你为什么感觉自己比ABAQUS算得快

关键词:软件架构,ABAQUS,UMAT,铺层,开发者视角

适用阅读人群:ABAQUS高阶用户、有限元软件开发人员、求解器开发人员、工业软件从业者

练习书法过程中,需要不断地读帖。所谓心摹手追,读帖过程中,揣摩每个字的结体、行笔线路、线条变化,然后再下笔临摹,时间久了水平自有进益。

你为什么感觉自己比ABAQUS算得快的图1

开发软件的过程也是这样,尤其是模仿自己非常熟悉的软件。我们需要跳出自己的习惯,去审视它,它为什么这么设计?优点是什么,限制又是什么,为什么只能这样,不能那样。

最开始开发求解器的时候,尤其是简单的求解器,跑一个简单的案例,你会经常发现自己的代码比ABAQUS算得快。如果对软件设计不够了解,便容易洋洋得意,甚至发论文讲自己的代码效率高,显著优于商用软件,打破国外垄断,填补国内空白,推动行业进步,应用前景不可限量。

在SFEM以及其他有限元软件开发项目中,我常常有豁然开朗的感觉,忽然明白原先以为ABAQUS一部分很难理解的设计,可能是不得不这么干,否则软件逻辑就会不通。

本文就从开发者的视角,浅谈一下ABAQUS软件的一些设计思路。由于该软件整体上是个黑箱,大部分都是我从开发的角度揣摩的,未必对,仅供参考。

1. 分析步与网格类型必须强制匹配

ABAQUS要求分析步类型与网格类型必须匹配。举个例子,如果分析步选用了热力耦合分析步,那么单元类型也必须选热力耦合单元。

你为什么感觉自己比ABAQUS算得快的图2

分析步类型

你为什么感觉自己比ABAQUS算得快的图3

网格类型

如果选了常规的静力使用的单元,就会报错。这么设计当然没毛病,因为热力耦合单元和静力单元的维度不同,刚度矩阵也不一样。但是为什么必须这么设计呢?

为什么ABAQUS不能根据分析步的类型,自动对单元进行处理呢?比如,明明知道它是三角形单元,非要让用户定义它是热力耦合的还是静力或者单纯传热的,而不能自己根据分析步对这个三角形单元进行处理。

如果我们自己写一个简单的线弹性求解器,就很难理解这一点,我们会觉得,无非就是刚度矩阵组装后,代入边界约束,然后矩阵求逆就完事了。

ABAQUS这样处理的原因,很大程度上是因为软件高度模块化的结果,即由网格到刚度矩阵的生成是一个单独的模块。求解器的输出是inp文件,inp文件中,节点和单元直接丢给网格处理网格,网格处理模块根据单元的类型关键字,就可以直接进行单元刚度矩阵的生成和总体刚度矩阵的组集,而不需要读入inp的分析步设置。

分析步模块,专注于负责求解控制,这里负责搭建完整仿真流程,控制步长,判断收敛等等。

通过这种解耦,各个模块不去干涉对方的工作,更容易形成通用、成熟的软件模式。

2. Part 与Assembly的解耦

ABAQUS的这种模块解耦设计的思想,在Part 与Assembly的设计上体现得最深刻。

在Part部分,我们可以导入一堆几何模型,但是在Assembly可能我们只会选用部分几何模型,用于后续的边界条件定义和网格生成。这样做的好处是,用户便捷地更换模型,方便进行设计迭代与参数化研究。只要拓扑关系相似,原先建立在装配体级别的接触(Interactions)、载荷(Loads)和边界条件(BCs)通常可以自动保留或快速重新映射,大幅缩短了设计迭代的周期。

你为什么感觉自己比ABAQUS算得快的图4

Assembly

另外,如果你在一个装配体中需要用到50个相同的螺栓,你只需要在 Part 模块中创建一个螺栓模型。然后在 Assembly 模块中,你可以将这个螺栓实例化50次,并放置在不同的位置。

我在开发SFEM V1.0阶段,正是借鉴了这一点,预留了Assembly模式的接口,方便在2.0版本实现Part和Assembly隔离。

3. Set(集合)思想

ABAQUS软件的另一大精髓设计就是:贯穿始终的 Set(集合)思想。

体感上,我们导入模型后,定义材料参数,你会觉得是把材料赋予了整个模型。

定义边界条件的时候,你从视口中拾取一个面约束,你会感觉整个约束加在了这个面上。

