【问题标题】:How to tell Abaqus to continue after Error with Python-Script?Python脚本出错后如何告诉Abaqus继续?
【发布时间】: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


【解决方案1】:

使用 try 和 except 子句:

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

【讨论】:

  • 据我了解,try-except 只能捕获 Python 错误,但我的错误是导致 Python 错误的 Abaqus 错误。所以我认为 try-except 在我的情况下不起作用。我唯一可以尝试的是将产生的 Python 错误用于 try-except 短语,但我担心 Abaqus 不会那样工作,因为我认为 Abaqus 无法撤消已经完成的工作。
  • 只需从您正在使用的模块中导入您遇到的错误。然后你可以在 try-except 子句中使用它,就像任何常见的 Python 错误一样。
【解决方案2】:

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

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

【讨论】:

  • 据我了解,try-except 只能捕获 Python 错误,但我的错误是导致 Python 错误的 Abaqus 错误。所以我认为 try-except 在我的情况下不起作用。我唯一可以尝试的是将产生的 Python 错误用于 try-except 短语,但我担心 Abaqus 不会那样工作,因为我认为 Abaqus 无法撤消已经完成的工作。
  • 在这种情况下,我会排除 Pyhton 错误并使用 traceback 模块打印堆栈跟踪:import traceback e_class, e_object, e_traceback = sys.exc_info() traceback_string = (''.join(traceback.format_tb(e_traceback))) 这至少可以产生更多信息。
  • 失败了,我为 Abaqus 找到了一个 scripting guide,其中包含 错误处理 部分。
  • @ArtsiomVahin 顺便说一句,该脚本指南是应该与 Abaqus 一起安装的标准文档的一部分。
【解决方案3】:

在您编辑的版本中,您仍然会在检测到故障后打开并尝试处理 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")

【讨论】:

  • 不,它不会在检测到故障后尝试处理 odb,是吗?在 if 条件中有一个“继续”,它告诉程序立即跳到新的迭代。那是错的吗? “Break”完全结束循环,“continue”跳到新的迭代?!
  • 好吧,我还是尝试了你的代码,但仍然出现同样的错误。我在问题的描述中写了错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 2014-08-17
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多