settimer在mfc程序中的某一个cdialogex中不起作用_ABAQUS用户子程序UMAT不正经教程(一): UMAT入门小知识...

本文是《ABAQUS子程序UMAT不正经教程》的第一部分,作者以轻松幽默的方式介绍了UMAT的基本知识。UMAT是ABAQUS中的用户材料子程序,用于自定义材料行为。尽管ABAQUS警告其需要专业知识,但作者决心挑战这一难点,并分享他的学习历程。教程涵盖了子程序的基础,如FORTRAN77的固定格式,UMAT的结构以及如何理解SUBROUTINE。作者强调,UMAT实质上就是一个函数,通过编写FORTRAN代码实现特定材料模型。尽管ABAQUS推荐使用固定格式,作者也提醒读者,现代编译器支持更高级的FORTRAN语法。在接下来的部分,作者将通过一个弹性本构模型实例,进一步解释UMAT的编写方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家好,我是艾米雷斯。从今天开始,我将开启一个不那么正经的教程系列,即《ABAQUS子程序UMAT不正经教程》。

或许你很奇怪,为啥是“不正经教程”,很简单哦:

这年头,“正经教程”谁看哦(当然,打史我我也不会承认是因为我的水平太差,写不了正经教程,只能写不正经教程而已)

d3ace0565ce72c66d0502ad98ebc6818.png

在开启教程之前,先简单介绍一下本艾。艾米雷斯毕业于我国一所以土木工程见长的知名高校:上海五角场建筑科技大学。博士期间,见到师弟用UMAT用得特别溜,初步接触后觉得这是以后科研道路上的一大神(装)兵(叉)利器,所以就着手去自学。

然而正如ABAQUS自带教程对于UMAT的描述:

***************************************************

The use of this subroutine generally requires considerable expertise.

***************************************************

艾米觉得这是ABAQUS在当我面说:“学渣就不要想染指了”。

c5d63a49100e8d209329a7de91f03a1d.png

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

ff47372edc682d1b72dd3ad19cb6a00e.png

平静下来之后,艾米就在想一个很深刻的问题:

有没有一种既好玩又不失重点的学习方法,帮助和我一样的学渣来大致掌握UMAT的核心技术,包括一些公式的推导。

在这样的背景之下,艾米决定尝试些一个看起来不那么正经的教程,帮助大家在UMAT的苦逼学习中获得一些乐趣,降低一些学习的压力。当然,正如之前所示,艾米的水平是有限的,如果你发现了什么错误,请在留言区留言,艾米欢迎所有的留言,但温馨提示,艾米是很懒的,所以你恢复后十天半个月没有回复也不要灰心,可能不是你的问题,而是艾米懒得打开知乎的创作中心。

下面我们就开始这一个不怎么正经的教程,在(一)中,艾米将介绍一些UMAT最基本的知识,这些知识暂不涉及一些公式的推导,以免吓着大家,毕竟,以艾米看知乎的大致习惯,当我看到有公式推导的文章,第一反应就是:

c09aeef5d44e38b874f18fab8388d7d7.png

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

equation?tex=y%3Df%28x%29

Subroutine就是那个函数 f ,我们要处理的就是其中的自变量 x ,至于输出 y , 可以是一个数值,也可以是我们一系列操作的结果。

UMAT是一般基于Fortran编写的,这里艾米要吐槽一下,这都2020年了,就不能用一些其他语言编写,譬如我神通广大的Python。当然ABAQUS选择Fortran,原因就在于这种语言编写的程序运行速度很快。运行速度和用户可读性一般不可兼得,譬如我大Python,一读就懂,但运行速度相比C/C++就逊色不少。

Fortran的语言一般有两种格式,一种是固定格式,一种是自由格式。固定格式来源于早期的卡片式,大概就长下面这个样子:

c8de39ea2a45370718daad5bc5c4bd29.png

另一种是自由格式,这个书写方式就和我们现代的代码编程习惯很接近了。

有小伙伴说了,那我就按照自由格式来写呗。然而,你想多了,根据艾米的实战经验,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, 234,这个就是之前说的续行,普遍都是采用数字,你也可以看心情用其他的,但注意了,必须写在第六列里。

你的代码区

这个就是由你定义的用户材料,也是整个UMAT最核心的区域

RETURN 和 END

这个表示子程序结束了,一般照抄就行,有始有终嘛

-----------------------------------我是分割线------------------------------------------------

有关UMAT一些最基本的程序知识,艾米就先介绍到这里,在第(二)讲中,艾米将用一个大家普遍采用的弹性本构来带大家看一下,如何编写一个UMAT子程序。

这里插一句,艾米看到的好多教程,都通过对矩阵的每个元素进行处理,双重循环来达到矩阵定义的目的,在下一讲中,艾米将告诉大家一个便捷的方法,充分地利用FORTRAN语言自带的矩阵处理库来生成相应的矩阵。

那我们下期见啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值