reworked anisotropic ductile model
This commit is contained in:
parent
9c474796ac
commit
4fcd1821cf
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue