如何告诉Abaqus在PythonScript出错后继续?

2024-06-09 12:40:50 发布

您现在位置:Python中文网/ 问答频道 /正文

目前我正在编写一个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中的错误:

^{pr2}$

输出之后,Python错误窗口告诉我没有.sta文件。在


Tags: 文件thefromimport脚本节点jobrandom
3条回答

我建议使用try-except-fromhttps://docs.python.org/2/tutorial/errors.html

try: 
   # do what needs to be done here
except Increment-Error:
    print "Oh no, and Incremental Error has happened!"

使用try and except子句:

try:
   code goes here
except IncrementError:
   log error and continue

在您编辑的版本中,您仍然打开并在检测到故障后尝试处理odb。在

你应该有(注意肯定的)

   if line == " THE ANALYSIS HAS COMPLETED\n":
     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()
   else:
     print "some error message"

我不明白为什么除了打印一条错误消息之外,你还需要做任何事情,主循环将继续并创建一个新的案例,不是吗?在

我也会在提交作业之前做os.remove("Job-1.sta")。在

相关问题 更多 >