reverted back to rate independent damage evolution. updated example config files to recent changes

This commit is contained in:
Pratheek Shanthraj 2014-11-25 23:56:52 +00:00
parent 81b55f0404
commit 36dc59b09f
6 changed files with 233 additions and 166 deletions

View File

@ -564,6 +564,8 @@ subroutine constitutive_microstructure(Tstar_v, Fe, Fp, ipc, ip, el)
PLASTICITY_nonlocal_ID, &
LOCAL_DAMAGE_isoBrittle_ID, &
LOCAL_DAMAGE_isoDuctile_ID, &
LOCAL_DAMAGE_anisoBrittle_ID, &
LOCAL_DAMAGE_anisoDuctile_ID, &
LOCAL_DAMAGE_gurson_ID, &
LOCAL_DAMAGE_phaseField_ID
@ -575,8 +577,14 @@ subroutine constitutive_microstructure(Tstar_v, Fe, Fp, ipc, ip, el)
constitutive_dislotwin_microstructure
use constitutive_dislokmc, only: &
constitutive_dislokmc_microstructure
use damage_gurson, only: &
damage_gurson_microstructure
use damage_isoBrittle, only: &
damage_isoBrittle_microstructure
use damage_isoDuctile, only: &
damage_isoDuctile_microstructure
use damage_anisoBrittle, only: &
damage_anisoBrittle_microstructure
use damage_anisoDuctile, only: &
damage_anisoDuctile_microstructure
use damage_gurson, only: &
damage_gurson_microstructure
use damage_phaseField, only: &
@ -592,6 +600,10 @@ subroutine constitutive_microstructure(Tstar_v, Fe, Fp, ipc, ip, el)
real(pReal), intent(in), dimension(3,3) :: &
Fe, & !< elastic deformation gradient
Fp !< plastic deformation gradient
real(pReal), dimension(:), allocatable :: &
accumulatedSlip
integer(pInt) :: &
nSlip
select case (phase_plasticity(material_phase(ipc,ip,el)))
@ -607,6 +619,17 @@ subroutine constitutive_microstructure(Tstar_v, Fe, Fp, ipc, ip, el)
end select
select case (phase_damage(material_phase(ipc,ip,el)))
case (LOCAL_DAMAGE_isoBrittle_ID)
call damage_isoBrittle_microstructure(constitutive_homogenizedC(ipc,ip,el), Fe, &
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_anisoBrittle_ID)
call damage_anisoBrittle_microstructure(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)
case (LOCAL_DAMAGE_phaseField_ID)
@ -1138,16 +1161,13 @@ subroutine constitutive_collectDotState(Tstar_v, Lp, FeArray, FpArray, subdt, su
select case (phase_damage(material_phase(ipc,ip,el)))
case (LOCAL_DAMAGE_isoBrittle_ID)
call damage_isoBrittle_dotState(constitutive_homogenizedC(ipc,ip,el), &
FeArray(1:3,1:3,ipc,ip,el), ipc, ip, el)
call damage_isoBrittle_dotState(ipc, ip, el)
case (LOCAL_DAMAGE_isoDuctile_ID)
call constitutive_getAccumulatedSlip(nSlip,accumulatedSlip,ipc, ip, el)
call damage_isoDuctile_dotState(nSlip,accumulatedSlip,ipc, ip, el)
call damage_isoDuctile_dotState(ipc, ip, el)
case (LOCAL_DAMAGE_anisoBrittle_ID)
call damage_anisoBrittle_dotState(Tstar_v, ipc, ip, el)
case (LOCAL_DAMAGE_anisoDuctile_ID)
call constitutive_getAccumulatedSlip(nSlip,accumulatedSlip,ipc,ip,el)
call damage_anisoDuctile_dotState(nSlip, accumulatedSlip, ipc, ip, el)
call damage_anisoDuctile_dotState(ipc, ip, el)
case (LOCAL_DAMAGE_gurson_ID)
call damage_gurson_dotState(Tstar_v, Lp, ipc, ip, el)
case (LOCAL_DAMAGE_phaseField_ID)

View File

@ -55,6 +55,7 @@ module damage_anisoBrittle
damage_anisoBrittle_stateInit, &
damage_anisoBrittle_aTolState, &
damage_anisoBrittle_dotState, &
damage_anisoBrittle_microstructure, &
damage_anisoBrittle_LdAndItsTangent, &
damage_anisoBrittle_getFd, &
damage_anisoBrittle_putFd, &
@ -78,9 +79,6 @@ subroutine damage_anisoBrittle_init(fileUnit)
debug_level,&
debug_constitutive,&
debug_levelBasic
use mesh, only: &
mesh_maxNips, &
mesh_NcpElems
use IO, only: &
IO_read, &
IO_lc, &
@ -95,7 +93,6 @@ subroutine damage_anisoBrittle_init(fileUnit)
IO_timeStamp, &
IO_EOF
use material, only: &
homogenization_maxNgrains, &
phase_damage, &
phase_damageInstance, &
phase_Noutput, &
@ -189,10 +186,10 @@ subroutine damage_anisoBrittle_init(fileUnit)
case ('atol_disp')
damage_anisoBrittle_aTol_disp(instance) = IO_floatValue(line,positions,2_pInt)
case ('sdot_0')
case ('sdot0')
damage_anisoBrittle_sdot_0(instance) = IO_floatValue(line,positions,2_pInt)
case ('rate_sensitivity_damage')
case ('damageratesensitivity')
damage_anisoBrittle_N(instance) = IO_floatValue(line,positions,2_pInt)
case ('ncleavage') !
@ -201,12 +198,12 @@ subroutine damage_anisoBrittle_init(fileUnit)
damage_anisoBrittle_Ncleavage(j,instance) = IO_intValue(line,positions,1_pInt+j)
enddo
case ('critical_displacement')
case ('criticaldisplacement')
do j = 1_pInt, Nchunks_CleavageFamilies
damage_anisoBrittle_critDisp(j,instance) = IO_floatValue(line,positions,1_pInt+j)
enddo
case ('critical_load')
case ('criticalload')
do j = 1_pInt, Nchunks_CleavageFamilies
damage_anisoBrittle_critLoad(j,instance) = IO_floatValue(line,positions,1_pInt+j)
enddo
@ -259,9 +256,9 @@ subroutine damage_anisoBrittle_init(fileUnit)
enddo outputsLoop
! Determine size of state array
sizeDotState = 1_pInt + & ! non-local damage
damage_anisoBrittle_totalNcleavage(instance) + & ! local damage on each damage system
damage_anisoBrittle_totalNcleavage(instance) ! local damage on each damage system
damage_anisoBrittle_totalNcleavage(instance) ! opening on each damage system
sizeState = sizeDotState + &
damage_anisoBrittle_totalNcleavage(instance) + & ! local damage on each damage system
9_pInt ! Fd
damageState(phase)%sizeState = sizeState
@ -309,9 +306,9 @@ subroutine damage_anisoBrittle_stateInit(phase,instance)
tempState(1) = 1.0_pReal
tempState(2 : &
1 + damage_anisoBrittle_totalNcleavage(instance)) = 1.0_pReal
1 + damage_anisoBrittle_totalNcleavage(instance)) = 0.0_pReal
tempState(2 + damage_anisoBrittle_totalNcleavage(instance): &
1 +2*damage_anisoBrittle_totalNcleavage(instance)) = 0.0_pReal
1 +2*damage_anisoBrittle_totalNcleavage(instance)) = 1.0_pReal
tempState(2 +2*damage_anisoBrittle_totalNcleavage(instance): &
10+2*damage_anisoBrittle_totalNcleavage(instance)) = reshape(math_I3, shape=[9])
damageState(phase)%state = spread(tempState,2,size(damageState(phase)%state(1,:)))
@ -334,9 +331,9 @@ subroutine damage_anisoBrittle_aTolState(phase,instance)
tempTol(1) = damage_anisoBrittle_aTol_damage(instance)
tempTol(2 : &
1 + damage_anisoBrittle_totalNcleavage(instance)) = damage_anisoBrittle_aTol_damage(instance)
1 + damage_anisoBrittle_totalNcleavage(instance)) = damage_anisoBrittle_aTol_disp (instance)
tempTol(2 + damage_anisoBrittle_totalNcleavage(instance): &
1 +2*damage_anisoBrittle_totalNcleavage(instance)) = damage_anisoBrittle_aTol_disp (instance)
1 +2*damage_anisoBrittle_totalNcleavage(instance)) = damage_anisoBrittle_aTol_damage(instance)
tempTol(2 +2*damage_anisoBrittle_totalNcleavage(instance): &
10+2*damage_anisoBrittle_totalNcleavage(instance)) = damage_anisoBrittle_aTol_damage(instance)
damageState(phase)%aTolState = tempTol
@ -351,7 +348,6 @@ subroutine damage_anisoBrittle_dotState(Tstar_v,ipc, ip, el)
phase_damageInstance, &
damageState
use lattice, only: &
lattice_Scleavage, &
lattice_Scleavage_v, &
lattice_maxNcleavageFamily, &
lattice_NcleavageSystem, &
@ -372,7 +368,7 @@ subroutine damage_anisoBrittle_dotState(Tstar_v,ipc, ip, el)
real(pReal) :: &
traction_d, traction_t, traction_n, traction_crit, &
udotd, udott, udotn, &
drivingForce, nonlocalFactor, localDamage
nonlocalFactor, localDamage
phase = mappingConstitutive(2,ipc,ip,el)
constituent = mappingConstitutive(1,ipc,ip,el)
@ -381,10 +377,12 @@ subroutine damage_anisoBrittle_dotState(Tstar_v,ipc, ip, el)
localDamage = max(0.0_pReal, &
1.0_pReal - sum(1.0_pReal - damageState(phase)% &
state(2:1+damage_anisoBrittle_totalNcleavage(instance),constituent)))
damageState(phase)%dotState(1,constituent) = &
(localDamage - damageState(phase)%state(1,constituent))/lattice_DamageMobility(phase)
nonlocalFactor = damage_anisoBrittle_getDamage(ipc, ip, el) - localDamage
index_d = 2_pInt
index_o = 2_pInt + damage_anisoBrittle_totalNcleavage(instance)
index_o = 2_pInt
index_d = 2_pInt + damage_anisoBrittle_totalNcleavage(instance)
do f = 1_pInt,lattice_maxNcleavageFamily
index_myFamily = sum(lattice_NcleavageSystem(1:f-1_pInt,phase)) ! at which index starts my family
do i = 1_pInt,damage_anisoBrittle_Ncleavage(f,instance) ! process each (active) cleavage system in family
@ -408,21 +406,61 @@ subroutine damage_anisoBrittle_dotState(Tstar_v,ipc, ip, el)
damageState(phase)%dotState(index_o,constituent) = &
(udotd + udott + udotn)/damage_anisoBrittle_critDisp(f,instance)
drivingForce = max(0.0_pReal, &
2.0_pReal*damageState(phase)%state(index_d,constituent)* &
damageState(phase)%state(index_o,constituent) - &
nonlocalFactor)
damageState(phase)%dotState(index_d,constituent) = &
(exp(-drivingForce**damage_anisoBrittle_N(instance)) - 1.0_pReal)/ &
lattice_DamageMobility(phase)
index_d = index_d + 1_pInt; index_o = index_o + 1_pInt
enddo
enddo
end subroutine damage_anisoBrittle_dotState
!--------------------------------------------------------------------------------------------------
!> @brief calculates derived quantities from state
!--------------------------------------------------------------------------------------------------
subroutine damage_anisoBrittle_microstructure(ipc, ip, el)
use material, only: &
mappingConstitutive, &
phase_damageInstance, &
damageState
use lattice, only: &
lattice_maxNcleavageFamily, &
lattice_NcleavageSystem
implicit none
integer(pInt), intent(in) :: &
ipc, & !< component-ID of integration point
ip, & !< integration point
el !< element
integer(pInt) :: &
phase, &
constituent, &
instance, &
f, i, index_d, index_o, index_myFamily
real(pReal) :: &
nonlocalFactor, localDamage
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_anisoBrittle_totalNcleavage(instance),constituent)))
nonlocalFactor = damage_anisoBrittle_getDamage(ipc, ip, el) - localDamage
index_o = 2_pInt
index_d = 2_pInt + damage_anisoBrittle_totalNcleavage(instance)
do f = 1_pInt,lattice_maxNcleavageFamily
index_myFamily = sum(lattice_NcleavageSystem(1:f-1_pInt,phase)) ! at which index starts my family
do i = 1_pInt,damage_anisoBrittle_Ncleavage(f,instance) ! process each (active) cleavage system in family
damageState(phase)%state(index_d,constituent) = &
min(damageState(phase)%state0(index_d,constituent), &
1.0_pReal/max(0.0_pReal,damageState(phase)%state(index_o,constituent) - &
nonlocalFactor))
index_d = index_d + 1_pInt; index_o = index_o + 1_pInt
enddo
enddo
damageState(phase)%dotState(1,constituent) = &
(localDamage - damageState(phase)%state(1,constituent))/lattice_DamageMobility(phase)
end subroutine damage_anisoBrittle_dotState
end subroutine damage_anisoBrittle_microstructure
!--------------------------------------------------------------------------------------------------
!> @brief contains the constitutive equation for calculating the velocity gradient
@ -468,7 +506,7 @@ subroutine damage_anisoBrittle_LdAndItsTangent(Ld, dLd_dTstar, Tstar_v, ipc, ip,
Ld = 0.0_pReal
dLd_dTstar3333 = 0.0_pReal
index = 2_pInt
index = 2_pInt + damage_anisoBrittle_totalNcleavage(instance)
do f = 1_pInt,lattice_maxNcleavageFamily
index_myFamily = sum(lattice_NcleavageSystem(1:f-1_pInt,phase)) ! at which index starts my family
do i = 1_pInt,damage_anisoBrittle_Ncleavage(f,instance) ! process each (active) cleavage system in family
@ -599,7 +637,7 @@ subroutine damage_anisoBrittle_putFd(Tstar_v, dt, ipc, ip, el)
instance = phase_damageInstance(phase)
Ld = 0.0_pReal
index = 2_pInt
index = 2_pInt + damage_anisoBrittle_totalNcleavage(instance)
do f = 1_pInt,lattice_maxNcleavageFamily
index_myFamily = sum(lattice_NcleavageSystem(1:f-1_pInt,phase)) ! at which index starts my family
do i = 1_pInt,damage_anisoBrittle_Ncleavage(f,instance) ! process each (active) cleavage system in family
@ -739,7 +777,6 @@ end function damage_anisoBrittle_getDamage
subroutine damage_anisoBrittle_putLocalDamage(ipc, ip, el, localDamage)
use material, only: &
mappingConstitutive, &
phase_damageInstance, &
damageState
implicit none
@ -761,7 +798,6 @@ end subroutine damage_anisoBrittle_putLocalDamage
function damage_anisoBrittle_getLocalDamage(ipc, ip, el)
use material, only: &
mappingConstitutive, &
phase_damageInstance, &
damageState
implicit none
@ -783,8 +819,7 @@ end function damage_anisoBrittle_getLocalDamage
function damage_anisoBrittle_postResults(ipc,ip,el)
use material, only: &
mappingConstitutive, &
phase_damageInstance,&
damageState
phase_damageInstance
implicit none
integer(pInt), intent(in) :: &

View File

@ -32,11 +32,10 @@ module damage_anisoDuctile
damage_anisoDuctile_Nslip !< number of slip systems per family
real(pReal), dimension(:), allocatable, private :: &
damage_anisoDuctile_aTol_damage, &
damage_anisoDuctile_N
damage_anisoDuctile_aTol_damage
real(pReal), dimension(:,:), allocatable, private :: &
damage_anisoDuctile_critAccShear
damage_anisoDuctile_critPlasticStrain
enum, bind(c)
enumerator :: undefined_ID, &
@ -52,6 +51,7 @@ module damage_anisoDuctile
damage_anisoDuctile_stateInit, &
damage_anisoDuctile_aTolState, &
damage_anisoDuctile_dotState, &
damage_anisoDuctile_microstructure, &
damage_anisoDuctile_getDamage, &
damage_anisoDuctile_putLocalDamage, &
damage_anisoDuctile_getLocalDamage, &
@ -71,9 +71,6 @@ subroutine damage_anisoDuctile_init(fileUnit)
debug_level,&
debug_constitutive,&
debug_levelBasic
use mesh, only: &
mesh_maxNips, &
mesh_NcpElems
use IO, only: &
IO_read, &
IO_lc, &
@ -88,7 +85,6 @@ subroutine damage_anisoDuctile_init(fileUnit)
IO_timeStamp, &
IO_EOF
use material, only: &
homogenization_maxNgrains, &
phase_damage, &
phase_damageInstance, &
phase_Noutput, &
@ -136,11 +132,10 @@ subroutine damage_anisoDuctile_init(fileUnit)
damage_anisoDuctile_output = ''
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_critPlasticStrain(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_aTol_damage(maxNinstance), source=0.0_pReal)
allocate(damage_anisoDuctile_N(maxNinstance), source=0.0_pReal)
rewind(fileUnit)
phase = 0_pInt
@ -176,18 +171,15 @@ subroutine damage_anisoDuctile_init(fileUnit)
case ('atol_damage')
damage_anisoDuctile_aTol_damage(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
damage_anisoDuctile_Nslip(j,instance) = IO_intValue(line,positions,1_pInt+j)
enddo
case ('critical_accshear')
case ('criticalplasticstrain')
do j = 1_pInt, Nchunks_SlipFamilies
damage_anisoDuctile_critAccShear(j,instance) = IO_floatValue(line,positions,1_pInt+j)
damage_anisoDuctile_critPlasticStrain(j,instance) = IO_floatValue(line,positions,1_pInt+j)
enddo
end select
@ -205,10 +197,8 @@ subroutine damage_anisoDuctile_init(fileUnit)
damage_anisoDuctile_totalNslip(instance) = sum(damage_anisoDuctile_Nslip(:,instance))
if (damage_anisoDuctile_aTol_damage(instance) < 0.0_pReal) &
damage_anisoDuctile_aTol_damage(instance) = 1.0e-3_pReal ! default absolute tolerance 1e-3
if (any(damage_anisoDuctile_critAccShear(:,instance) < 0.0_pReal)) &
call IO_error(211_pInt,el=instance,ext_msg='critical_accshear ('//LOCAL_DAMAGE_anisoDuctile_LABEL//')')
if (damage_anisoDuctile_N(instance) <= 0.0_pReal) &
call IO_error(211_pInt,el=instance,ext_msg='rate_sensitivity_damage ('//LOCAL_DAMAGE_anisoDuctile_LABEL//')')
if (any(damage_anisoDuctile_critPlasticStrain(:,instance) < 0.0_pReal)) &
call IO_error(211_pInt,el=instance,ext_msg='criticaPlasticStrain ('//LOCAL_DAMAGE_anisoDuctile_LABEL//')')
endif myPhase
enddo sanityChecks
@ -232,9 +222,9 @@ subroutine damage_anisoDuctile_init(fileUnit)
endif
enddo outputsLoop
! Determine size of state array
sizeDotState = 1_pInt + &
damage_anisoDuctile_totalNslip(instance) ! non-local damage
sizeState = sizeDotState
sizeDotState = 1_pInt ! non-local damage
sizeState = sizeDotState + &
damage_anisoDuctile_totalNslip(instance)
damageState(phase)%sizeState = sizeState
damageState(phase)%sizeDotState = sizeDotState
@ -271,8 +261,6 @@ end subroutine damage_anisoDuctile_init
subroutine damage_anisoDuctile_stateInit(phase)
use material, only: &
damageState
use math, only: &
math_I3
implicit none
integer(pInt), intent(in) :: phase !< number specifying the phase of the damage
@ -305,15 +293,49 @@ end subroutine damage_anisoDuctile_aTolState
!--------------------------------------------------------------------------------------------------
!> @brief calculates derived quantities from state
!--------------------------------------------------------------------------------------------------
subroutine damage_anisoDuctile_dotState(nSlip, accumulatedSlip, ipc, ip, el)
subroutine damage_anisoDuctile_dotState(ipc, ip, el)
use material, only: &
mappingConstitutive, &
phase_damageInstance, &
damageState
use lattice, only: &
lattice_maxNslipFamily, &
lattice_DamageMobility
implicit none
integer(pInt), intent(in) :: &
ipc, & !< component-ID of integration point
ip, & !< integration point
el !< element
integer(pInt) :: &
phase, &
constituent, &
instance
real(pReal) :: &
localDamage
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)))
damageState(phase)%dotState(1,constituent) = &
(localDamage - 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: &
mappingConstitutive, &
phase_damageInstance, &
damageState
use lattice, only: &
lattice_maxNslipFamily
implicit none
integer(pInt), intent(in) :: &
nSlip, &
@ -329,7 +351,6 @@ subroutine damage_anisoDuctile_dotState(nSlip, accumulatedSlip, ipc, ip, el)
index, f, i
real(pReal) :: &
localDamage, &
drivingForce, &
nonlocalFactor
phase = mappingConstitutive(2,ipc,ip,el)
@ -344,20 +365,16 @@ subroutine damage_anisoDuctile_dotState(nSlip, accumulatedSlip, ipc, ip, el)
index = 1_pInt
do f = 1_pInt,lattice_maxNslipFamily
do i = 1_pInt,damage_anisoDuctile_Nslip(f,instance) ! process each (active) slip system in family
drivingForce = max(0.0_pReal, &
2.0_pReal*damageState(phase)%state(index+1,constituent)* &
accumulatedSlip(index)/damage_anisoDuctile_critAccShear(f,instance) - &
nonlocalFactor)
damageState(phase)%dotState(index+1,constituent) = &
(exp(-drivingForce**damage_anisoDuctile_N(instance)) - 1.0_pReal)/ &
lattice_DamageMobility(phase)
damageState(phase)%state(index+1,constituent) = &
min(damageState(phase)%state0(index+1,constituent), &
1.0_pReal/max(0.0_pReal,accumulatedSlip(index)/ &
damage_anisoDuctile_critPlasticStrain(f,instance) - &
nonlocalFactor))
index = index + 1_pInt
enddo
enddo
damageState(phase)%dotState(1,constituent) = &
(localDamage - damageState(phase)%state(1,constituent))/lattice_DamageMobility(phase)
end subroutine damage_anisoDuctile_dotState
end subroutine damage_anisoDuctile_microstructure
!--------------------------------------------------------------------------------------------------
!> @brief returns damage
@ -396,7 +413,6 @@ end function damage_anisoDuctile_getDamage
subroutine damage_anisoDuctile_putLocalDamage(ipc, ip, el, localDamage)
use material, only: &
mappingConstitutive, &
phase_damageInstance, &
damageState
implicit none
@ -418,7 +434,6 @@ end subroutine damage_anisoDuctile_putLocalDamage
function damage_anisoDuctile_getLocalDamage(ipc, ip, el)
use material, only: &
mappingConstitutive, &
phase_damageInstance, &
damageState
implicit none
@ -442,8 +457,6 @@ function damage_anisoDuctile_getSlipDamage(ipc, ip, el)
mappingConstitutive, &
phase_damageInstance, &
damageState
use lattice, only: &
lattice_maxNslipFamily
implicit none
integer(pInt), intent(in) :: &
@ -474,8 +487,7 @@ end function damage_anisoDuctile_getSlipDamage
function damage_anisoDuctile_postResults(ipc,ip,el)
use material, only: &
mappingConstitutive, &
phase_damageInstance,&
damageState
phase_damageInstance
implicit none
integer(pInt), intent(in) :: &

View File

@ -27,7 +27,6 @@ module damage_isoBrittle
real(pReal), dimension(:), allocatable, private :: &
damage_isoBrittle_aTol, &
damage_isoBrittle_N, &
damage_isoBrittle_critStrainEnergy
enum, bind(c)
@ -44,6 +43,7 @@ module damage_isoBrittle
damage_isoBrittle_stateInit, &
damage_isoBrittle_aTolState, &
damage_isoBrittle_dotState, &
damage_isoBrittle_microstructure, &
damage_isoBrittle_getDamage, &
damage_isoBrittle_putLocalDamage, &
damage_isoBrittle_getLocalDamage, &
@ -64,9 +64,6 @@ subroutine damage_isoBrittle_init(fileUnit)
debug_level,&
debug_constitutive,&
debug_levelBasic
use mesh, only: &
mesh_maxNips, &
mesh_NcpElems
use IO, only: &
IO_read, &
IO_lc, &
@ -81,7 +78,6 @@ subroutine damage_isoBrittle_init(fileUnit)
IO_timeStamp, &
IO_EOF
use material, only: &
homogenization_maxNgrains, &
phase_damage, &
phase_damageInstance, &
phase_Noutput, &
@ -125,7 +121,6 @@ subroutine damage_isoBrittle_init(fileUnit)
damage_isoBrittle_output = ''
allocate(damage_isoBrittle_outputID(maxval(phase_Noutput),maxNinstance), source=undefined_ID)
allocate(damage_isoBrittle_Noutput(maxNinstance), source=0_pInt)
allocate(damage_isoBrittle_N(maxNinstance), source=0.0_pReal)
allocate(damage_isoBrittle_critStrainEnergy(maxNinstance), source=0.0_pReal)
allocate(damage_isoBrittle_aTol(maxNinstance), source=0.0_pReal)
@ -160,10 +155,7 @@ subroutine damage_isoBrittle_init(fileUnit)
IO_lc(IO_stringValue(line,positions,2_pInt))
end select
case ('rate_sensitivity_damage')
damage_isoBrittle_N(instance) = IO_floatValue(line,positions,2_pInt)
case ('critical_strain_energy')
case ('criticalstrainenergy')
damage_isoBrittle_critStrainEnergy(instance) = IO_floatValue(line,positions,2_pInt)
case ('atol_damage')
@ -182,9 +174,7 @@ subroutine damage_isoBrittle_init(fileUnit)
if (damage_isoBrittle_aTol(instance) < 0.0_pReal) &
damage_isoBrittle_aTol(instance) = 1.0e-3_pReal ! default absolute tolerance 1e-3
if (damage_isoBrittle_critStrainEnergy(instance) <= 0.0_pReal) &
call IO_error(211_pInt,el=instance,ext_msg='critical_strain_energy ('//LOCAL_DAMAGE_isoBrittle_LABEL//')')
if (damage_isoBrittle_N(instance) <= 0.0_pReal) &
call IO_error(211_pInt,el=instance,ext_msg='rate_sensitivity_damage ('//LOCAL_DAMAGE_isoBrittle_LABEL//')')
call IO_error(211_pInt,el=instance,ext_msg='criticalStrainEnergy ('//LOCAL_DAMAGE_isoBrittle_LABEL//')')
endif myPhase
enddo sanityChecks
@ -206,7 +196,7 @@ subroutine damage_isoBrittle_init(fileUnit)
endif
enddo outputsLoop
! Determine size of state array
sizeDotState = 2_pInt
sizeDotState = 1_pInt
sizeState = 2_pInt
damageState(phase)%sizeState = sizeState
@ -276,7 +266,34 @@ end subroutine damage_isoBrittle_aTolState
!--------------------------------------------------------------------------------------------------
!> @brief calculates derived quantities from state
!--------------------------------------------------------------------------------------------------
subroutine damage_isoBrittle_dotState(C, Fe, ipc, ip, el)
subroutine damage_isoBrittle_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_isoBrittle_dotState
!--------------------------------------------------------------------------------------------------
!> @brief calculates derived quantities from state
!--------------------------------------------------------------------------------------------------
subroutine damage_isoBrittle_microstructure(C, Fe, ipc, ip, el)
use material, only: &
mappingConstitutive, &
phase_damageInstance, &
@ -287,8 +304,6 @@ subroutine damage_isoBrittle_dotState(C, Fe, ipc, ip, el)
math_Mandel33to6, &
math_transpose33, &
math_I3
use lattice, only: &
lattice_DamageMobility
implicit none
integer(pInt), intent(in) :: &
@ -300,7 +315,6 @@ subroutine damage_isoBrittle_dotState(C, Fe, ipc, ip, el)
integer(pInt) :: &
phase, constituent, instance
real(pReal) :: &
drivingForce, &
strain(6), &
stress(6), &
C(6,6)
@ -312,21 +326,11 @@ subroutine damage_isoBrittle_dotState(C, Fe, ipc, ip, el)
strain = 0.5_pReal*math_Mandel33to6(math_mul33x33(math_transpose33(Fe),Fe)-math_I3)
stress = math_mul66x6(C,strain)
drivingForce = max(0.0_pReal, &
2.0_pReal*damageState(phase)%state(2,constituent)* &
sum(abs(stress*strain))/damage_isoBrittle_critStrainEnergy(instance) - &
damage_isoBrittle_getDamage(ipc, ip, el) + &
damageState(phase)%state(2,constituent))
damageState(phase)%dotState(1,constituent) = &
(damageState(phase)%state(2,constituent) - damageState(phase)%state(1,constituent))/ &
lattice_DamageMobility(phase)
damageState(phase)%state(2,constituent) = &
min(damageState(phase)%state0(2,constituent), &
damage_isoBrittle_critStrainEnergy(instance)/sum(abs(stress*strain)))
damageState(phase)%dotState(2,constituent) = &
(exp(-drivingForce**damage_isoBrittle_N(instance)) - 1.0_pReal)/ &
lattice_DamageMobility(phase)
end subroutine damage_isoBrittle_dotState
end subroutine damage_isoBrittle_microstructure
!--------------------------------------------------------------------------------------------------
!> @brief returns damage
@ -449,8 +453,8 @@ function damage_isoBrittle_getDamagedC66(C, ipc, ip, el)
phase = mappingConstitutive(2,ipc,ip,el)
constituent = mappingConstitutive(1,ipc,ip,el)
damage_isoBrittle_getDamagedC66 = &
damageState(phase)%state(2,constituent)* &
damageState(phase)%state(2,constituent)* &
damageState(phase)%state(1,constituent)* &
damageState(phase)%state(1,constituent)* &
C
end function damage_isoBrittle_getDamagedC66
@ -461,8 +465,8 @@ end function damage_isoBrittle_getDamagedC66
function damage_isoBrittle_postResults(ipc,ip,el)
use material, only: &
mappingConstitutive, &
phase_damageInstance,&
damageState
damageState, &
phase_damageInstance
implicit none
integer(pInt), intent(in) :: &

View File

@ -27,8 +27,7 @@ module damage_isoDuctile
real(pReal), dimension(:), allocatable, private :: &
damage_isoDuctile_aTol, &
damage_isoDuctile_N, &
damage_isoDuctile_critpStrain
damage_isoDuctile_critPlasticStrain
enum, bind(c)
enumerator :: undefined_ID, &
@ -44,6 +43,7 @@ module damage_isoDuctile
damage_isoDuctile_stateInit, &
damage_isoDuctile_aTolState, &
damage_isoDuctile_dotState, &
damage_isoDuctile_microstructure, &
damage_isoDuctile_getDamage, &
damage_isoDuctile_getSlipDamage, &
damage_isoDuctile_putLocalDamage, &
@ -63,9 +63,6 @@ subroutine damage_isoDuctile_init(fileUnit)
debug_level,&
debug_constitutive,&
debug_levelBasic
use mesh, only: &
mesh_maxNips, &
mesh_NcpElems
use IO, only: &
IO_read, &
IO_lc, &
@ -80,7 +77,6 @@ subroutine damage_isoDuctile_init(fileUnit)
IO_timeStamp, &
IO_EOF
use material, only: &
homogenization_maxNgrains, &
phase_damage, &
phase_damageInstance, &
phase_Noutput, &
@ -124,8 +120,7 @@ subroutine damage_isoDuctile_init(fileUnit)
damage_isoDuctile_output = ''
allocate(damage_isoDuctile_outputID(maxval(phase_Noutput),maxNinstance), source=undefined_ID)
allocate(damage_isoDuctile_Noutput(maxNinstance), source=0_pInt)
allocate(damage_isoDuctile_N(maxNinstance), source=0.0_pReal)
allocate(damage_isoDuctile_critpStrain(maxNinstance), source=0.0_pReal)
allocate(damage_isoDuctile_critPlasticStrain(maxNinstance), source=0.0_pReal)
allocate(damage_isoDuctile_aTol(maxNinstance), source=0.0_pReal)
rewind(fileUnit)
@ -159,11 +154,8 @@ subroutine damage_isoDuctile_init(fileUnit)
IO_lc(IO_stringValue(line,positions,2_pInt))
end select
case ('rate_sensitivity_damage')
damage_isoDuctile_N(instance) = IO_floatValue(line,positions,2_pInt)
case ('critical_plastic_strain')
damage_isoDuctile_critpStrain(instance) = IO_floatValue(line,positions,2_pInt)
case ('criticalplasticstrain')
damage_isoDuctile_critPlasticStrain(instance) = IO_floatValue(line,positions,2_pInt)
case ('atol_damage')
damage_isoDuctile_aTol(instance) = IO_floatValue(line,positions,2_pInt)
@ -179,10 +171,8 @@ subroutine damage_isoDuctile_init(fileUnit)
! sanity checks
if (damage_isoDuctile_aTol(instance) < 0.0_pReal) &
damage_isoDuctile_aTol(instance) = 1.0e-3_pReal ! default absolute tolerance 1e-3
if (damage_isoDuctile_critpStrain(instance) <= 0.0_pReal) &
if (damage_isoDuctile_critPlasticStrain(instance) <= 0.0_pReal) &
call IO_error(211_pInt,el=instance,ext_msg='critical_plastic_strain ('//LOCAL_DAMAGE_isoDuctile_LABEL//')')
if (damage_isoDuctile_N(instance) <= 0.0_pReal) &
call IO_error(211_pInt,el=instance,ext_msg='rate_sensitivity_damage ('//LOCAL_DAMAGE_isoDuctile_LABEL//')')
endif myPhase
enddo sanityChecks
@ -205,7 +195,7 @@ subroutine damage_isoDuctile_init(fileUnit)
endif
enddo outputsLoop
! Determine size of state array
sizeDotState = 2_pInt
sizeDotState = 1_pInt
sizeState = 2_pInt
damageState(phase)%sizeState = sizeState
@ -275,15 +265,40 @@ end subroutine damage_isoDuctile_aTolState
!--------------------------------------------------------------------------------------------------
!> @brief calculates derived quantities from state
!--------------------------------------------------------------------------------------------------
subroutine damage_isoDuctile_dotState(nSlip,accumulatedSlip,ipc, ip, el)
subroutine damage_isoDuctile_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_isoDuctile_dotState
!--------------------------------------------------------------------------------------------------
!> @brief calculates derived quantities from state
!--------------------------------------------------------------------------------------------------
subroutine damage_isoDuctile_microstructure(nSlip,accumulatedSlip,ipc, ip, el)
use material, only: &
phase_damageInstance, &
mappingConstitutive, &
damageState
use math, only: &
math_norm33
use lattice, only: &
lattice_DamageMobility
implicit none
integer(pInt), intent(in) :: &
@ -295,28 +310,16 @@ subroutine damage_isoDuctile_dotState(nSlip,accumulatedSlip,ipc, ip, el)
accumulatedSlip
integer(pInt) :: &
phase, constituent, instance
real(pReal) :: &
drivingForce
phase = mappingConstitutive(2,ipc,ip,el)
constituent = mappingConstitutive(1,ipc,ip,el)
instance = phase_damageInstance(phase)
drivingForce = max(0.0_pReal, &
2.0_pReal*damageState(phase)%state(2,constituent)* &
sum(accumulatedSlip)/damage_isoDuctile_critpStrain(instance) - &
damage_isoDuctile_getDamage(ipc, ip, el) + &
damageState(phase)%state(2,constituent))
damageState(phase)%state(2,constituent) = &
min(damageState(phase)%state0(2,constituent), &
damage_isoDuctile_critPlasticStrain(instance)/sum(accumulatedSlip))
damageState(phase)%dotState(1,constituent) = &
(damageState(phase)%state(2,constituent) - damageState(phase)%state(1,constituent))/ &
lattice_DamageMobility(phase)
damageState(phase)%dotState(2,constituent) = &
(exp(-drivingForce**damage_isoDuctile_N(instance)) - 1.0_pReal)/ &
lattice_DamageMobility(phase)
end subroutine damage_isoDuctile_dotState
end subroutine damage_isoDuctile_microstructure
!--------------------------------------------------------------------------------------------------
!> @brief returns damage

View File

@ -1,5 +1,5 @@
!--------------------------------------------------------------------------------------------------
! $Id: damage_phaseField.f90 3736 2014-11-21 13:12:54Z MPIE\l.sharma $
! $Id$
!--------------------------------------------------------------------------------------------------
!> @author Pratheek Shanthraj, Max-Planck-Institut für Eisenforschung GmbH
!> @author Luv Sharma, Max-Planck-Institut für Eisenforschung GmbH
@ -65,9 +65,6 @@ subroutine damage_phaseField_init(fileUnit)
debug_level,&
debug_constitutive,&
debug_levelBasic
use mesh, only: &
mesh_maxNips, &
mesh_NcpElems
use IO, only: &
IO_read, &
IO_lc, &
@ -82,7 +79,6 @@ subroutine damage_phaseField_init(fileUnit)
IO_timeStamp, &
IO_EOF
use material, only: &
homogenization_maxNgrains, &
phase_damage, &
phase_damageInstance, &
phase_Noutput, &
@ -109,7 +105,7 @@ subroutine damage_phaseField_init(fileUnit)
mainProcess: if (worldrank == 0) then
write(6,'(/,a)') ' <<<+- damage_'//LOCAL_damage_phaseField_label//' init -+>>>'
write(6,'(a)') ' $Id: damage_phaseField.f90 3736 2014-11-21 13:12:54Z MPIE\l.sharma $'
write(6,'(a)') ' $Id$'
write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
#include "compilation_info.f90"
endif mainProcess
@ -316,8 +312,6 @@ subroutine damage_phaseField_microstructure(C, Fe, Cv, ipc, ip, el)
math_Mandel33to6, &
math_transpose33, &
math_I3
use lattice, only: &
lattice_DamageMobility
implicit none
integer(pInt), intent(in) :: &
@ -454,8 +448,7 @@ end function damage_phaseField_getDamageDiffusion33
!--------------------------------------------------------------------------------------------------
function damage_phaseField_getDamagedC66(C, ipc, ip, el)
use material, only: &
mappingConstitutive, &
damageState
mappingConstitutive
implicit none
integer(pInt), intent(in) :: &