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]

  • 11
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
abaqus python建模是通过使用pyabaqus库来实现的。pyabaqus库可以在不打开abaqus软件的情况下,通过在cmd窗口中使用原始dos命令行的方式执行python文件,调用abaqus计算内核模块,执行abaqus支持的python语法进行建模和计算。具体的执行方式是在cmd窗口中使用设置的系统变量 abaqus cae -noGUI 文件名.py 的方式执行。这样可以快速建模和进行有限元分析。你可以参考引用\[1\]和引用\[2\]中的相关内容来了解更多关于abaqus python建模的信息。此外,你还可以参考引用\[3\]中的官方指引和文档来获取更详细的使用指南。 #### 引用[.reference_title] - *1* *3* [python操作abaqus建模教程①](https://blog.csdn.net/weixin_45014436/article/details/128455412)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [python脚本实例-Abaqus利用Python脚本建模实例](https://blog.csdn.net/weixin_37988176/article/details/109376122)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值