写一个径向返回算法Fortran代码用在abaqus的本构模型中
以下是一个径向返回算法的Fortran代码,用于在abaqus的本构模型中:
SUBROUTINE RADIAL_RETURN(STRESS, STRAINP, STRAINN, YIELD, YOUNG, POISSON, TANGENT)
! This subroutine implements the radial return algorithm for a plasticity model in Abaqus.
! Inputs:
! STRESS - the current stress tensor
! STRAINP - the plastic strain tensor from the previous step
! STRAINN - the strain tensor from the current step
! YIELD - the yield stress of the material
! YOUNG - the Young's modulus of the material
! POISSON - the Poisson's ratio of the material
! Outputs:
! STRESS - the updated stress tensor
! STRAINP - the updated plastic strain tensor
! TANGENT - the updated tangent stiffness tensor
IMPLICIT NONE
REAL*8, DIMENSION(6) :: STRESS, STRAINP, STRAINN, TANGENT
REAL*8 :: YIELD, YOUNG, POISSON, MU, K, GAMMA, R, Q, DQ
REAL*8, DIMENSION(6,6) :: ELASTIC, PLASTIC, IDENTITY
REAL*8, DIMENSION(6) :: STRAIND, STRESSD, STRAINE, STRESSE, DELTA_STRESS
REAL*8 :: TRACE, NORM_STRESS, TOLERANCE
INTEGER :: I
! Define the elastic and plastic stiffness tensors
MU = YOUNG / (2.0 * (1.0 + POISSON))
K = YOUNG / (3.0 * (1.0 - 2.0 * POISSON))
ELASTIC = MU * (IDENTITY(1:6,1:6) - 2.0 / 3.0 * IDENTITY(7,7)) + K * IDENTITY(7,7)
PLASTIC = MU * IDENTITY(1:6,1:6)
! Calculate the deviatoric and volumetric parts of the strain tensor
STRAIND(1:6) = STRAINN(1:6) - STRAINP(1:6)
TRACE = STRAINN(1) + STRAINN(2) + STRAINN(3)
STRAINE(1:6) = 1.0 / 3.0 * TRACE * IDENTITY(7,7)
! Calculate the deviatoric and volumetric parts of the stress tensor
STRESSD(1:6) = MATMUL(ELASTIC(1:6,1:6), STRAIND(1:6))
STRESSE(1:6) = K * TRACE * IDENTITY(7,7)
! Calculate the norm of the deviatoric stress tensor
NORM_STRESS = SQRT(2.0 / 3.0 * (STRESSD(1)**2 + STRESSD(2)**2 + STRESSD(3)**2 + 2.0 * (STRESSD(4)**2 + STRESSD(5)**2 + STRESSD(6)**2)))
! Check if the yield condition is satisfied
IF (NORM_STRESS > YIELD) THEN
! Calculate the radial return step
R = YIELD / NORM_STRESS
DELTA_STRESS(1:6) = R * STRESSD(1:6)
GAMMA = 1.0 - R
! Calculate the plastic strain increment
STRAINP(1:6) = STRAINP(1:6) + GAMMA * STRAIND(1:6)
! Calculate the plastic tangent stiffness tensor
Q = MU / (3.0 * K + 2.0 * MU)
DQ = 2.0 * MU / (3.0 * K + 2.0 * MU)**2
TANGENT(1:6,1:6) = ELASTIC(1:6,1:6) - DQ * MATMUL(DELTA_STRESS(1:6), TRANSPOSE(DELTA_STRESS(1:6))) + Q * (MATMUL(DELTA_STRESS(1:6), TRANSPOSE(DELTA_STRESS(1:6))) - 2.0 / 3.0 * (DELTA_STRESS(1)*IDENTITY(1,1) + DELTA_STRESS(2)*IDENTITY(2,2) + DELTA_STRESS(3)*IDENTITY(3,3) + 2.0 * (DELTA_STRESS(4)*IDENTITY(4,4) + DELTA_STRESS(5)*IDENTITY(5,5) + DELTA_STRESS(6)*IDENTITY(6,6))))
! Update the stress tensor
STRESS(1:6) = STRESS(1:6) + DELTA_STRESS(1:6)
ELSE
! Update the elastic tangent stiffness tensor
TANGENT(1:6,1:6) = ELASTIC(1:6,1:6)
END IF
! Set the tolerance for the norm of the deviatoric stress tensor
TOLERANCE = YIELD / 100.0
! Apply the volumetric strain to the stress and tangent stiffness tensors
STRESS(1:6) = STRESS(1:6) + STRESSE(1:6)
TANGENT(1:6,1:6) = TANGENT(1:6,1:6) + K * IDENTITY(1:6,1:6)
END SUBROUTINE
原文地址: http://www.cveoy.top/t/topic/MIQ 著作权归作者所有。请勿转载和采集!