这段代码可以实现ABAQUS自动创建作业---导入上一个作业的odb文件作为初始应力场----提交计算作业------创建新作业的循环。循环次数可以自行设定。
使用方法就是复制源码的.py文件,在CAE界面点左上角文件--运行脚本--选取.py即可。
(这段代码稍加开发可以做一个简单的小插件,不过目前已经满足我自己需要了我就懒得再开发了。其实用RSG开发个界面+代码函数化很简单。)
重复导入odb平衡地应力的方法可以参考bilibili视频,我这里就不挂链接了。
如果需要大量重复导入次数才能平衡好的模型才需要使用我这个脚本,手动三五次能平衡好的不想动手的话也可以看看。
下面我简单讲解一下源码,重复导入odb场的原理和GUI操作我就不讲了。
1.首先import各类需要的模块
# -*- coding: utf-8 -*-
from odbAccess import openOdb
from textRepr import *
from abaqus import*
from abaqusConstants import*
from caeModules import *
import csv
import regionToolset
import time
import subprocess
2.将需要在abaqus前处理中用到的变量名称参数化,比如需要设置的场变量的名称和作业的名称,这里的i代表循环次数,从0开始,每一轮循环会+1。所以每一轮循环的作业名会job-2/job-3/job-4一直增加下去。
场名称要比job名称少1,这是因为job3的作业里需要引用job2的odb文件作为初始应力场,job4引用job3的odb文件,以此类推
job_name = 'job-' + str(3 + i)
job_name_d1 = 'job-' + str(2 + i)
predefined_field_d1 = 'Predefined Field-' + str(1 + i)
predefined_field = 'Predefined Field-' + str(2 + i)
3.注释很容易看得懂,都是一些ABAQUS前处理的命令,注意此处region区域需要自行修改,可以参考abaqus-pythonreader软件进行读取.py命令的方法进行修改。
此处创建新场的step=1,increment=6也需要按照自己导入odb过程中稳定下来的增量步进行修改。
# 关闭之前的定义场
mdb.models['Model-withoutpile-0826'].predefinedFields[predefined_field_d1].suppress(
)
# 创建新场
a = mdb.models['Model-withoutpile-0826'].rootAssembly
e1 = a.instances['PART-1-1'].elements
elements1 = e1.getSequenceFromMask(mask=('[#ffffffff:4617 #fffffff ]',), )
region = regionToolset.Region(elements=elements1)
mdb.models['Model-withoutpile-0826'].Stress(name=predefined_field,
distributionType=FROM_FILE,
fileName='D:/Desktop/Abraham/articial/ABAQUS1/'+job_name_d1+'.odb', step=1,
increment=6)
# 创建作业
mdb.Job(name=job_name, model='Model-withoutpile-0826', 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=1,
numGPUs=0)
# 提交作业
mdb.jobs[job_name].submit(consistencyChecking=OFF)
4.一定要加这一行,不然会出现多个作业被同时创建且同时运行与中断的情况
# 等待上一个作业完成
mdb.jobs[job_name].waitForCompletion()
5.写一个很简单的while循环加进去
i = 0
while i<300:
#中间为刚才写的代码主体
i += 1
6.代码整体
# -*- coding: utf-8 -*-
from odbAccess import openOdb
from textRepr import *
from abaqus import*
from abaqusConstants import*
from caeModules import *
import csv
import regionToolset
import time
import subprocess
i = 0
while i<300:
job_name = 'job-' + str(3 + i)
job_name_d1 = 'job-' + str(2 + i)
predefined_field_d1 = 'Predefined Field-' + str(1 + i)
predefined_field = 'Predefined Field-' + str(2 + i)
# 关闭之前的定义场
mdb.models['Model-withoutpile-0826'].predefinedFields[predefined_field_d1].suppress(
)
# 创建新场
a = mdb.models['Model-withoutpile-0826'].rootAssembly
e1 = a.instances['PART-1-1'].elements
elements1 = e1.getSequenceFromMask(mask=('[#ffffffff:4617 #fffffff ]',), )
region = regionToolset.Region(elements=elements1)
mdb.models['Model-withoutpile-0826'].Stress(name=predefined_field,
distributionType=FROM_FILE,
fileName='D:/Desktop/Abraham/articial/ABAQUS1/'+job_name_d1+'.odb', step=1,
increment=6)
# 创建作业
mdb.Job(name=job_name, model='Model-withoutpile-0826', 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=1,
numGPUs=0)
# 提交作业
mdb.jobs[job_name].submit(consistencyChecking=OFF)
# 等待上一个作业完成
mdb.jobs[job_name].waitForCompletion()
#循环计数加一
i += 1
最后给大家看一下应用效果,我这里简单将i设置为3进行了尝试。
这里的job-3/job-4/job-5都是脚本自动创建的
可以看到预定义场也已经自行创建,接下来我们检查一下场文件是否正确。
可以看到场文件自动设置的也都正确,验证了代码的正确性,由于项目需要结果文件我就不公开在网上了。大家有需要的自行复制使用即可。