许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  写ABAQUS子程序UMAT和VUMAT,这些Fortran语法你得先会

写ABAQUS子程序UMAT和VUMAT,这些Fortran语法你得先会

阅读数 3
点赞 0
article_banner


1. .for 文件的基本认识

在 Abaqus 用户子程序中,常见的程序文件后缀为 .for,例如 UMAT.for、VUMAT.for 等。.for 文件通常表示 Fortran 程序文件,在 Abaqus 二次开发中多采用传统固定格式 Fortran 语法。UMAT、VUMAT、USDFLD、UEL 等用户子程序均可使用 Fortran 编写,其中 UMAT 主要用于 Abaqus/Standard,VUMAT 主要用于 Abaqus/Explicit。

对于初学者来说,可以先将 .for 文件理解为 Abaqus 调用的 Fortran 子程序文件。用户通过该文件编写材料本构关系、应力更新方法、状态变量更新方法以及其他自定义计算逻辑。

2. 固定格式 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文件不区分大小写

3. 注释语句

Fortran 中的注释语句用于解释代码功能,不参与程序计算。在固定格式 Fortran 中,常见的注释方式是在第 1 列写入 C、c 或 *。例如:

代码块

fortran


     自动换行
   


     复制代码
   

12


C     This is a comment line


      复制成功
     
     
     
     

也可以使用现代 Fortran 中常见的感叹号 ! 进行注释,例如:

代码块

fortran


     自动换行
   


     复制代码
   

12


      ! Read material parameters


      复制成功
     
     
     
     

在 UMAT/VUMAT 子程序中,注释通常用于说明材料参数含义、变量作用、应力更新步骤、损伤判据含义以及状态变量编号。良好的注释可以显著提高代码的可读性,尤其是在后期修改子程序或复现他人代码时非常重要。

4. INCLUDE 语句

在 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 即可。

5. 变量类型声明

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


      复制成功
     
     
     
     

在材料子程序中,应力、应变、弹性模量、泊松比、塑性应变、损伤变量等通常采用双精度实数形式,以保证计算精度。

6. 数组声明

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 的读取顺序保持一致。

7. 赋值语句

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中的对应输入如下图所示:


8. 循环语句

循环语句是 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 循环中对所有积分点逐点更新。

9. 判断语句

判断语句用于根据不同条件执行不同计算。在 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。类似语句在损伤模型和材料失效模型中非常常见。

10. UMAT 中常见变量

UMAT 是 Abaqus/Standard 中的用户材料子程序。初学 UMAT 时,应重点掌握 STRESS、STATEV、DDSDDE、STRAN、DSTRAN 和 PROPS 等变量。

STRESS 是应力数组,进入 UMAT 时通常为上一增量步末的应力,离开 UMAT 时需要更新为当前增量步末的应力。STATEV 是状态变量数组,用于保存塑性应变、损伤变量、历史最大应变、失效标志等历史信息。DDSDDE 是材料切线刚度矩阵,主要用于 Abaqus/Standard 的隐式迭代过程。STRAN 是当前增量步开始时的总应变,DSTRAN 是当前增量步的应变增量,PROPS 是材料参数数组。

UMAT 的基本计算逻辑可以概括为:首先读取材料参数,然后根据应变增量计算应力增量,再更新应力和状态变量,最后给出材料切线刚度矩阵。对于线弹性材料,其核心思路可以简单理解为利用刚度矩阵乘以应变增量,得到应力增量,并将其累加到当前应力中。

STATE状态变量在Abaqus中的输入界面如下:


11. VUMAT 中常见变量

VUMAT 是 Abaqus/Explicit 中的用户材料子程序。与 UMAT 不同,VUMAT 通常不需要用户提供材料切线刚度矩阵,而是直接在显式时间积分过程中更新应力和状态变量。

初学 VUMAT 时,应重点掌握 nblock、strainInc、stressOld、stressNew、stateOld、stateNew 和 props 等变量。其中,nblock 表示当前一次调用中包含的积分点数量,strainInc 表示当前时间步的应变增量,stressOld 表示上一步应力,stressNew 表示当前步应力,stateOld 表示上一步状态变量,stateNew 表示当前步状态变量,props 表示材料参数数组。

VUMAT 的基本计算逻辑可以概括为:在 nblock 循环中,对每一个积分点读取旧应力、旧状态变量和当前应变增量,然后根据材料本构模型计算新应力和新状态变量,最后写入 stressNew 和 stateNew。

12. UMAT 与 VUMAT 的基本区别

UMAT 主要用于 Abaqus/Standard,属于隐式分析用户材料子程序;VUMAT 主要用于 Abaqus/Explicit,属于显式分析用户材料子程序。UMAT 通常需要用户定义材料切线刚度矩阵 DDSDDE,该矩阵会影响隐式迭代的收敛性;VUMAT 通常不需要定义 DDSDDE,而是直接更新 stressNew 和 stateNew。

从变量形式上看,UMAT 中常用 STRESS 和 STATEV,这些变量进入子程序时包含旧值,退出子程序时需要被更新为当前值;VUMAT 中则明确区分旧值和新值,例如 stressOld、stressNew、stateOld、stateNew。此外,VUMAT 通常需要使用 nblock 循环,对多个积分点逐点更新,而 UMAT 一般针对单个积分点进行计算。

13. 常见基础错误

初学 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 的顺序排列。在编写复合材料、各向异性材料或损伤模型时,应特别注意剪切分量顺序和剪切应变定义方式。

15. 小结

Abaqus UMAT/VUMAT 子程序的学习可以分为两个层次:第一个层次是看懂 Fortran 基础语法和子程序接口,第二个层次是理解材料本构模型的具体实现。本文只针对第一个层次进行基础介绍,主要内容包括 .for 文件、固定格式 Fortran 书写规则、注释、续行、变量声明、数组声明、赋值语句、循环语句、判断语句,以及 UMAT/VUMAT 中常见变量的基本含义。

对于初学者而言,掌握这些基础语法后,就可以初步阅读 Abaqus 用户子程序代码,并能够对代码中的变量、数组、循环和判断逻辑形成基本认识。后续若需要进一步修改或开发子程序,还需要继续学习材料本构关系、应力更新算法、状态变量设计、材料刚度矩阵构造和调试方法等内容。



免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
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
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空