要对Abaqus进行参数研究,我想使用Python脚本来定义参数并生成连续不同的Job。
生成作业后,脚本将分析文件odb中的结果。 该脚本几乎可以正常工作,但是作业是在没有.odb文件的情况下生成的?
你知道为什么吗?
程序已附上
预先感谢
#####################################################################
### Création du fichier ODB ###
#####################################################################
...
def create_ODB(k1, k2, cc, Gc, h, job) :
... #Abaqus scripting to create the model, the conditions, the parameters
### Create Job
mdb.Job(contactPrint=OFF, description='', echoPrint=OFF, explicitPrecision=
SINGLE, historyPrint=OFF, memory=90, memoryUnits=PERCENTAGE, model=
'Model-1', modelPrint=OFF, multiprocessingMode=DEFAULT, name=job,
nodalOutputPrecision=SINGLE, numCpus=1, numDomains=1,
parallelizationMethodExplicit=DOMAIN, scratch='', type=ANALYSIS,
userSubroutine='')
###Lancement du job
mdb.jobs[job].submit(consistencyChecking=OFF)
#mdb.jobs[job].waitForCompletion()
return(k1, k2, cc, Gc, h)
这是创建和提交工作的一部分
然后我使用一个循环和一些函数来读取.odb
#####################################################################
### Fonctions de lecture du fichier ODB ###
#####################################################################
from odbAccess import *
from abaqusConstants import *
from odbMaterial import *
from odbSection import *
def open_ODB(s='Job-1.odb'):
"""Ouvre le fichier ODB pass� en argument. Retourne un objet
odb."""
return openOdb(path='C:/Amelie/model/macro/'+s)
def T_mean(odb):
lastFrame = odb.steps['Thermo-electric'].frames[-1]
temperatureField = lastFrame.fieldOutputs['NT11']
fieldValues = temperatureField.values
t = [v.data for v in fieldValues]
tmean = sum(t)/len(t)
return tmean-273
def T_max(odb) :
lastFrame = odb.steps['Thermo-electric'].frames[-1]
temperatureField = lastFrame.fieldOutputs['NT11']
setData = odb.rootAssembly.instances['LAYER-6-1'].nodeSets['SET-1']
tempField = temperatureField.getSubset(region=setData, position=NODAL)
tempValues = tempField.values
tmax = 0
for t in tempValues :
if t.data > tmax :
tmax = t.data
tmax=tmax-273
return(tmax)
现在是循环:
t_k1=[i for i in range(3,8)]
t_k2=[1.16]
t_cc=[18315,25000,45000]
t_Gc=[44.25]
t_h=[5*10**(-6),5*10**(-3),5]
t=[]
i=0
i_max = len(t_k1) * len(t_k2) * len(t_cc) * len(t_Gc) * len(t_h)
t_debut = time.time()
texp=170
for k1 in t_k1:
for k2 in t_k2:
for cc in t_cc:
for Gc in t_Gc:
for h in t_h:
(k1, k2, cc, Gc, h) = create_ODB(k1, k2, cc, Gc, h,job="Job-"+str(i))
t.append((k1, k2, cc, Gc, h))
t_now = time.time() - t_debut
p = (i+1.)/i_max
reste = t_now/p - t_now # temps final moins temps �coul�
follow_calcul(i, i_max, reste, k1, k2, cc, Gc, h)
log_calcul(i,k1, k2, cc, Gc, h)
i += 1
time.sleep(50) # laisser le temps aux derniers calculs de se terminer
trouve = False
ecart_0=20
for i in range(len(t)):
clean(i)
(k1, k2, cc, Gc, h) = t[i]
try:
odb = open_ODB("Job-"+str(i)+".odb")
tmax = T_max(odb)
tmean = T_mean(odb)
odb.close()
ecart=((tmean-texp)/texp)*100
follow_postpro(i,k1, k2, cc, Gc, h, tmax, tmean, ecart)
log_postpro(i,k1, k2, cc, Gc, h, tmax, tmean, ecart)
if tmax-tmean < 30 and texp-tmean < 10:
trouve = True
if ecart<ecart_0 :
i_0 = i
k1_0, k2_0, cc_0, Gc_0, h_0 = k1, k2, cc, Gc, h
ecart_0=ecart
tmax_0 = tmax
tmean_0 = tmean
except OdbError:
pass
#Ecriture du résultat dans un fichier texte
f = open("follow_postpro.log", 'a')
f.write("==================================================\n")
f.write("=== Meilleur résultat trouvé ===\n")
f.close()
if trouve:
follow_postpro(i_0, k1_0, k2_0, cc_0, Gc_0, h_0, tmax_0, tmean_0, ecart_0)
else:
f = open("follow_postpro.log", 'a')
f.write("==================================================\n")
f.write("rien trouvé \n")
f.close()
有些代码部分遗漏了,但是我想我把最重要的部分和有问题的部分都放了。
很抱歉,长消息。