分享

「譯」一小时学会写Abaqus 脚本

 伊伊爸 2023-10-06 发布于海南

Learn Abaqus script in one hour

Original author: J.T.B Overvelde

引言

Abaqus脚本是一个强大的处理工具,它能够有效地将Abaqus的GUI功能和Python功能结合起来。这一教程不是一个完整的Abaqus脚本手册,只是从实用的角度出发对Abaqus脚本的简要介绍。如果你对Abaqus的GUI及有限元法不熟悉,那你最好先去了解一下它们再来阅读这份教程。当然,你无需对inp文件的结构非常熟悉。正常的话,完整阅读这份文档不会花费你超过2个小时。

这份教程将主要介绍一下几个主题

  • 使用GUI创建简单模型;

  • 创建你的第一个模型数据库脚本文件(mdb);

  • 使用GUI输出数据;

  • 创建你的第一个输出数据库脚本文件(odb);

  • 修改脚本文件实现其他功能的例子;

  • 进一步使用脚本的一些建议。

创建脚本文件的基本原则如下

  • 创建和保存模型;

  • 用Abaqus生成的文件创建脚本文件;

  • 创建Output(输出);

  • 运行生成的脚本文件重新计算;

  • 修改脚本文件来创建一个不同的模型和输出。

有经验的Abaqus用户应该知道,使用Abaqus的GUI数值模拟时会生成一个inp文件。脚本文件运行时也一样,会生成一个inp文件并传递给求解器。

使用GUI创建简单模型

我使用的版本是Abaqus cae 6.8-2,但Abaqus不同版本界面的差别不大,更早或之后的版本也大同小异。

图片

首先启动Abaqus CAE,进入如上图GUI界面。上图中已经示意了几个将会用到的按钮和窗口部件。选择一个可用的工作目录(Working directory),操作产生的文件会出现在这一目录中。
创建模型之前,在脚本窗口键入一行命令,然后点击脚本键执行这一命令,键入的内容为:

session.journalOptions.setValues(replayGeometry=COORDINATE, recoverGeometry=COORDINATE)

命令执行后GUI界面不会出现什么明显变化,实际上,这一命令将使使用Python语言创建sets、surfaces、选择region等操作的脚本更具可读性。如果不理解也不必纠结于此。
下面开始创建一个模型,步骤如下:

  • 创建Part:2D Plannar,Deformable, Shell, Approximate size: 20;

  • 创建Rectangle(矩形):控制点为坐标(-5, -1)和(5, 1);

  • 创建Material:Linear elastic(线弹性),E=1e9,v=0.3;

  • 创建Section(截面):Solid, Homogeneous,选用上一步中的材料;

  • 添加截面到Part中;

  • 创建Set(节点集):Left edge

  • 创建Surface(面):Top edge

  • Mesh(网格):Mesh control设为structured and quad;

  • Mesh:Element type设为Standard, quadratic, plannar stress;

  • Mesh:以 0.5 的 globle size 撒种子,然后 mesh part;

  • Assembly(组装):创建 Part Instance;

  • Step(分析步):创建 General Static step, 并将 Nlgeom 设置为 on, initial 和 maximum 将 increment size 设为 0.1;

  • BC(边界条件):在创建的 set 上加 displacement(位移),U1=U2=UR3=0;

  • Load(荷载):在创建的 surface 上施加 pressure(分布荷载),设置 magnitude(大小) 为-1e-5;

  • Job(任务):创建一个名为 EXAMPLE 的 Job 并提交分析;

  • Save As(另存为):命名为 EXAMPLE(.cae)。

到此为止,你已经创建了一个完整模型。正常情况下,工作目录下应该生成了文件”EXAMPLE.jnl”。

创建你的第一个模型数据库脚本文件(mdb)

我们从创建脚本文件开始。打开'EXAMPLE.jnl’文件,并将该文件另存为 'EXAMPLE.py’ 。我将在文档的最后附上'EXAMPLE.py’的内容。Python 文件看 起来一团糟,给他建立一个结构是一个好的习惯。让我带你来浏览一下代码,告 诉你脚本的每一行分属那一块。 对这些脚本的透彻的理解还需要更多的经验和练 习。但是,试试看吧,看你能不能识别出一些你在用户图形界面中的操作。

# -*- coding: mbcs -*-

这一行是注释,所以不会被编译。需要了解的是Python中注释的格式是以”#”作为注释的命令。


from part import * from material import * from section import * from assembly import * from step import * from interaction import * from load import * from mesh import * from job import * from sketch import * from visualization import * from connectorBehavior import *

