【发布时间】:2017-11-22 16:39:24
【问题描述】:
目前我正在编写一个 Python 脚本,我从 Abaqus CAE 开始。它的目的是为神经网络生成数据集。因此,脚本从之前定义的节点集中挑选一个随机节点,并在该节点上应用位移和旋转。然后它告诉 abaqus 求解该模拟,并在模拟完成后读取 odb 文件。之后,脚本将继续使用下一个随机选择的节点进行之前选择的迭代次数。 该脚本在代码方面工作得很好,但有时随机选择的位移和旋转输入对于 abaqus 来说太难解决了,所以它会因“增量错误”而崩溃(为这个增量做了太多的增量.. ..)。因此,目录中有一个 .lck 文件会阻止 Python 脚本访问读取 odb 文件,因此 Python 脚本也会崩溃。 我已经尝试通过编辑增量大小和最大增量数来修复这个错误,但是这两个想法都没有奏效。 我的最新想法是实现一个“if”条件,告诉 abaqus 删除所有“Job_1.*”文件并继续下一个节点和其他随机选择的输入变量,如果在作业之后直接存在 .lck 文件已经完成了。但这个想法也没有奏效。因此,我问你们,如果你们中的任何人知道我如何解决这个问题。发生此类错误后,有什么方法可以告诉 Abaqus 它应该继续使用另一个节点? 这是代码:
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
from time import *
import datetime
import string
import odbAccess
from abaqus import getInput
from random import choice
from random import random
from math import pi
from math import sqrt
import os
import glob
def create_dataset(dataset_length):
print "Start"
global dataset
a = mdb.models['Model-1'].rootAssembly
n1 = a.instances['PART-1-1'].nodes
session.journalOptions.setValues(replayGeometry=COORDINATE, recoverGeometry=COORDINATE)
nodes1 =n1[157:159]+n1[190:194]+n1[198:200]+n1[201:209]+n1[239:247]+.... #Abaqus Node-Set for random pick
nodesetlen=len(nodes1)
i=0
while i < dataset_length: # while-Loop with the length of the requested dataset-length
print "%i. Loop begins" %(i+1)
k = choice(range(nodesetlen)) #random-index
x = nodes1[k:k+1] # random node out of the nodeset
region = a.Set(nodes=x, name='BC_RH') # Abaqus region definition (because the new node-position )
datum = mdb.models['Model-1'].rootAssembly.datums[49]
mdb.models['Model-1'].DisplacementBC(name='BC_RH', createStepName='Step-1',
region=region, u1=(random()*30),
u2=(random()*30), u3=(random()*30),
ur1=(random()*pi/4),
ur2=(random()*pi/4), ur3=(random()*pi/4),
amplitude=UNSET, fixed=OFF, distributionType=UNIFORM, fieldName='',
localCsys=datum) # Sets the inputs for the abaqus-Job_1
mdb.jobs['Job_1'].submit(consistencyChecking=OFF) # submits the Job
print "Job ist submitted"
mdb.jobs['Job_1'].waitForCompletion() #Python waits for Abaqus until the Job is done
print "Job is done"
my_file = "U:/Job_1.lck"
with open("Job_1.sta") as rfile:
line = rfile.readlines()[-1]
if line == " THE ANALYSIS HAS NOT BEEN COMPLETED\n":
print "Increment Error next Loop will start"
sleep(30) #just to be sure that Abaqus closed all files
else:
odb = openOdb(path='Job_1.odb') # Opens ODB-File
# HERE ARE A LOT OF OUTPUT-CALCULATIONS IN THE REAL FILE
# DOESNT INFLUENCE THE PROBLEM
odb.close()
i += 1
print "Erfolgreich beendet"
return dataset
dataset_length = 500
create_dataset(dataset_length)
这是 Abaqus CAE 中的错误:
1. Loop begins
Recent Node-Label: 22432
Job ist submitted
Job Job_1: Analysis Input File Processor completed successfully.
Error in job Job_1: Too many attempts made for this increment
Error in job Job_1: THE ANALYSIS HAS BEEN TERMINATED DUE TO PREVIOUS ERRORS. ALL OUTPUT REQUESTS HAVE BEEN WRITTEN FOR THE LAST CONVERGED INCREMENT.
Job Job_1: Abaqus/Standard aborted due to errors.
Job is done
Increment Error, next Loop will start
1. Loop begins
Recent Node-Label: 20996
Job ist submitted
Error in job Job_1: Abaqus/Standard Analysis exited with an error - Please see the message file for possible error messages if the file exists.
Error in job Job_1: Abaqus/Standard Analysis exited with an error - Please see the message file for possible error messages if the file exists.
Job Job_1 aborted due to errors.
Job Job_1 aborted due to errors.
Job is done
然后打印出 Python-error-Window 告诉我没有 .sta 文件。
【问题讨论】:
-
请注意,这不是可以通过 try/except 捕获的 python 错误。确保启动时没有状态(.sta)文件,并在 sta 文件中检查“分析已完成”(或根本没有创建 sta 文件表明存在错误)
-
如果没有找到 sta-File,我应该告诉程序做什么(所以它知道发生了错误)?如前所述,我的想法是删除所有 Job_1.* 文件,以便 Abaqus 具有与第一个循环中相同的条件,但这会在下一个循环中以错误结束,所有错误行都在 Abaqus 中重复打印,就像它执行两个一次工作。如果程序以某种方式通过第二个循环,所有的错误行都会打印三遍。你对此有什么解释吗?
-
@PiedPiper 我为你添加了代码!请对我宽容,我一个月前才开始用 Python 编写脚本:D
-
似乎所有的 odb 处理都应该遵循
else下的if -
我根据您通过检查 .sta 文件给我的想法编辑了脚本。所以现在代码告诉 abaqus 重新打开模型并继续 while 循环,如果 .sta 文件中有错误行。它工作得很好,直到某一点。如果发生错误,Abaqus 将重新打开模型并继续执行 while 循环,但在提交作业后不久,它给了我一个错误(我无法准确判断,因为 Abaqus 告诉我检查 .msg 文件,但那里没有描述错误)。而且这个错误行被重复打印了很奇怪。
标签: python neural-network abaqus