2022年Abaqus+python入门体会[参 .pdf
Abaqus/python 入门体会(初稿)长安大学 姜峰林 2009.2.1 #= 自己的论文要用到有限元进行数值模拟分析,以前都用 ansys 计算, 可 ansys中岩土的本构模型只有DP 模型,无法准确的反映土的硬化/软化性质,模拟计算出的结果因此也和实际差别很大。Abaqus 有着丰富的材料模型,超强的非线性分析能力, 岩土的模型也很多, 因此才转学Abaqus。Abaqus 的 cae建模功能还是很好的,但科研课题一般都要进行参数分析,采用cae 的建模方法有些不切实际,学了没几天就放弃cae开始学习 inp,也是学了一阵子才知道inp 不能建立实体模型,只能直接建节点和单元。复杂的模型inp 也无法建立,但采用 Python 建模就可以解决这个问题。由于 Abaqus 的学习资料不多,过了好些日子才知道Abaqus 也可以采用Python 语言进行建模计算,只是比Ansys 的 Apdl 语言复杂得多,并且除了手册上的 Script 资料之外,没有较为系统的教程,刚一接触真是让人头痛。通过查看 Simwe 论坛上关于Python 的帖子,和论坛朋友的帮助,自己在慢慢积累,现在对 Python 有了一点点了解,算是入了个门。接触 Abaqus 也没多久,对python 更是一知半解,绝大多数地方根本都不清楚,抽空写一点认识体会主要是给像自己一样刚学习Abqus Python 的朋友,能少走一些弯路,节约一些时间。同时希望大家批评指正、共同讨论、补充。#- 学习 Abaqus/Python 基础: Abaqus 的 cae 建模有比较全面的认识;了解一些 Python 语法知识(大家都不会有太多时间单独学习Python 语言本身,只需要有概念了解即可,不懂的地方可以随时查询Python script 手册)Abaqus/Python 学会使用不太难,可要精通应用还是要付出一定的劳动。大家所分析的课题专业不同,方向也千差万别,所用到的Abaqus 的功能也就有很大的差别,能对自己的工作领域熟练应用就算成功。Abaqus 毕竟只是软件,如何考虑专业知识成功建模才是最困难的。#- 1. Python 与 Abaqus 2. Abaqus/Python 结构3.模型参数分析技巧4.几个命令的体会5.一个 Abaqus/Python 例子#- 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 15 页 - - - - - - - - - #= 1. Python 与 Abaqus 1.1 Python 简介Python 是面向对象的语言。面向对象的语言自己的理解为:语言本身已经定义了许多固定模块,如数学函数、对显示模式的控制、一些对话框的编写等等程序模块,只需要按照程序的指定格式填空即可完成既定任务,格式相对比较固定,因此语言格式看起来非常繁琐,但方便实用能够大量节约程序员的时间。面向对象语言的使用方式可以比喻为:一棵树分为树干、树枝、细枝和树叶等部分,你要是想得到一个确定位置的树叶(且具大小等属性)只有一个路径可以走即树干树枝细枝树叶,换成面向对象的格式为树干 .树枝 .细枝.树叶 (树叶片数或大小等属性)。以下是 abaqus中 Python 的一般格式, 这些格式都是固定的,我们只需要改变其中的参数即可:mdb.modelsModel-1.ConstrainedSketch(name=_profile_, sheetSize=0.3) s = mdb.modelsModel-1.ConstrainedSketch(name=_profile_, sheetSize=0.3) s.sketchOptions.setValues(decimalPlaces=3, viewStyle=AXISYM) s.setPrimaryObject(option=STANDALONE) s.ConstructionLine(point1=(0.0, -100.0), point2=(0.0, 100.0) Python有着较强的逻辑控制语句如if 、for、while等,可以通过循环或条件等语句把复杂且重复的操作变得简单易于操作,也是用参数化编程较cae的最大优势。1.2 如何学 abaqus Python 命令 Abaqus 是采用Python 语言编制而成,在cae 中所有的操作都可以通过Python 脚本命令完成(注:好像Python 并不能完全取代inp 文件,一些材料属性的参数好像要用inp 才能赋值)。学会用 python reader程序Abaqus cae可以自动生成python 文件,存放在工作目录的 abaqus.rpy 文件中,每一步cae 操作都会产生相应的python 命令。可以通过simwe 网友ck436ck436 编写的 python reader 程序 实时读取产生的命令,反复揣摩、 领会每个命令,很快就会有所提高,对python 的命令有所领悟。与 cae 建模相同, Python 建模也分为: part、property、assembly、step、ineraction、load、mesh、job 等模块,具体每个模块中的建模命令可参考Python reader 读取的命令学习,我们只需去记忆常用的Python 命令。以下是 python reader 程序下载地址。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 15 页 - - - - - - - - - http:/ 1.3 Abaqus/Python学习资料关于 Python 的学习资料非常多,如Swaroop, C.H. 著沈洁元译的简明Python 教程就是很好的参考资料。 王纯业的Python 学习笔记也不错,simwe论坛可以下载到。另外就是 Abaqus 手册:Abaqus Scripting Users ManualAbaqus Scripting Reference ManualGetting Started with Abaqus: Interactive EditionAbaqus 手册真是冗长,只能是根据自己的课题有选择的查阅。#= 2. Abaqus/Python结构Abaqus的object model 分为session、mdb和odb三个objects,session为视图模块、 mdb为模型数据模块、odb为数据输入输出模块。每个object下面又有很多命令分支,直到执行到所需要的具体命令。以下各图选自 Abaqus Scripting Users Manual,更多书面的的解释可以参考abaqus 手册。每个 object 都像一棵树,要执行某个命令就需要按照python 的面向对象的格式进行。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 15 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 15 页 - - - - - - - - - 例如: cell4 = mdb.modelsblock.partscrankcase.cells4,要把 part 模块中编号为 4 的体赋值给cell4,就需通过路径mdbmodelspartcells(4 号体属性),其中 block、crankcase、分别是 model 和 part 的名字。在草图 Sketch 中画线:s = mdb.models block .ConstrainedSketch(name=grid, sheetSize=3.0) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 15 页 - - - - - - - - - s.Line(point1=(-1.275, 0.0), point2=(-1.125, 0.0) s.Line(point1=(1.125, 0.0), point2=(1.275, 0.0) 执行任何一条命令都必须按照结构树的格式进行操作。我们所看到的python 脚本繁杂的语句就是这样形成的。这样大量的命令不能在短时间内掌握,我们只需要根据自己的需要边建立模型边学习就可以了。a = mdb.modelsModel-1.rootAssembly s = a.instancesMount-1.edges side1Edges = s.findAt(0.0475, 0.0, 0.0), ) 以 上 三 行与 下 面 的 句 子是 等 同 的 , 即把 findat找 到 的edges 赋 值 给side1Edges。分开来写简单明了,大大缩短了语句的长度。side1Edges = mdb.modelsModel-1.rootAssembly. instancesMount-1.edges. findAt(0.0475, 0.0, 0.0), ) a.Surface(side1Edges=side1Edges, name=Bottom),这行语句设置side1Edges所对应的 edge为名称 Bottom 的 surface 的 set。#= 3.模型参数分析技巧 Python脚本建模的好处就是可以进行参数分析,即改变我们要分析模型的几何尺寸、材料属性等可变参数,对数值模型进行求解计算,从而对所分析的对象有更全面的了解。1对自己要进行参数分析的参数赋值:如几何尺寸或材料属性等a120,b130,c140,命名要符合python 规则。2.cae与 Python 混合建模,不会的命令就利用cae自动生成,用 Python reader记录命令然后进行修改,可以弥补不熟悉Python 的缺点; 3.逐句修改 Python 脚本,可以去掉一些不必要的语句并在cae 中逐句进行验证。#= 4. 几个命令的体会4.1 Set ( ) Set命令在 python 建模时要经常用到,对实体、surface、element 等分组,方便加载、施加约束和单元生死等控制4.2 Findat ( ) 对 cell、edge、face、vertice 进行查找,括号中参数为实体坐标名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 15 页 - - - - - - - - - p = mdb.modelsModel-1.partsMount f = p.faces faces = f.findAt(0.042303, 0.006937, 0.0), ) pickedRegions =(faces, ) p.setElementType(regions=pickedRegions, elemTypes=(elemType1, elemType2) 4.3 Len ( ) 利用 len 命令可以实现对单元选取p = mdb.modelsprecast culvert.partssoil e = p.elements len(e) n1=len(e) elements = e1:n1 #单元数存放在e 的一维数组里p.Set(elements=elements, name=Set-3) 对单元进行编组set,可以进行生死单元的控制,我摸索了好久才想到这个办法,目前只在二维模型应用过,三维也应该没问题。Abaqus 没有办法对单元编号进行编号控制,也没有像ansys那样有效的选择命令,怎样选择abaqus的单元就是很头疼的问题,我要做路堤的分层回填模拟,手动选取单元根本就没有可能。 Abaqus 的编号其实是有规则的,后划分的单元编号最小,先划分的单元编号最大;这样我们就可以每次划分单元后都采用len 命令计算一次单元数量,并用参数记录下来,这样我们就能计算出每部分单元的数量以及他的起始和终止编号。根据elements = e1:n1、p.Set(elements=elements, name=Set-3) 语句就可以把每部分单元设置成set,以后操作就很方便了。#= 5. 一个 Abaqus/Python例子下面是一个 Getting Started with Abaqus: Interactive Edition中的一个橡胶避震垫例子: ? 号后语句表示我的注释,注释上面的句子。我也不懂的就没有注释,先熟悉一下 Python的样子。在学习的时候可以copy(Crtol + V )到 cae下面的命令行中一句句的执行,并在cae视窗中查看命令执行情况,领会命令使用方法。# Script for rubber mount example 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 15 页 - - - - - - - - - ? “#”开头表示这一行为注释行,同ansys的“!”号 from abaqus import * from abaqusConstants import * ? 引入 abaqus中的一些模块,这些模块是abaqus已事先存储在文件中,要引入才这些模块能运行相应的命令 session.viewportsViewport: 1.makeCurrent() session.viewportsViewport: 1.maximize() session.journalOptions.setValues(replayGeometry=COORDINATE, recoverGeometry=COORDINATE) ? 对cae视窗的操作命令;maximize() 的括号好像是默认为当前值 from caeModules import * from driverUtils import executeOnCaeStartup executeOnCaeStartup() Mdb() #- # Sketch profile of the mount ? 进入草图模块 s = mdb.modelsModel-1.ConstrainedSketch(name=_profile_, sheetSize=0.3) ? 建立一个 sketch 草图,草图的尺寸为0.3 个单位;这个句子算是一个标准的Python语句,具体后面解释 g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints s.sketchOptions.setValues(decimalPlaces=3, viewStyle=AXISYM) s.setPrimaryObject(option=STANDALONE) ? 设置草图为轴对称模式 s.ConstructionLine(point1=(0.0, -100.0), point2=(0.0, 100.0) s.FixedConstraint(entity=g2) ? 建立辅助线及约束 mdb.modelsModel-1.sketches_profile_.sketchOptions.setValues(gridFrequency=4) ? sketch 参数修改 s.rectangle(point1=(0.01, 0.0), point2=(0.025, 0.01) ? 画矩形 s.DistanceDimension(entity1=g2, entity2=v0,textPoint=(0.00998260825872421, -0.00830297358334064), value=0.01) s.VerticalDimension(vertex1=v0,vertex2=v1,textPoint=(0.0,0.00851448811590672), value=0.03) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 15 页 - - - - - - - - - s.ObliqueDimension(vertex1=v0,vertex2=v3,textPoint=(0.025699570775032, -0.00830297358334064), value=0.05) ? 标注图形尺寸,还可以修改图形尺寸,如拉伸、压缩等 s.CircleByCenterPerimeter(center=(0.085,0.025),point1=(0.06, 0.00740899052470922) ? 画圆 s.CoincidentConstraint(entity1=v5, entity2=g5) s.DistanceDimension(entity1=g2, entity2=v4,textPoint=(0.0811913833022118, -0.023865295574069), value=0.1) s.VerticalDimension(vertex1=v2, vertex2=v4,textPoint=(0.115524396300316, 0.0262394621968269), value=0.0) s.ObliqueDimension(vertex1=v5, vertex2=v3,textPoint=(0.0519323498010635, 0.0), value=0.005) ? 修改圆尺寸、移动位置 没搞清楚修改尺寸命令有什么实际意义,直接定义好尺寸不就结了? s.autoTrimCurve(curve1=g7,point1=(0.124150268733501,-0.00965208746492863) ? 裁剪命令,其中g7 是圆的线编号,g=s.geometry s.autoTrimCurve(curve1=g5,point1=(0.0601795427501202,0.020298857241869) s.autoTrimCurve(curve1=g4,point1=(0.0557677671313286,0.030869778245687) ? 裁剪命令s.RadialDimension(curve=g8,textPoint=(0.0725325122475624,0.0207393132150173),radius=0.047169905660283) d6.setValues(reference=ON) ? 标注命令,标注界面很漂亮session.viewportsViewport: 1.view.fitView() ? cae图形缩放的合适大小p = mdb.modelsModel-1.Part(name=Mount, dimensionality=AXISYMMETRIC, type=DEFORMABLE_BODY) p = mdb.modelsModel-1.partsMount ? 命名 modelp.BaseShell(sketch=s) s.unsetPrimaryObject() session.viewportsViewport: 1.setValues( displayedObject=p) del mdb.modelsModel-1.sketches_profile_ ? 显示 model名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 15 页 - - - - - - - - - #- # Create material Rubber ? 创建材料模型mdb.modelsModel-1.Material(Rubber) mdb.modelsModel-1.materialsRubber.Hyperelastic(type=POLYNOMIAL, table=() mdb.modelsModel-1.materialsRubber.hyperelastic.UniaxialTestData(table=( 0.054E6, 0.0380), (0.152E6, 0.1338), (0.254E6, 0.2210), (0.362E6, 0.3450), (0.459E6, 0.4600), (0.583E6, 0.6242), (0.656E6, 0.8510), (0.730E6, 1.4268) mdb.modelsModel-1.materialsRubber.hyperelastic.BiaxialTestData(table=(0.089E6, 0.0200), (0.255E6, 0.1400), (0.503E6, 0.4200), (0.958E6, 1.4900), (1.703E6, 2.7500), (2.413E6, 3.4500) mdb.modelsModel-1.materialsRubber.hyperelastic.PlanarTestData(table=(0.055E6, 0.0690), (0.324E6, 0.2828), (0.758E6, 1.3862), (1.269E6, 3.0345), (1.779E6, 4.0621) # # Create material Steel # mdb.modelsModel-1.Material(Steel) mdb.modelsModel-1.materialsSteel.Elastic(table=(200.E9, 0.3), ) # # Create solid sections for the rubber and steel # mdb.modelsModel-1.HomogeneousSolidSection(name=RubberSection, material=Rubber, thickness=1.0) mdb.modelsModel-1.HomogeneousSolidSection(name=SteelSection, material=Steel, thickness=1.0) #- # Partition the part into two regions (rubber and steel regions) ? 切割体形成两个部分,从而可以赋予不同材料属性f, e, d = p.faces, p.edges, p.datums t =p.MakeSketchTransform(sketchPlane=f.findAt(coordinates=(0.043333, 0.001667,0.0),normal=(0.0,0.0,1.0),sketchPlaneSide=SIDE1, origin=(0.033052,0.014514, 0.0) s = mdb.modelsModel-1.ConstrainedSketch(name=_profile_, sheetSize=0.134, gridSpacing=0.003, transform=t) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 15 页 - - - - - - - - - g, v, d1, c = s.geometry, s.vertices, s.dimensions, s.constraints s.sketchOptions.setValues(decimalPlaces=3) s.setPrimaryObject(option=SUPERIMPOSE) p.projectReferencesOntoSketch(sketch=s, filter=COPLANAR_EDGES) ? 进入草图,并设置草图属性(图纸大小、网格间距等)s.Line(point1=(0.026948, -0.009514), point2=(-0.03, -0.009514) s.HorizontalConstraint(entity=g.findAt(-0.001526, -0.009514) s.PerpendicularConstraint(entity1=g.findAt(0.026948, -0.012014), entity2=g.findAt(-0.001526, -0.009514) ? 作辅助线, findat(查找)命令很有用,可以用来选择实体pickedFaces = f.findAt(0.043333, 0.001667, 0.0), ) p.PartitionFaceBySketch(faces=pickedFaces, sketch=s) ? 用辅助线分割体s.unsetPrimaryObject() ? 显示分割后体del mdb.modelsModel-1.sketches_profile_ #- # Assign rubber section ? 实体指定不同的材料属性p = mdb.modelsModel-1.partsMount f = p.faces faces = f.findAt(0.042303, 0.006937, 0.0), ) region = regionToolset.Region(faces=faces) p.SectionAssignment(region=region, sectionName=RubberSection, offset=0.0) # # Assign steel section # faces = f.findAt(0.043333, 0.003333, 0.0), ) region = regionToolset.Region(faces=faces) p.SectionAssignment(region=region, sectionName=SteelSection, offset=0.0) a = mdb.modelsModel-1.rootAssembly session.viewportsViewport: 1.setValues(displayedObject=a) # # Set coordinate system (done by default) # a.DatumCsysByDefault(CARTESIAN) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 15 页 - - - - - - - - - # # Instance the mount # p = mdb.modelsModel-1.partsMount a.Instance(name=Mount-1, part=p, dependent=ON) # # Create geometry set Middle # e = a.instancesMount-1.edges edges = e.findAt(0.020708, 0.03, 0.0), ) a.Set(edges=edges, name=Middle) ? 通过 findat命令定义了一个edges组“ Middle ”# Create geometry set Out # v = a.instancesMount-1.vertices verts = v.findAt(0.01, 0.0, 0.0), ) a.Set(vertices=verts, name=Out) ? 通过 findat命令定义了一个vertices组“ Out”# Create surface Bottom # s = a.instancesMount-1.edges side1Edges = s.findAt(0.0475, 0.0, 0.0), ) a.Surface(side1Edges=side1Edges, name=Bottom) ? 通过 findat命令定义了一个edges组“ Bottom ”#- # Create a static general step ? 进入 step 模块mdb.modelsModel-1.StaticStep(name=Compress mount, previous=Initial, description=Apply axial pressure load to mount, timePeriod=1, adiabatic=OFF, maxNumInc=100, stabilization=None, timeIncrementationMethod=AUTOMATIC, initialInc=0.01, minInc=1e-05, maxInc=1, matrixSolver=SOLVER_DEFAULT, amplitude=RAMP, extrapolation=LINEAR, fullyPlastic=, nlgeom=ON) ? step 中的一些设置,与cae操作框相对应session.viewportsViewport: 1.assemblyDisplay.setValues( step=Compress mount) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 15 页 - - - - - - - - - ? cae中显示 step 模块 Compress mount # # Modify output requests # mdb.modelsModel-1.fieldOutputRequestsF-Output-1.setValues( variables=(S, PE, PEEQ, PEMAG, NE, LE, U, RF, CF, CSTRESS, CDISP) ? 对结果数据输出的一些定义regionDef=a.setsOut mdb.modelsModel-1.HistoryOutputRequest(name=H-Output-1, createStepName=Compress mount, variables=(U1, U2, U3), region=regionDef) session.viewportsViewport: 1.assemblyDisplay.setValues(loads=ON, bcs=ON, predefinedFields=ON) #- # Apply pressure load ? 进入 load 模块region = a.surfacesBottom mdb.modelsModel-1.Pressure(name=Pressure, createStepName=Compress mount, region=region, magnitude=500000.0) ? 通过 bottom 的set 对底边进行加载# Apply symmetry bc to set Middle # region = a.setsMiddle mdb.modelsModel-1.DisplacementBC(name=Symmetry, createStepName=Compress mount, region=region, u2=0.0) ? 对顶面进行约束# Suppress visibility of datum geometry # session.viewportsViewport: 1.assemblyDisplay.geometryOptions.setValues( geometryEdgesInShaded=OFF, datumPoints=OFF, datumAxes=OFF, datumPlanes=OFF,datumCoordSystems=OFF) session.viewportsViewport: 1.assemblyDisplay.setValues(mesh=ON, loads=OFF, bcs=OFF, predefinedFields=OFF) session.viewportsViewport: 1.assemblyDisplay.meshOptions.setValues( meshTechnique=ON) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 15 页 - - - - - - - - - p = mdb.modelsModel-1.partsMount session.viewportsViewport: 1.setValues(displayedObject=p) ? mesh 模块的一些显示设置#- # Assign edge seeds ? 进入 mesh 模块p = mdb.modelsModel-1.partsMount e = p.edges pickedEdges = e.findAt(0.0225, 0.005, 0.0), ), (0.0475, 0.0, 0.0), ), (0.020708, 0.03, 0.0), ) p.seedEdgeByNumber(edges=pickedEdges, number=30) pickedEdges = e.findAt(0.053289, 0.023434, 0.0), ), (0.01, 0.01125, 0.0), ) p.seedEdgeByNumber(edges=pickedEdges, number=14) pickedEdges = e.findAt(0.01, 0.00125, 0.0), ), (0.06, 0.00375, 0.0), ) p.seedEdgeByNumber(edges=pickedEdges, number=1) ? 选择边,设置种子数# Use structured meshing # f = p.faces pickedRegions = f p.setMeshControls(regions=pickedRegions, technique=STRUCTURED) ? STRUCTURED划分网格# Assign element type to the rubber # elemType1 = mesh.ElemType(elemCode=CAX4H, elemLibrary=STANDARD) elemType2 = mesh.ElemType(elemCode=CAX3, elemLibrary=STANDARD) faces = f.findAt(0.042303, 0.006937, 0.0), ) pickedRegions =(faces, ) p.setElementType(regions=pickedRegions, elemTypes=(elemType1