Mod SLD Stress Model 155
Mod SLD Stress Model 155
===================================================================================
=======
! This UMAT implements the model of António Melro for resins, using Fortran
Modern
! language.
!
! ! Adaptated version for Alya from Igors's remanufacturings
!
!
===================================================================================
=======
!
! PROPS (7)
! PROPS(1) --> YOUNG MODULUS ----------------------> EYOUNG
! PROPS(2) --> POISSON COEFFICIENT ----------------> ENIU
! PROPS(3) --> COEFFICIENT OF THERMAL EXPANSION ---> ALPHA
! PROPS(4) --> PLASTIC POISSON COEFFICIENT --------> PNIU
! PROPS(5) --> TENSION FAILURE STRESS -------------> XT
! PROPS(6) --> COMPRESSION FAILURE STRESS ---------> XC
! PROPS(7) --> FRACTURE TOUGHNESS -----------------> GCM
!
===================================================================================
=======
!
! STATE VARIABLES (10)
! STATEV(1) ----> INTERNAL VARIABLE ---------------> RINT
! STATEV(2) ----> DAMAGE PARAMETER ----------------> eps_f
! STATEV(3) ----> DAMAGE VARIABLE -----------------> DAMAGE
! STATEV(4) ----> EQUIVALENT PLASTIC STRAIN -------> EQPLAS
! STATEV(5) ----> PLASTIC EPSILON_11 --------------> EPLAST(1)
! STATEV(6) ----> PLASTIC EPSILON_22 --------------> EPLAST(2)
! STATEV(7) ----> PLASTIC EPSILON_33 --------------> EPLAST(3)
! STATEV(8) ----> PLASTIC GAMA_12 -----------------> EPLAST(4)
! STATEV(9) ----> PLASTIC GAMA_13 -----------------> EPLAST(5)
! STATEV(10) ---> PLASTIC GAMA_23 -----------------> EPLAST(6)
!
! STATEV(11) ---> STRESS S11 -----------------> S(1)
! STATEV(12) ---> STRESS S22 -----------------> S(2)
! STATEV(13) ---> STRESS S33 -----------------> S(3)
! STATEV(14) ---> STRESS S12 -----------------> S(4)
! STATEV(15) ---> STRESS S13 -----------------> S(5)
! STATEV(16) ---> STRESS S23 -----------------> S(6)
module mod_sld_stress_model_155
implicit none
public :: sld_stress_model_155
contains
implicit none
!
! User parameters
!
real(rp), parameter :: tol_conv = 1.0e-6_rp !< Convergence tolerance of
th NR
integer(ip), parameter :: miter = 100_ip !< Maximum number of NR
iterations
! Evaluate yield function: Yield stress and yield surface (elastic or not)
call yielcurv( 1, epbar, syt, ht)
call yielcurv(-1, epbar, syc, hc)
!
===================================================================================
======
! Plastic increment - go for return mapping
!
! Initialise some needed parameters
!
zeta_s = 1.0_rp + 6.0_rp * G_shear * dgamma
! Eq. 25
zeta_p = 1.0_rp + 2.0_rp * K_bulk * alpha_p * dgamma
! Eq. 25
A = 18.0_rp * J2_trial / zeta_s**2.0_rp + 4.0_rp / 27.0_rp * (alpha_p *
I1_trial / zeta_p)**2.0_rp ! Eq. 28
res = y_func
!
! Newton-Raphson iterative cycle
!
do iiter = 1,miter
! Check convergence
if( abs(res/(2.0_rp * syt * syc)) < tol_conv ) then ! Converged
end if
100 continue
!
===================================================================================
=======
! Evaluate the damage activation function
!
-----------------------------------------------------------------------------------
------
end if
end if
!
! Save damage variable
!
statev(3) = damage
else
!
! Damage is not evolving (but is present)
!
if( damage > 0.0_rp ) then
! Damage is present
if( lawco == SM155_AREFI_VERSION ) then
call DamagedElasticMatrix(ndi, nshr, E, nu, G_shear, damage, ddsdde)
end if
stress = matmul(ddsdde, stran_e)
else if( dgamma > 0.0_rp ) then
! Elasto-plastic tangent
! Update Derivative of the accumulated plastic strain with respect to the
plastic multiplier
depb_ddgamma = sqrt(A) - dgamma / 2.0_rp / sqrt(A) * (216.0_rp * G_shear
* J2_trial / zeta_s**3.0_rp + & ! Eq. 32
16.0_rp * (alpha_p**3.0_rp) * K_bulk * I1_trial**2.0_rp / 27.0_rp /
zeta_p**3.0_rp)
depb_ddgamma = sqrt(1.0_rp / (1.0_rp + 2.0_rp * nu_p**2.0_rp) ) *
depb_ddgamma ! Eq. 32
dsigc_ddgamma = hc * depb_ddgamma
! Eq. 30
dsigt_ddgamma = ht * depb_ddgamma
! Eq. 31
dres_dgamma = 2.0_rp * I1_trial/ zeta_p * (dsigc_ddgamma - dsigt_ddgamma)
- & ! Eq. 29
4.0_rp * K_bulk * alpha_p * I1_trial * (syc - syt) / zeta_p**2.0_rp
- &
72.0_rp * G_shear * J2_trial/zeta_s**3.0_rp - 2.0_rp * depb_ddgamma
* (syc * ht + syt * hc)
eta = -dres_dgamma
end if
end if
!
===================================================================================
========
! Subroutine to determine current yield stresses in both tension C
! and compression as a function of equivalent plastic strain C
!
! LTYPE = 1, IT READS TENSION FILE C
! LTYPE = -1, IT READS COMPRESSION FILE C
!
!
===================================================================================
========
SUBROUTINE YIELCURV(LTYPE,EQPLAS,SY,H)
implicit none
real(rp) :: EQPLAS0,EQPLAS1,SY0,SY1
integer(ip) :: I,j
integer(ip) :: unit
integer(ip), parameter :: NCT= 50_ip
integer(ip), parameter :: NCC= 67_ip
real(rp) :: YCT(NCT,2),YCC(NCC,2)
character(len=100) :: filename
!
! Find on the Table the Corresponding Yield Stress
!
IF(LTYPE.EQ.1) THEN
! Read file
filename = "yield_t.txt"
j = 0_ip
unit = 968686_ip
open(unit, file=filename, status='old', iostat=j)
if (j /= 0) then
write(*, *) "Error opening the file"
stop
end if
do i = 1,NCT
read(unit,*) YCT(i,:)
end do
close(unit)
!
H = 1.0e-10_rp
SY = YCT(NCT,2)
DO I=1,NCT-1
IF (EQPLAS.LT.YCT(I+1,1)) THEN
SY0 = YCT(I,2)
SY1 = YCT(I+1,2)
EQPLAS0 = YCT(I,1)
EQPLAS1 = YCT(I+1,1)
H = (SY1-SY0) / (EQPLAS1-EQPLAS0)
SY = (EQPLAS-EQPLAS0)*H + SY0
GOTO 20
ENDIF
ENDDO
ELSE
! Read file
filename = "yield_c.txt"
j = 0_ip
unit = 968687_ip
open(unit, file=filename, status='old', iostat=j)
if (j /= 0) then
write(*, *) "Error opening the file"
stop
end if
do i = 1,NCC
read(unit,*) YCC(i,:)
end do
close(unit)
H = 1.0e-10_rp
SY = YCC(NCC,2)
DO I=1,NCC-1
IF (EQPLAS.LT.YCC(I+1,1)) THEN
SY0 = YCC(I,2)
SY1 = YCC(I+1,2)
EQPLAS0 = YCC(I,1)
EQPLAS1 = YCC(I+1,1)
H = (SY1-SY0) / (EQPLAS1-EQPLAS0)
SY = (EQPLAS-EQPLAS0)*H + SY0
GOTO 20
ENDIF
ENDDO
ENDIF
20 CONTINUE
RETURN
!
===================================================================================
========
! This subroutine computes the elastic matrix for the damaged material
!
! Igor A. Rodrigues Lopes, Oct 2023
! [email protected]
!
===================================================================================
========
implicit none
!
===================================================================================
========
! This subroutine computes the consistent tangent for the damaged material
!
! Igor A. Rodrigues Lopes, Oct 2023
! [email protected]
!
===================================================================================
========
implicit none
dCmdd = 0.0_rp
dCmdd(1:ndi,1:ndi) = dlambdaddd
do i = 1, ndi
dCmdd(i,i) = dGddd
end do
do i = ndi+1, ndi+nshr
dCmdd(i,i) = -G
end do
! Tangent
dDSdDE = 0.0_rp
do i = 1,ndi+nshr
do j = 1,ndi+nshr
do l = 1,ndi+nshr
dDSdDE(i,j) = dDSdDE(i,j) + dCmdd(i,l) * stran_e(l) * drde(j)
end do
end do
end do
dDSdDE = dddr*dDSdDE
dDSdDE = dDSdDE + Cdamaged
!
===================================================================================
========
! Reference: Damage evolution law proposed by Arefi et al. (2018).
!
! This function updates the damage variable according to the internal variable
_rint_.
! It is based on the damage evolution law proposed by Arefi et al. (2018).
! Bilinear isotropic damage
!
! Igor A. Rodrigues Lopes, Oct 2023
! [email protected]; [email protected]
! Reviewed: OK
!
===================================================================================
========
!
===================================================================================
========
! Reference: Damage evolution law proposed by Arefi et al. (2018).
!
! This function computes the derivative of the damage variable wrt to the
internal variable
! _rint_.
! It is based on the damage evolution law proposed by Arefi et al. (2018).
!
! Igor A. Rodrigues Lopes, Oct 2023
! [email protected]; [email protected]
! Reviewed: OK
!
===================================================================================
========
!
===================================================================================
========
! Reference: Exponential Damage (Federico)
!
!
! Subroutine to determine the damage parameter _A_ by solving the equation:
! int_1^\infty (Y*dddr) dr - Gc/Le = 0
! using the secant method [Melro, PhD Thesis, 2011]
!
! Initial version:
! Routine SMPARAMA, by Federico Danzi
! Code refactoring:
! Igor A. Rodrigues Lopes, Dec 2023
! [email protected]
!
===================================================================================
=======
implicit none
! Initialisations
tol = 0.01_rp
maxiter = 10000_ip
!
A_new = (2.0_rp * Le * XT**2.0_rp)/(2.0_rp * E * Gc - Le * XT**2.0_rp)
A_old = 0.5_rp * A_new
! Compute the integrals with both values of A
call SimpsonIntegralExponential(int_old, A_old, E, v, XT, XC, Gc/Le)
call SimpsonIntegralExponential(int_new, A_new, E, v, XT, XC, Gc/Le)
! Initialise the residual and enter the iterative loop
resid = abs(int_new - Gc / Le) / (Gc / Le)
icount = 0_ip
do while (resid > tol .and. icount <= maxiter)
! Update the value of A with the secant method
A_n = exp(log(A_new) - (log(int_new) - log(Gc/Le)) * (log(A_new) -
log(A_old)) / (log(int_new) - log(int_old)))
A_old = A_new
A_new = A_n
int_old = int_new
! Compute the integral with the new value of A
call SimpsonIntegralExponential(int_new, A_n, E, v, XT, XC, Gc/Le)
! Update the residual and the iteration counter
resid = abs(int_new - Gc / Le) / (Gc / Le)
icount = icount + 1
end do
!
===================================================================================
========
! Reference: Exponential Damage (Federico)
!
!
! Subroutine to obtain the improper integral:
! int_1^\infty (Y*dddr) dr
! given a damage parameter A. The integral is computed using the Simpson method.
!
! Initial version:
! Routine SIMPSONMATRIX, by Federico Danzi, and SMINT, by Antonio Melro.
! Code refactoring as SimpsonIntegral:
! Igor A. Rodrigues Lopes, Dec 2023
! [email protected]
!
===================================================================================
=======
implicit none
! Arguments
real(rp), intent(in) :: E, v, XT, XC, GcdLe
!! Material properties
real(rp), intent(in) :: A
!! Damage parameter
real(rp), intent(out) :: int_new
!! Integral value
! Local variables
real(rp) :: int_old, Dr, d, dddr, sigma, s11_eff, YUN
!! Integration variables
real(rp), dimension(3) :: r, integrand
!! Function with Damage Evolution Law
integer(ip), parameter :: miter_1 = 10_ip, miter_2 = 10000_ip
integer(ip) :: icount_1, icount_2, i, n_steps
!! Integer variables
real(8), parameter :: tol = 0.001_rp, Kfactor = 10000.0_rp
!! Convergence tolerance
!
===================================================================================
=======
! Initialisations
int_old = 1.0_rp
int_new = 0.0_rp
n_steps = 100_ip
! Initialise loop where the integral is computed with different step sizes
icount_1 = 0
do while (abs((int_new - int_old) / GcdLe) > tol .and. icount_1 < miter_1)
r(3) = 1.0_rp
sigma = XT
Dr = -1.0_rp / real(n_steps,rp) / A * log(1.0_rp / Kfactor)
int_old = int_new
int_new = 0.0_rp
icount_2 = 0_ip
do while (sigma > XT / Kfactor .and. icount_2 < miter_2)
r(1) = r(3)
r(2) = r(1) + Dr
r(3) = r(2) + Dr
do i = 1, 3
d = DamageEvolutionLaw(A, r(i))
dddr = FMDDAMAGEDR(A, r(i))
s11_eff = (XT - XC + sqrt((XC - XT)**2.0_rp + 4.0_rp * XT * XC *
r(i))) / 2.0_rp
YUN = s11_eff**2.0_rp / 2.0_rp / E * &
(2.0_rp * v**2.0_rp * d**2.0_rp + (1.0_rp - v * (1.0_rp - d) *
(1.0_rp + 2.0_rp * v))**2.0d0) / &
(1.0_rp + v * (1.0_rp - d))**2.0_rp / (1.0_rp - 2.0_rp * v *
(1.0_rp - d))**2.0_rp
integrand(i) = dddr * YUN
end do
int_new = int_new + (integrand(1) + 4.0_rp * integrand(2) + integrand(3))
* Dr / 3.0_rp
sigma = (1.0_rp - d) * (1.0_rp - v * (1.0_rp - d) * (1.0_rp + 2.0_rp *
v)) * s11_eff / &
(1.0_rp + v * (1.0_rp - d)) / (1.0_rp - 2.0_rp * v * (1.0_rp - d))
icount_2 = icount_2 + 1_ip
end do
n_steps = n_steps * 2_ip
icount_1 = icount_1 + 1_ip
end do
!
===================================================================================
========
! Reference: Classical Damage
!
!
! Subroutine to determine the damage parameter _A_ by solving the equation:
! int_1^\infty (Y*dddr) dr - Gc/Le = 0
! using the secant method [Melro, PhD Thesis, 2011]
!
! Initial version:
! Routine SMPARAMA, by Federico Danzi
! Code refactoring:
! Igor A. Rodrigues Lopes, Dec 2023
! [email protected]
!
===================================================================================
=======
implicit none
! Initialisations
tol = 0.01_rp
maxiter = 10000_ip
!
A_new = (2.0_rp * Le * XT**2.0_rp)/(2.0_rp * E * Gc - Le * XT**2.0_rp)
A_old = 0.5_rp * A_new
! Compute the integrals with both values of A
call SimpsonIntegralClassical(int_old, A_old, E, XT, XC, Gc/Le)
call SimpsonIntegralClassical(int_new, A_new, E, XT, XC, Gc/Le)
! Initialise the residual and enter the iterative loop
resid = abs(int_new - Gc / Le) / (Gc / Le)
icount = 0_ip
do while (resid > tol .and. icount <= maxiter)
! Update the value of A with the secant method
A_n = exp(log(A_new) - (log(int_new) - log(Gc/Le)) * (log(A_new) -
log(A_old)) / (log(int_new) - log(int_old)))
A_old = A_new
A_new = A_n
int_old = int_new
! Compute the integral with the new value of A
call SimpsonIntegralClassical(int_new, A_n, E, XT, XC, Gc/Le)
! Update the residual and the iteration counter
resid = abs(int_new - Gc / Le) / (Gc / Le)
icount = icount + 1
end do
!
===================================================================================
========
! Reference: Exponential Damage (Federico)
! Classical Damage
!
! Subroutine to obtain the improper integral:
! int_1^\infty (Y*dddr) dr
! given a damage parameter A. The integral is computed using the Simpson method.
!
! Initial version:
! Routine SIMPSONMATRIX, by Federico Danzi, and SMINT, by Antonio Melro.
! Code refactoring as SimpsonIntegral:
! Igor A. Rodrigues Lopes, Dec 2023
! [email protected]
!
===================================================================================
=======
subroutine SimpsonIntegralClassical(int_new, A, E, XT, XC, GcdLe)
implicit none
! Arguments
real(rp), intent(in) :: E, XT, XC, GcdLe
!! Material properties
real(rp), intent(in) :: A
!! Damage parameter
real(rp), intent(out) :: int_new
!! Integral value
! Local variables
real(rp) :: int_old, Dr, d, dddr, sigma, s11_eff, YUN
!! Integration variables
real(rp) :: r(3), integrand(3)
!! Function with Damage Evolution Law
integer(ip), parameter :: miter_1 = 10_ip, miter_2 = 10000_ip
integer(ip) :: n_steps, icount_1, icount_2, i
!! Integer variables
real(rp), parameter :: tol = 0.001_rp, Kfactor = 10000.0_rp
!! Convergence tolerance
! Initialisations
int_old = 1.0_rp
int_new = 0.0_rp
n_steps = 100_ip
! Initialise loop where the integral is computed with different step sizes
icount_1 = 0_ip
do while (abs((int_new-int_old)/GcdLe) > tol .and. icount_1 < miter_1)
r(3) = 1.0_rp
sigma = XT
Dr = -1.0_rp / real(n_steps,rp) / A * log(1.0_rp / Kfactor)
int_old = int_new
int_new = 0.0_rp
icount_2 = 0_ip
do while (sigma > XT / Kfactor .and. icount_2 < miter_2)
r(1) = r(3)
r(2) = r(1) + Dr
r(3) = r(2) + Dr
do i = 1,3
d = DamageEvolutionLaw(A, r(i))
dddr = FMDDAMAGEDR(A, r(i))
s11_eff = (XT - XC + sqrt((XC - XT)**2.0_rp + 4.0_rp * XT * XC *
r(i))) / 2.0_rp
YUN = s11_eff**2.0_rp / 2.0_rp / E
integrand(i) = dddr * YUN
end do
int_new = int_new + (integrand(1) + 4.0_rp * integrand(2) + integrand(3))
* Dr / 3.0_rp
sigma = (1.0_rp - d) * s11_eff
icount_2 = icount_2 + 1_ip
end do
n_steps = n_steps * 2_ip
icount_1 = icount_1 + 1_ip
end do
!
===================================================================================
========
! Reference: Exponential Damage (Federico)
! Classical Damage
!
! Function with Damage Evolution Law
! ! Eq. 53 Melro et al. 2013
! ! Eq. 15 Arefi et al. 2018
!
! root = sqrt(7.0_rp + 2.0_rp * r_m**2.0_rp)
! d_m = 1.0_rp - exp(A_m * (3.0_rp - root)) / (root - 2.0_rp)
!
===================================================================================
========
real(rp) :: root
!
===================================================================================
========
! Reference: Exponential Damage (Federico)
! Classical Damage
!
! Function with Derivative of Damage Evolution Law -->> dddr
!
===================================================================================
========
real(rp) :: root
!
===================================================================================
========
! Reference: Exponential Damage (Federico)
!
! This subroutine computes the consistent tangent for the damaged material
!
!
===================================================================================
========
!
===================================================================================
========
! Reference: Classical Damage
!
! This subroutine computes the consistent tangent for the damaged material
!
!
===================================================================================
========
implicit none
real(rp) :: dddr
real(rp) :: drde(ndi+nshr)
real(rp) :: ddde(ndi+nshr)
integer(ip) :: i, j
! Final tangent
dDSdDE = 0.0d0
do i = 1,ndi+nshr
do j = 1,ndi+nshr
dDSdDE(i,j) = - stress_eff(i) * ddde(j)
end do
end do
dDSdDE = dDSdDE + Cdamaged
!--------------------------------------------------------------
! Helper function to compute Determinant of 3x3 matrix
!--------------------------------------------------------------
!--------------------------------------------------------------
! Helper function to compute inverse of 3x3 matrix
!--------------------------------------------------------------
SUBROUTINE matInv(matrix, inv)
IMPLICIT NONE
CALL determinant(matrix, J)
inv(:, :) = inv(:, :) / J
! Kinematic variables
call matInv(F_dd, Finv_dd)
call determinant(F_dd,J)
!
! Abaqus UMAT voigt: 11 22 33 12 13 23
! Abaqus ordering: 1 2 3 4 5 6
!
! Cauchy (S) to Kirchoff (T)
T_dd(1,1) = J * S_v(1) !Ok
T_dd(2,1) = J * S_v(4) !Ok
T_dd(3,1) = J * S_v(5) !Ok
T_dd(1,2) = J * S_v(4) !Ok
T_dd(2,2) = J * S_v(2) !Ok
T_dd(3,2) = J * S_v(6) !Ok
T_dd(1,3) = J * S_v(5) !Ok
T_dd(2,3) = J * S_v(6) !Ok
T_dd(3,3) = J * S_v(3) !Ok
C_dddd(2,2,1,1) = C_vv(2,1)
C_dddd(2,2,1,2) = C_vv(2,4)
C_dddd(2,2,1,3) = C_vv(2,5)
C_dddd(2,2,2,1) = C_vv(2,4)
C_dddd(2,2,2,2) = C_vv(2,2)
C_dddd(2,2,2,3) = C_vv(2,6)
C_dddd(2,2,3,1) = C_vv(2,5)
C_dddd(2,2,3,2) = C_vv(2,6)
C_dddd(2,2,3,3) = C_vv(2,3)
C_dddd(3,3,1,1) = C_vv(3,1)
C_dddd(3,3,1,2) = C_vv(3,4)
C_dddd(3,3,1,3) = C_vv(3,5)
C_dddd(3,3,2,1) = C_vv(3,4)
C_dddd(3,3,2,2) = C_vv(3,2)
C_dddd(3,3,2,3) = C_vv(3,6)
C_dddd(3,3,3,1) = C_vv(3,5)
C_dddd(3,3,3,2) = C_vv(3,6)
C_dddd(3,3,3,3) = C_vv(3,3)
C_dddd(1,2,1,1) = C_vv(4,1)
C_dddd(1,2,1,2) = C_vv(4,4)
C_dddd(1,2,1,3) = C_vv(4,5)
C_dddd(1,2,2,1) = C_vv(4,4)
C_dddd(1,2,2,2) = C_vv(4,2)
C_dddd(1,2,2,3) = C_vv(4,6)
C_dddd(1,2,3,1) = C_vv(4,5)
C_dddd(1,2,3,2) = C_vv(4,6)
C_dddd(1,2,3,3) = C_vv(4,3)
C_dddd(2,1,1,1) = C_vv(4,1)
C_dddd(2,1,1,2) = C_vv(4,4)
C_dddd(2,1,1,3) = C_vv(4,5)
C_dddd(2,1,2,1) = C_vv(4,4)
C_dddd(2,1,2,2) = C_vv(4,2)
C_dddd(2,1,2,3) = C_vv(4,6)
C_dddd(2,1,3,1) = C_vv(4,5)
C_dddd(2,1,3,2) = C_vv(4,6)
C_dddd(2,1,3,3) = C_vv(4,3)
C_dddd(1,3,1,1) = C_vv(5,1)
C_dddd(1,3,1,2) = C_vv(5,4)
C_dddd(1,3,1,3) = C_vv(5,5)
C_dddd(1,3,2,1) = C_vv(5,4)
C_dddd(1,3,2,2) = C_vv(5,2)
C_dddd(1,3,2,3) = C_vv(5,6)
C_dddd(1,3,3,1) = C_vv(5,5)
C_dddd(1,3,3,2) = C_vv(5,6)
C_dddd(1,3,3,3) = C_vv(5,3)
C_dddd(3,1,1,1) = C_vv(5,1)
C_dddd(3,1,1,2) = C_vv(5,4)
C_dddd(3,1,1,3) = C_vv(5,5)
C_dddd(3,1,2,1) = C_vv(5,4)
C_dddd(3,1,2,2) = C_vv(5,2)
C_dddd(3,1,2,3) = C_vv(5,6)
C_dddd(3,1,3,1) = C_vv(5,5)
C_dddd(3,1,3,2) = C_vv(5,6)
C_dddd(3,1,3,3) = C_vv(5,3)
C_dddd(3,2,1,1) = C_vv(6,1)
C_dddd(3,2,1,2) = C_vv(6,4)
C_dddd(3,2,1,3) = C_vv(6,5)
C_dddd(3,2,2,1) = C_vv(6,4)
C_dddd(3,2,2,2) = C_vv(6,2)
C_dddd(3,2,2,3) = C_vv(6,6)
C_dddd(3,2,3,1) = C_vv(6,5)
C_dddd(3,2,3,2) = C_vv(6,6)
C_dddd(3,2,3,3) = C_vv(6,3)
C_dddd(2,3,1,1) = C_vv(6,1)
C_dddd(2,3,1,2) = C_vv(6,4)
C_dddd(2,3,1,3) = C_vv(6,5)
C_dddd(2,3,2,1) = C_vv(6,4)
C_dddd(2,3,2,2) = C_vv(6,2)
C_dddd(2,3,2,3) = C_vv(6,6)
C_dddd(2,3,3,1) = C_vv(6,5)
C_dddd(2,3,3,2) = C_vv(6,6)
C_dddd(2,3,3,3) = C_vv(6,3)
! dTau/dF to dP/dF
A1_dddd = 0.0_rp
do ii = 1, 3
do jj = 1, 3
do kk = 1, 3
do ll = 1, 3
A1_dddd(ii,jj,kk,ll) = 0.0_rp
do pp = 1, 3
do mm = 1, 3
A1_dddd(ii,jj,kk,ll) = A1_dddd(ii,jj,kk,ll) + &
J * C_dddd(ii,pp,kk,mm) * Finv_dd(ll,mm) *
Finv_dd(jj,pp) + &
0.5_rp * I_dd(ii,kk) * Finv_dd(ll,mm) * T_dd(mm,pp) *
Finv_dd(jj,pp) + &
0.5_rp * I_dd(pp,kk) * Finv_dd(ll,mm) * T_dd(ii,mm) *
Finv_dd(jj,pp)
enddo
A1_dddd(ii,jj,kk,ll) = A1_dddd(ii,jj,kk,ll) - &
0.5_rp * Finv_dd(ll,ii) * T_dd(kk,pp) * Finv_dd(jj,pp) -
0.5_rp * Finv_dd(ll,pp) * T_dd(ii,kk) * Finv_dd(jj,pp) - &
T_dd(ii,pp) * Finv_dd(ll,pp) * Finv_dd(jj,kk)
enddo
enddo
enddo
enddo
enddo
subroutine sld_abaqus2alya(stress,ddsdde,gpstr,gpdds)
use mod_sld_stress_model_comput, only : SM_tensor_to_voigt_fourth
use mod_sld_stress_model_comput, only : SM_Voigt2Tensor_2nd, SM_V2T_KINETIC
implicit none
!-------------------------------------------------------------------
!
! Stress tensor
!
!-------------------------------------------------------------------
!
! [11, 22, 33, 12, 13, 23] UMAT Abaqus
! [11, 22, 33, 23, 13, 12] Alya
!
! Alya Abaqus
vostr(1) = stress(1)
vostr(2) = stress(2)
vostr(3) = stress(3)
vostr(4) = stress(6)
vostr(5) = stress(5)
vostr(6) = stress(4)
!-------------------------------------------------------------------
!
! Second eleasticity tensor
!
!-------------------------------------------------------------------
!
! [11, 22, 33, 12, 13, 23] UMAT Abaqus
! [11, 22, 33, 23, 13, 12] Alya
!
! Alya Abaqus
voddsdde(1,1) = ddsdde(1,1)
voddsdde(1,2) = ddsdde(1,2)
voddsdde(1,3) = ddsdde(1,3)
voddsdde(1,4) = ddsdde(1,6)
voddsdde(1,5) = ddsdde(1,5)
voddsdde(1,6) = ddsdde(1,4)
voddsdde(2,1) = ddsdde(2,1)
voddsdde(2,2) = ddsdde(2,2)
voddsdde(2,3) = ddsdde(2,3)
voddsdde(2,4) = ddsdde(2,6)
voddsdde(2,5) = ddsdde(2,5)
voddsdde(2,6) = ddsdde(2,4)
voddsdde(3,1) = ddsdde(3,1)
voddsdde(3,2) = ddsdde(3,2)
voddsdde(3,3) = ddsdde(3,3)
voddsdde(3,4) = ddsdde(3,6)
voddsdde(3,5) = ddsdde(3,5)
voddsdde(3,6) = ddsdde(3,4)
voddsdde(4,1) = ddsdde(6,1)
voddsdde(4,2) = ddsdde(6,2)
voddsdde(4,3) = ddsdde(6,3)
voddsdde(4,4) = ddsdde(6,6)
voddsdde(4,5) = ddsdde(6,5)
voddsdde(4,6) = ddsdde(6,4)
voddsdde(5,1) = ddsdde(5,1)
voddsdde(5,2) = ddsdde(5,2)
voddsdde(5,3) = ddsdde(5,3)
voddsdde(5,4) = ddsdde(5,6)
voddsdde(5,5) = ddsdde(5,5)
voddsdde(5,6) = ddsdde(5,4)
voddsdde(6,1) = ddsdde(4,1)
voddsdde(6,2) = ddsdde(4,2)
voddsdde(6,3) = ddsdde(4,3)
voddsdde(6,4) = ddsdde(4,6)
voddsdde(6,5) = ddsdde(4,5)
voddsdde(6,6) = ddsdde(4,4)
subroutine
sld_stress_model_155(pgaus,pmate,gpgdi,gpeps,ielem,gpstr,gpdds,gppio,gptmo)
implicit none
real(rp) :: STRAN(NTENS)
real(rp) :: DSTRAN(NTENS)
real(rp) :: STRESS(NTENS)
real(rp) :: STATEV(NSTATV)
real(rp) :: DDSDDE(NTENS,NTENS) ! Tangent matrix
real(rp) :: PROPS(NPROPS) ! Material properties
real(rp) :: CELENT ! Characteristic element length
integer(ip) :: lawco
!
! Others
!
integer(ip) :: igaus
real(rp) :: voeps(NTENS)
PROPS(1:NPROPS) = parco_sld(1:NPROPS,pmate)
CELENT = celen_sld(ielem)
lawco = lawco_sld(pmate)
do igaus = 1,pgaus
!
! Initialization
!
gpstr(:,:,igaus) = 0.0_rp
gpdds(:,:,:,:,igaus) = 0.0_rp
gppio(:,:,igaus) = 0.0_rp
gptmo(:,:,:,:,igaus) = 0.0_rp
!-------------------------------------------------------------------
!
! Strain tensor
!
!-------------------------------------------------------------------
!-------------------------------------------------------------------
!
! UMAT: Effective stress tensor and Elasticiy tensor (ABAQUS)
!
!-------------------------------------------------------------------
call umat(STRESS, STATEV, DDSDDE, &
STRAN, DSTRAN, NDI, NSHR, NTENS, &
NSTATV, lawco, PROPS, NPROPS, &
CELENT)
!-------------------------------------------------------------------
!
! Stress and tangent convetion to alya
!
!-------------------------------------------------------------------
!-------------------------------------------------------------------
!
! Stress and Tangen transformation (
! [Ref: Lucarni & Segurado, Computational Mechanics 2018,
https://doi.org/10.48550/arXiv.1806.10599]
!
!-------------------------------------------------------------------
!-------------------------------------------------------------------
!
! Store state variables
!
!-------------------------------------------------------------------