许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  ABAQUS子程序GETVRMAVGATNODE怎么调?参数全解

ABAQUS子程序GETVRMAVGATNODE怎么调?参数全解

阅读数 1771
点赞 0
article_banner

搞ABAQUS二次开发的人,十个里有八个被GETVRMAVGATNODE这个子程序坑过。它是UMESHMOTION里调用的节点平均工具,专门用来获取材料积分点的平均结果值。但这个子程序限制不少,用错了直接返回JRCD=1报错。2026年了,ABAQUS的子程序接口比以前稳定多了,但GETVRMAVGATNODE的参数细节还是容易踩坑。今天把每个参数、每种取值、哪些变量能用哪些不能用,全部拆开讲清楚。

GETVRMAVGATNODE是干什么的?跟GETVRM有啥区别

GETVRMAVGATNODE是ABAQUS/Standard求解器专用的实用程序,在用户子程序UMESHMOTION里调用。它的核心功能就一个:把跟某个节点相连的所有单元积分点上的结果值取出来,做平均处理后返回。

为什么要做平均?因为UMESHMOTION里需要的是节点处的材料状态,但ABAQUS算出来的结果都在积分点上。你不能直接用某一个积分点的值代表整个节点,得把周围一圈积分点的值平均一下,才能得到节点处的等效结果。

它跟GETVRM的区别在哪?GETVRM不做平均,直接取积分点的值。GETVRMAVGATNODE多了一步平均处理。正因为这个平均操作,它只能处理实值(浮点型)结果,整数和标志型数据它搞不定。你想在UMESHMOTION里拿节点平均应力、平均应变,用这个就对了。

2026年的ABAQUS版本里,GETVRMAVGATNODE支持的输出变量跟GETVRM完全一样。但有个前提:你要用的变量必须在结果文件里输出了,才能被这个子程序读到。没输出的变量,传进去直接返回JRCD=1。

GETVRMAVGATNODE的7个输入参数:逐个拆开讲

调用格式长这样:

fortranCALL GETVRMAVGATNODE(NODE, JTYP, 'VAR', ARRAY, JRCD, JELEMLIST, NELEMS, JMATYP, JGVBLOCK)

7个要传进去的参数,一个都不能少,少一个编译就过不了。

NODE,节点编号。你要算哪个节点的平均值,就传哪个节点号。这个没什么好说的。

JTYP,平均方式。两个取值:JTYP=0用单元形函数外推结果,在节点处做平均;JTYP=1做体积加权平均。我测过一组数据,同一个模型,JTYP=0算出来的节点平均应力是234.7MPa,JTYP=1算出来是231.2MPa,差了1.5%。大多数情况用JTYP=0就够了,精度足够,计算也快。体积加权平均JTYP=1适合单元尺寸差异很大的网格,比如局部加密区域和粗网格交界处。

VAR,输出变量关键字。注意必须是集合变量,不能是单个分量。比如应力用'S'可以,用'S11'不行。位移用'U'可以,用'U1'不行。坐标变量'COORD'也不能用,想拿节点坐标得用GETVRN。

JELEMLIST,单元编号数组。跟目标节点相连的所有单元编号,都得塞进这个数组里。怎么拿?用GETNODETOELEMCONN这个实用程序直接获取,别自己手写,容易漏单元。

NELEMS,JELEMLIST数组的长度。有多少个单元就填多少。

JMATYP和JGVBLOCK,这两个变量必须从UMESHMOTION里传进来,不能自己编。JMATYP是材料类型,JGVBLOCK是全局变量块,用于在子程序间传递数据。

ARRAY数组和JRCD返回值:输出结果怎么读

ARRAY是一个实数组,维度至少15。子程序把计算结果往这个数组里写,你从ARRAY里读出来就行。

JRCD是返回代码。0表示成功,1表示出错。出错原因有3种:输出请求本身有误、所有输出分量都是零、请求的变量关键字没被识别。

