本文介绍了 LS-DYNA 新一代二次开发环境,编译连接过程和新增功能。新的开发环境完全兼容原有的开发环境,包括所有的材料模型,状态方程,单元类型,和求解器控制等各种用户子程序。
新开发环境简化用户子程序的编译连接过程,直接生成动态连接库,与 LS-DYNA 主执行程序完全脱离。LS-DYNA 主程序支持多个用户子程序的动态连接库同时加载,按用户规则同时调用。新增功能包括支持用户自定义关键字,模型参数化及自动生成等。
本文介绍了新开发环境的编译环境设置和编译连接过程,以及多个动态连接库的同时加载和调用方法。
LS-DYNA 是一个大型的通用有限元程序,秉承一个执行程序,一个模型文件,执行多类型多物理分析的开发宗旨,致力简化用户建模过程并提高模型的重复利用率。LS-DYNA 内置的显式和隐式高效求解器及两者之间的动态互换,对解决多重非线性的大规模问题具有独特的优势,在实际工程中也得到非常广泛的应用。考虑到实际物理问题的复杂性和多样性,LS-DYNA 在开发初期就开放程序内核,让用户根据实际问题开发相应的用户模块来增强主程序的功能。现有的用户子程序大体上包括以下几类:
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 的用户子程序做一个概述,介绍新开发环境下的开发过程及对源程序进行跟踪和调试过程,最后演示多个动态连接库的加载和调用过程。
用户材料模型是用户子程序中应用最广泛的,也是最实用的模块。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)
进入这个子程序后,再根据不同的单元类型选择不同的材料子程序
这三个不同子程序根据各自的单元特点对应力应变进行相应的处理,再进入具体的用户子程序 umat41, umat42, …… , umat50。这 10 个子程序是标准的串行版本模板,演示不同类型的材料模型,用户可以从这 10 个子程序模板中选一个较为贴近的开始。如果对计算效率要求较高,用户可以选与其对应的矢量版的模板,umat41v, umat42v, …… , umat50v。矢量版子程序的特点是利用现代 128 位或更多位 CPU 的宽度,一次对多个操作数同时进行运算,比如一个 128 位 CPU 一次对 4 个 32 位的单精度实数进行运算,而一个 512 位 CPU 则一次对 16 个单精度实数进行运算。用户开发出这个 umat 子程序就可以进行显式分析。如果要进行隐式分析,LS-DYNA 还需要该材料的切线刚度阵子程序。不同单元的切线刚度阵入口子程序分别是:
这三个入口子程序也是根据各自的单元特点处理后,进入具体的切线刚度阵子程序 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。
热材料模型的材料号是从 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,而没有单独的矢量版子程序。
状态方程在 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。
用户单元开发分两类,壳单元和体单元。用户壳单元的号码是从 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 的用户单元模板。
这个部分的子程序很多,多数都在 dyn21.f 中,还有几个在 couple2other_user.f 和 dynrfn_user.f 中。这些子程序是分散在手册的不同章节,没有一个统一的说明。在关键字 *MODULE_USE 一节中,这些子程序都被简单地分类处理。另外,在 LS-DYNA 手册第一卷关键字手册的附录 A - H 中对二次开发有非常详细的介绍。
在新的用户子程序开发环境中,LS-DYNA 的主程序与用户子程序完全分开,二次开发包中也不包含 LS-DYNA 主程序的 OBJ 文件。因此,新的二次开发包的文件很小,全部打包压缩后只有 165KB,极大地提高了用户子程序的编译和连接速度,使得二次开发更加方便。
二次开发包中包括以下三部分内容:
前两部分的源程序与用户子程序的具体功能相关。脚本文件 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 ……
其中:
[版权声明] :本文文字、代码及图片版权归原作者所有,任何媒体、网站或个人未经本网协议授权不得采集、整理、转载或以其他方式复制发表。已经本站协议授权的媒体、网站,在使用时必须注明“稿件来源:学研谷”。