大家好,我是艾米雷斯。从今天开始,我将开启一个不那么正经的教程系列,即《ABAQUS子程序UMAT不正经教程》。
或许你很奇怪,为啥是“不正经教程”,很简单哦:
这年头,“正经教程”谁看哦(当然,打史我我也不会承认是因为我的水平太差,写不了正经教程,只能写不正经教程而已)

在开启教程之前,先简单介绍一下本艾。艾米雷斯毕业于我国一所以土木工程见长的知名高校:上海五角场建筑科技大学。博士期间,见到师弟用UMAT用得特别溜,初步接触后觉得这是以后科研道路上的一大神(装)兵(叉)利器,所以就着手去自学。
然而正如ABAQUS自带教程对于UMAT的描述:
***************************************************
The use of this subroutine generally requires considerable expertise.
***************************************************
艾米觉得这是ABAQUS在当我面说:“学渣就不要想染指了”。

艾米雷斯脾气可大了,这种“羞辱”岂能作罢,我就不相信,区区UMAT我会搞不定。在网上大量查阅了大量资料,看了一堆大神推导的公式,之后,艾米雷斯终于顿悟了:

平静下来之后,艾米就在想一个很深刻的问题:
有没有一种既好玩又不失重点的学习方法,帮助和我一样的学渣来大致掌握UMAT的核心技术,包括一些公式的推导。
在这样的背景之下,艾米决定尝试些一个看起来不那么正经的教程,帮助大家在UMAT的苦逼学习中获得一些乐趣,降低一些学习的压力。当然,正如之前所示,艾米的水平是有限的,如果你发现了什么错误,请在留言区留言,艾米欢迎所有的留言,但温馨提示,艾米是很懒的,所以你恢复后十天半个月没有回复也不要灰心,可能不是你的问题,而是艾米懒得打开知乎的创作中心。
下面我们就开始这一个不怎么正经的教程,在(一)中,艾米将介绍一些UMAT最基本的知识,这些知识暂不涉及一些公式的推导,以免吓着大家,毕竟,以艾米看知乎的大致习惯,当我看到有公式推导的文章,第一反应就是:

UMAT是ABAQUS众多子程序(Subroutine)中的一个,从命名来看,就是User-Material的简写。很多初学的小伙伴刚看到Subroutine这个名词时,本能地会感到虎躯一震,认为这是一个高大上的词汇,其实Subroutine子程序就是一个函数,本质上就是:

Subroutine就是那个函数 f ,我们要处理的就是其中的自变量 x ,至于输出 y , 可以是一个数值,也可以是我们一系列操作的结果。
UMAT是一般基于Fortran编写的,这里艾米要吐槽一下,这都2020年了,就不能用一些其他语言编写,譬如我神通广大的Python。当然ABAQUS选择Fortran,原因就在于这种语言编写的程序运行速度很快。运行速度和用户可读性一般不可兼得,譬如我大Python,一读就懂,但运行速度相比C/C++就逊色不少。
Fortran的语言一般有两种格式,一种是固定格式,一种是自由格式。固定格式来源于早期的卡片式,大概就长下面这个样子:

