目前有已编好混凝土材料模型 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,分别进行合理定义。