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

python结合aba

python结合aba

Uploaded by

Xiaowei Wu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
24 views

python结合aba

python结合aba

Uploaded by

Xiaowei Wu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
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