LS-DYNA的二次开发环境及应用

本文介绍了LS-DYNA新一代二次开发环境,编译连接过程和新增功能。新的开发环境完全兼容原有的开发环境,包括所有的材料模型,状态方程,单元类型,和求解器控制等各种用户子程序。

新开发环境简化用户子程序的编译连接过程,直接生成动态连接库,与LS-DYNA主执行程序完全脱离。LS-DYNA主程序支持多个用户子程序的动态连接库同时加载,按用户规则同时调用。新增功能包括支持用户自定义关键字,模型参数化及自动生成等。

本文介绍了新开发环境的编译环境设置和编译连接过程,以及多个动态连接库的同时加载和调用方法。

1. 概述

LS-DYNA是一个大型的通用有限元程序,秉承一个执行程序,一个模型文件,执行多类型多物理分析的开发宗旨,致力简化用户建模过程并提高模型的重复利用率。LS-DYNA内置的显式和隐式高效求解器及两者之间的动态互换,对解决多重非线性的大规模问题具有独特的优势,在实际工程中也得到非常广泛的应用。考虑到实际物理问题的复杂性和多样性,LS-DYNA在开发初期就开放程序内核,让用户根据实际问题开发相应的用户模块来增强主程序的功能。现有的用户子程序大体上包括以下几类: 

  • 材料模型UMAT 
  • 热材料模型TUMAT 
  • 状态方程UEOS 
  • 单元UELEM 
  • 求解控制模块 
  • 输入输出模块 

LS-DYNA为每个模块都提供现成的模板程序,用户根据需要修改相应模块的模就可以实现二次开发。因此,对于有一定编程经验的有限元开发人员来说,LS-DYNA的用户模块开发是相对比较简单的,尤其是全套的模板程序提供了很好的示例和开发基础,演示了在大变形大转动及各种非线性下的高效编程。这么多年来,有大批用户成功地根据自己的需要开发出高质量的用户子程序,实现各种复杂问题的计算。

从目前的一些用户的使用情况来看,二次开发比较容易出错的一个环节是编译和连接过程。目前LS-DYNA提供的一种开发方法是把所有主程序的OBJ文件打包成库文件提供给用户,而这些OBJ文件是在LS-DYNA标准编译环境下编译出来的半成品二进制文件。然后用户在自己的开发环境下编译其用户子程序,与主程序的OBJ库文件连接生成含有用户子程序的LS-DYNA执行程序。该方法的好处是生成的LS-DYNA执行程序内含用户子程序,方便执行。容易出错的地方是用户的编译环境往往LS-DYNA的标准编译环境不一样,可能会导致连接后的LS-DYNA执行程序不能正常工作。两个编译环境之间的差异可能会存在于各个方面,比如操作系统类别和版本,FORTRAN编译器的主版本及修正版本,C/C++编译器的版本及其所带的标准库文件等等。这些差异导致的错误有时还很难发现,对二次开发造成一定的困扰。 

另外,LS-DYNA得到越来越广泛的应用,在有些工业领域逐渐被认为是行业的标准分析软件。该行业的原材料供应商针对自己的材料等开发专门的材料模型及配套参数,提供给客户对用其材料的产品利用LS-DYNA进行分析。近几年来这种开发模式逐渐形成了一个发展趋势。从另一面看,制造商在一次分析中可能要用到多个供应商的不同材料模型,而如何保证所有供应商的子程序OBJ版本都与LS-DYNA一致并正确地连接在一起,难度往往较大。LS-DYNA预分配的用户材料号从41号到50号,总共只有10个,如何协调众多供应商的材料号避免冲突,又增加协调的难度。因此,这些需求都对LS-DYNA的开发环境提出了更高的要求。 

为此,在完全兼容现有用户子程序的基础上,LS-DYNA推出另一种新的开发环境,在方便性,兼容性和灵活性等方面有很大的提高。首先,LS-DYNA的主程序是一个可以进行独立分析的标准版执行程序,与用户子程序完全分离,也不依赖于任何用户子程序;LS-DYNA的主程序可以单独升级,同时保持对用户子程序的兼容性,用户子程序无需重新编译和连接。其次,用户子程序是在用户的开发环境下的独立编译连接并生成的动态连接库,其所用的系统库函数不影响LS-DYNA主程序;动态连接库也保证了用户子程序的版本独立性和兼容性,无需和LS-DYNA主程序同时升级;有些情况下,动态连接库可以允许不同的FORTRAN编译器来编译和连接。最后,用户可以根据模型需要,在模型文件里面指定加载一个或多个多动态连接库,并与模型中的相应部件关联,实现动态调用。此外,若将来用户子程序的接口有一定的变化时,LS-DYNA的高版本将考虑对以前版本的用户子程序的兼容性,可以直接加载以前版本的用户子程序的动态连接库,而用户无需重新编译和连接。 