实际上,在上述过程中,ABAQUS自动把你选择的模型、点、面、单元自动转化为一个Set或者Surf:

你为什么感觉自己比ABAQUS算得快的图5

材料参数定义后自动创建的Set

你为什么感觉自己比ABAQUS算得快的图6

约束定义后自动创建的Set

这个天才般的设计思想,被全部借鉴到了SFEM的开发中。

首先,Set具有极高的复用性。一个定义好的SET可以在模型的各个环节被反复调用,而不需要每次都去屏幕上重新框选。举例:假设你定义了一个名为 Bolt_Hole 的SET(包含螺栓孔内表面的几何或节点)。你可以:

(1) 用它来定义接触面(Surface)。

(2) 用它来施加螺栓预紧力或边界条件。

(3) 用它来定义局部坐标系下的材料方向。

(4) 在后处理(Step模块)中,专门请求输出这个 Bolt_Hole SET 的应力集中数据(History Output)。

一次定义,多处引用,大大提高了建模效率。

其次,Set显著提升 INP 文件的可读性与可维护性。ABAQUS的底层求解器是读取 .inp 文件的。如果不用Set,你的输入文件里会充斥着成千上万个毫无规律的节点和单元编号,难以阅读和修改。

另外,Set思想极大便利了参数化建模与二次开发。如果你使用Python对ABAQUS进行二次开发或参数化建模,Set是不可或缺的桥梁。在脚本中,通过坐标或拓扑关系自动找到某些点/面是非常复杂的。标准的做法是:通过脚本利用坐标系找到目标几何 将其命名为特定的Set后续所有的施加载荷、网格划分、结果提取操作,全部通过调用这个Set的字符串名称来完成。这种基于名称的寻址方式,使得脚本非常稳健。

4. 铺层角度为什么无法批量定义

在使用ABAQUS进行复合材料铺层定义的时候,Composite Layup的使用让人觉得很难受。因为每行的Region、Material、CSYS都需要点击后进入另一个弹窗去定义。这逼得你不得不手动操作半天,如果铺层区域很多、铺层角度很多,这个工作量还不小,且容易出错。

你为什么感觉自己比ABAQUS算得快的图7

Composite Layup窗口

我在使用的时候常常想,为什么不让我们直接导入一个表格定义呢?又快又方便。

表格导入不是技术上达不到,而是ABAQUS出于一种防错设计思想。Region的定义,需要让用户选择定义好的单元Set,如果未定义,就链接到Set定义。同样的,Material、CSYS都需要如此。

如果直接导入表格,可能会出现根本不存在的Set、Material、CSYS。

我在设计SFEM的时候,没有借鉴这一点,因为我们工程中接触的大部分实际构件铺层都很厚。花半天的时间逐行输入,确实太耗时间。为此,我设计的导入铺层的功能,可以直接导入表格,材料参数和区域都通过文本定义即可。

你为什么感觉自己比ABAQUS算得快的图8

SFEM软件铺层定义窗口

对于变厚度的情况,通过参考几何、铺层表格,自动完成复杂的厚度、铺层定义。

你为什么感觉自己比ABAQUS算得快的图9

SFEM软件变厚度铺层定义窗口

你为什么感觉自己比ABAQUS算得快的图10

SFEM软件变厚度铺层定义效果

5. 铺层定义为什么无法和UMAT同时使用

继续聊铺层。在ABAQUS中,如果使用了铺层Composite Layup定义实体或壳单元,这时候再调用UMAT子程序就会报错。

也就是,ABAQUS并不支持铺层定义与子程序的联合使用。我开始以为是ABAQUS的问题,后来发现还有“用户”的问题。

我们学复合材料力学,就会接触到单层板的Q矩阵,以及层合板的A、B、D矩阵。

对于大部分人来说,编写一个代码:单层板根据铺层角度、厚度,同时进行坐标系变换、积分,逐层汇集的A、B、D矩阵是个不小的挑战。单这一条,就拦住了80%的用户。

除此之外,还有个更关键的问题,如果需要支持用户在UMAT中定义层合本构,UAMT需要增加铺层信息的传入,否则用户无法进行坐标系变换和厚度信息的获取。

另外,UMAT中的应变不是含有“铺层”的应变,如果要用,应变要给用户提供每一层的应变。

