Abaqus python 实例--个人练习
学习了一段时间的Abaqus的python脚本,给自己出两道题练习一下。先说一下,学习资料,主要是学习的是曹金凤老师的《Python语言在Abaqus中的应用》,如果有一定基础,需要更多实例练习可以参考江丙云老师的《ABAQUS Python二次开发攻略》。
题目一:
带孔方板拉伸,逐渐加密孔边网格,孔边最大Mises应力,会相应变化,当最大Mises应力变化不大时,输出相应网格密度(孔边的种子个数)。
第一步,录制宏,建立模型
启动ABAQUS/CAE,[File]–>[Macro Manage]–>creat–>continue
操作CAE截面,Create Part–> 2D Planar–>continue
为了分割网格时方便,切分部件
创建材料–>截面–>赋给部件–>装配–>静态分析步–>位移约束和位移加载
设置种子,为分割网格准备
关闭CAE,不要保持,在工作目录下,找到abaqusMacros.py,复制并重命名为’PlateHole-Op.py’
打开’PlateHole-Op.py’,将第7行(在附近找就行,版本不同,行号可能不同)的def Macro1():
改为·def PlateHole(meshNumber):
,meshNumber为孔边网格的种子数。将第120行附近的
pickedEdges = e1.getSequenceFromMask(mask=('[#3102 ]', ), )
a.seedEdgeByNumber(edges=pickedEdges, number=2, constraint=FINER)
elemType1 = mesh.ElemType(elemCode=CPS4R, elemLibrary=STANDARD,
secondOrderAccuracy=OFF, hourglassControl=DEFAULT,
distortionControl=DEFAULT)
改为
a.seedEdgeByNumber(edges=pickedEdges, number=meshNumber, constraint=FINER)
反复调用时,可以不断修改孔边网格密度。
第二步,提交作业
再出打开Abaqus/cae,运行录制好的宏,并提交作业,等计算完成后,不必保存直接关闭Abaqus/cae,工作目录下找到abaqus.rpy,修改后缀为.py直接打开,删除运行宏的代码后,把剩余代码,复制到’PlateHole-Op.py’中,在def PlateHole(meshNamber):
之后。
第三步,提取最大Mises应力
odb=session.openOdb(jobName+'.odb')
frame1=odb.steps['Step-1'].frames[-1]
stress1=frame1.fieldOutputs['S']
maxValue=0
for stressValue in stress1.values:
if (stressValue.mises > maxValue):
maxValue=stressValue.mises
maxNodel=stressValue.elementLabel
print'meshNumber:%d'%meshNumber
print 'maxValue:%f'%maxValue
print 'maxNodel:%d'%maxNodel
完整代码以及运算结果
# -*- coding: mbcs -*-
#
# Abaqus/CAE Release 2020 replay file
# Internal Version: 2019_09_14-01.49.31 163176
# Run by DELL on Fri Feb 26 17:34:05 2021
#
# from driverUtils import executeOnCaeGraphicsStartup
# executeOnCaeGraphicsStartup()
#: Executing "onCaeGraphicsStartup()" in the site directory ...
from abaqus import *
from abaqusConstants import *
from caeModules import *
from driverUtils import executeOnCaeStartup
import odbAccess
import visualization
# 创建模型
def PlateHole(meshNumber):
import section
import regionToolset
import displayGroupMdbToolset as dgm
import part
import material
import assembly
import step
import interaction
import load
import mesh
import optimization
import job
import sketch
import visualization
import xyPlot
import displayGroupOdbToolset as dgo
import connectorBehavior
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
sheetSize=200.0)
g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.setPrimaryObject(option=STANDALONE)
s.rectangle(point1=(-80.0, 30.0), point2=(80.0, -30.0))
s.CircleByCenterPerimeter(center=(0.0, 0.0), point1=(5.0, 0.0))
p = mdb.models['Model-1'].Part(name='Part-1', dimensionality=TWO_D_PLANAR,
type=DEFORMABLE_BODY)
p = mdb.models['Model-1'].parts['Part-1']
p.BaseShell(sketch=s)
s.unsetPrimaryObject()
p = mdb.models['Model-1'].parts['Part-1']
session.viewports['Viewport: 1'].setValues(displayedObject=p)
del mdb.models['Model-1'].sketches['__profile__']
p = mdb.models['Model-1'].parts['Part-1']
f = p.faces
pickedFaces = f.getSequenceFromMask(mask=('[#1 ]', ), )
v1, e, d1 = p.vertices, p.edges, p.datums
p.PartitionFaceByShortestPath(faces=pickedFaces, point1=p.InterestingPoint(
edge=e[2], rule=MIDDLE), point2=p.InterestingPoint(edge=e[4],
rule=MIDDLE))
p = mdb.models['Model-1'].parts['Part-1']
f = p.faces
pickedFaces = f.getSequenceFromMask(mask=('[#3 ]', ), )
v2, e1, d2 = p.vertices, p.edges, p.datums
p.PartitionFaceByShortestPath(faces=pickedFaces, point1=p.InterestingPoint(
edge=e1[2], rule=MIDDLE), point2=p.InterestingPoint(edge=e1[8],
rule=MIDDLE))
session.viewports['Viewport: 1'].partDisplay.setValues(sectionAssignments=ON,
engineeringFeatures=ON)
session.viewports['Viewport: 1'].partDisplay.geometryOptions.setValues(
referenceRepresentation=OFF)
mdb.models['Model-1'].Material(name='steel')
mdb.models['Model-1'].materials['steel'].Elastic(table=((210000.0, 0.3), ))
mdb.models['Model-1'].materials['steel'].Plastic(table=((800.0, 0.0), (1000.0,
0.02), (1200.0, 0.08), (1400.0, 0.2)))
mdb.models['Model-1'].HomogeneousSolidSection(name='Section-steel',
material='steel', thickness=None)
p = mdb.models['Model-1'].parts['Part-1']
f = p.faces
faces = f.getSequenceFromMask(mask=('[#f ]', ), )
region = p.Set(faces=faces, name='Set-1')
p = mdb.models['Model-1'].parts['Part-1']
p.SectionAssignment(region=region, sectionName='Section-steel', offset=0.0,
offsetType=MIDDLE_SURFACE, offsetField='',
thicknessAssignment=FROM_SECTION)
a = mdb.models['Model-1'].rootAssembly
session.viewports['Viewport: 1'].setValues(displayedObject=a)
session.viewports['Viewport: 1'].assemblyDisplay.setValues(
optimizationTasks=OFF, geometricRestrictions=OFF, stopConditions=OFF)
a = mdb.models['Model-1'].rootAssembly
a.DatumCsysByDefault(CARTESIAN)
p = mdb.models['Model-1'].parts['Part-1']
a.Instance(name='Part-1-1', part=p, dependent=OFF)
session.viewports['Viewport: 1'].assemblyDisplay.setValues(
adaptiveMeshConstraints=ON)
mdb.models['Model-1'].StaticStep(name='Step-1', previous='Initial',
initialInc=0.1)
session.viewports['Viewport: 1'].assemblyDisplay.setValues(step='Step-1')
session.viewports['Viewport: 1'].assemblyDisplay.setValues(loads=ON, bcs=ON,
predefinedFields=ON, connectors=ON, adaptiveMeshConstraints=OFF)
a = mdb.models['Model-1'].rootAssembly
e1 = a.instances['Part-1-1'].edges
edges1 = e1.getSequenceFromMask(mask=('[#4400 ]', ), )
region = a.Set(edges=edges1, name='Set-1')
mdb.models['Model-1'].DisplacementBC(name='BC-1', createStepName='Step-1',
region=region, u1=0.0, u2=0.0, ur3=0.0, amplitude=UNSET, fixed=OFF,
distributionType=UNIFORM, fieldName='', localCsys=None)
a = mdb.models['Model-1'].rootAssembly
e1 = a.instances['Part-1-1'].edges
edges1 = e1.getSequenceFromMask(mask=('[#88 ]', ), )
region = a.Set(edges=edges1, name='Set-2')
mdb.models['Model-1'].DisplacementBC(name='BC-2', createStepName='Step-1',
region=region, u1=2.0, u2=0.0, ur3=0.0, amplitude=UNSET, fixed=OFF,
distributionType=UNIFORM, fieldName='', localCsys=None)
mdb.models['Model-1'].boundaryConditions['BC-1'].move('Step-1', 'Initial')
session.viewports['Viewport: 1'].assemblyDisplay.setValues(mesh=ON, loads=OFF,
bcs=OFF, predefinedFields=OFF, connectors=OFF)
session.viewports['Viewport: 1'].assemblyDisplay.meshOptions.setValues(
meshTechnique=ON)
a = mdb.models['Model-1'].rootAssembly
partInstances =(a.instances['Part-1-1'], )
a.seedPartInstance(regions=partInstances, size=5.0, deviationFactor=0.1,
minSizeFactor=0.1)
a = mdb.models['Model-1'].rootAssembly
e1 = a.instances['Part-1-1'].edges
pickedEdges = e1.getSequenceFromMask(mask=('[#3102 ]', ), )
a.seedEdgeByNumber(edges=pickedEdges, number=meshNumber, constraint=FINER)
elemType1 = mesh.ElemType(elemCode=CPS4R, elemLibrary=STANDARD,
secondOrderAccuracy=OFF, hourglassControl=DEFAULT,
distortionControl=DEFAULT)
elemType2 = mesh.ElemType(elemCode=CPS3, elemLibrary=STANDARD)
a = mdb.models['Model-1'].rootAssembly
f1 = a.instances['Part-1-1'].faces
faces1 = f1.getSequenceFromMask(mask=('[#f ]', ), )
pickedRegions =(faces1, )
a.setElementType(regions=pickedRegions, elemTypes=(elemType1, elemType2))
a = mdb.models['Model-1'].rootAssembly
partInstances =(a.instances['Part-1-1'], )
a.generateMesh(regions=partInstances)
executeOnCaeStartup()
minMises=0
i=3
while 1:
meshNumber=i
PlateHole(meshNumber)
jobName='Job_PlateHole'+str(meshNumber)
mdb.Job(name=jobName, model='Model-1', description='', type=ANALYSIS,
atTime=None, waitMinutes=0, waitHours=0, queue=None, memory=90,
memoryUnits=PERCENTAGE, getMemoryFromAnalysis=True,
explicitPrecision=SINGLE, nodalOutputPrecision=SINGLE, echoPrint=OFF,
modelPrint=OFF, contactPrint=OFF, historyPrint=OFF, userSubroutine='',
scratch='', resultsFormat=ODB, multiprocessingMode=DEFAULT, numCpus=8,
numDomains=8, numGPUs=0)
mdb.jobs[jobName].submit(consistencyChecking=OFF)
mdb.jobs[jobName].waitForCompletion()
# 提取最大Mises
odb=session.openOdb(jobName+'.odb')
frame1=odb.steps['Step-1'].frames[-1]
stress1=frame1.fieldOutputs['S']
maxValue=0
for stressValue in stress1.values:
if (stressValue.mises > maxValue):
maxValue=stressValue.mises
maxNodel=stressValue.elementLabel
print'meshNumber:%d'%meshNumber
print 'maxValue:%f'%maxValue
print 'maxNodel:%d'%maxNodel
if abs(maxValue-minMises)<10:
print 'difference:%f'%(abs(maxValue-minMises))
print 'found,meshNumber%d'%meshNumber
break
else:
print 'difference:%f'%(abs(maxValue-minMises))
minMises= maxValue
i=i+1
计算结果:
一共提交3~26,共23个job,当种子各种加密的26个时,最大Mises的变化值不超过1Mpa。
题目二:
在三维实体中随机掏出小球形成多孔材料。三维实体三维为303030的正方形,小球直径为2
第一步,利用numpy.random生成N个的小球的坐标
第二步,打开Abaqus/Cae,创建2个Part,并在装配中完成切割
打开相应的rpy文件,对切割部分进行改写
运行改写后的脚本:
第三步,代码
# -*- coding: mbcs -*-
#
# Abaqus/CAE Release 2020 replay file
# Internal Version: 2019_09_14-01.49.31 163176
# Run by DELL on Sun Feb 28 17:34:29 2021
#
# from driverUtils import executeOnCaeGraphicsStartup
# executeOnCaeGraphicsStartup()
#: Executing "onCaeGraphicsStartup()" in the site directory ...
from abaqus import *
from abaqusConstants import *
session.Viewport(name='Viewport: 1', origin=(0.0, 0.0), width=222.845825195313,
height=167.922225952148)
session.viewports['Viewport: 1'].makeCurrent()
session.viewports['Viewport: 1'].maximize()
from caeModules import *
from driverUtils import executeOnCaeStartup
executeOnCaeStartup()
session.viewports['Viewport: 1'].partDisplay.geometryOptions.setValues(
referenceRepresentation=ON)
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
sheetSize=200.0)
g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.setPrimaryObject(option=STANDALONE)
s.rectangle(point1=(0.0, 0.0), point2=(30.0, 30.0))
p = mdb.models['Model-1'].Part(name='cube', dimensionality=THREE_D,
type=DEFORMABLE_BODY)
p = mdb.models['Model-1'].parts['cube']
p.BaseSolidExtrude(sketch=s, depth=30.0)
s.unsetPrimaryObject()
p = mdb.models['Model-1'].parts['cube']
del mdb.models['Model-1'].sketches['__profile__']
s1 = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
sheetSize=10.0)
g, v, d, c = s1.geometry, s1.vertices, s1.dimensions, s1.constraints
s1.setPrimaryObject(option=STANDALONE)
s1.ConstructionLine(point1=(0.0, -5.0), point2=(0.0, 5.0))
s1.FixedConstraint(entity=g[2])
s1.ArcByCenterEnds(center=(0.0, 0.0), point1=(0.0, 1.0), point2=(0.0, -1.0),
direction=CLOCKWISE)
s1.CoincidentConstraint(entity1=v[2], entity2=g[2], addUndoState=False)
s1.CoincidentConstraint(entity1=v[0], entity2=g[2], addUndoState=False)
s1.CoincidentConstraint(entity1=v[1], entity2=g[2], addUndoState=False)
s1.Line(point1=(0.0, 1.0), point2=(0.0, -1.0))
s1.VerticalConstraint(entity=g[4], addUndoState=False)
s1.PerpendicularConstraint(entity1=g[3], entity2=g[4], addUndoState=False)
p = mdb.models['Model-1'].Part(name='ball', dimensionality=THREE_D,
type=DEFORMABLE_BODY)
p = mdb.models['Model-1'].parts['ball']
p.BaseSolidRevolve(sketch=s1, angle=360.0, flipRevolveDirection=OFF)
s1.unsetPrimaryObject()
p = mdb.models['Model-1'].parts['ball']
del mdb.models['Model-1'].sketches['__profile__']
a = mdb.models['Model-1'].rootAssembly
a = mdb.models['Model-1'].rootAssembly
a.DatumCsysByDefault(CARTESIAN)
p = mdb.models['Model-1'].parts['cube']
a.Instance(name='cut0-1', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
import numpy as np
N=500
x=[]
y=[]
z=[]
diameter=2
i=0
ii=0
T=1
while (i<N)and(ii<1000):
ii=ii+1
i=i+1
x.append(np.random.rand(1)[0]*30)
y.append(np.random.rand(1)[0]*30)
z.append(np.random.rand(1)[0]*30)
for j in range(i-1):
distance=(x[i-1]-x[j])**2+(y[i-1]-y[j])**2+(z[i-1]-z[j])**2
if (distance<diameter**2):
x.pop(-1)
i=i-1
break
print'len(x)',len(x)
for i in range(len(x)):
p = mdb.models['Model-1'].parts['ball']
a.Instance(name='ball-1', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('ball-1', ), vector=(x[i],y[i],z[i]))#把原来的数值给为自己的随机数列
#: The instance ball-1 was translated by 30., 15., 0. with respect to the assembly coordinate system
a = mdb.models['Model-1'].rootAssembly
nameOld='cut'+str(i)
nameNew='cut'+str(i+1)
a.InstanceFromBooleanCut(name=nameNew,
instanceToBeCut=mdb.models['Model-1'].rootAssembly.instances[nameOld+'-1'],
cuttingInstances=(a.instances['ball-1'], ), originalInstances=DELETE)
if not(i%10==0) :
del mdb.models['Model-1'].parts[nameOld]