在 Abaqus 用户子程序中,常见的程序文件后缀为 .for,例如 UMAT.for、VUMAT.for 等。.for 文件通常表示 Fortran 程序文件,在 Abaqus 二次开发中多采用传统固定格式 Fortran 语法。UMAT、VUMAT、USDFLD、UEL 等用户子程序均可使用 Fortran 编写,其中 UMAT 主要用于 Abaqus/Standard,VUMAT 主要用于 Abaqus/Explicit。
对于初学者来说,可以先将 .for 文件理解为 Abaqus 调用的 Fortran 子程序文件。用户通过该文件编写材料本构关系、应力更新方法、状态变量更新方法以及其他自定义计算逻辑。
Abaqus 子程序中常见的 .for 文件通常采用固定格式 Fortran 写法。固定格式 Fortran 对代码书写位置有一定要求。一般情况下,第 1 列可用于注释标志,例如 C、c 或 *;第 1 至第 5 列可用于语句标号;第 6 列常用于续行标志;第 7 至第 72 列为正式代码书写区域;第 73 列以后通常不建议继续书写有效代码。
例如,在 UMAT 子程序接口中,经常会看到如下写法:
代码块
fortran
自动换行
复制代码
1234
SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,
1 RPL,DDSDDT,DRPLDE,DRPLDT,
2 STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP)
复制成功
其中,第二行和第三行前面的 1、2 表示续行,即前一行代码尚未结束,当前行继续上一行内容。对于 Abaqus 子程序而言,正确理解续行规则非常重要,否则容易出现编译错误。
注意:.for文件不区分大小写
Fortran 中的注释语句用于解释代码功能,不参与程序计算。在固定格式 Fortran 中,常见的注释方式是在第 1 列写入 C、c 或 *。例如:
代码块
fortran
自动换行
复制代码
12
C This is a comment line
复制成功
也可以使用现代 Fortran 中常见的感叹号 ! 进行注释,例如:
代码块
fortran
自动换行
复制代码
12
! Read material parameters
复制成功
在 UMAT/VUMAT 子程序中,注释通常用于说明材料参数含义、变量作用、应力更新步骤、损伤判据含义以及状态变量编号。良好的注释可以显著提高代码的可读性,尤其是在后期修改子程序或复现他人代码时非常重要。
在 UMAT 子程序中:
代码块
fortran
自动换行
复制代码
12
INCLUDE 'ABA_PARAM.INC'
复制成功
在 VUMAT 子程序中:
代码块
fortran
自动换行
复制代码
12
INCLUDE 'vaba_param.inc'
复制成功
INCLUDE 语句的作用是引入 Abaqus 提供的参数定义文件。该文件中通常包含 Abaqus 用户子程序所需的一些基本参数和精度设置。对于初学者来说,一般不需要修改该语句,只需要知道 UMAT 中常用 ABA_PARAM.INC,VUMAT 中常用 vaba_param.inc 即可。
Fortran 程序中通常需要提前声明变量类型。Abaqus 子程序中常见的变量类型包括整数类型和双精度实数类型。
整数变量常用 INTEGER 声明,例如:
代码块
fortran
自动换行
复制代码
12
INTEGER I, J, KM
复制成功
双精度实数变量常用 DOUBLE PRECISION 或 REAL*8 声明,例如:
代码块
fortran
自动换行
复制代码
12
DOUBLE PRECISION E, NU, G
复制成功
或者写成:
代码块
fortran
自动换行
复制代码
12
REAL*8 E, NU, G
复制成功
在材料子程序中,应力、应变、弹性模量、泊松比、塑性应变、损伤变量等通常采用双精度实数形式,以保证计算精度。
UMAT/VUMAT 中大量变量以数组形式存在,例如应力数组、应变数组、状态变量数组和材料参数数组等。Fortran 中常用 DIMENSION 语句声明数组大小。
在 UMAT 中,常见数组声明如下:
代码块
fortran
自动换行
复制代码
1234
DIMENSION STRESS(NTENS),STATEV(NSTATV),
1 DDSDDE(NTENS,NTENS),STRAN(NTENS),DSTRAN(NTENS),
2 PROPS(NPROPS)
复制成功
其中,STRESS 表示应力数组,STATEV 表示状态变量数组,DDSDDE 表示材料切线刚度矩阵,STRAN 表示总应变,DSTRAN 表示应变增量,PROPS 表示材料参数数组。
Fortran 数组下标通常从 1 开始。例如:
代码块
fortran
自动换行
复制代码
123
E = PROPS(1)
NU = PROPS(2)
复制成功
表示将 Abaqus 输入文件中第一个材料参数赋给弹性模量 E,将第二个材料参数赋给泊松比 NU。因此,材料参数在 inp 文件中的输入顺序必须与子程序中 PROPS 的读取顺序保持一致。
Fortran 中使用等号进行赋值。例如:
代码块
fortran
自动换行
复制代码
1234
E = PROPS(1)
NU = PROPS(2)
G = E / (2.0D0 * (1.0D0 + NU))
复制成功
其中,E = PROPS(1) 表示将 PROPS(1) 的值赋给变量 E。在 Abaqus 子程序中,双精度常数通常写作 1.0D0、2.0D0 或 0.0D0,其中 D0 表示双精度浮点数。对于 UMAT/VUMAT 这类数值计算程序,建议尽量使用双精度形式,避免精度不足导致计算误差。
该部分在Abaqus中的对应输入如下图所示:

