SUBROUTINE UMAT(STRESS, STATEV, DDSDDE, SSE, SPD, SCD, RPL, DDSDDT,
1 DRPLDE, DRPLDT, STRAN, DSTRAN, TIME, DTIME, TEMP, DTEMP, PREDEF,
2 DPRED, CMNAME, NDI, NSHR, NTENS, NSTATV, PROPS, NPROPS, COORDS,
3 DROT, PNEWDT, CELENT, DFGRD0, DFGRD1, NOEL, NPT, LAYER, KSPT,
4 KSTEP, KINC)
IMPLICIT NONE
REAL*8 STRESS(NTENS), STATEV(NSTATV), DDSDDE(NTENS, NTENS)
REAL*8 STRAN(NTENS), DSTRAN(NTENS), TEMP, DTEMP
REAL*8 PROPS(NPROPS), TIME, DTIME
INTEGER NDI, NSHR, NTENS, NSTATV, NPROPS
REAL*8 E_A, E_M, nu, sigma_cr_AM, sigma_cr_MA, M_f, A_s, epsilon_L
REAL*8 xi, xi_T, xi_S, D(6,6)
E_A = PROPS(1) ! 奥氏体弹性模量
E_M = PROPS(2) ! 马氏体弹性模量
nu = PROPS(3) ! 泊松比
sigma_cr_AM = PROPS(4) ! A→M临界应力
sigma_cr_MA = PROPS(5) ! M→A临界应力
M_f = PROPS(6) ! 马氏体相变结束温度
A_s = PROPS(7) ! 奥氏体相变开始温度
epsilon_L = PROPS(8) ! 最大相变应变
xi = STATEV(1) ! 马氏体体积分数
xi_T = STATEV(2) ! 温度诱导马氏体
xi_S = STATEV(3) ! 应力诱导马氏体
CALL CALC_D(D, E_A, E_M, nu, xi)
STRESS = STRESS + MATMUL(D, DSTRAN)
CALL UPDATE_PHASE_TRANSFORMATION(xi, xi_T, xi_S, TEMP, STRESS, sigma_cr_AM, sigma_cr_MA, M_f, A_s)
STATEV(1) = xi
STATEV(2) = xi_T
STATEV(3) = xi_S
DDSDDE = D
RETURN
END SUBROUTINE UMAT
SUBROUTINE CALC_D(D, E_A, E_M, nu, xi)
IMPLICIT NONE
REAL*8 D(6,6), E_A, E_M, nu, xi
REAL*8 E, G, K
INTEGER i, j
E = E_A * (1 - xi) + E_M * xi
G = E / (2 * (1 + nu))
K = E / (3 * (1 - 2 * nu))
D = 0.0
D(1:3, 1:3) = K + 4 * G / 3
D(4, 4) = G
D(5, 5) = G
D(6, 6) = G
RETURN
END SUBROUTINE CALC_D
SUBROUTINE UPDATE_PHASE_TRANSFORMATION(xi, xi_T, xi_S, TEMP, STRESS, sigma_cr_AM, sigma_cr_MA, M_f, A_s)
IMPLICIT NONE
REAL*8 xi, xi_T, xi_S, TEMP, STRESS(6), sigma_cr_AM, sigma_cr_MA, M_f, A_s
REAL*8 sigma_eq
sigma_eq = SQRT(STRESS(1)**2 + STRESS(2)**2 + STRESS(3)**2)
IF (sigma_eq >= sigma_cr_AM .AND. TEMP <= M_f) THEN
xi = xi + 0.1 ! 假设相变速率为0.1
END IF
IF (sigma_eq <= sigma_cr_MA .AND. TEMP >= A_s) THEN
xi = xi - 0.1 ! 假设相变速率为0.1
END IF
xi = MAX(0.0, MIN(1.0, xi))
RETURN
END SUBROUTINE UPDATE_PHASE_TRANSFORMATION