本文先对LS-DYNA的用户子程序做一个概述,介绍新开发环境下的开发过程及对源程序进行跟踪和调试过程,最后演示多个动态连接库的加载和调用过程。

2. LS-DYNA用户子程序 

2.1 材料模型UMAT 

用户材料模型是用户子程序中应用最广泛的,也是最实用的模块。LS-DYNA中的用户材料号是从41号到50号,受关键字*MAT_USER_DEFINED_MATERIAL_MODELS控制。所有用户材料子程序的统一入口子程序是dyn21.f中的 

subroutine usrmat (lft,llt,cm,bqs,capa,eltype,mt,ipt, 
. npc,plc,crv,nnpcrv,rcoor,scoor,tcoor,nnm1,nip,ipt_thk) 

进入这个子程序后,再根据不同的单元类型选择不同的材料子程序 

  • urmathn: 体单元的三维材料模型 
  • urmats: 壳单元的二维平面应力材料模型 
  • urmatb, urmatd, urmatt: 三种不同的梁单元模型 

这三个不同子程序根据各自的单元特点对应力应变进行相应的处理,再进入具体的用户子程序umat41, umat42, … , umat50。这10个子程序是标准的串行版本模板,演示不同类型的材料模型,用户可以从这10个子程序模板中选一个较为贴近的开始。如果对计算效率要求较高,用户可以选与其对应的矢量版的模板,umat41v, umat42v, … , umat50v。矢量版子程序的特点是利用现代128位或更多位CPU的宽度,一次对多个操作数同时进行运算,比如一个128位CPU一次对4个32位的单精度实数进行运算,而一个512位CPU则一次对16个单精度实数进行运算。用户开发出这个umat子程序就可以进行显式分析。如果要进行隐式分析,LS-DYNA还需要该材料的切线刚度阵子程序。不同单元的切线刚度阵入口子程序分别是: 

  • urtanh: 体单元的三维材料模型 
  • urtans: 壳单元的二维平面应力材料模型 
  • urtanb: 三种不同的梁单元模型 

这三个入口子程序也是根据各自的单元特点处理后,进入具体的切线刚度阵子程序 utan41, utan42, … , utan50, 或者其相应的矢量版子程序utan41v, utan42v, … , utan50v。用户需要开发对应的utan子程序,就可以进行隐式分析了。 

如果该材料需要支持LS-DYNA的界面单元,则用户还要开发对应的用户界面材料子程序(Cohesive Materials)。界面材料子程序的统一入口子程序是dyn21b.f中的 

subroutine umat41c(idpart,cm,lft,llt,fc,dx,dxdt,aux,ek, 
& ifail,dt1siz,crv,nnpcrv,nhxbwp,cma,maketan,dsave,ctmp,elsiz, 
& reject,ip,nip) 

进入后转入相应的具体界面材料子程序umat41c, umat42c, … , umat50c。 

2.2 热材料模型TUMAT 

热材料模型的材料号是从11号到15号,由关键字*MAT_THERMAL_USER_DEFINED控制。其统一入口子程序是dyn21b.f中的 

subroutine thusrmat(mt,c1,c2,c3,cvl,dcvdtl,hsrcl,dhsrcdtl, 
hsv,iphsv,r_matp,crv,nnpcrv,npc,plc,nel,nep,iep,eltype,dt,atime, 
ihsrcl,hsvm,nmecon,temp,hsv2,hstored) 

相应的用户热材料模型子程序是thumat11, thumat12, … , thumat15,而没有单独的矢量版子程序。 

2.3 状态方程UEOS 

状态方程在LS-DYNA的显式分析中非常重要,是冲击力学的基础。用户状态方程的号码是从21号到30号,由关键字*EOS_USER_DEFINED控制。其入口子程序是dyn21b.f中的 

subroutine ueoslib(lft,llt,nes,mte,eosp,pnew,v0,dvol, 
& crv,nnpcrv,ivect,ihistp,iflag,nh) 

相应的用户状态方程的子程序是ueos21s, ueos22s, … , ueos30s, 及其对应的矢量版分别是ueos21v, ueos22v, … , ueos30v。 

2.4 单元UELEM 

用户单元开发分两类,壳单元和体单元。用户壳单元的号码是从101号到105号,由关键字*SECTION_SHELL控制,统一入口子程序是dyn21b.f中的 