循环语句是 UMAT/VUMAT 中最常见的程序结构之一。Fortran 中常用 DO 语句进行循环计算。例如:
代码块
fortran
自动换行
复制代码
1234
DO I = 1, NTENS
STRESS(I) = STRESS(I) + DSTRAN(I)
END DO
复制成功
该语句表示从 I = 1 循环到 I = NTENS,逐个更新应力分量。
在 VUMAT 中,最重要的是 nblock 循环。VUMAT 一次调用时可能同时处理多个材料积分点,因此需要通过循环对每个积分点分别进行应力和状态变量更新。常见写法如下:
代码块
fortran
自动换行
复制代码
123456
DO 100 KM = 1, NBLOCK
user coding
100 CONTINUE
复制成功
其中,KM 表示当前积分点编号。在 VUMAT 中,通常需要在 DO KM = 1, NBLOCK 循环内部更新 stressNew(KM,I) 和 stateNew(KM,I)。初学 VUMAT 时要特别注意,不能只更新一个积分点,而应在 nblock 循环中对所有积分点逐点更新。
判断语句用于根据不同条件执行不同计算。在 UMAT/VUMAT 中,判断语句常用于屈服判断、损伤起始判断、单元失效判断和材料参数控制。
基本写法如下:
代码块
fortran
自动换行
复制代码
123456
IF (SIGEQ .LE. SIGY) THEN
FLAG = 0
ELSE
FLAG = 1
END IF
复制成功
其中,.LE. 表示小于等于,.GE. 表示大于等于,.LT. 表示小于,.GT. 表示大于,.EQ. 表示等于,.NE. 表示不等于。
例如:
代码块
fortran
自动换行
复制代码
1234
IF (DAMAGE .GE. 1.0D0) THEN
STATEV(1) = 1.0D0
END IF
复制成功
该代码表示如果损伤变量 DAMAGE 大于等于 1,则将状态变量 STATEV(1) 设置为 1。类似语句在损伤模型和材料失效模型中非常常见。
UMAT 是 Abaqus/Standard 中的用户材料子程序。初学 UMAT 时,应重点掌握 STRESS、STATEV、DDSDDE、STRAN、DSTRAN 和 PROPS 等变量。
STRESS 是应力数组,进入 UMAT 时通常为上一增量步末的应力,离开 UMAT 时需要更新为当前增量步末的应力。STATEV 是状态变量数组,用于保存塑性应变、损伤变量、历史最大应变、失效标志等历史信息。DDSDDE 是材料切线刚度矩阵,主要用于 Abaqus/Standard 的隐式迭代过程。STRAN 是当前增量步开始时的总应变,DSTRAN 是当前增量步的应变增量,PROPS 是材料参数数组。
UMAT 的基本计算逻辑可以概括为:首先读取材料参数,然后根据应变增量计算应力增量,再更新应力和状态变量,最后给出材料切线刚度矩阵。对于线弹性材料,其核心思路可以简单理解为利用刚度矩阵乘以应变增量,得到应力增量,并将其累加到当前应力中。
STATE状态变量在Abaqus中的输入界面如下:

