做有限元仿真的朋友,日常工作大概是这样的:
打开CAE → 改参数 → 提交任务 → 等结果 → 再改参数 → 再提交……
当你只有1个工况,这当然没问题。但现实往往是:10组网格密度 × 5个载荷工况 × 3种材料参数 = 150个任务。手动点击就显得耗时费力。
BAT批处理文件的核心优势:
Abaqus本质上是一个可以通过命令行驱动的程序。打开Windows的CMD,最基本的调用格式是:
abaqus job=任务名 input=inp文件名 cpus=核数 interactive
job=任务名 | .odb、.dat、.msg 等文件都以此命名 |
input=文件名 | .inp后缀,Abaqus会自动识别) |
cpus=核数 | |
interactive | 关键参数 |
ask_delete=OFF | .lck文件存在时,不询问直接覆盖(批量运行必备,避免弹窗卡住脚本) |
memory=90% |
🚨 避坑提示:
interactive这个参数新手最容易忘。如果你在BAT里提交了多个任务却不加它,所有任务会同时启动,资源争抢会让每个任务都跑得奇慢无比。
新建一个文本文件,将后缀改为 .bat,写入以下内容:
@echo off
REM ============================================================
REM Abaqus 基础调用脚本
REM 功能:切换到工作目录,提交单个INP任务
REM ============================================================
REM 【第一步】设置工作目录(INP文件所在的文件夹路径)
cd /d "D:\Simulation\MyProject"
REM 【第二步】提交任务
REM job = 作业名(输出文件前缀)
REM input = INP文件名(无需加.inp后缀)
REM cpus = 使用核心数,按需调整
REM interactive = 等待任务完成后再继续
REM ask_delete = 不询问直接覆盖旧的lock文件
abaqus job=beam_static input=beam_static cpus=4 interactive ask_delete=OFF
REM 【第三步】任务结束后暂停,方便查看命令行输出信息
echo.
echo ========== 任务已完成 ==========
pause
几点说明:
@echo off:关闭命令回显,让输出更整洁cd /d:/d 参数允许同时切换盘符和路径,缺了/d跨盘切换会失败REM:注释符,不影响执行💡 经验之谈: 强烈建议工作目录和文件路径不要包含中文和空格。虽然用引号包裹路径可以处理空格,但Abaqus在某些版本里对含中文的路径还是会报错。养成用英文命名的好习惯,省心!
标准的Abaqus材料库覆盖不了所有需求。以下场景你就需要自己写子程序:
子程序文件通常是一个 .for(Fortran 77格式)或 .f90 文件。
只需在原来的命令里加上 user= 参数:
abaqus job=任务名 input=inp文件名 user=子程序文件名 cpus=核数 interactive
例如:
abaqus job=umat_test input=umat_test user=UMAT_hyperelastic cpus=4 interactive
这是调用子程序最容易踩坑的地方,必须提前说清楚。
调用用户子程序时,Abaqus需要在本地将 .for 文件编译成可执行代码。这要求你的电脑上必须安装且正确配置以下软件:
ifort)🚨 避坑提示: 版本不匹配是新手最大的噩梦。例如Abaqus 2021推荐搭配VS 2019 + Intel Parallel Studio XE 2020。装错版本,子程序怎么都跑不起来。建议在Abaqus官网查询对应版本的"System Requirements"文档再动手安装。
验证编译环境是否正常,可以在CMD里运行:
abaqus verify -user_std
如果输出 PASS,说明标准子程序编译链路正常。
@echo off
REM ============================================================
REM Abaqus 子程序调用脚本
REM 功能:提交带UMAT子程序的Abaqus任务
REM ============================================================
REM 【设置工作目录】INP文件和FOR文件需放在同一目录下
cd /d "D:\Simulation\UMAT_Project"
REM 【提交带子程序的任务】
REM user = Fortran子程序文件名(无需加.for后缀)
abaqus job=umat_test ^
input=umat_test ^
user=UMAT_hyperelastic ^
cpus=4 ^
interactive ^
ask_delete=OFF
echo.
echo ========== 子程序任务已完成 ==========
pause
💡 说明:
^是BAT中的换行续写符,让长命令更易读,实际执行效果等同于写在一行。
ifort is not recognized | ||
Abaqus/Analysis exited with errors | ||
Too many errors in batch | .dat 文件末尾的编译日志,定位Fortran语法问题 |
💡 排查技巧: 任务失败后,第一时间打开与任务同名的
.dat文件(纯文本),拉到最底部,报错信息都在那里。比盯着CMD窗口的滚动输出靠谱多了。
假设你有 case01.inp、case02.inp……case10.inp 共10个文件:
@echo off
cd /d "D:\Simulation\BatchJob"
REM 用for循环遍历所有INP文件并依次提交
for %%i in (case01 case02 case03 case04 case05 ^
case06 case07 case08 case09 case10) do (
echo.
echo >>> 正在提交任务:%%i
abaqus job=%%i input=%%i cpus=4 interactive ask_delete=OFF
echo >>> 任务 %%i 完成
)
echo.
echo ========== 全部任务已完成 ==========
pause
或者更简洁地,用通配符遍历当前目录下所有INP文件:
for %%f in (*.inp) do (
abaqus job=%%~nf input=%%~nf cpus=4 interactive ask_delete=OFF
)
💡
%%~nf的含义:%%f是完整文件名(含扩展名),%%~nf只取文件名主体(去掉.inp)。
跑大型模型经常需要隔夜计算。加上这行,任务跑完自动关机,第二天来直接看结果:
REM 所有任务完成后,延迟60秒自动关机(给你反悔的机会)
shutdown /s /t 60 /c "Abaqus任务已完成,60秒后关机"
如果想取消关机:在60秒内打开CMD运行 shutdown /a。
在BAT里加入时间戳日志,方便事后追溯:
REM 将任务开始/结束时间记录到日志文件
echo [%date% %time%] 开始任务:beam_static >> run_log.txt
abaqus job=beam_static input=beam_static cpus=4 interactive ask_delete=OFF
echo [%date% %time%] 完成任务:beam_static >> run_log.txt
这样 run_log.txt 里会记录每个任务的实际运行时间,后续分析效率时很有用。
回顾一下本文的核心内容:
abaqus job= input= cpus= interactive 是最核心的四个参数,ask_delete=OFF 是批量运行的必备选项cd /d 切换,路径全程用英文无空格user= 参数,但前提是配好Intel Fortran + VS编译环境%%~nf 取文件名主体shutdown /s /t 60 安心睡觉BAT脚本看似简单,但真正用好了,能把你从大量重复性操作中解放出来,让你把时间花在更有价值的事情上——比如认真分析结果,而不是对着GUI不停地点鼠标。