同样的还有要应力的处理,因为UMAT需要用户返回应力结果,因此在刚度矩阵集成后,用户需要计算出每一层的应力返回给UMAT,UMAT同样没有整个接口。

这将大大增加ABAQUS主软件端UMAT接口难度,可以说需要他们重新开发整个接口。

因此如果要满足铺层定义、UMAT的联合使用,需要用户具备很高的水平,也要求ABAQUS专门开发非常复杂的UMAT接口。

如果我是软件开发商,这个吃力不讨好的功能,也不会列入开发计划。

6. 子程序为什么要进行环境配置,以及为什么算得慢

我最先接触ABAQUS的时候,最头疼的就是软件的安装。尤其涉及到子程序后,还需要额外安装VS、Fortran,安装的时候,必须要软件版本互相匹配,且要按照一定的顺序安装。每换一个电脑,经常捣鼓一天的时间搞安装。

那么为什么子程序一定要进行环境安装呢?

这是因为ABAQUS的求解器从根子上就是Fortran编写的,用户写的代码需要直接与求解器的底层核心代码进行编译链接,使用同种语言效率最高、最稳定。

但是单纯的Fortran程序是无根之萍,无法直接运行,需要相应的运行环境。

正因如此,使用子程序意味着ABAQUS的求解器需要调用外部函数。这也造成了,相同本构情况下,内置模型算的快,子程序算的慢。

ABAQUS在发展过程中,引入了C、C++、Python等语言,尤其是前端交互,支持Python二次开发,养活了一大帮人。但是早期求解器的语言限制,Python短期内还不会被引入作为求解器的接口。

7. odb文件为什么无法在ABAQUS外部解析

ABAQUS 求解器的输入inp文件是可读、可编辑的,这个设定给我们搞二次开发带来了充分的发挥空间。

然而,一旦我们试图把ABAQUS当做底层求解器使用,自己搭建前后处理流程,就会面临一个重大的问题:结果文件无法被外部解析。

ABAQUS的结果文件.odb 并不是像 .csv、.json 或开源的 .vtk 那样的纯文本或公开标准的格式。它是高度定制的、闭源的二进制数据库格式。

这不是技术问题,而是设定问题,你不知道人家是如何编码的,自然也就无法解码。

这也是商业上的巧妙考量,如果 .odb 是开源格式,那么其他竞争对手(如 ANSYS, Altair HyperWorks)或者开源后处理软件(如 ParaView)就可以完美、无缝地读取 ABAQUS 的结果。达索系统希望用户留在自己的生态里。你要看结果,就必须购买并使用具备 Abaqus License 的环境。这是一种非常经典的商业软件护城河策略。

8. 你的求解器为什么感觉比ABAQUS快

回到我们开头的问题,有时我们开发一个有限元求解器,在ABAQUS对比效率的时候常常发现自己的代码出结果更快。

你为什么感觉自己比ABAQUS算得快的图11

之所以有这个现象,是因为我们拿求解器的效率去和ABAQUS整个软件的效率在比。

在我们提交job任务的时候,ABAQUS后台会有如下处理步骤:

(1)生成inp文本。这需要ABAQUS从内存数据中,通过inp生成模块创建inp文本;

(2)求解器读取inp。求解器解析inp,讲网格信息、分析步、边界条件等丢给不同的处理模块

(3)求解。

(4)结果写入odb文件。

(5)读取odb文件,解析为后处理显示用的云图等数据。

上述步骤中,网格少、求解步骤简单问题来说,求解的时间反而是最少的。因此我们拿自己求解器和整个流程去比,当然显得速度很快。

结语

你不做有限元软件开发,见ABAQUS如井底望月,你做了有限元软件开发见ABAQUS则如浮游见青天。

除了数学、力学知识外,有限元软件的开发本身就是一套严密、复杂的系统工作。我的文章留言中,有很多的唯AI论者。好像有了AI,工业软件的开发就易如反掌。

我从不质疑AI的强大,并且在目前我所有的软件开发中,都使用了AI进行辅助。但是“有了AI,有限元软件开发就不再重要,即使开发也变得十分简单”这个论调是完全反智的。

难道有了AI,数学、力学我们就可以不学了?软件逻辑就不需要人来推演了?行业知识与物理模型的融合,就可以脱离人了?

之前的这类留言,我都保留了。以后这类反智留言我会直接删除,这类人会直接被拉黑,咱们互不打扰。

查看全文
默认 最新
ansys结构交流群