首页/文章/ 详情

Abaqus中任意两个Fortran 子程序之间的参数传递-附源码与模型

2天前浏览7
在有限元分析领域,Abaqus 凭借其强大的功能和广泛的适用性,成为众多工程师和科研人员的首选工具。而 Fortran 语言以其高效的数值计算能力,在 Abaqus 的内核二次开发中扮演着关键角色同时也是验证和猜测Abaqus求解器算法的重要工具。
Abaqus提供了多个Fortran子程序供用户进行二次开发,这些子程序涉及荷载定义(如Dload,DFLUX),边界定义(如Disp),约束定义(MPC),材料本构(Umat),单元技术(UEL)等各个方面。
在进行实际编写时,有时候可能会遇到同一个模型中需要定义多个子程序的情形,而Abaqus在同一模型中通常只能提交一个Fortran代码文件,此时就涉及了如何在同一Fortran代码中实现多个子程序的解决方案。同时这种情形通常又有两种情况:(一)同一模型中需要定义多个同一类型的子程序;(二)同一模型中需要定义多个不同类型的子程序。
本文在这里不对第一种情况的处理方式进行介绍,对于第二种即“同一模型中需要定义多个不同类型的子程序”,实际上我们只需要把对应的代码放到同一个文件中即可。例如,在同一模型中既需要采用Umat定义材料本构,又需要Dload定义荷载,则我们所要做的就是把umat的代码和Dload的代码放到同一个文件a.f中,再在提交时选择该文件a.f即可。
通常情况下,Umat和Dload并不会相互影响,是完全独立的。那如果现实中Umat和Dload存在相互影响的关系,此时我们就需要把Umat的代码逻辑和Dload的代码逻辑关联起来,这就可以用本文即将介绍的方法进行。
为了简化,我们假设Umat和Dload的相互关联的逻辑如下:
Umat的输入参数弹性模量为E,并且我们需要在模型上用Dload施加一个压力荷载,这个压力荷载的具体值和E的值相等(当然这个问题并不需要用子程序完成,这里仅仅是示例)。
很显然,要实现上述逻辑,我们需要的实际上是把Umat的输入参数传递到Dload中去,从而在Dload中定义荷载值为Umat的输入参数值。在理清上述思路后,在Fortran中我们实际上有两种方式来实现Umat和Dload的参数传递:Common公共区和Module。
这里,我们仅介绍更为现代化的Module的方式,实际上,现代Fortran是倡导使用Module而不使用Common的。
在Fortran中,Module的主要作用是封装变量、常量、类型定义以及过程,在不同的子程序中使用同一module,module中的变量值在这些不同的子程序中是相互共享的。
因此,我们可以采用如下方式进行实现Umat和Dload的参数传递







































































       module mod_a         real(8)::force1       end module mod_a
       SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,     1 RPL,DDSDDT,DRPLDE,DRPLDT,STRAN,DSTRAN,     2 TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,MATERL,NDI,NSHR,NTENS,     3 NSTATV,PROPS,NPROPS,COORDS,DROT,PNEWDT,CELENT,     4 DFGRD0,DFGRD1,NOEL,NPT,KSLAY,KSPT,KSTEP,KINC)              use mod_aC      INCLUDE 'ABA_PARAM.INC'C      CHARACTER*80 MATERL      DIMENSION STRESS(NTENS),STATEV(NSTATV),     1 DDSDDE(NTENS,NTENS),DDSDDT(NTENS),DRPLDE(NTENS),     2 STRAN(NTENS),DSTRAN(NTENS),TIME(2),PREDEF(1),DPRED(1),     3 PROPS(NPROPS),COORDS(3),DROT(3,3),     4 DFGRD0(3,3),DFGRD1(3,3)C      DIMENSION EELAS(6),EPLAS(6),FLOW(6)      PARAMETER (ONE=1.0D0,TWO=2.0D0,THREE=3.0D0,SIX=6.0D0)      DATA NEWTON,TOLER/10,1.D-6/C      EMOD=PROPS(1)C    把输入的弹性模量的值Emod赋值给module中的变量force1      force1=EMOD       ENU=PROPS(2)      IF(ENU.GT.0.4999.AND.ENU.LT.0.5001) ENU=0.499      EBULK3=EMOD/(ONE-TWO*ENU)      EG2=EMOD/(ONE+ENU)      EG=EG2/TWO      EG3=THREE*EG      ELAM=(EBULK3-EG2)/THREEC      DDSDDE=0.D0C      DO 40 K1=1,NDI        DO 30 K2=1,NDI           DDSDDE(K2,K1)=ELAM 30     CONTINUE        DDSDDE(K1,K1)=EG2+ELAM 40   CONTINUE      DO 50 K1=NDI+1,NTENS        DDSDDE(K1,K1)=EG 50   CONTINUECC    CALCULATE STRESS FROM ELASTIC STRAINSC      DO 70 K1=1,NTENS        DO 60 K2=1,NTENS           STRESS(K2)=STRESS(K2)+DDSDDE(K2,K1)*DSTRAN(K1) 60     CONTINUE 70   CONTINUE      RETURN      END            SUBROUTINE DLOAD(F,KSTEP,KINC,TIME,NOEL,NPT,LAYER,KSPT,     1 COORDS,JLTYP,SNAME)            USE mod_aC      INCLUDE 'ABA_PARAM.INC'C      DIMENSION TIME(2), COORDS (3)      CHARACTER*80 SNAMEC    施加的压力荷载值为module中的变量force1的值      F=force1      RETURN      END
这里,首先定义了一个名为mod_a的module,在mod_a中定义了一个变量force1,这个变量就是umat和Dload中需要传递的量,之后在umat和Dload中分布use mod_a,这两个子程序中就可以使用和共享force1这一变量,在umat中使用force1=Emod指定了force1的值,在Dload中使用F=force1定义了施加的荷载的值为force1的值,也即Emod的值。
通过上述方式,实际上就实现了Umat和Dload的数据传递(实际上是共享)。以下是采用umat和Dload数据传递与不采用子程序的计算结果对比,二者完全一致:
 
 
很显然,用这种方式,实际上对于任意的两个Abaqus子程序,我们都可以实现数据传递和共享,要做的只是把相应的需要共享的数据放到Module里,再在不同的子程序里使用这个module即可。
本文介绍了在不同的Abaqus子程序中实现数据传递的方法,以上是本文的全部内容,感谢阅读!
【完】

来源:八大博士的日常
ACTFluxAbaqus二次开发UM材料单元技术
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-06-11
最近编辑:2天前
兵心依旧
博士 兵哥出品,必是精品
获赞 77粉丝 479文章 14课程 3
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