去年我接了个轨交项目的活,一个转向架焊接构架,上面有四百多个弹簧连接点,每个点的刚度参数不一样。甲方给了一张Excel表,让我把四百多组参数灌进模型里跑二十个工况。
手动操作的话,每个弹簧点要进Interaction模块、找对应位置、改参数、检查方向,一个点大概三分钟。四百个点,二十个小时。二十个工况就是四百个小时。
我写了个Python脚本,读Excel、循环建模、自动提交、批量提取结果,整个流程跑完用了四十分钟。这就是二次开发在工程里的真实价值——不是炫技,是保命。
今天把Abaqus二次开发这件事从头到尾拆给你看。两条路径怎么选、环境怎么搭不报错、脚本怎么写、坑在哪里、报错了怎么查,全部讲清楚。
Abaqus二次开发就两个入口,别搞混了:
Python脚本接口 → 管的是"前后处理"。建模、划网格、提交Job、读odb结果、画云图、导出CSV。所有你在CAE界面里用鼠标点的事情,Python都能用代码替代。
Fortran子程序接口 → 管的是"求解器内核"。你用的材料本构Abaqus库里没有(比如某种新型复合材料的渐进损伤模型)、你需要一个软件里不存在的单元类型、你要定义一个随空间坐标变化的非标准载荷——这些得写Fortran。
判断标准就一句话: 你的需求是"把重复操作自动化"还是"让求解器算一种它本来不会算的东西"?前者Python,后者Fortran。别反过来。
我见过一个研究生,导师让他批量改螺栓预紧力跑三十组工况,他花两周学Fortran写了一堆框架代码,最后发现十行Python循环提交就搞定了。两周打水漂。

