在 Abaqus 二次开发中,常见流程是:用 Python 脚本自动建模、提交计算任务,然后在计算完成后继续进行结果读取或后处理。这里面最关键的一步,就是让脚本等待 Abaqus Job 运行完成。 如果没有等待机制,脚本可能会在计算还没结束时就去读取 ODB 文件,容易出现文件不存在、文件被占用或结果不完整等问题。
1. 最基本的等待写法
Abaqus Python 中提交并等待 Job 完成的核心代码是:
job.submit(consistencyChecking=OFF)job.waitForCompletion()
其中:
job.submit()
表示提交计算任务;
job.waitForCompletion()
表示让 Python 脚本暂停,直到 Abaqus 求解结束。
一个简单示例如下:
job = mdb.Job( name="Job-1", model="Model-1",type=ANALYSIS,)job.submit(consistencyChecking=OFF)job.waitForCompletion()print("Job finished.")
这段代码执行后,脚本会先提交 Job-1,然后等待计算完成,最后才输出:
Job finished.
2. 为什么需要 waitForCompletion
Abaqus 计算过程中会生成多个文件,例如:
Job-1.inpJob-1.datJob-1.msgJob-1.staJob-1.odb
其中 .odb 是后处理最常用的结果文件。
如果提交 Job 后马上读取 ODB:
job.submit(consistencyChecking=OFF)odb = openOdb(path="Job-1.odb")
这时计算可能还没有结束,ODB 文件也可能还没有生成完整,因此容易报错。
正确做法是:
job.submit(consistencyChecking=OFF)job.waitForCompletion()odb = openOdb(path="Job-1.odb", readOnly=True)
也就是说,后处理应放在 waitForCompletion() 后面。
计算示例输出
3. 一个常用的完整流程
一个比较常用的计算与后处理流程如下:
import osfrom odbAccess import openOdbjob_name = "Job-1"job = mdb.Job( name=job_name, model="Model-1",type=ANALYSIS,)job.submit(consistencyChecking=OFF)job.waitForCompletion()odb_path = job_name + ".odb"if not os.path.exists(odb_path): raise RuntimeError("ODB file was not generated.")odb = openOdb(path=odb_path, readOnly=True)try: step = odb.steps["Step-1"] frame = step.frames[-1] u_field = frame.fieldOutputs["U"]print("ODB has been opened successfully.")finally: odb.close()
这里有几个关键点:
- 1先提交 Job;
- 2用
waitForCompletion() 等待计算完成; - 3检查 ODB 文件是否存在;
- 4打开 ODB 读取结果;
- 5读取完成后关闭 ODB。
4. 读取结果时要注意关闭 ODB
Abaqus 的 ODB 文件在读取时会被占用,所以读取完成后最好及时关闭:
odb.close()
更推荐写成:
odb = openOdb(path=odb_path, readOnly=True)try:# 读取结果 passfinally: odb.close()
这样即使中间读取结果时报错,也能保证 ODB 被关闭。
5. 简单封装成函数
可以把提交、等待和检查 ODB 文件封装成一个函数:
def submit_and_wait(job, job_name): job.submit(consistencyChecking=OFF) job.waitForCompletion() odb_path = job_name + ".odb"if not os.path.exists(odb_path): raise RuntimeError("ODB file not found: " + odb_path)return odb_path
使用时:
job_name = "Job-1"job = mdb.Job( name=job_name, model="Model-1",type=ANALYSIS,)odb_path = submit_and_wait(job, job_name)
这样主程序会更清晰。
6. 小结
Abaqus Python 中等待 Job 完成的关键代码是:
job.submit(consistencyChecking=OFF)job.waitForCompletion()
一般推荐流程是:
提交 Job ↓等待 Job 完成 ↓检查 ODB 是否存在 ↓打开 ODB ↓读取结果 ↓关闭 ODB
对于单个模型或简单自动化分析,这套流程已经足够使用。后续如果要做大量批量计算,再进一步增加状态检查、失败日志保存和超时控制等功能即可。