目前有已编好混凝土材料模型 umat 仅支持显式运算,想进一步改写此模型使其支持隐式运算,了解大概理论,需要编写 utan 部分添加 tangent stiffness modulus 计算部分内容,但尚未搞清楚具体操作流程。希望各位有相关经验的大神可以指点一二,也可有偿咨询,不需要代做,只想了解相关流程和思路。
这个回答,比较的冗长,从隐式分析的一般概念,到编写刚度矩阵。
编写隐式分析的 UMAT 子程序,可以了解一下用户手册中的附录 A,关于隐式分析的说明。
这是一个弹性问题的隐式分析用户子程序 UMAT41 案例,也调用了用户子程序 utan41, 访问链接 ,后文附上 K 文件精简版。dyn21.f 中有多种的 utan xx 的调用示例。
进行隐式分析,不同单元的切线刚度矩阵子程序的入口:
这三个入口子程序根据各自的单元特点处理后,具体进入切线刚度矩阵 utan41~50,或者相应的矢量版子程序 utan41v~50v。
精简的 K 文件如下:
$ uses built-in umat41 $ To converge in static would likely require more transverse constraint *keyword *PART umat41 2,1,1 $mat_001 $2,1,2 *control_implicit_dynamics 1 *control_implicit_auto 1 $---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 *CONTROL_IMPLICIT_GENERAL $# imflag dt0 imform nsbs igs cnstn form $ 1 0.001000 1,.0002 $---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 *CONTROL_TIMESTEP 0.0000 0.9000 *CONTROL_TERMINATION 0.0100E+00 $---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 *DATABASE_BINARY_d3plot 0.0010E+00 *DATABASE_NODAL_FORCE_GROUP 6 *DATABASE_HISTORY_SOLID_SET 3 *DATABASE_ELOUT 0.0001E+00 *DATABASE_NODFOR 0.0001E+00 $---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 *mat_elastic 2,7.89e-9, 2.1e5, .3 $---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 *MAT_USER_DEFINED_MATERIAL_MODELS $# mid ro mt lmc nhv iortho ibulk ig 1 7.890E-09 41 4 0 0 3 4 $# ivect ifail itherm ihyper ieos $ 1 0 0 $# p1 p2 p3 p4 p5 p6 p7 p8 2.100E+05 0.300000 175.0e3 80.769e3 $---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 *MAT_Plastic_kinematic 11 7.890E-09 2.100E+05 3.000E-01 4.400E+02 1.700E+03 1.000E+00 $---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 *SECTION_SOLID 1 1 $---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 *SET_NODE_LIST 5 $ for prescribed displacement 173 174 175 176 177 178 343 344 347 349 351 353 *SET_NODE_LIST 6 $ for constraint 17 18 19 20 25 26 187 188 191 193 195 197 $---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 $ elements at center *SET_SOLID 3 71 72 73 74 75 76 77 78 79 80 $---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 $ line of center nodes for load *SET_NODE_LIST 2 277 278 279 280 281 282 $---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 *DEFINE_CURVE 10 0.00000000000000E+00 0.0000000000000E+00 0.01000000000000E+00 10.000000000000E+00 *BOUNDARY_PRESCRIBED_MOTION_SET 5 1 2 10 1.000E-00 $---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 *BOUNDARY_SPC_SET 6 0 1 1 1 1 1 1 $---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 *NODE 1 10.000000000000 16.000000000000 0.0000000000000 2 10.000000000000 12.000000000000 0.0000000000000 3 10.000000000000 8.0000000000000 0.0000000000000 4 10.000000000000 4.0000000000000 0.0000000000000 $ *ELEMENT_SOLID 1 2 25 17 1 27 187 188 189 190 2 2 17 18 2 1 188 191 192 189 3 2 18 19 3 2 191 193 194 192 *END
如何编写用户自定义材料的切线刚度矩阵?从 R102784 开始(2015),之后的版本,可以在 umatXXc 中定义切线刚度矩阵。
而对于之前的版本,这可参考如下的内容:
在子程序中包括以下两个公共块及其 threadprivate/TASKCOMMON 声明:
common/vect8loc/dsave(nlq,6,6) common/bki03iloc/lnodim(nlq,48),ndofpn,nnpke,melemt,imlft,imllt, & is17loc,is18loc,imp_mxe c$omp threadprivate (/vect8loc/) c$omp threadprivate (/bki03iloc/)
可以在 dyn211b.f 或者其他文件的子程序的 usrsld 找到这些声明。
然后在你的代码中,检查 is17loc.eq.1,如果为 true,则填充 vect8loc 中的 dsave 数组,刚度方向在对角线上,非对角元素为 0。
if (is17loc.eq.1) then do i=lft,llt dsave(i,1,1)=stifr(i) dsave(i,2,1)=0. dsave(i,3,1)=0. dsave(i,1,2)=0. dsave(i,2,2)=stifs(i) dsave(i,3,2)=0. dsave(i,1,3)=0. dsave(i,2,3)=0. dsave(i,3,3)=stift(i) enddo endif
其中 stiff、stifs 和 stift 是刚度在两个平面中的方向 r 和 s 以及法向 t,分别进行合理定义。