后处理里翻遍了Field Output所有下拉项,找不到应力三轴度,Abaqus自带的输出变量就那些,Mises、主应力、PEEQ,想看点自己定义的东西,只能走UVARM这条路。
先搞清楚UVARM是干什么的。它就是一个“只读”的输出变量生成器,在材料定义的每一个积分点上被调用,你可以拿GETVRM去读应力应变状态变量这些现成数据,算一个自己的量出来,塞进UVAR数组里,后处理的时候当云图画。它不碰本构,不改变刚度,不参与求解,纯粹是后处理层面的扩展,UMAT是改计算的,UVARM是改显示的,两码事。
材料模块里加User Defined Output Variables,这个字段在Material定义下面,Mechanical → User Defined Output Variables,里面填NUVARM的数量。这个数字必须跟Fortran子程序里UVAR数组的维度一致,NUVARM=3,子程序里就只能写到UVAR(3),写到UVAR(4)就写越界了。ABAQUS不会报错,但云图数据是乱的。同一个模型里不同材料可以有不同的NUVARM,每个材料对应一套自己的输出逻辑,但子程序里得用CMNAME区分材料分支。
有一次给同事调一个复合材料失效指标,他想看Tsai-Wu准则算出来的危险因子,NUVARM设了1,子程序里算完塞进UVAR(1),提交跑完,云图上UVARM1那一项是灰的,画不出来。查了半天发现他把UVARM写在了Step模块的Field Output Request里,但材料层面没加*USER OUTPUT VARIABLES,ABAQUS根本没给这个材料分配UVARM的存储空间。材料模块里加了这个字段之后,重启CAE,Field Output Request里才会出现UVARM1的选项。那个同事当时坐在我旁边,桌上摆着半杯凉了的奶茶,吸管咬得扁扁的,他一边翻Manual一边念叨“怎么就没有呢”,前后折腾了快一个小时。

GETVRM是UVARM的核心工具。调用格式是CALL GETVRM('S', ARRAY, JARRAY, FLGRAY, JRCD, JMAC, JMATYP, MATLAYO, LACCFLA),第一个参数是你要读的输出变量标识符,'S'是应力,'E'是应变,'SDV'是状态变量,'PEEQ'是等效塑性应变。读出来的数据放在ARRAY数组里,双精度浮点。非线性分析里GETVRM返回的是当前迭代的值,只有在增量步收敛的那次迭代,返回的才是最终值,所以UVARM在一个增量步内可能被调用多次,每次的结果不一样,后处理里看到的永远是收敛那一次的值。
USER OUTPUT VARIABLES在inp里的写法是USER OUTPUT VARIABLES, NUVARM=3,跟在MATERIAL下面。OUTPUT, FIELD, VARIABLE=PRESELECT, UVARM这个是在Step里请求输出。UVARM的数据写进.odb是单精度的,但子程序内部计算是双精度的,如果算出来的量级特别大或者特别小,往odb写的时候可能溢出,云图上显示-1.#IND或者-NaN。遇到这种就检查计算中间有没有除以接近零的数,或者用对数尺度先变换一下再输出。
子程序的编译配置跟UMAT一样,abaqus job=job_name user=uvarm.for cpus=4 interactive,.for文件里SUBROUTINE UVARM开头的参数列表一个都不能少,INCLUDE 'ABA_PARAM.INC'这行必须有。跟UMAT同时用的时候,两个子程序写在同一个.for文件里,别分开。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删