本系列文章研究成熟的有限元理论基础及在商用有限元软件的实现方式。有限元的理论发展了几十年已经相当成熟,商用有限元软件同样也是采用这些成熟的有限元理论,只是在实际应用过程中,商用CAE软件在传统的理论基础上会做相应的修正以解决工程中遇到的不同问题,且各家软件的修正方法都不一样,每个主流商用软件手册中都会注明各个单元的理论采用了哪种理论公式,但都只是提一下用什么方法修正,很多没有具体的实现公式。商用软件对外就是一个黑盒子,除了开发人员,使用人员只能在黑盒子外猜测内部实现方式。
一方面我们查阅各个主流商用软件的理论手册并通过进行大量的资料查阅猜测内部修正方法,另一方面我们自己编程实现结构有限元求解器,通过自研求解器和商软的结果比较来验证我们的猜测,如同管中窥豹一般来研究的修正方法,从而猜测商用有限元软件的内部计算方法。我们关注CAE中的结构有限元,所以主要选择了商用结构有限元软件中文档相对较完备的Abaqus来研究内部实现方式,同时对某些问题也会涉及其它的Nastran/Ansys等商软。为了理解方便有很多问题在数学上其实并不严谨,同时由于水平有限可能有许多的理论错误,欢迎交流讨论,也期待有更多的合作机会。
==UEL用户子程序开发步骤==
用户子程序主要是将用户特定的材料本构模型和单元算法等公式编写为计算机语言表示的公式,并实现和商软求解器之间的交互迭代。
常用的商业有限元软件都提供了用户自定义子程序的功能,且一般都是Fortran语言开发,Fortran是上世纪70年代的语言,相对现代化的流行语言编写,格式要求非常严格,编译调试都比较繁琐,使得开发效率低下,而且接口限制较多,除了商软提供的功能外用户基本没法改动,灵活性较差。由于用户子程序很多都涉及复杂的公式编写,用户除了需要扎实的理论基础外,还需要较强的能将公式表达为Fortran语言的编程能力,这对非计算机专业出身的人来说往往在浪费了很多额外精力,使得很多理论高手都对用户子程序望而却步,难以入门。
在实际工作中,很多工程师用Matlab来编写和推导公式,Matlab被认为是市面上最接近草稿纸上推导公式的一款软件了,而且有限元在数值层面上的计算其实就是矩阵运算,所以Matlab这种数据按矩阵来组织非常适合用来开发有限元相关的程序。而现在市面上还没有采用Matlab来开发商软子程序的案例。iSolver是市面上第一款基于Matlab来开发商软用户子程序的软件工具,支持用Matlab编写和调试用户子程序。iSolver子程序的接口完全按照Abaqus的标准实现,而Abaqus的子程序接口在近几年内已经基本不再变化了,同样的,虽然iSolver在不断发展,但iSolver子程序接口将维持不变,所有在iSolver上编写的算法子程序都只要维护自己的算法部分就行,而不是维护整个有限元求解的整个过程。
UEL网上资料很多,大家可以很容易查看,但大部分资料都只是简单提供UEL算例,这里我们列出了UEL接口的关键输入输出参数,如下表所示:
Abaqus中只能通过修改手动inp文件完成用户UEL的定义,通常包含以下关键字及相应属性,如图所示:
使用任意编辑器编写.for文件,推荐使用Visual Studio Code,微软开源的轻量化代码编辑器,配置灵活高效:
Abaqus没有自带Fortran编译器,所以用户需要自己去安装Fortran编译器和Visual Studio Build Tools,并配置相应环境。具体配置过程与UMAT一致,可以查看我们关于环境配置的视频:
https://www.jishulink.com/college/video/c13034?chapter=1
在环境配置完成之后,打开命令提示框,输入命令Abaqus make Library=XXX.for,即开始编译,编译过程中的警告和错误都会打印在命令提示框内。
运行有两种方法,第一种就是在命令提示框中输入Abaqus job=XXX user=XXX.for,如下图所示。
第二种就是在Abaqus中创建基于inp文件的任务,然后选择对应的用户子程序for文件,在任务管理器中提交运行,如图所示。
至此,基于Fortran的UEL开发流程已经完成,但结果的正确性还需要更加细致的验证,为更方便的查找问题,建议先采用单个单元调试UEL,在确保单个单元正确后再将UEL用于实际问题。
如果想要知道代码的运行结果是否和预期的一致,一种笨办法是用print打印到log文件中,高效的方法是采用断点调试的方法进行运行中的调试。
Abaqus支持命令行调试,不过命令行反复运行也比较繁琐,用户也可选择用一键调试Abaqus的用户子程序的DUS插件工具。DUS(Debug User Subroutine)是集成在ABAQUS/CAE中的一个插件,能够一键启动用户配置的用户子程序开发平台(如Visual Studio 2008等),并进入对用户定义子程序的单步调试模式。
有兴趣的可到下面网页下载使用。
Abaqus用户子程序调试插件:
https://www.jishulink.com/content/post/424513
1.3 基于Matlab的iSolver的UEL开发步骤
基于Matlab的Abaqus的UEL具体开发步骤和Abaqus类似,只不过某些步骤需要用到自研有限元求解器开发平台iSolver。
与Abaqus相应的操作一致,如图所示:
1.3.2 编写
在Matlab中创建并编写U1001.m的文件,放入Abaqus工作目录下。该文件只包括一个U1001函数,接口和Abaqus的接口参数完全一致,功能也是计算应力应变关系和当前应力状态等,相对Fortran,利用Matlab可以更容易的编写计算公式,同时可以利用Matlab在矩阵计算中各种强大功能和算法库。因为Abaqus的UEL接口和计算功能各个版本相对固定,这个matlab的UEL接口参数也相对固定,不会因为iSolver的版本不同而重新修改接口。
由于matlab是脚本语言,不需要编译。
在Abaqus菜单栏的Plug-ins里选择iSolver插件的菜单。
点击iSolver->Engine,按照下图所示,在功能项Use Solver中选择iSolver,在Source Type里面选择Matlab,勾选Debug。点击Submit进行调试运行。
程序会自动打开matlab并加载U1001.m文件,手动打上断点
点击在Debug菜单下的Run U1001运行。
程序将在断点处停止,且将鼠标移动到需要调试查看的参数上,能够查看到对应的值。
按F10可以进行单步调试。
在上述步骤的基础上去掉勾选Debug选项,点击Submit运行计算,此时将采用iSolver求解器联合U1001.m进行求解分析,运行完毕点击Result在Abaqus中查看结果。
具体的壳理论和在iSolver中实现的UEL算例可以参考下面的视频:
https://www.jishulink.com/college/video/c14948
深入浅出有限元:基础理论->Abaqus操作->matlab编程
本文首先简单的讨论了UEL的一般含义,并详细的介绍了基于Fortran和Matlab两种方式的UEL的开发步骤,对比发现开发步骤基本相同,但Matlab更加高效和灵活。同时,由于iSolver基本单元类型和Abaqus算法完全一致,可以发现同一个算例验证两者分析结果完全一致,从而证明基于Matlab的UEL的流程和结果的正确性。
UEL的开发一方面要有扎实的公式推导能力,另一方面需要基础的编程能力和开发工具应用水平,后者不是重点,但往往浪费了大家很多的精力,善用工具方能提高效率,基于Fortran和Matlab两种方式的UEL的开发步骤和开发工具如下表:
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删