python 重复(类似)结构或分析的快速建模
原帖:仿真科技论坛
作者:wufan3924
用 python 语言建模相对于 cae 建模有很多优势,个人感觉主要有下面几个:
1、直观,易于保存,重复利用。
abaqus 模型和任务的管理一直是一个大问题,py 文件相对于 cae 文件更加直观,且可以
在各种设备上查看(因为只是一些文本)
,注释方便,可以很容易的知道里面有什么(当然,这个需
要看得人对 abaqus 的 python 比较熟悉)
。我以前的 cae 模型利用率非常低,而 python 代码则比较高。
2、方便修改参数。
代码在参数化建模方面比 cae 要方便的多,在代码的最开始的地方将需要研究的参数提
取出来,每次分析修改文本中的某个数,run script 就可以了。
还可以写一个循环,循环该参数的所有可能的值,提交多个多个任务(job)
。
3、重复结构或分析的快速建模。
个人认为这一条是 python 代码相较于 cae 建模优势最大的。如果你的结构有很多个重复
类似的结构,成百上千,在 cae 里面建模几乎是不可能的。而在 python 代码中,一个循环就可以实
现了,只要你找到了这些结构之间的关系。
其他的,还有诸如后处理,插件和界面构建等。下面通过一个简单的例子来说明一下第三条,重
复结构或分析的快速建模,用好了会大大节约自己的时间,做更多有意义的事情。
#-*- coding: utf8 -*-
# 导入必要的模块
from abaqus import *
from abaqusConstants import *
from caeModules import *
import numpy as np
Mdb()
# job 名称
Job_name = "Job-motor-flat-spring-1"
# 不同层的张角
theta =
[-67.1564,-67.1564,-69.44076,-71.72512,-74.00948,-76.29384,-78.5782,-80.86256,-83.14692,-85.43128]
theta1= [22.8436, 22.8436, 20.55924, 18.27488, 15.99052, 13.70616, 11.4218,9.13744,
6.85308, 4.56872]
# 不同层的拱高
R = [1529.9877 ,1537.9877 ,1545.9877 ,1553.9877 ,1561.9877 ,1569.9877 ,1577.9877
,1585.9877, 1593.9877, 1601.9877]
# 材料参数
Youngs = 207000.0
poisson = 0.3
# 创建材料和截面
mat1 = mdb.models['Model-1'].Material(name='Material-1')
mat1.Elastic(table=((Youngs, poisson), ))
mdb.models['Model-1'].HomogeneousShellSection(name='Section-1',
preIntegrate=OFF, material='Material-1', thicknessType=UNIFORM,
thickness=8.0, thicknessField='', idealization=NO_IDEALIZATION,
poissonDefinition=DEFAULT, thicknessModulus=None, temperature=GRADIENT,
useDensity=OFF, integrationRule=SIMPSON, numIntPts=5)
a = mdb.models['Model-1'].rootAssembly
a.DatumCsysByDefault(CARTESIAN)
# 创建一般静态分析步
# 第一个分析步是为了收敛而设置的接触分析步
mdb.models['Model-1'].StaticStep(name='Step-1', previous='Initial',
initialInc=0.1, maxInc=0.1, nlgeom=ON)
# 第二个分析步是载荷作用的分析步
mdb.models['Model-1'].StaticStep(name='Step-2', previous='Step-1',
initialInc=0.1, maxInc=0.1, nlgeom=ON)
# 创建接触属性
mdb.models['Model-1'].ContactProperty('IntProp-1')
mdb.models['Model-1'].interactionProperties['IntProp-1'].TangentialBehavior(
formulation=FRICTIONLESS)
mdb.models['Model-1'].interactionProperties['IntProp-1'].NormalBehavior(
pressureOverclosure=HARD, allowSeparation=ON,
constraintEnforcementMethod=DEFAULT)
# 利用循环创建多个 part 并划分网格,每个 part 是一个拱
for i in range(0,len(R)):
ss = theta1[i]/180*np.pi
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=4000.0)
g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.ConstructionLine(point1=(0.0, 0.0), angle=90.0)
s.ConstructionLine(point1=(0.0, 0.0), angle=theta[i])
s.ArcByCenterEnds(center=(0.0, 0.0), point1=(0.0, -R[i]), point2=(
R[i]*np.sin(ss), -R[i]*np.cos(ss)), direction=COUNTERCLOCKWISE)
p = mdb.models['Model-1'].Part(name='Part-%d'%(i+1), dimensionality=THREE_D,
type=DEFORMABLE_BODY)
p = mdb.models['Model-1'].parts['Part-%d'%(i+1)]
p.BaseShellExtrude(sketch=s, depth=75.0)
del mdb.models['Model-1'].sketches['__profile__']
p = mdb.models['Model-1'].parts['Part-%d'%(i+1)]
f = p.faces
faces = f.getSequenceFromMask(mask=('[#1 ]', ), )
region = p.Set(faces=faces, name='Set-1')
p.SectionAssignment(region=region, sectionName='Section-1', offset=0.0,
offsetType=BOTTOM_SURFACE, offsetField='', thicknessAssignment=FROM_SECTION)
p = mdb.models['Model-1'].parts['Part-%d'%(i+1)]
f = p.faces
faces = f.getSequenceFromMask(mask=('[#1 ]', ), )
region = regionToolset.Region(faces=faces)
mdb.models['Model-1'].parts['Part-%d'%(i+1)].MaterialOrientation(region=region,
orientationType=GLOBAL, axis=AXIS_1, additionalRotationType=ROTATION_NONE,
localCsys=None, fieldName='')
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['Part-%d'%(i+1)]
a.Instance(name='Part-%d-1'%(i+1), part=p, dependent=ON)
p = mdb.models['Model-1'].parts['Part-%d'%(i+1)]
p.seedPart(size=5.0, deviationFactor=0.1, minSizeFactor=0.1)
p.generateMesh()
# 利用循环创建各个拱之间的接触
for i in range(0,len(R)):
if i<9:
a = mdb.models['Model-1'].rootAssembly
s1 = a.instances['Part-%d-1'%(i+1)].faces
side1Faces1 = s1.getSequenceFromMask(mask=('[#1 ]', ), )
region1=a.Surface(side1Faces=side1Faces1, name='m_Surf-%d'%(i+1))
a = mdb.models['Model-1'].rootAssembly
s1 = a.instances['Part-%d-1'%(i+2)].faces
side2Faces1 = s1.getSequenceFromMask(mask=('[#1 ]', ), )
region2=a.Surface(side2Faces=side2Faces1, name='s_Surf-%d'%(i+1))
mdb.models['Model-1'].SurfaceToSurfaceContactStd(name='Int-%d'%(i+1),
createStepName='Step-1', master=region1, slave=region2, sliding=FINITE,
thickness=ON, interactionProperty='IntProp-1', adjustMethod=NONE,
initialClearance=OMIT, datumAxis=None, clearanceRegion=None)
# 施加对称边界条件
a = mdb.models['Model-1'].rootAssembly
e1 = a.instances['Part-1-1'].edges
edges1 = e1.getSequenceFromMask(mask=('[#2 ]', ), )
e2 = a.instances['Part-2-1'].edges
edges2 = e2.getSequenceFromMask(mask=('[#2 ]', ), )
e3 = a.instances['Part-3-1'].edges
edges3 = e3.getSequenceFromMask(mask=('[#2 ]', ), )
e4 = a.instances['Part-4-1'].edges
edges4 = e4.getSequenceFromMask(mask=('[#2 ]', ), )
e5 = a.instances['Part-5-1'].edges
edges5 = e5.getSequenceFromMask(mask=('[#2 ]', ), )
e6 = a.instances['Part-6-1'].edges
edges6 = e6.getSequenceFromMask(mask=('[#2 ]', ), )
e7 = a.instances['Part-7-1'].edges
edges7 = e7.getSequenceFromMask(mask=('[#2 ]', ), )
e8 = a.instances['Part-8-1'].edges
edges8 = e8.getSequenceFromMask(mask=('[#2 ]', ), )
e9 = a.instances['Part-9-1'].edges
edges9 = e9.getSequenceFromMask(mask=('[#2 ]', ), )
e10 = a.instances['Part-10-1'].edges
edges10 = e10.getSequenceFromMask(mask=('[#2 ]', ), )
region = a.Set(edges=edges1+edges2+edges3+edges4+edges5+edges6+edges7+edges8+\
edges9+edges10, name='Set-1')
mdb.models['Model-1'].XsymmBC(name='BC-1', createStepName='Step-1',
region=region, localCsys=None)
# 创建载荷
a = mdb.models['Model-1'].rootAssembly
e1 = a.instances['Part-1-1'].edges
edges1 = e1.getSequenceFromMask(mask=('[#8 ]', ), )
region = a.Set(edges=edges1, name='Set-2')
mdb.models['Model-1'].EncastreBC(name='BC-2', createStepName='Step-1',
region=region, localCsys=None)
a = mdb.models['Model-1'].rootAssembly
s1 = a.instances['Part-10-1'].edges
side1Edges1 = s1.getSequenceFromMask(mask=('[#2 ]', ), )
region = a.Surface(side1Edges=side1Edges1, name='Surf-19')
mdb.models['Model-1'].ShellEdgeLoad(name='Load-1', createStepName='Step-1',
region=region, magnitude=100.0, distributionType=UNIFORM, field='',
localCsys=None)
mdb.models['Model-1'].loads['Load-1'].setValues(traction=TRANSVERSE)
mdb.models['Model-1'].loads['Load-1'].setValues(magnitude=-1.0e-6)
mdb.models['Model-1'].loads['Load-1'].setValuesInStep(stepName='Step-2', magnitude=-100.0)
# 创建 job
mdb.Job(name=Job_name, model='Model-1')
有限元与 python 编程