首页/文章/ 详情

高效稳定!在Abaqus子程序中如何使用MKL数学运算库

1月前浏览492
Abaqus是知名的非线性有限元求解器,其以强悍稳定的非线性求解性能,相对方便的前处理操作界面,强大的二次开发功能在国内和国际获得了广泛的用户,无论是学术研究,还是工程应用,Abaqus均有一席之地。
对于Abaqus来说,使用Fortran或其他语言进行二次开发极为常见,通过二次开发,我们可以一定程度上参与到Abaqus的“内核”计算中。比如,通过Umat用户材料子程序,可以实现Abaqus中没有而我们又需要的材料本构;或者是,通过编写Umat子程序实现Abaqus中已有的材料本构与Abaqus自带的材料本构进行对标,从而方便我们验证对该材料本构理论的掌握程度;通过UEL自定义单元,我们可以开发自己需要的单元类型。通过Dload,可以实现我们需要的分布压力的加载。
在编写子程序时,通常情况下会遇到一些矩阵向量运算。如果我们采用的是Fortran,对于这些运算可能有一些比较方便的操作,例如矩阵向量乘,矩阵-矩阵乘等。当然,在Abaqus自带的例子中,这部分运算通常还是用循环表达的,比如下面的应力与应变关系的运算:





DO 70 K1=1,NTENSDO 60 K2=1,NTENSSTRESS(K2)=STRESS(K2)+DDSDDE(K2,K1)*DSTRAN(K1)60     CONTINUE70   CONTINUE
如果我们使用Fortran的matmul来完成,则只需要一行,当然这里的Dstran需要定义为二维数组而非一维数组:

STRESS=STRESS+matmul(DDSDDE,DSTRAN)
除了上述这种常规的矩阵向量乘,矩阵矩阵乘这种基础操作之外,在实际中,子程序的运算还可能涉及一些更为复杂的操作,比如矩阵求逆,方程组求解,特征值求解等等。此时,如果自己手动去写这部分的代码当然可以,但是更方便的是调库。MKL库就给了我们一个不错的选项。
MKL库是Intel公司开发的数学函数库,其提供了一系列用于数值计算的Fortran和C语言接口如blas,lapack,pardiso等,用户通过调用MKL可以高效并行地完成矩阵乘法,线性方程组求解,FFT快速傅里叶变换等工作,具有优秀的计算性能。
通过在Abaqus子程序中调用MKL库,我们可以通过MKL库强悍稳定的求解性能省去了很多基础运算的编写。
在之前的文章Fortran77还有前途吗?-Intel MKL的Fortran77接口和C接口使用 和如何快过matlab?-MKL数值计算库的Fortran95接口使用及MKL文档下载 中,我们实际上已经介绍了MKL的基本使用和文档的下载链接,本文主要讲如何在Abaqus的Fortran子程序中调用MKL库,(目前仅仅成功配置了MKL库的Fortran77接口,Fortran95接口后续再进行)。
在Fortran子程序中调用MKL库主要有以下几步:
  1. 在代码中编写调用MKL库的代码。例如:

上面这句代码就是调用mkl库中的dasum这个函数对stress这个一维数组各个元素求和,并输出到.log文件中或者是打印到屏幕。在mkl中这个函数的函数原型和参数解释如下:

2.修改win86_64.env的配置文件使得子程序能够识别mkl的函数:

打开安装目录下的”win86_64.env”文件,这个文件包含了使用子程序时的编译链接选项的配置。文件的位置大致如下:
打开后,在”compile_fortran”项下增加'/Qmkl'选项:
在”link_sl”和”link_exe”项下增加对应的.lib库文件,一般需要增加以下几个:
这里的.lib库文件的位置在mkl的安装目录下,具体可自行文件搜索获得。要注意如果是安装的是OneApi,在mkl下有两个路径:
这里虽然实际上两个路径是一个路径,latest实际上是一个快捷方式到2022.1.0,但是我试了一下如果在”link_sl”和”link_exe”项中填写2022.1.0,会识别不出来2022这个数字,因此最好是填latest,正如上面图中所示。

3.保存.env文件,abaqus子程序使用mkl库已经配置成功,通过命令行直接运行或者界面提交即可。

以上,介绍了如何在Abaqus子程序中使用MKL库,感谢您的阅读。

来源:有限元术
Abaqus非线性二次开发MATLABUM理论材料
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-12-18
最近编辑:1月前
寒江雪_123
硕士 | cae工程师 签名征集中
获赞 50粉丝 108文章 61课程 9
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