由于我们在Python环境下执行脚本,许多Abaqus的命令并不包含在原始的Python环境中。这段命令就可以在脚本中引入Abaqus相关的模块功能。


mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=20.0)
mdb.models['Model-1'].sketches['__profile__'].rectangle(point1=(-5.0, -1.0),
point2=(5.0, 1.0))
mdb.models['Model-1'].Part(dimensionality=TWO_D_PLANAR, name='Part-1', type=
DEFORMABLE_BODY)
mdb.models['Model-1'].parts['Part-1'].BaseShell(sketch=
mdb.models['Model-1'].sketches['__profile__'])
del mdb.models['Model-1'].sketches['__profile__']

这一段命令就是在创建Sketch和Part。


mdb.models['Model-1'].Material(name='Material-1') mdb.models['Model-1'].materials['Material-1'].Elastic(table=((1000000000.0, 0.3), )) mdb.models['Model-1'].HomogeneousSolidSection(material='Material-1', name= 'Section-1', thickness=None) mdb.models['Model-1'].parts['Part-1'].SectionAssignment(offset=0.0, offsetField='', offsetType=MIDDLE_SURFACE, region=Region( faces=mdb.models['Model-1'].parts['Part-1'].faces.findAt(((-1.666667, -0.333333, 0.0), (0.0, 0.0, 1.0)), )), sectionName='Section-1')

这段命令是在执行创建Material、Section及SectionAssignment的功能。


mdb.models['Model-1'].parts['Part-1'].Set(edges=
mdb.models['Model-1'].parts['Part-1'].edges.findAt(((-5.0, -0.5, 0.0), )),
name='Set-1')
mdb.models['Model-1'].parts['Part-1'].Surface(name='Surf-1', side1Edges=
mdb.models['Model-1'].parts['Part-1'].edges.findAt(((-2.5, 1.0, 0.0), )))

这里创建了Set和Surface。注意:每一行结尾的”findAt”命令,这个命令是被用于 替代 getSequenceFromMask(abaqus 用的数字系统) ,因为我们是在建立 abaqus 模型之前将指令输入脚本窗口。


mdb.models['Model-1'].parts['Part-1'].setMeshControls(elemShape=QUAD, regions= mdb.models['Model-1'].parts['Part-1'].faces.findAt(((-1.666667, -0.333333, 0.0), )), technique=STRUCTURED) mdb.models['Model-1'].parts['Part-1'].setElementType(elemTypes=(ElemType( elemCode=CPS8R, elemLibrary=STANDARD), ElemType(elemCode=CPS6M, elemLibrary=STANDARD)), regions=( mdb.models['Model-1'].parts['Part-1'].faces.findAt(((-1.666667, -0.333333, 0.0), )), )) mdb.models['Model-1'].parts['Part-1'].seedPart(deviationFactor=0.1, size=0.5) mdb.models['Model-1'].parts['Part-1'].generateMesh()

这段命令设置了Mesh Control、Element Type并执行Mesh


mdb.models['Model-1'].rootAssembly.DatumCsysByDefault(CARTESIAN)
mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='Part-1-1',
part=mdb.models['Model-1'].parts['Part-1'])
mdb.models['Model-1'].rootAssembly.regenerate()

这段命令相当于组装过程。注意,当用到 rootAssembly 时,你不必须给出 assembly 的一个名称,当然这只是因为这里只有一个装配件。


mdb.models['Model-1'].StaticStep(initialInc=0.1, maxInc=0.1, name='Step-1', previous='Initial') mdb.models['Model-1'].DisplacementBC(amplitude=UNSET, createStepName='Step-1', distributionType=UNIFORM, fieldName='', fixed=OFF, localCsys=None, name= 'BC-1', region= mdb.models['Model-1'].rootAssembly.instances['Part-1-1'].sets['Set-1'], u1= 0.0, u2=0.0, ur3=0.0) mdb.models['Model-1'].Pressure(amplitude=UNSET, createStepName='Step-1', distributionType=UNIFORM, field='', magnitude=-100000.0, name='Load-1', region= mdb.models['Model-1'].rootAssembly.instances['Part-1-1'].surfaces['Surf-1'])

这一部分指令相当于施加了边界条件和荷载。


mdb.Job(contactPrint=OFF, description='', echoPrint=OFF, explicitPrecision=
SINGLE, historyPrint=OFF, memory=90, memoryUnits=PERCENTAGE, model=
'Model-1', modelPrint=OFF, multiprocessingMode=DEFAULT, name='EXAMPLE',
nodalOutputPrecision=SINGLE, numCpus=1, numDomains=1,
parallelizationMethodExplicit=DOMAIN, scratch='', type=ANALYSIS,
userSubroutine='')
mdb.jobs['EXAMPLE'].submit(consistencyChecking=OFF)