Abaqus内置了自己的Python解释器,跟你电脑上装的Anaconda或者官网下载的Python是两回事。版本对应关系我列在这里:
| Abaqus版本 | 内置Python版本 |
|---|---|
| 6.14及更早 | Python 2.7.x |
| 2020~2021 | Python 3.7 |
| 2022 | Python 3.8 |
| 2023 | Python 3.9 |
| 2024 | Python 3.10+ |
你的脚本必须在Abaqus自带的Python环境里跑,不能用系统Python。 因为 from abaqus import *、from odbAccess import openOdb 这些模块只存在于Abaqus的安装目录里,系统Python找不到它们。
打开VS Code → 左下角齿轮 → Settings → 搜索 python.pythonPath → 把路径改成Abaqus安装目录下的python.exe。具体路径长这样:
C:\SIMULIA\Abaqus\2022\tools\SMApy\python3.8\python.exe
【注意】 如果你装的时候改了路径,去安装目录下搜 python.exe,在 tools\SMApy 子目录里。
配好之后VS Code的自动补全和语法检查才能识别Abaqus的模块。不配的话你写 mdb.models 会标红,但其实能跑,纯粹是编辑器不认识。
abaqus cae noGUI=your_script.py。适合批量跑,不需要打开图形界面。最典型的用法。把几何尺寸、材料参数、载荷大小定义成变量,循环生成不同工况的模型。
我的做法是先把一个标准模型在CAE里手动建好,跑通一遍。然后打开工作目录下的 abaqus.rpy 文件——这个文件记录了你每一步操作对应的Python命令。把它拷出来,把里面的硬编码参数换成变量,套个for循环,就是一个参数化建模脚本。
这个.rpy文件是新手最大的宝藏。 你不需要背API,你只需要在CAE里手动操作一遍,然后去看.rpy里生成了什么代码。
我常用的一个脚本逻辑:遍历Part下所有单元,取每个单元的节点坐标,算边长极值比(近似长宽比),超过阈值的单元编号写入CSV。核心代码:
from abaqus import *
from abaqusConstants import *
import math
def check_mesh_quality(model_name, part_name, threshold=5.0):
part = mdb.models[model_name].parts[part_name]
bad_list = []
for elem in part.elements:
nodes = elem.getNodes()
coords = [n.coordinates for n in nodes]
edges = []
for i in range(len(coords)):
for j in range(i+1, len(coords)):
dist = math.sqrt(sum(
(coords[i][k]-coords[j][k])**2 for k in range(3)
))
edges.append(dist)
if min(edges) > 0:
ar = max(edges) / min(edges)
if ar > threshold:
bad_list.append(elem.label)
print("Bad elements: %d" % len(bad_list))
return bad_list
跑完之后拿着bad_list回Mesh模块用 Mesh → Verify 高亮这些单元,逐个修。比肉眼盯着看一百万元素的模型强一万倍。
这个需求在提交计算之前做质量校核时经常碰到。三种拿法:
Total mass of model,后面那个数就是。包含集中质量点,最完整。mdb.models['Model-1'].parts['Part-1'].getMassProperties(),返回体积、质量、质心坐标。但注意,这个方法不包含通过Point Mass/Inertia定义的集中质量,得自己手动加。
ImportError: No module named abaqus你在系统Python里跑脚本,或者VS Code的解释器没指对。
排查: 打开终端,敲 where python(Windows)或 which python(Linux),看当前用的是哪个解释器。如果不是Abaqus目录下那个,改环境变量或者改IDE配置。
解决: 用Abaqus Command窗口执行,或者在VS Code里确认解释器路径指向 ...\tools\SMApy\python3.x\python.exe。
Abaqus Error: the journal file contains errors你的.rpy文件或者脚本里有语法错误。最常见的是Python 2和Python 3语法混用。
典型翻车: Abaqus 6.14用Python 2.7,你写了 print("hello"),在2.7里print是语句不是函数,不带括号也能跑,但加了括号在某些上下文里会出问题。反过来,2022版用Python 3.8,你写了 print "hello" 直接语法错误。
解决: 确认你的Abaqus版本对应的Python大版本号。6.14及之前用Python 2语法,2020及之后用Python 3语法。脚本开头加一行注释标明适用版本,团队协作的时候别人才不会踩你的坑。
这个最阴险。代码没报错,但生成的模型少了个约束、材料属性赋错了Part、网格种子没生效。
排查思路: 在脚本关键节点插入 print 语句,把变量值打出来。比如赋完材料之后 print(section.name),确认截面名对不对。建完网格之后 print(len(part.elements)),看单元数量是不是你预期的。
进阶手段: 用 session.journalOptions.setValues(replayGeometry=COORINATE) 让.rpy记录更详细的几何操作坐标,方便对比。
1. mdb对象和odb对象的索引规则不一样。
CAE模型操作走 mdb,单元编号、节点编号是 1-based(从1开始)。读odb结果文件走 openOdb,返回的列表是 0-based(从0开始)。混了就会差一个元素,数据对不上,查半天查不出来。
2. 大模型遍历单元极慢。
一百万元素的模型,你for循环逐个取节点坐标算质量指标,能跑十几分钟。解决办法:限定Element Set只检查你关心的区域,或者把坐标提取出来用NumPy做向量化运算。
3. 脚本路径里不能有中文和空格。
Abaqus的Python解释器对非ASCII路径支持很差。你的.py文件放在 D:\仿真项目\版本2\ 这种目录下,大概率报文件找不到。老老实实用纯英文路径。
4. 每次CAE崩溃或者强制关闭,.rpy文件会截断。
如果你正在用.rpy学习代码,CAE崩了,最后几步操作的记录可能丢失。养成习惯:重要操作前先手动备份一份.rpy。
5. 用 session.viewports['Viewport: 1'].setValues() 这类GUI操作时,CAE必须在前台。
命令行模式(abaqus cae noGUI=xxx.py)下调用视图操作会报错。如果你的脚本里有画云图、保存图片的操作,必须用 abaqus cae script=xxx.py 带图形界面启动。

create_material()、assign_section()、submit_and_monitor()。下次新项目直接import,不用从头写。type 参数换成了枚举常量),不测直接上生产线会出事。