最近新上手abaqus子程序,没有人带,自己瞎琢磨,碰了不少壁;在闲鱼上淘到的umat和vumat子程序放在这里,供各位研究生er使用,也欢迎大家交流哇!
链接:https://pan.baidu.com/s/1dMQHzT35LSYSjsvYbgLwqg
提取码:297o
上述压缩包里面的子程序,我大概看懂了一部分,有新手可以在评论区交流。
坐标:bit力学系

abaqus.bat -j jobname user=sub.f interactive,命令行敲完回车,等了三秒弹出一行“error during compilation”,连log都没生成。
环境配齐是第一步,Abaqus 2021对应VS2019加Intel oneAPI 2021,装完在cmd里跑abaqus verify -user_std,全pass才算通,VS版本错一个minor号链接器就找不到libifcoremd.lib,oneAPI装的时候勾选Fortran和C++两个组件,默认只勾C++,子程序编译永远过不了。Python这边Abaqus自带2.7解释器,路径在installation_dir\tools\SMApy\python2.7,别用系统装的3.x,import abaqus直接报No module named abaqus,想写新语法就用rpy脚本外部调用,或者干脆上pyabq这种第三方封装库,Ansys的ACT框架倒是原生支持Python3,Abaqus这边生态还卡在2.7尾巴上。
子程序入口UMAT、VUMAT、USDFLD、UELMAT这几个最常用,UMAT里STATEV数组维度必须在DEPVAR里声明,少写一个分量结果全乱,应力更新写在DDSDDE矩阵之后,雅可比不对称收敛会慢一半甚至发散,VUMAT没有DDSDDE,显式积分自己算应力增量,时间步长由稳定条件控制,写错了不会报错只会算出离谱的数。调试的时候把write(,*)塞进循环,输出重定向到msg文件,比开debugger快十倍,gfortran编译选项加-g -O0才能断点,oneAPI默认优化级别O2,变量被优化掉watch窗口全是
去年七月调一个蠕变子程序,办公室空调坏了三天,室温三十四度,风扇吹出来的全是热风,旁边同事在啃西瓜,汁水滴在键盘缝里,我盯着屏幕上的NaN看了整整一下午,STATEV(5)明明赋了值,下一增量步进来变成-1.#QNAN,把整个subroutine逐行加write输出,写到第两百多行才发现是数组越界,DIMENSION STATEV(4)声明了4个分量,代码里却访问了STATEV(5),编译器没报错因为Fortran默认不检查边界,加了/check:bounds重新编译才定位到那一行,改完跑通的那一刻汗已经把后背浸透了,西瓜味混着汗味飘了一整层楼。
Python二次开发分两块,前处理用mdb对象建模,后处理用odbAccess读结果,mdb.Model().Part()这条链子写顺了比CAE点点点快几十倍,参数化扫掠、批量提交、结果提取全靠它,odbAccess打开odb是只读的,想改结果得用fieldOutput.addData新建场,脚本里from abaqus import *这一句必须在第一行,否则后续所有对象都拿不到。rpy文件放在工作目录下,abaqus cae noGUI=script.py执行,日志输出到abaqus.rpy.log,报错信息比交互式窗口详细得多。
材料参数从Excel读进来用xlrd或者openpyxl,Abaqus Python2.7自带的xlrd版本太老不支持xlsx,只能读xls,想读新格式就把openpyxl的egg包扔到site-packages里,路径在installation_dir\tools\SMApy\python2.7\Lib\site-packages,别pip install,解释器认的是本地egg。后处理画曲线用xyPlot,数据导出csv用session.xyDataListFromOdb配合writeXYReport,批量处理几十个odb的时候写成函数套循环,比手动一个个打开效率高两个数量级。
子程序和Python混用的场景,比如USDFLD里根据温度切换材料属性,温度场又来自Python预处理生成的非均匀初始条件,这时候数据传递靠sdvini或者外部文件读写,子程序里open文件读txt,Python端提前把节点坐标和对应值写好,格式对齐,IO开销大就把数据压缩成二进制,read/write比文本解析快一个量级。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删