在有限元计算中,可能会碰到材料参数(这里以线弹性材料弹性模量E为例)在模型中并不为常值的情况,例如,E与某一坐标相关。大家知道,abaqus材料中材料是在*section对截面属性定义的时候对单元组进行赋值的。并且GUI中也没有提供变参数的接口(这里顺路提一下,载荷是可以通过函数给出变载荷的,GUI中有接口)。这就需要我们采取一些特殊的措施。在CAE-lab前文《Abaqus中计材料参数不为常数的两种处理方法》中, 给大家介绍了‘编辑inp文件’和‘使用Umat’两种方法,这里就给大家介绍一下用python脚本实现的方法。
| 方法 | 要求 | 难度 |
| 编辑inp | 会一门编程语言,能够完成对文本文件的读取和写入 | 4星 |
| 使用Umat | 会使用abaqus的Umat用户子程序,计算文件中不需要使用其它的用户子程序 | 3星(如果对abaqus用户子程序不熟悉,则为5星) |
| Python脚本 | 会python基础,对python编写abaqus脚本了解 | 3星(如果对python脚本不熟悉,则为5星) |
Python大法在abaqus前后处理中具有举足轻重地位和天然的优势,通过python给单元赋材料属性非常简单,本例中,假设每个单元的弹性模量不一样,并且是一个函数,我们的思路就是遍历所有的单元,给每一个单元定义一种材料。具体实现如下:
1.模型
以简单的Cube模型为例,如图1,注意由于我们是遍历单元赋材料,Abaqus中模型必须在划分好网格后在进行赋材料属性。

图1 网格模型图
2. python脚本
下面的代码较为简单,注释也比较清楚,本例中的E的变化是贴主随意给的,实际中E可能是各种形式,具体案例具体分析。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | mymodel = mdb.models[ 'Cube' ] # 获取模型 mypart = mdb.models[ 'Cube' ].parts[ 'Cube' ] #获取part for ele_index in mypart.elements: #单元循环 ele = ele_index.label #单元编号 node = ele_index.getNodes() #单元节点坐标 Matname = 'Steel' + str (ele) #材料名 mySteel = mymodel.Material(name = Matname) #创建材料 EE = ele * 1000 + 100.E3 # 变化的材料参数 可以是坐标的函数 或者其他 elasticProperties = (EE, 0.3 ) mySteel.Elastic(table = (elasticProperties, ) ) #设置材料参数 sectionname = 'CubeSec' + str (ele) mySection = mymodel.HomogeneousSolidSection(name = sectionname,material = Matname, thickness = 1.0 ) #创建section elements = mypart.elements[ 0 ] setname = 'set' + str (ele) region = mypart. Set (elements = mypart.elements[ele - 1 :ele], name = setname) # 这里elements要为A sequence of MeshElement objects 即类型为tuple mypart.SectionAssignment(region = region, sectionName = sectionname) #赋材料属性 |
3.结果
赋材料后,以材料区分来显示模型,可见每个单元的材料都不一样,在模型树菜单也可以看到,python脚本建立了125种材料(共125个单元)


图2 不同单元的材料

图3 计算结果
4.总结
我们介绍的三种方法都能很好的解决材料参数不为常数的问题,编辑inp和python对单元较少时运行效率较高,但是单元较多时,Umat用起来可能更方便,大家可以都尝试一下。返回搜狐,查看更多