另一种是自由格式,这个书写方式就和我们现代的代码编程习惯很接近了。
有小伙伴说了,那我就按照自由格式来写呗。然而,你想多了,根据艾米的实战经验,ABAQUS的UMAT程序采用的是固定格式,如果采用自由格式,有一定的概率会报错,至少艾米装的Fortran编译器是如此,因此,我们后面的例子中,你会看到艾米的程序基本是用固定格式进行书写。不信邪的小伙伴也可以试一试,实际上,ABAQUS内部的UMAT资料上就已经写了,建议大家使用固定格式,也就是FORTRAN77的格式书写。
是不是发现又出现了一个新的名词,FORTRAN77。这个其实是FORTRAN的版本,后续还有FORTRAN90和FORTRAN95。
这里要分清一个概念哦,虽然ABAQUS要求书写的格式是FORTRAN77的书写格式,但 FORTRAN90 和 FORTRAN95 的语法在子程序中是可以使用的。原因在于,我们现在用的编译器支持 FORTRAN90 和 FORTRAN95 的,书写格式只是书写格式,不影响编译器识别我们的代码。
为了方便小伙伴们查阅,FORTRAN77的书写格式给大家总结了一下。
FORTRAN77按照 列号 将程序分为了几个区,注意,列号从1开始:
***************************************************
列号1~5:标号区,可以写1~5位整数,空格不起作用,也就是说,100和1 00在程序看来是一个东西。这里主要做啥呢,还记不记得大学学C/C++时,老师提到一个叫做go to的功能,就是将程序入口接到某一行,标号区就是给每行起个名字,譬如给某一行起名10,后面你来了一句 goto 10,这样程序就会跳到这一行继续运行。当然,如同很多人告诉你的,不要用go to这个函数,因为这样会打乱整个程序的架构,所以艾米有时候也很无语,这简直脱了裤子那啥嘛,对吧。标号区的第一列如果是符号 ' C ' 或者 ' * ',则该行是注释,程序会把这行当注释,啥都不做。
列号6:续行区,主要是为了一行代码太长需要续行做准备,只要这一行写上一个非空个或者非零的字符,就表示这一行是续行。一般小伙伴们看到很多人会写上1,2,3,4 等数字,那是个人的习惯,实际上,你就是写上$ $ $ $ ,也是没关系的,还能体现你财大气粗的独特气质。
列号7~72:程序区,你的代码就写在这些列里面
列号73~80:又是注释区,上古时代遗留下来,那个时期的程序员写注释的地方,编译器不会执行这些列的代码。
***************************************************
有了这些铺垫之后,就让我们来看一下UMAT子程序的大体架构:
***************************************************
C First user subroutine trial
SUBROUTINE UMAT (STRESS,STATEV,DDSDDE,SSE,SPD,SCD,RPL,
1 DDSDDT,DRPLDE,DRPLDT,STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP ,
2 PREDEF,DPRED,CMNAME,NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS ,
3 COORDS,DROT,PNEWDT,CELENT,DFGRD0,DFGRD1,NOEL,NPT,LAYER ,
4 KSPT,KSTEP,KINC)
INCLUDE 'ABA_PARAM.INC'
C
CHARACTER*8 CMNAME
DIMENSION STRESS(NTENS), STATEV(NSTATV), DDSDDE(NTENS,NTENS) ,
1 DDSDDT(NTENS), DRPLDE(NTENS), STRAN(NTENS), DSTRAN(NTENS) ,
2 PREDEF(1), DPRED(1), PROPS(NPROPS), COORDS(3), DROT(3,3) ,
3 DFGRD0(3,3), DFGRD1(3,3)
DIMENSION MyVector(6), MyMatrix(6,6)
PARAMETER(TOLER = 1.0D-6)
你的代码区,在这里编写你高端大气上档次的FORTRAN代码。
RETURN
END
***************************************************
由于编辑较为困难,艾米将想要说的用加粗字体表示了出来。
第一行:C First user subroutine trial
由于第一行出现了字符 'C',所以这一行是注释行,你可以写任意自己想写的东西,当然这一行也可以不要。
SUBROUTINE UMAT
这个是ABAQUS的UMAT指定入口样式,也就是说,不管你有多飘,都得这么写,ABAQUS只认这种形式,包括后面括号内的一大串,你只要照抄就行。
这里有小伙伴要问,符号一定要大写么。答案是不需要,艾米大写纯属是因为借来的师弟的程序都是大写,所以就被师弟带歪了,FORTRAN程序是不区分大小写的,至少艾米的程序里不区分。
INCLUDE 'ABA_PARAM.INC'
这个也是照抄就行,文件主要的用途就是定义了一下UMAT的变量,应该就是上面括号里的一大长串东西。
加粗的1, 2,3,4,这个就是之前说的续行,普遍都是采用数字,你也可以看心情用其他的,但注意了,必须写在第六列里。
你的代码区
这个就是由你定义的用户材料,也是整个UMAT最核心的区域
RETURN 和 END
这个表示子程序结束了,一般照抄就行,有始有终嘛
-----------------------------------我是分割线------------------------------------------------
有关UMAT一些最基本的程序知识,艾米就先介绍到这里,在第(二)讲中,艾米将用一个大家普遍采用的弹性本构来带大家看一下,如何编写一个UMAT子程序。
这里插一句,艾米看到的好多教程,都通过对矩阵的每个元素进行处理,双重循环来达到矩阵定义的目的,在下一讲中,艾米将告诉大家一个便捷的方法,充分地利用FORTRAN语言自带的矩阵处理库来生成相应的矩阵。
那我们下期见啦