You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Abaqus脚本批量创建作业时属性未更新问题?

问题原因与解决方案

核心问题分析

  1. 参数未对应到作业:你把模型参数修改循环和作业创建循环拆成了两个独立的嵌套循环。第一个循环会反复覆盖Model-1里的Material-1属性,最终只保留最后一组i/j/m的值;第二个循环创建的所有作业都基于这个已经固定为最终参数的模型,导致所有作业属性完全一致。
  2. 结果一致的连锁反应:所有作业用的都是同一套最终参数,仿真结果自然相同;另外你每次导出XYData用的是固定名称,后面的结果会覆盖前面的XYData对象,进一步加剧了数据混乱。

修正后的脚本

将参数修改、作业创建、仿真执行、结果导出逻辑合并到同一个嵌套循环中,直接从i/j/m计算合法的作业名称后缀,确保每个作业对应当前循环的参数:

from abaqusConstants import *
from numpy import arange

# 合并参数循环与作业逻辑,确保每组参数对应一个作业
for i in arange(0.05, 0.25, 0.05):
    for j in arange(0.35, 0.36, 0.01):
        for m in arange(1.67e-08, 1.68e-08, 1e-10):
            # 计算作业名称的整数后缀(避免小数点)
            k = int(i * 100)
            l = int(j * 100)
            n = int(m * 1e10)
            job_name = f'Job_ym{k}_pr{l}_pe{n}'
            
            # 修改材料属性:如果Material-1已存在则直接更新,无需重复创建
            if 'Material-1' not in mdb.models['Model-1'].materials:
                mdb.models['Model-1'].Material(name='Material-1')
            mat = mdb.models['Model-1'].materials['Material-1']
            mat.Elastic(table=((i, j), ))
            mat.Permeability(
                inertialDragCoefficient=0.142887, 
                specificWeight=9.81e-06, 
                table=((m, 4.0), )
            )
            
            # 创建并提交作业
            mdb.Job(
                name=job_name, 
                model='Model-1', 
                type=ANALYSIS,
                memory=90, 
                memoryUnits=PERCENTAGE, 
                resultsFormat=ODB,
                numCpus=1
            )
            mdb.jobs[job_name].submit(consistencyChecking=OFF)
            mdb.jobs[job_name].waitForCompletion()
            
            # 导出力-时间数据
            odb_path = f'{job_name}.odb'
            odb = session.openOdb(name=odb_path)
            # 生成唯一的XYData名称,避免覆盖
            xy_data_name = f'{job_name}_RF2_RP-1'
            session.XYDataFromHistory(
                name=xy_data_name, 
                odb=odb, 
                outputVariableName='Reaction force: RF2 PI: rootAssembly Node 1 in NSET RP', 
                steps=('Step-1', 'Step-2', )
            )
            x0 = session.xyDataObjects[xy_data_name]
            session.writeXYReport(fileName=f'{job_name}.txt', xyData=(x0, ))
            
            # 清理资源,避免内存占用和名称冲突
            session.closeOdb(odb_path)
            del session.xyDataObjects[xy_data_name]

关键修改点

  • 合并循环:将参数修改与作业执行绑定,每组参数对应一个独立作业,确保参数不被覆盖。
  • 动态计算作业名称:直接从i/j/m转换为整数后缀,无需单独维护k/l/n循环,避免参数对应错误。
  • 唯一XYData名称:用作业名作为XYData名称前缀,防止后续结果覆盖之前的数据。
  • 资源清理:关闭ODB文件并删除XYData对象,减少内存占用和名称冲突。

内容的提问来源于stack exchange,提问作者sriram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:23:21