0% found this document useful (0 votes)
16 views

python结合aba

python结合aba

Uploaded by

Xiaowei Wu
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
16 views

python结合aba

python结合aba

Uploaded by

Xiaowei Wu
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 43

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 编程

You might also like