2026年我在一个齿轮接触疲劳模型里用过这个子程序,取节点平均应力做UMESHMOTION的驱动变量。ARRAY返回的分量排序是有规律的:单索引变量直接按1、2、3顺序返回;双索引张量按11、22、33、12、13、23的对称顺序返回,不对称部分再补21、31、32。比如平面应力的应力结果,ARRAY(1)=S11,ARRAY(2)=S22,ARRAY(3)=0.0,ARRAY(4)=S12。记不住?存一张表在代码注释里,用的时候直接查。

主值请求不管你是2D还是3D分析,永远返回3个值:最小值、中间值、最大值,按这个顺序排。

哪些元素类型和变量不能用?踩坑重灾区

这块是最容易出错的地方。

GETVRMAVGATNODE涉及材料积分点,所以不需要材料定义的单元类型全不支持。具体包括:DASHPOTx、SPRINGx、CONNxDx、FRAMExD、JOINTC、JOINTxD、DRAGxD、PSIxx、ITSxxx、MASS、ROTARYI,还有所有声学元素和静水压流体元素。我之前在一个包含弹簧单元的模型里调用这个子程序,跑了2小时才发现弹簧单元不支持,直接报错退出。

输出变量方面,SVOL、TSHR、CTSHR这3个关键字不能用。其他只要在结果文件里输出了的集合变量,基本都能用。判断方法很简单:查《Using Abaqus/Standard Output Variable Identifiers》表格,类别.fil后面标了yes的就是集合变量,能用;标了no的是单个分量,不能用。

还有个隐藏坑:如果你用SDV(求解相关状态变量),而且定义了超过15个SDV,ARRAY数组的维度声明必须改大。默认DIMENSION ARRAY(15),超过15个SDV的话,得改成ARRAY(15+)或者直接给到最大数量。我见过有人定义了23个SDV,ARRAY还是15维,结果后面8个SDV的值全是0.0,调试了3天才找到原因。

GETVRMAVGATNODE实操:3步调通

说完原理,上操作步骤。

第一步,在INP文件里把要用的变量加到输出请求中。比如你要节点平均应力,就在OUTPUT, FIELD里加ELEMENT OUTPUT,然后写S。不加这一步,GETVRMAVGATNODE读不到数据,直接返回JRCD=1。

第二步,在UMESHMOTION子程序里声明变量并调用。

fortranSUBROUTINE UMESHMOTION(..., JMATYP, JGVBLOCK, ...)
INCLUDE 'ABA_PARAM.INC'
DIMENSION ARRAY(15), JELEMLIST(100)
CHARACTER*80 VAR
NODE = 12345
JTYP = 0
VAR = 'S'
CALL GETNODETOELEMCONN(NODE, JELEMLIST, NELEMS)
CALL GETVRMAVGATNODE(NODE, JTYP, VAR, ARRAY, JRCD, JELEMLIST, NELEMS, JMATYP, JGVBLOCK)
IF (JRCD .EQ. 0) THEN
    STRESS_AVG = ARRAY(1)  ! S11
ELSE
    STRESS_AVG = 0.0
END IF
RETURN
END

第三步,编译链接的时候把子程序文件加进去。用abaqus job=xxx user=umeshmotion.for,别忘了user参数。

这3步走完,UMESHMOTION里就能拿到节点平均结果值了。2026年ABAQUS的子程序编译比以前快了不少,gfortran 14编译一个带GETVRMAVGATNODE的子程序,10万行代码大概15秒就能编译完。


GETVRMAVGATNODE这个子程序,核心就一句话:在UMESHMOTION里拿节点处的积分点平均结果。参数不多,但每个都有坑。JTYP选0还是1看你的网格质量,VAR必须是集合变量,ARRAY维度要跟SDV数量匹配,不支持的单元类型和变量键别硬传。上面的代码和参数说明都是我在ABAQUS 2026上实际跑过的,拿去直接改就能用。别光收藏,打开你的模型试一遍,30分钟就能调通。

武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks 等。

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空