reworked anisotropic ductile model

This commit is contained in:
Pratheek Shanthraj 2014-11-06 17:52:43 +00:00
parent 9c474796ac
commit 4fcd1821cf
2 changed files with 48 additions and 75 deletions

View File

@ -549,7 +549,6 @@ subroutine constitutive_microstructure(Tstar_v, Fe, Fp, ipc, ip, el)
PLASTICITY_nonlocal_ID, & PLASTICITY_nonlocal_ID, &
LOCAL_DAMAGE_isoBrittle_ID, & LOCAL_DAMAGE_isoBrittle_ID, &
LOCAL_DAMAGE_isoDuctile_ID, & LOCAL_DAMAGE_isoDuctile_ID, &
LOCAL_DAMAGE_anisoDuctile_ID, &
LOCAL_DAMAGE_gurson_ID LOCAL_DAMAGE_gurson_ID
use constitutive_titanmod, only: & use constitutive_titanmod, only: &
@ -565,8 +564,6 @@ subroutine constitutive_microstructure(Tstar_v, Fe, Fp, ipc, ip, el)
damage_isoBrittle_getDamage damage_isoBrittle_getDamage
use damage_isoDuctile, only: & use damage_isoDuctile, only: &
damage_isoDuctile_microstructure damage_isoDuctile_microstructure
use damage_anisoDuctile, only: &
damage_anisoDuctile_microstructure
use damage_gurson, only: & use damage_gurson, only: &
damage_gurson_microstructure damage_gurson_microstructure
@ -609,9 +606,6 @@ subroutine constitutive_microstructure(Tstar_v, Fe, Fp, ipc, ip, el)
case (LOCAL_DAMAGE_isoDuctile_ID) case (LOCAL_DAMAGE_isoDuctile_ID)
call constitutive_getAccumulatedSlip(nSlip,accumulatedSlip,ipc, ip, el) call constitutive_getAccumulatedSlip(nSlip,accumulatedSlip,ipc, ip, el)
call damage_isoDuctile_microstructure(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) case (LOCAL_DAMAGE_gurson_ID)
call damage_gurson_microstructure(ipc, ip, el) 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) case (LOCAL_DAMAGE_anisoBrittle_ID)
call damage_anisoBrittle_dotState(Tstar_v, ipc, ip, el) call damage_anisoBrittle_dotState(Tstar_v, ipc, ip, el)
case (LOCAL_DAMAGE_anisoDuctile_ID) 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) case (LOCAL_DAMAGE_gurson_ID)
call damage_gurson_dotState(Tstar_v, Lp, ipc, ip, el) call damage_gurson_dotState(Tstar_v, Lp, ipc, ip, el)
end select end select
@ -1418,16 +1413,13 @@ function constitutive_getSlipDamage(nSlip, Tstar_v, ipc, ip, el)
Tstar_v !< 2nd Piola-Kirchhoff stress Tstar_v !< 2nd Piola-Kirchhoff stress
real(pReal) :: & real(pReal) :: &
constitutive_getSlipDamage(nSlip) constitutive_getSlipDamage(nSlip)
real(pReal), allocatable :: &
accumulatedSlip(:)
select case (phase_damage(material_phase(ipc,ip,el))) select case (phase_damage(material_phase(ipc,ip,el)))
case (LOCAL_DAMAGE_isoDuctile_ID) case (LOCAL_DAMAGE_isoDuctile_ID)
constitutive_getSlipDamage = damage_isoDuctile_getSlipDamage(ipc, ip, el) constitutive_getSlipDamage = damage_isoDuctile_getSlipDamage(ipc, ip, el)
case (LOCAL_DAMAGE_anisoDuctile_ID) case (LOCAL_DAMAGE_anisoDuctile_ID)
call constitutive_getAccumulatedSlip(nSlip,accumulatedSlip,ipc,ip,el) constitutive_getSlipDamage = damage_anisoDuctile_getSlipDamage(ipc, ip, el)
constitutive_getSlipDamage = damage_anisoDuctile_getSlipDamage(nSlip, accumulatedSlip, ipc, ip, el)
case (LOCAL_DAMAGE_gurson_ID) case (LOCAL_DAMAGE_gurson_ID)
constitutive_getSlipDamage = damage_gurson_getSlipDamage(Tstar_v, ipc, ip, el) constitutive_getSlipDamage = damage_gurson_getSlipDamage(Tstar_v, ipc, ip, el)