这里创建了 job 并提交 job 进行分析。这些代码后面的所有行都是不重要的 信息,你可以删去他们。

在运行这个脚本之前,将你工作目录下除去'EXAMPLE.py’的左右文件都删掉。 如果你的用户图形界面还打开着一个新的模型, 请不要保存任何东西。 现在, 在左上角的菜单栏中点击 File,然后点击 Run script…,然后选择你的脚本文件。 如果每一步都准确无误的完成了,那么你的模型应该没有什么问题。确保文件 'EXAMPLE.odb’存在于你的工作目录下。如果你没有在你的工作目录下把之前 的文件删除,abaqus 将会覆盖他们。这不会出现任何问题,不过,这里的目的 是为了让你看看 odb 文件被创建的过程。

使用GUI输出数据

关闭后重新打开 abaqus CAE 来重新记录脚本。 现在点击左上角菜单栏的 File 点击'Open…’ ,在工作目录下选择并打开文件'EXAMPLE.odb’ 。我们用创建模 型脚本一样的方法创建输出文件的脚本。 最重要的不同之处在于这个过程被记录 在'Abaqus.rpy’中而不是'EXAMPLE.jnl’ 。让我们在变形情况下创建一个应力 的图形,按如下步骤操作: Plot 变形状态下的应力。在 File 中点击 print,destination 选择 file,保存.tiff 格式的图形。命名为 EXAMPLE。 你必须要保存 odb 文件。 确保 abaqus.rpy 存在于你的工作目录下。 如果你找 不到你可以试试在启动 abaqus CAE 的原始工作目录下找找看。

创建你的第一个输出数据库脚本文件(odb)

将'abaqus.rpy’保存为'EXAMPLE_ODB.py’ 。这个脚本文件的内容在附件 中给出。下面是一个简短的脚本文件。


from abaqus import * from abaqusConstants import * session.Viewport(name='Viewport: 1', origin=(0.0, 0.0), width=268.952117919922, height=154.15299987793) session.viewports['Viewport: 1'].makeCurrent() session.viewports['Viewport: 1'].maximize() executeOnCaeStartup() o1 = session.openOdb(name='/home/overveld/ScriptManual/EXAMPLE.odb') session.viewports['Viewport: 1'].setValues(displayedObject=o1)

这一步相当于引入了一些模块,创建了一个视图,打开odb文件。


session.viewports['Viewport: 1'].odbDisplay.display.setValues(plotState=(
CONTOURS_ON_DEF, ))
session.printToFile(fileName='EXAMPLE', format=TIFF, canvasObjects=(
session.viewports['Viewport: 1'], ))

这一步设置了显示的图形是受力变形后的应力并将图形保存。

修改脚本文件实现其他功能的例子

我将给出一个修改脚本的范例。修改的地方有两处:

  • 不同于用固定的数值创建Part,我将修改脚本文件开头的两处内容来创建形状可变的Part。

  • 让 mdb 和 odb 文件结合。

附件里给出了这些文件,并且修改的地方都有注释。我不在详细地解释这些指令,你可以作为一个联系去解读它。

这里我不再从GUI界面运行这些脚本,而是直接从命令窗运行。用下面两条命令即可:

abaqus cae script=EXAMPLE_MDB.py abaqus cae noGUI=EXAMPLE_MDB.py

第一行会打开Abaqus cae,你会看到中间过程。后面一行命令则不会打开GUI界面,你只能看到结果。

进一步使用脚本的一些建议

截至到这里,你应该已经比较熟悉我们的操作方法了:让Abaqus来做那些繁琐的工作,组织文件,反复运行。我希望我没有食言,你看到这里花费的时间应该不超过1小时。教程最后我还是给出几个实用的建议:

  • 你应该尽可能多的在日常的数值分析工作中实用Python语言写脚本,这是最好的学习方式。我从头开始到写下这份教程也是用了两个半月时间学习和写脚本。

  • 关于Python的资料在网上非常容易获得。搜索引擎就是一个很好的获取资料的工具。你可能搜集到直接与脚本将官的内容不多,试试这里:http://abaqusdoc./v6.9/。这是一个包含了所有脚本指令的完整的参考手册。

  • 试试从MatLab里调用Abaqus cae。MatLab提供了强大的数学工具箱,试试这些命令:

    • unix([abaqus cae script=EXAMPLE_MDB.py])

    • system([abaqus cae script=EXAMPLE_MDB.py])

附件

脚本文件可点击原文,参阅文本的英文原始文件。
http:///files/sorotoolkit/files/learnabaqusscriptinonehour.pdf

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多