From 4fcd1821cfdf9b6bea84cf6bef36a897024223a5 Mon Sep 17 00:00:00 2001
From: Pratheek Shanthraj
Date: Thu, 6 Nov 2014 17:52:43 +0000
Subject: [PATCH] reworked anisotropic ductile model
---
code/constitutive.f90 | 14 +----
code/damage_anisoDuctile.f90 | 109 +++++++++++++++--------------------
2 files changed, 48 insertions(+), 75 deletions(-)
diff --git a/code/constitutive.f90 b/code/constitutive.f90
index 3b3aa8eb6..b15856f54 100644
--- a/code/constitutive.f90
+++ b/code/constitutive.f90
@@ -549,7 +549,6 @@ subroutine constitutive_microstructure(Tstar_v, Fe, Fp, ipc, ip, el)
PLASTICITY_nonlocal_ID, &
LOCAL_DAMAGE_isoBrittle_ID, &
LOCAL_DAMAGE_isoDuctile_ID, &
- LOCAL_DAMAGE_anisoDuctile_ID, &
LOCAL_DAMAGE_gurson_ID
use constitutive_titanmod, only: &
@@ -565,8 +564,6 @@ subroutine constitutive_microstructure(Tstar_v, Fe, Fp, ipc, ip, el)
damage_isoBrittle_getDamage
use damage_isoDuctile, only: &
damage_isoDuctile_microstructure
- use damage_anisoDuctile, only: &
- damage_anisoDuctile_microstructure
use damage_gurson, only: &
damage_gurson_microstructure
@@ -609,9 +606,6 @@ subroutine constitutive_microstructure(Tstar_v, Fe, Fp, ipc, ip, el)
case (LOCAL_DAMAGE_isoDuctile_ID)
call constitutive_getAccumulatedSlip(nSlip,accumulatedSlip,ipc, ip, el)
call damage_isoDuctile_microstructure(nSlip,accumulatedSlip,ipc, ip, el)
- case (LOCAL_DAMAGE_anisoDuctile_ID)
- call constitutive_getAccumulatedSlip(nSlip,accumulatedSlip,ipc, ip, el)
- call damage_anisoDuctile_microstructure(nSlip,accumulatedSlip,ipc, ip, el)
case (LOCAL_DAMAGE_gurson_ID)
call damage_gurson_microstructure(ipc, ip, el)
@@ -1134,7 +1128,8 @@ subroutine constitutive_collectDotState(Tstar_v, Lp, FeArray, FpArray, subdt, su
case (LOCAL_DAMAGE_anisoBrittle_ID)
call damage_anisoBrittle_dotState(Tstar_v, ipc, ip, el)
case (LOCAL_DAMAGE_anisoDuctile_ID)
- call damage_anisoDuctile_dotState(ipc, ip, el)
+ call constitutive_getAccumulatedSlip(nSlip,accumulatedSlip,ipc,ip,el)
+ call damage_anisoDuctile_dotState(nSlip, accumulatedSlip, ipc, ip, el)
case (LOCAL_DAMAGE_gurson_ID)
call damage_gurson_dotState(Tstar_v, Lp, ipc, ip, el)
end select
@@ -1418,16 +1413,13 @@ function constitutive_getSlipDamage(nSlip, Tstar_v, ipc, ip, el)
Tstar_v !< 2nd Piola-Kirchhoff stress
real(pReal) :: &
constitutive_getSlipDamage(nSlip)
- real(pReal), allocatable :: &
- accumulatedSlip(:)
select case (phase_damage(material_phase(ipc,ip,el)))
case (LOCAL_DAMAGE_isoDuctile_ID)
constitutive_getSlipDamage = damage_isoDuctile_getSlipDamage(ipc, ip, el)
case (LOCAL_DAMAGE_anisoDuctile_ID)
- call constitutive_getAccumulatedSlip(nSlip,accumulatedSlip,ipc,ip,el)
- constitutive_getSlipDamage = damage_anisoDuctile_getSlipDamage(nSlip, accumulatedSlip, ipc, ip, el)
+ constitutive_getSlipDamage = damage_anisoDuctile_getSlipDamage(ipc, ip, el)
case (LOCAL_DAMAGE_gurson_ID)
constitutive_getSlipDamage = damage_gurson_getSlipDamage(Tstar_v, ipc, ip, el)
diff --git a/code/damage_anisoDuctile.f90 b/code/damage_anisoDuctile.f90
index 856abccbb..980fd8266 100644
--- a/code/damage_anisoDuctile.f90
+++ b/code/damage_anisoDuctile.f90
@@ -32,7 +32,9 @@ module damage_anisoDuctile
damage_anisoDuctile_Nslip !< number of slip systems per family
real(pReal), dimension(:), allocatable, private :: &
- damage_anisoDuctile_aTol_damage
+ damage_anisoDuctile_aTol_damage, &
+ damage_anisoDuctile_sdot_0, &
+ damage_anisoDuctile_N
real(pReal), dimension(:,:), allocatable, private :: &
damage_anisoDuctile_critAccShear
@@ -51,7 +53,6 @@ module damage_anisoDuctile
damage_anisoDuctile_stateInit, &
damage_anisoDuctile_aTolState, &
damage_anisoDuctile_dotState, &
- damage_anisoDuctile_microstructure, &
damage_anisoDuctile_getDamage, &
damage_anisoDuctile_putLocalDamage, &
damage_anisoDuctile_getLocalDamage, &
@@ -136,9 +137,11 @@ subroutine damage_anisoDuctile_init(fileUnit)
allocate(damage_anisoDuctile_outputID(maxval(phase_Noutput),maxNinstance), source=undefined_ID)
allocate(damage_anisoDuctile_Noutput(maxNinstance), source=0_pInt)
allocate(damage_anisoDuctile_critAccShear(lattice_maxNslipFamily,maxNinstance), source=0.0_pReal)
- allocate(damage_anisoDuctile_Nslip(lattice_maxNslipFamily,maxNinstance),source=0_pInt)
- allocate(damage_anisoDuctile_totalNslip(maxNinstance), source=0_pInt)
+ allocate(damage_anisoDuctile_Nslip(lattice_maxNslipFamily,maxNinstance), source=0_pInt)
+ allocate(damage_anisoDuctile_totalNslip(maxNinstance), source=0_pInt)
allocate(damage_anisoDuctile_aTol_damage(maxNinstance), source=0.0_pReal)
+ allocate(damage_anisoDuctile_sdot_0(maxNinstance), source=0.0_pReal)
+ allocate(damage_anisoDuctile_N(maxNinstance), source=0.0_pReal)
rewind(fileUnit)
phase = 0_pInt
@@ -174,6 +177,12 @@ subroutine damage_anisoDuctile_init(fileUnit)
case ('atol_damage')
damage_anisoDuctile_aTol_damage(instance) = IO_floatValue(line,positions,2_pInt)
+ case ('sdot_0')
+ damage_anisoDuctile_sdot_0(instance) = IO_floatValue(line,positions,2_pInt)
+
+ case ('rate_sensitivity_damage')
+ damage_anisoDuctile_N(instance) = IO_floatValue(line,positions,2_pInt)
+
case ('nslip') !
Nchunks_SlipFamilies = positions(1) - 1_pInt
do j = 1_pInt, Nchunks_SlipFamilies
@@ -209,8 +218,9 @@ subroutine damage_anisoDuctile_init(fileUnit)
endif
enddo outputsLoop
! Determine size of state array
- sizeDotState = 1_pInt ! non-local damage
- sizeState = sizeDotState + 1_pInt
+ sizeDotState = 1_pInt + &
+ damage_anisoDuctile_totalNslip(instance) ! non-local damage
+ sizeState = sizeDotState
damageState(phase)%sizeState = sizeState
damageState(phase)%sizeDotState = sizeDotState
@@ -281,42 +291,15 @@ end subroutine damage_anisoDuctile_aTolState
!--------------------------------------------------------------------------------------------------
!> @brief calculates derived quantities from state
!--------------------------------------------------------------------------------------------------
-subroutine damage_anisoDuctile_dotState(ipc, ip, el)
- use material, only: &
- mappingConstitutive, &
- damageState
- use lattice, only: &
- lattice_DamageMobility
-
- implicit none
- integer(pInt), intent(in) :: &
- ipc, & !< component-ID of integration point
- ip, & !< integration point
- el !< element
- integer(pInt) :: &
- phase, &
- constituent
-
- phase = mappingConstitutive(2,ipc,ip,el)
- constituent = mappingConstitutive(1,ipc,ip,el)
-
- damageState(phase)%dotState(1,constituent) = &
- (damageState(phase)%state(2,constituent) - &
- damageState(phase)%state(1,constituent))/lattice_DamageMobility(phase)
-
-end subroutine damage_anisoDuctile_dotState
-
-!--------------------------------------------------------------------------------------------------
-!> @brief calculates derived quantities from state
-!--------------------------------------------------------------------------------------------------
-subroutine damage_anisoDuctile_microstructure(nSlip, accumulatedSlip, ipc, ip, el)
+subroutine damage_anisoDuctile_dotState(nSlip, accumulatedSlip, ipc, ip, el)
use material, only: &
mappingConstitutive, &
phase_damageInstance, &
damageState
use lattice, only: &
- lattice_maxNslipFamily
-
+ lattice_maxNslipFamily, &
+ lattice_DamageMobility
+
implicit none
integer(pInt), intent(in) :: &
nSlip, &
@@ -330,23 +313,35 @@ subroutine damage_anisoDuctile_microstructure(nSlip, accumulatedSlip, ipc, ip, e
constituent, &
instance, &
index, f, i
+ real(pReal) :: &
+ localDamage, &
+ nonlocalFactor
phase = mappingConstitutive(2,ipc,ip,el)
constituent = mappingConstitutive(1,ipc,ip,el)
instance = phase_damageInstance(phase)
+ localDamage = max(0.0_pReal, &
+ 1.0_pReal - sum(1.0_pReal - damageState(phase)% &
+ state(2:1+damage_anisoDuctile_totalNslip(instance),constituent)))
+ nonlocalFactor = damage_anisoDuctile_getDamage(ipc, ip, el) - localDamage
+
index = 1_pInt
- damageState(phase)%state(2,constituent) = 1.0_pReal
do f = 1_pInt,lattice_maxNslipFamily
do i = 1_pInt,damage_anisoDuctile_Nslip(f,instance) ! process each (active) slip system in family
- damageState(phase)%state(2,constituent) = damageState(phase)%state(2,constituent) - &
- accumulatedSlip(index)/damage_anisoDuctile_critAccShear(f,instance)
+ damageState(phase)%dotState(index+1,constituent) = &
+ -damage_anisoDuctile_sdot_0(instance)* &
+ max(0.0_pReal, &
+ damageState(phase)%state(index+1,constituent)* &
+ accumulatedSlip(index)/damage_anisoDuctile_critAccShear(f,instance) - &
+ nonlocalFactor)**damage_anisoDuctile_N(instance)
index = index + 1_pInt
enddo
enddo
- damageState(phase)%state(2,constituent) = max(0.0_pReal, damageState(phase)%state(2,constituent))
+ damageState(phase)%dotState(1,constituent) = &
+ (localDamage - damageState(phase)%state(1,constituent))/lattice_DamageMobility(phase)
-end subroutine damage_anisoDuctile_microstructure
+end subroutine damage_anisoDuctile_dotState
!--------------------------------------------------------------------------------------------------
!> @brief returns damage
@@ -419,14 +414,14 @@ function damage_anisoDuctile_getLocalDamage(ipc, ip, el)
damage_anisoDuctile_getLocalDamage
damage_anisoDuctile_getLocalDamage = &
- damageState(mappingConstitutive(2,ipc,ip,el))%state(2,mappingConstitutive(1,ipc,ip,el))
+ damageState(mappingConstitutive(2,ipc,ip,el))%state(1,mappingConstitutive(1,ipc,ip,el))
end function damage_anisoDuctile_getLocalDamage
!--------------------------------------------------------------------------------------------------
!> @brief returns slip system damage
!--------------------------------------------------------------------------------------------------
-function damage_anisoDuctile_getSlipDamage(nSlip, accumulatedSlip, ipc, ip, el)
+function damage_anisoDuctile_getSlipDamage(ipc, ip, el)
use material, only: &
mappingConstitutive, &
phase_damageInstance, &
@@ -436,38 +431,24 @@ function damage_anisoDuctile_getSlipDamage(nSlip, accumulatedSlip, ipc, ip, el)
implicit none
integer(pInt), intent(in) :: &
- nSlip, &
ipc, & !< grain number
ip, & !< integration point number
el !< element number
- real(pReal), dimension(nSlip), intent(in) :: &
- accumulatedSlip
real(pReal) :: &
- damage_anisoDuctile_getSlipDamage(nSlip), &
- nonlocalFactor
+ damage_anisoDuctile_getSlipDamage(damage_anisoDuctile_totalNslip( &
+ phase_damageInstance(mappingConstitutive(2,ipc,ip,el))))
integer(pInt) :: &
phase, &
constituent, &
- instance, &
- index, f, i
+ instance
phase = mappingConstitutive(2,ipc,ip,el)
constituent = mappingConstitutive(1,ipc,ip,el)
instance = phase_damageInstance(phase)
- nonlocalFactor = damage_anisoDuctile_getDamage (ipc, ip, el) - &
- damage_anisoDuctile_getLocalDamage(ipc, ip, el)
- index = 1_pInt
- do f = 1_pInt,lattice_maxNslipFamily
- do i = 1_pInt,damage_anisoDuctile_Nslip(f,instance) ! process each (active) cleavage system in family
- damage_anisoDuctile_getSlipDamage(index) = &
- 1.0_pReal/(1.0_pReal + &
- accumulatedSlip(index)/damage_anisoDuctile_critAccShear(f,instance) - &
- nonlocalFactor)
-
- index = index + 1_pInt
- enddo
- enddo
+ damage_anisoDuctile_getSlipDamage = &
+ damageState(phase)%state(2:1+damage_anisoDuctile_totalNslip(instance),constituent)* &
+ damageState(phase)%state(2:1+damage_anisoDuctile_totalNslip(instance),constituent)
end function damage_anisoDuctile_getSlipDamage