View File

@ -32,7 +32,9 @@ module damage_anisoDuctile
damage_anisoDuctile_Nslip !< number of slip systems per family damage_anisoDuctile_Nslip !< number of slip systems per family
real(pReal), dimension(:), allocatable, private :: & 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 :: & real(pReal), dimension(:,:), allocatable, private :: &
damage_anisoDuctile_critAccShear damage_anisoDuctile_critAccShear
@ -51,7 +53,6 @@ module damage_anisoDuctile
damage_anisoDuctile_stateInit, & damage_anisoDuctile_stateInit, &
damage_anisoDuctile_aTolState, & damage_anisoDuctile_aTolState, &
damage_anisoDuctile_dotState, & damage_anisoDuctile_dotState, &
damage_anisoDuctile_microstructure, &
damage_anisoDuctile_getDamage, & damage_anisoDuctile_getDamage, &
damage_anisoDuctile_putLocalDamage, & damage_anisoDuctile_putLocalDamage, &
damage_anisoDuctile_getLocalDamage, & 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_outputID(maxval(phase_Noutput),maxNinstance), source=undefined_ID)
allocate(damage_anisoDuctile_Noutput(maxNinstance), source=0_pInt) allocate(damage_anisoDuctile_Noutput(maxNinstance), source=0_pInt)
allocate(damage_anisoDuctile_critAccShear(lattice_maxNslipFamily,maxNinstance), source=0.0_pReal) allocate(damage_anisoDuctile_critAccShear(lattice_maxNslipFamily,maxNinstance), source=0.0_pReal)
allocate(damage_anisoDuctile_Nslip(lattice_maxNslipFamily,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_totalNslip(maxNinstance), source=0_pInt)
allocate(damage_anisoDuctile_aTol_damage(maxNinstance), source=0.0_pReal) 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) rewind(fileUnit)
phase = 0_pInt phase = 0_pInt
@ -174,6 +177,12 @@ subroutine damage_anisoDuctile_init(fileUnit)
case ('atol_damage') case ('atol_damage')
damage_anisoDuctile_aTol_damage(instance) = IO_floatValue(line,positions,2_pInt) 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') ! case ('nslip') !
Nchunks_SlipFamilies = positions(1) - 1_pInt Nchunks_SlipFamilies = positions(1) - 1_pInt
do j = 1_pInt, Nchunks_SlipFamilies do j = 1_pInt, Nchunks_SlipFamilies
@ -209,8 +218,9 @@ subroutine damage_anisoDuctile_init(fileUnit)
endif endif
enddo outputsLoop enddo outputsLoop
! Determine size of state array ! Determine size of state array
sizeDotState = 1_pInt ! non-local damage sizeDotState = 1_pInt + &
sizeState = sizeDotState + 1_pInt damage_anisoDuctile_totalNslip(instance) ! non-local damage
sizeState = sizeDotState
damageState(phase)%sizeState = sizeState damageState(phase)%sizeState = sizeState
damageState(phase)%sizeDotState = sizeDotState damageState(phase)%sizeDotState = sizeDotState
@ -281,41 +291,14 @@ end subroutine damage_anisoDuctile_aTolState
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
!> @brief calculates derived quantities from state !> @brief calculates derived quantities from state
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
subroutine damage_anisoDuctile_dotState(ipc, ip, el) subroutine damage_anisoDuctile_dotState(nSlip, accumulatedSlip, 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)
use material, only: & use material, only: &
mappingConstitutive, & mappingConstitutive, &
phase_damageInstance, & phase_damageInstance, &
damageState damageState
use lattice, only: & use lattice, only: &
lattice_maxNslipFamily lattice_maxNslipFamily, &
lattice_DamageMobility
implicit none implicit none
integer(pInt), intent(in) :: & integer(pInt), intent(in) :: &
@ -330,23 +313,35 @@ subroutine damage_anisoDuctile_microstructure(nSlip, accumulatedSlip, ipc, ip, e
constituent, & constituent, &
instance, & instance, &
index, f, i index, f, i
real(pReal) :: &
localDamage, &
nonlocalFactor
phase = mappingConstitutive(2,ipc,ip,el) phase = mappingConstitutive(2,ipc,ip,el)
constituent = mappingConstitutive(1,ipc,ip,el) constituent = mappingConstitutive(1,ipc,ip,el)
instance = phase_damageInstance(phase) 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 index = 1_pInt
damageState(phase)%state(2,constituent) = 1.0_pReal
do f = 1_pInt,lattice_maxNslipFamily do f = 1_pInt,lattice_maxNslipFamily
do i = 1_pInt,damage_anisoDuctile_Nslip(f,instance) ! process each (active) slip system in family 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) - & damageState(phase)%dotState(index+1,constituent) = &
accumulatedSlip(index)/damage_anisoDuctile_critAccShear(f,instance) -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 index = index + 1_pInt
enddo enddo
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 !> @brief returns damage
@ -419,14 +414,14 @@ function damage_anisoDuctile_getLocalDamage(ipc, ip, el)
damage_anisoDuctile_getLocalDamage damage_anisoDuctile_getLocalDamage
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 end function damage_anisoDuctile_getLocalDamage
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
!> @brief returns slip system damage !> @brief returns slip system damage
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
function damage_anisoDuctile_getSlipDamage(nSlip, accumulatedSlip, ipc, ip, el) function damage_anisoDuctile_getSlipDamage(ipc, ip, el)
use material, only: & use material, only: &
mappingConstitutive, & mappingConstitutive, &
phase_damageInstance, & phase_damageInstance, &
@ -436,38 +431,24 @@ function damage_anisoDuctile_getSlipDamage(nSlip, accumulatedSlip, ipc, ip, el)
implicit none implicit none
integer(pInt), intent(in) :: & integer(pInt), intent(in) :: &
nSlip, &
ipc, & !< grain number ipc, & !< grain number
ip, & !< integration point number ip, & !< integration point number
el !< element number el !< element number
real(pReal), dimension(nSlip), intent(in) :: &
accumulatedSlip
real(pReal) :: & real(pReal) :: &
damage_anisoDuctile_getSlipDamage(nSlip), & damage_anisoDuctile_getSlipDamage(damage_anisoDuctile_totalNslip( &
nonlocalFactor phase_damageInstance(mappingConstitutive(2,ipc,ip,el))))
integer(pInt) :: & integer(pInt) :: &
phase, & phase, &
constituent, & constituent, &
instance, & instance
index, f, i
phase = mappingConstitutive(2,ipc,ip,el) phase = mappingConstitutive(2,ipc,ip,el)
constituent = mappingConstitutive(1,ipc,ip,el) constituent = mappingConstitutive(1,ipc,ip,el)
instance = phase_damageInstance(phase) instance = phase_damageInstance(phase)
nonlocalFactor = damage_anisoDuctile_getDamage (ipc, ip, el) - & damage_anisoDuctile_getSlipDamage = &
damage_anisoDuctile_getLocalDamage(ipc, ip, el) damageState(phase)%state(2:1+damage_anisoDuctile_totalNslip(instance),constituent)* &
index = 1_pInt damageState(phase)%state(2:1+damage_anisoDuctile_totalNslip(instance),constituent)
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
end function damage_anisoDuctile_getSlipDamage end function damage_anisoDuctile_getSlipDamage