subroutine usrshl(rule,ixp,x,rhs,rhr,vt,vr,strain,yhatn,fibl, 
auxvec,mtype,ro,cm,csprop,nsubgv,mtnum,nfegp,ihgq,hgq,ies,ener, 
mpusr,lav,nmel,nnm1,mxe,ibqshl,iqtype,bkqs,gmi,ihgenf,hgener, 
lft,llt,rhssav,eig,eign,qextra,nmtcon,ithxpid,ietyp,cmusr, 
lenvec8,xipn,drlstr,rhsl,loceps,epsint,eosp,isdrill,rots) 

进入到壳单元程序后,所有的变量都是在壳单元的单元坐标系中完成。壳单元的额外控制参数见*CONTROL_ACCURACY,*CONTROL_SHELL等。用户单元开发的工作量及复杂度要远超用户材料模型的开发,涉及到单元的形函数,B矩阵,沙漏控制,单元内力集成等等。另外还需提供用户壳单元的质量阵,见dyn21b.f中的 

subroutine ushlmass(iop,w,nxdof,x,rho,cm,lmc) 

而用户体单元的号码也是从101号到105号,由关键字*SECTION_SOLID控制,统一入口子程序是dyn21b.f中的 

subroutine usrsld(mtype,cm,u,v,fv,x,auxvec,eosp,tnew,fval,ener, 
npc,pld,hgforc,ies,bqs,nhxbwp,hgener,mte,nmtcon,lav,ihg, 
nnm2,lft,llt,ibq,nes,idmp,kp,nnm1,mxe,iehgfg,strains,rhssav, 
volfrc,cmaux,eig,eign,idam,damag,lpwphv,rots,hges,lochvh,ithxpid, 
ietyp,cmusr,xipn) 

质量阵的入口子程序是在dyn21b.f中 

subroutine usldmass(iop,w,nxdof,x,rho,cm,lmc) 

用户体单元的变量都是在整体坐标系中进行,对各向异性材料需要转动。开发的复杂度比较高,其模板中需要提供很多子程序。详细情况参阅dyn21b.f的用户单元模板。 

2.5 求解控制模块及输入输出模块 

这个部分的子程序很多,多数都在dyn21.f中,还有几个在couple2other_user.f 和dynrfn_user.f中。这些子程序是分散在手册的不同章节,没有一个统一的说明。在关键字*MODULE_USE一节中,这些子程序都被简单地分类处理。另外,在LS-DYNA手册第一卷关键字手册的附录A-H中对二次开发有非常详细的介绍。

3. LS-DYNA用户子程序的编译和连接 

在新的用户子程序开发环境中,LS-DYNA的主程序与用户子程序完全分开,二次开发包中也不包含LS-DYNA主程序的OBJ文件。因此,新的二次开发包的文件很小,全部打包压缩后只有165KB,极大地提高了用户子程序的编译和连接速度,使得二次开发更加方便。 

二次开发包中包括以下三部分内容: 

  • 各个用户子程序的模板,是FORTRAN的源程序,包括dyn21.f和 dyn21b.f等; 
  • 头文件,也是源程序,包含LS-DYNA中各个COMMON BLOCK参数,供二次开发使用; 
  • 编译脚本文件,Makefile,用于编译和连接。 

前两部分的源程序与用户子程序的具体功能相关。脚本文件Makefile是一个纯文本文件,可以用普通的文本编辑器修改,主要内容包括以下几个变量的设置: 

MY_FLAG = -fPIC -O2 -safe_cray_ptr -xSSE2 -align array16byte ...... 
FC = /opt/platform_mpi/bin/mpif90 
LD = /opt/platform_mpi/bin/mpif90 -shared -nofor_main 
export MPI_F77 := /opt/intel/composer_xe_2013.5.192/bin/intel64/ifort 
MY_TARGET = libusermat_105657.so 
MY_OBJS = dyn21.o dyn21b.o init_dyn21.o ...... 
MY_INC = nlqparm define.inc define2.inc ......

其中: 

  • 发表于 2019-06-16 20:37
  • 阅读 ( 402 )

[版权声明] :本文文字、代码及图片版权归原作者所有,任何媒体、网站或个人未经本网协议授权不得采集、整理、转载或以其他方式复制发表。已经本站协议授权的媒体、网站,在使用时必须注明“稿件来源:学研谷”。

0 条评论

请先 登录 后评论
猜猜我是谁
白浪 -研究生

16
提问
7
回答
5
文章
注册推广