Abaqus是知名的非线性有限元求解器,其以强悍稳定的非线性求解性能,相对方便的前处理操作界面,强大的二次开发功能在国内和国际获得了广泛的用户,无论是学术研究,还是工程应用,Abaqus均有一席之地。对于Abaqus来说,使用Fortran或其他语言进行二次开发极为常见,通过二次开发,我们可以一定程度上参与到Abaqus的“内核”计算中。比如,通过Umat用户材料子程序,可以实现Abaqus中没有而我们又需要的材料本构;或者是,通过编写Umat子程序实现Abaqus中已有的材料本构与Abaqus自带的材料本构进行对标,从而方便我们验证对该材料本构理论的掌握程度;通过UEL自定义单元,我们可以开发自己需要的单元类型。通过Dload,可以实现我们需要的分布压力的加载。在编写子程序时,通常情况下会遇到一些矩阵向量运算。如果我们采用的是Fortran,对于这些运算可能有一些比较方便的操作,例如矩阵向量乘,矩阵-矩阵乘等。当然,在Abaqus自带的例子中,这部分运算通常还是用循环表达的,比如下面的应力与应变关系的运算:DO 70 K1=1,NTENS
DO 60 K2=1,NTENS
STRESS(K2)=STRESS(K2)+DDSDDE(K2,K1)*DSTRAN(K1)
60 CONTINUE
70 CONTINUE
如果我们使用Fortran的matmul来完成,则只需要一行,当然这里的Dstran需要定义为二维数组而非一维数组:STRESS=STRESS+matmul(DDSDDE,DSTRAN)
除了上述这种常规的矩阵向量乘,矩阵矩阵乘这种基础操作之外,在实际中,子程序的运算还可能涉及一些更为复杂的操作,比如矩阵求逆,方程组求解,特征值求解等等。此时,如果自己手动去写这部分的代码当然可以,但是更方便的是调库。MKL库就给了我们一个不错的选项。MKL库是Intel公司开发的数学函数库,其提供了一系列用于数值计算的Fortran和C语言接口如blas,lapack,pardiso等,用户通过调用MKL可以高效并行地完成矩阵乘法,线性方程组求解,FFT快速傅里叶变换等工作,具有优秀的计算性能。通过在Abaqus子程序中调用MKL库,我们可以通过MKL库强悍稳定的求解性能省去了很多基础运算的编写。在Fortran子程序中调用MKL库主要有以下几步:在代码中编写调用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库,感谢您的阅读。