本文摘要(由AI生成):
本文介绍了使用C++代替Fortran编写Abaqus用户子程序的方法。由于Fortran语言可读性差且历史负担重,许多工程师更熟悉C++。Abaqus 6.13之后的版本支持C++编写用户子程序。文章详细阐述了运行环境配置、子程序编写和子程序提交的过程,包括C++编译器的调用、C++函数与Fortran子程序的协调、数据类型映射等。通过对比基于Fortran和C++编写的相同用户子程序,展示了两者之间的差异。最后指出,基于C++编写的Abaqus用户子程序的提交方式与基于Fortran的方式相同。
Fortran语言的可读性差,代码的历史负担重,造成基于Fortran的开发和维护非常困难。从一个有限元分析工程师的角度,大多数人在编程语言方面的知识体系里,对C++的熟悉程度远超过Fortran。
在abaqus6.13之后的版本,对于使用C++编写abaqus用户子程序是完全支持的。
基于C++编写abaqus用户子程序的运行环境配置方式与基于Fortran编写用户子程序基本相同,唯一的区别在于,假如在visual studio安装时,没有勾选C++编译器,需手动勾选安装,如下图所示。
在abaqus中通过各种方式提交包含基于C++编写的子程序(后缀为.c/.cpp等)的分析任务后,会首先调用C++编译器,编译子程序,然后调用Fortran编译器,链接子程序。
在abaqus command中输入命令abaqus information=system,查看C++编译器的运行情形,如下图,则表示运行环境配置成功。
使用C++编写用户子程序时,子程序写作成一个C++函数。通过下面的两个步骤,实现C++用户子程序与Fortran用户子程序的协调。
a.将外部的C++名字映射到外部的Fortran名字
通过包含abaqus内置的宏文件aba_for_c.h,并使用FOR_NAME宏来声明子程序的名字,这样C++子程序中的函数名可以与Fortran子程序相协调,这样基于C++编写的子程序能被abaqus中的Fortran代码调用。
#include <aba_for_c.h>
Extern “C”
Void FOR_NAME(dload, DLOAD)()
b. 将C++数据类型映射到Fortran数据类型
所有子程序的参数与Fortran子程序相同,但是需要通过引用的方式传入。
(double & F, int & KSTEP, int & KINC, double (& TIME)[2],int & NOEL,
int & NPT, int & LAYER, int & KSPT, double (& COORDS)[3], int & JLTYP, char (& SNAME)[80])
基于C++的用户子程序内代码块遵循C++的编写代码规范,涉及到子程序中需要调用abaqus中的功能程序时,正常调用即可。这样,就可以完全抛开Fortran的代码,使用自己熟悉的C++进行子程序的编写了。
下面是分别是基于Fortran和基于C++编写的相同的用户子程序,通过对比,可以很清晰地发现两者的差别。
图 基于C++的Dload用户子程序
图 基于Fortran的Dload用户子程序
基于C++编写的abaqus用户子程序,提交任务运行的方式,与基于Fortran编写的abaqus用户子程序完全相同。可以使用abaqus/CAE的交互界面提交,也可以基于abaqus command用如下命令行提交
Abaqus job= ,user= , cpus=