有限元理论基础及Abaqus内部实现方式研究系列36:DLOAD用户子程序开发步骤
(原创,欢迎转载,转载请说明出处)
1 概述
本系列文章研究成熟的有限元理论基础及在商用有限元软件的实现方式,通过
(1) 基础理论
(2) 商软操作
(3) 自编程序
三者结合的方式将复杂繁琐的结构有限元理论通过简单直观的方式展现出来,同时深层次的学习有限元理论和商业软件的内部实现原理。
有限元的理论发展了几十年已经相当成熟,商用有限元软件同样也是采用这些成熟的有限元理论,只是在实际应用过程中,商用CAE软件在传统的理论基础上会做相应的修正以解决工程中遇到的不同问题,且各家软件的修正方法都不一样,每个主流商用软件手册中都会注明各个单元的理论采用了哪种理论公式,但都只是提一下用什么方法修正,很多没有具体的实现公式。商用软件对外就是一个黑盒子,除了开发人员,使用人员只能在黑盒子外猜测内部实现方式。
一方面我们查阅各个主流商用软件的理论手册并通过进行大量的资料查阅猜测内部修正方法,另一方面我们自己编程实现结构有限元求解器,通过自研求解器和商软的结果比较来验证我们的猜测,如同管中窥豹一般来研究的修正方法,从而猜测商用有限元软件的内部计算方法。我们关注CAE中的结构有限元,所以主要选择了商用结构有限元软件中文档相对较完备的Abaqus来研究内部实现方式,同时对某些问题也会涉及其它的Nastran/Ansys等商软。为了理解方便有很多问题在数学上其实并不严谨,同时由于水平有限可能有许多的理论错误,欢迎交流讨论,也期待有更多的合作机会。
通用结构有限元软件iSolver介绍视频:
http://www.jishulink.com/college/video/c12884
==第36篇: DLOAD用户子程序开发步骤==
前段时间很多朋友都问我们iSolver怎么实现DLOAD子程序,相比前面第八、九篇介绍的UMAT用户自定义材料的开发,第二十、二十三篇介绍的UEL用户自定义单元的开发,DLOAD要简单很多,可以说,没有任何复杂的算法,所以我们在此也仅仅介绍一下DLOAD的开发步骤,也顺便给iSolver用户提供一个简单的算例帮助大家更好的使用iSolver的DLOAD功能。
实际生活中很多时候载荷是随着某些物理量变化的,最常见的是随着时间或者位置的变化,如果仅仅是随着时间变化,那么在Abaqus中可以用Amplitude设置一个载荷和时间的对应表就行了;如果仅仅是随着加载位置变化,那么可以直接把载荷位置独立划分出来,譬如设成一个单独Set,在整个时间段内都只在该位置加载就行。那如果载荷既随时间变化,同时在时间推进过程中加载位置也在变怎么办呢?
譬如大坝的水位随着潮汐的作用一天内会不同,导致不同时间段对大坝的水压也不同。再譬如汽车在大桥上行驶,每一个时刻车子所在位置不同,对桥的荷载自然也不同了。
上述这些情况就必须要用到子程序了,如果是分布载荷,那么就是DLOAD子程序,DLOAD主要是将用户特定的分布载荷随时间、单元、积分点等变化算法编写为计算机语言表示的公式,并实现和求解器之间的交互迭代。
Abaqus的DLOAD采用Fortran语言实现,而iSolver的DLOAD采用Matlab实现。本文首先简单的讨论了DLOAD的输入输出参数,然后详细的介绍了基于Fortran和MATLAB 两种方式的DLOAD的开发步骤,对比发现开发步骤基本相同,同时采用MATLAB 更加高效和灵活。
1.1 DLOAD的关键输入输出参数
和UEL相比,DLOAD的网上资料较少。这里我们列出了Abaqus的DLOAD接口的关键输入输出参数,如下表所示:
从输入参数可以看出,Abaqus的分布载荷可以是分析步、增量步、时间、单元序号、积分点、面名称等相关,可变参数只能是这么多,没法扩展,如果载荷用到其它变量参数就麻烦了,这也是大家用商软的一个痛点,商软的接口暴露出来的很少,很多复杂的问题往往由于商软接口的限定而没法在商软平台上实现,真正卡死了我们深入研究问题和创新的能力,而自主软件就可以突破这个限定。由于工程实际用户的需要,期望在瞬态分析时可以设置分布载荷随速度的变化曲线,所以iSolver在DLOAD接口中特意增加了VELOCTIY参数,方便用户将速度值传入子程序进行计算。
1.2 基于Fortran的Abaqus的DLOAD的开发步骤
1.2.1 在Abaqus界面中定义DLOAD
一般在Abaqus界面中定义DLOAD,方法是在创建载荷时,在Distribution的下拉框中选择User-defined:
也可直接在inp中定义DLOAD,方法是在定义载荷时将分布类型从P改成对应的用户自定义载荷(面载荷为PNU,体载荷为BXNU), 如图所示:
然后在创建Job时,在User subroutine file中选择或输入用户编写的DLOAD的Fortran程序:
1.2.2 编写
使用任意编辑器编写.for文件,比如UltraEdit
1.2.3 编译(可选)
Abaqus没有自带Fortran编译器,所以用户需要自己去安装Fortran编译器和Visual Studio Build Tools,并配置相应环境。具体配置过程与UMAT一致,可以查看我们关于环境配置的视频:
https://www.jishulink.com/college/video/c13034?chapter=1
在环境配置完成之后,打开命令提示框,输入命令Abaqus make Library=XXX.for,即开始编译,编译过程中的警告和错误都会打印在命令提示框内。
1.2.4 运行
运行DLOAD有多种方法,除了前面所述的基于模型创建Job时直接选择DLOAD程序外,还可以在命令提示框中输入Abaqus job=XXX user=XXX.for,如下图所示。
另一种就是在Abaqus中创建基于inp文件的任务,然后再选择对应的用户子程序for文件,在任务管理器中提交运行,如图所示。
至此,基于Fortran的DLOAD开发流程已经完成,但结果的正确性还需要更加细致的验证,为更方便的查找问题,建议先采用单个单元调试DLOAD,在确保单个单元正确后再将DLOAD用于实际问题。
1.2.5 调试(可选)
如果想要知道代码的运行结果是否和预期的一致,一种笨办法是用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的DLOAD开发步骤
基于MATLAB 的Abaqus的DLOAD具体开发步骤和Abaqus类似,只不过某些步骤需要用到自研有限元求解器开发平台iSolver。
1.3.1 定义DLOAD
如果是通过Abaqus界面定义DLOAD,则与Abaqus相应的操作一致(见2.2.1 节),
1.3.2 编写
在MATLAB 中创建并编写DLOAD.m的文件,放入Abaqus工作目录下。该文件只包括一个DLOAD函数,前面参数接口和Abaqus的接口参数完全一致,功能也是计算分布载荷的幅值,相对Fortran,利用MATLAB 可以更容易的编写计算公式,同时可以利用MATLAB 在矩阵计算中各种强大功能和算法库。因为Abaqus的DLOAD接口和计算功能各个版本相对固定,这个MATLAB 的DLOAD接口参数也相对固定,不会因为iSolver的版本不同而重新修改接口。
具体接口函数可直接查看iSolver的设置界面,在View Interface中选择DLOAD就可查看,复制到DLOAD.m即可。
1.3.3 编译(无)
由于MATLAB 是脚本语言,不需要编译。
1.3.4 调试(可选)
在Abaqus菜单栏的Plug-ins里选择iSolver插件的菜单。
点击iSolver->Engine,按照下图所示,在功能项User Subroutine中选择DLOAD,勾选Debug。点击Submit进行调试运行。
程序会自动打开MATLAB 并加载DLOAD.m文件,手动打上断点
点击在Debug菜单下的Run DLOAD 运行。
程序将在断点处停止,且将鼠标移动到需要调试查看的参数上,能够查看到对应的值。
按F10可以进行单步调试。
1.3.5 运行
在上述步骤的基础上去掉勾选Debug选项,点击Submit运行计算,此时将采用iSolver求解器联合DLOAD.m进行求解分析,运行完毕点击Results在Abaqus中查看结果。
1.4 视频讲解和操作验证演示
如果觉得上面的文字太复杂,也可以看一下视频的简要讲解和软件演示,里面包括DLOAD在Abaqus和iSolver实现的从零开始的一个Step By Step操作的算例演示:
https://www.jishulink.com/college/video/c12884 20理论系列文章36-DLOAD用户子程序开发步骤.mp4
1.5 总结
本文首先简单的讨论了DLOAD的一般含义,并详细的介绍了基于Fortran和MATLAB 两种方式的DLOAD的开发步骤,对比发现开发步骤基本相同,但MATLAB 更加高效和灵活。同时,由于iSolver基本单元类型和Abaqus算法完全一致,可以发现同一个算例验证两者分析结果完全一致,从而证明基于MATLAB 的DLOAD的流程和结果的正确性。
DLOAD的开发一方面要有扎实的公式推导能力,另一方面需要基础的编程能力和开发工具应用水平,后者不是重点,但往往浪费了大家很多的精力,善用工具方能提高效率,基于Fortran和MATLAB 两种方式的DLOAD的开发步骤和开发工具如下表:
项次 |
步骤 |
基于Fortran的 开发工具 |
基于MATLAB 的 开发工具 |
1 |
参数设置 |
Abaqus/CAE |
Abaqus/CAE |
2 |
编写 |
文本编译器 |
MATLAB |
3 |
编译 |
VS+iVF |
无需编译 |
4 |
调试 |
VS+iVF+DUS插件 |
MATLAB +iSolver插件 |
5 |
运行 |
Standard.exe+DLOAD.for |
iSolver.exe+DLOAD.m |
如果有任何其它疑问或者项目合作意向,也欢迎联系我们:
SnowWave02 From www.jishulink.com
email: snowwave02@qq.com
以往的系列文章:
========第一阶段========
第一篇:S4壳单元刚度矩阵研究。
http://www.jishulink.com/content/post/338859
第二篇:S4壳单元质量矩阵研究。
http://www.jishulink.com/content/post/343905
第三篇:S4壳单元的剪切自锁和沙漏控制。
http://www.jishulink.com/content/post/350865
第四篇:非线性问题的求解。
http://www.jishulink.com/content/post/360565
第五篇:单元正确性验证。
https://www.jishulink.com/content/post/373743
第六篇:General梁单元的刚度矩阵。
https://www.jishulink.com/content/post/403932
第七篇:C3D8六面体单元的刚度矩阵。
https://www.jishulink.com/content/post/430177
第八篇:UMAT用户子程序开发步骤。
https://www.jishulink.com/content/post/432848
第九篇:编写线性UMAT Step By Step。
http://www.jishulink.com/content/post/440874
第十篇:耦合约束(Coupling constraints)的研究。
https://www.jishulink.com/content/post/531029
========第二阶段========
第十一篇:自主CAE开发实战经验第一阶段总结。
http://www.jishulink.com/content/post/532475
第十二篇:几何梁单元的刚度矩阵。
http://www.jishulink.com/content/post/534362
第十三篇:显式和隐式的区别。
http://www.jishulink.com/content/post/537154
第十四篇:壳的应力方向。
https://www.jishulink.com/content/post/1189260
第十五篇:壳的剪切应力。
https://www.jishulink.com/content/post/1191641
第十六篇:Part、Instance与Assembly。
https://www.jishulink.com/content/post/1195061
第十七篇:几何非线性的物理含义。
https://www.jishulink.com/content/post/1198459
第十八篇:几何非线性的应变。
https://www.jishulink.com/content/post/1201375
第十九篇:Abaqus几何非线性的设置和后台。
http://www.jishulink.com/content/post/1203064
第二十篇:UEL用户子程序开发步骤。
https://www.jishulink.com/content/post/1204261
========第三阶段========
第二十一篇:自主CAE开发实战经验第二阶段总结。
https://www.jishulink.com/content/post/1204970
第二十二篇:几何非线性的刚度矩阵求解。
http://www.jishulink.com/content/post/1254435
第二十三篇:编写简单面内拉伸问题UEL Step By Step
http://www.jishulink.com/content/post/1256835
第二十四篇:显式求解Step By Step。
https://www.jishulink.com/content/post/1261165
第二十五篇:显式分析的稳定时间增量。
http://www.jishulink.com/content/post/1263601
第二十六篇:编写线性VUMAT Step By Step。
https://www.jishulink.com/content/post/1266640
第二十七篇:Abaqus内部计算和显示的应变。
https://www.jishulink.com/content/post/1273788
第二十八篇:几何非线性的T.L.和U.L.描述方法
https://www.jishulink.com/content/post/1282956
第二十九篇:几何非线性的T.L.和U.L.转换关系
https://www.jishulink.com/content/post/1286065
第三十篇:谐响应分析原理
https://www.jishulink.com/content/post/1290151
========第四阶段========
第三十一篇:自主CAE开发实战经验第三阶段总结
https://www.jishulink.com/content/post/1294824
第三十二篇:谐响应分析算法
https://www.jishulink.com/content/post/1299983
第三十三篇:线性瞬态动力学
https://www.jishulink.com/content/post/1302074
第三十四篇:非线性瞬态分析
https://www.jishulink.com/content/post/1787283
第三十五篇:接触求解算法
https://www.jishulink.com/content/post/1792869
查看更多评论 >