问题描述
我一直在研究可公开获得的晶体可塑性FORTRAN subroutine,但是,我不明白输入材料如何通过子例程和函数传递。
因此,在主UMAT中,变量PROPS指向在输入文件的* USER MATERIAL选项中输入的材料常数。对于子例程,该值为125。
现在,由UMAT调用的子例程定义了另一个变量PROP,它具有不同的值,例如
在 1430行中;
C PROP(1) - PROP(3) -- direction of the first vector in
C local cubic crystal system
在第2167行中,(对于i = 1)
C PROP -- material constants characterizing the self- and latent-
C hardening law (INPUT)
C
C For the HYPER SECANT hardening law
C PROP(1,i) -- initial hardening modulus H0 in the ith
C set of slip systems
C PROP(2,i) -- saturation stress TAUs in the ith set of
C slip systems
C PROP(3,i) -- initial critical resolved shear stress
C TAU0 in the ith set of slip systems
虽然我在代码中找不到PROPS和PROP之间的任何关系,但我可以看到PROP正在实现适当的材质常量。
我无法理解PROP如何从输入文件中获取属性常量?有人可以解释它的工作原理吗?
fortran code。
解决方法
ROTATION
子例程在L.1404中定义(为清楚起见删除了注释):
SUBROUTINE ROTATION (PROP,ROTATE)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION PROP(16),ROTATE(3,3),TERM1(3,TERM2(3,INDX(3)
[...]
Fortran遵循``传递引用''的原理工作,即函数参数实际上接收指向变量在内存中的任何位置的指针。因此,子例程ROTATION
将其第一个参数解释为16元素双精度数组(的起始地址),而第二个参数则是3x3双精度数组的地址。
在L.569上,您看到该函数被调用:
CALL ROTATION (PROPS(57),ROTATE)
因此,给出的地址是PROPS
的第57个元素的地址。这意味着子例程实际上可以访问PROPS(57)
-PROPS(72)
的内容。根据开始时的评论(L.385),
PROPS(57) - PROPS(72) -- parameters characterizing the initial
C orientation of a single crystal in
C global system
子例程结束时,其结果在L.569接收的数组ROTATE
中。