VUMAT 是 Abaqus/Explicit 中的用户材料子程序。与 UMAT 不同,VUMAT 通常不需要用户提供材料切线刚度矩阵,而是直接在显式时间积分过程中更新应力和状态变量。
初学 VUMAT 时,应重点掌握 nblock、strainInc、stressOld、stressNew、stateOld、stateNew 和 props 等变量。其中,nblock 表示当前一次调用中包含的积分点数量,strainInc 表示当前时间步的应变增量,stressOld 表示上一步应力,stressNew 表示当前步应力,stateOld 表示上一步状态变量,stateNew 表示当前步状态变量,props 表示材料参数数组。
VUMAT 的基本计算逻辑可以概括为:在 nblock 循环中,对每一个积分点读取旧应力、旧状态变量和当前应变增量,然后根据材料本构模型计算新应力和新状态变量,最后写入 stressNew 和 stateNew。
UMAT 主要用于 Abaqus/Standard,属于隐式分析用户材料子程序;VUMAT 主要用于 Abaqus/Explicit,属于显式分析用户材料子程序。UMAT 通常需要用户定义材料切线刚度矩阵 DDSDDE,该矩阵会影响隐式迭代的收敛性;VUMAT 通常不需要定义 DDSDDE,而是直接更新 stressNew 和 stateNew。
从变量形式上看,UMAT 中常用 STRESS 和 STATEV,这些变量进入子程序时包含旧值,退出子程序时需要被更新为当前值;VUMAT 中则明确区分旧值和新值,例如 stressOld、stressNew、stateOld、stateNew。此外,VUMAT 通常需要使用 nblock 循环,对多个积分点逐点更新,而 UMAT 一般针对单个积分点进行计算。
初学 UMAT/VUMAT 时,常见错误之一是材料参数顺序错误。如果代码中写的是 E = PROPS(1)、NU = PROPS(2),那么 Abaqus 输入文件中第一个材料参数就必须是弹性模量,第二个材料参数必须是泊松比。如果输入顺序与代码读取顺序不一致,就可能导致材料响应完全错误。
第二类常见错误是数组下标错误。Fortran 数组通常从 1 开始,而不是从 0 开始。因此,PROPS(1) 表示第一个材料参数,STATEV(1) 表示第一个状态变量。使用 PROPS(0) 这类写法容易导致数组越界或程序异常。
第三类常见错误是 VUMAT 中忘记使用 nblock 循环。由于 VUMAT 一次调用可能包含多个积分点,因此必须在循环中逐点更新 stressNew 和 stateNew。如果遗漏该循环,可能导致只有部分积分点被更新,或者程序运行结果异常。
第四类常见错误是状态变量没有正确传递。在 VUMAT 中,stateOld 是旧状态变量,stateNew 是当前步需要写入的新状态变量。如果计算中没有将需要保留的历史变量写入 stateNew,那么这些历史信息可能在下一时间步丢失。
第五类常见错误是剪切分量顺序混淆。三维情况下,应力和应变分量通常按照 11、22、33、12、13、23 的顺序排列。在编写复合材料、各向异性材料或损伤模型时,应特别注意剪切分量顺序和剪切应变定义方式。
Abaqus UMAT/VUMAT 子程序的学习可以分为两个层次:第一个层次是看懂 Fortran 基础语法和子程序接口,第二个层次是理解材料本构模型的具体实现。本文只针对第一个层次进行基础介绍,主要内容包括 .for 文件、固定格式 Fortran 书写规则、注释、续行、变量声明、数组声明、赋值语句、循环语句、判断语句,以及 UMAT/VUMAT 中常见变量的基本含义。
对于初学者而言,掌握这些基础语法后,就可以初步阅读 Abaqus 用户子程序代码,并能够对代码中的变量、数组、循环和判断逻辑形成基本认识。后续若需要进一步修改或开发子程序,还需要继续学习材料本构关系、应力更新算法、状态变量设计、材料刚度矩阵构造和调试方法等内容。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删