using analytic solution for local/nonlocal coupled damage (as opposed to having crystallite iterate to find a consistent solution)

This commit is contained in:
Pratheek Shanthraj 2014-11-26 17:29:45 +00:00
parent 61bb9a373e
commit 54de033c45
2 changed files with 34 additions and 30 deletions

View File

@ -368,19 +368,16 @@ subroutine damage_anisoBrittle_dotState(Tstar_v,ipc, ip, el)
real(pReal) :: & real(pReal) :: &
traction_d, traction_t, traction_n, traction_crit, & traction_d, traction_t, traction_n, traction_crit, &
udotd, udott, udotn, & udotd, udott, udotn, &
nonlocalFactor, localDamage localDamage
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, & localDamage = minval(damageState(phase)%state(2+ damage_anisoBrittle_totalNcleavage(instance): &
1.0_pReal - sum(1.0_pReal - damageState(phase)% & 1+2*damage_anisoBrittle_totalNcleavage(instance),constituent))
state(2+ damage_anisoBrittle_totalNcleavage(instance): &
1+2*damage_anisoBrittle_totalNcleavage(instance),constituent)))
damageState(phase)%dotState(1,constituent) = & damageState(phase)%dotState(1,constituent) = &
(localDamage - damageState(phase)%state(1,constituent))/lattice_DamageMobility(phase) (localDamage - damageState(phase)%state(1,constituent))/lattice_DamageMobility(phase)
nonlocalFactor = damage_anisoBrittle_getDamage(ipc, ip, el) - localDamage
index_o = 2_pInt index_o = 2_pInt
index_d = 2_pInt + damage_anisoBrittle_totalNcleavage(instance) index_d = 2_pInt + damage_anisoBrittle_totalNcleavage(instance)
@ -436,27 +433,32 @@ subroutine damage_anisoBrittle_microstructure(ipc, ip, el)
instance, & instance, &
f, i, index_d, index_o, index_myFamily f, i, index_d, index_o, index_myFamily
real(pReal) :: & real(pReal) :: &
nonlocalFactor, localDamage localDamage
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, & localDamage = minval(damageState(phase)%state(2+ damage_anisoBrittle_totalNcleavage(instance): &
1.0_pReal - sum(1.0_pReal - damageState(phase)% & 1+2*damage_anisoBrittle_totalNcleavage(instance),constituent))
state(2+ damage_anisoBrittle_totalNcleavage(instance): &
1+2*damage_anisoBrittle_totalNcleavage(instance),constituent)))
nonlocalFactor = damage_anisoBrittle_getDamage(ipc, ip, el) - localDamage
index_o = 2_pInt index_o = 2_pInt
index_d = 2_pInt + damage_anisoBrittle_totalNcleavage(instance) index_d = 2_pInt + damage_anisoBrittle_totalNcleavage(instance)
do f = 1_pInt,lattice_maxNcleavageFamily do f = 1_pInt,lattice_maxNcleavageFamily
index_myFamily = sum(lattice_NcleavageSystem(1:f-1_pInt,phase)) ! at which index starts my family 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 do i = 1_pInt,damage_anisoBrittle_Ncleavage(f,instance) ! process each (active) cleavage system in family
if (localDamage == damageState(phase)%state(index_d,constituent)) then
drivingForce = damageState(phase)%state(index_o,constituent) - &
damage_anisoBrittle_getDamage(ipc, ip, el)
damageState(phase)%state(index_d,constituent) = & damageState(phase)%state(index_d,constituent) = &
min(damageState(phase)%state0(index_d,constituent), & min(damageState(phase)%state0(index_d,constituent), &
1.0_pReal/max(0.0_pReal,damageState(phase)%state(index_o,constituent) - & (sqrt(drivingForce*drivingForce + 4.0_pReal) - drivingForce)/2.0_pReal)
nonlocalFactor)) else
drivingForce = damageState(phase)%state(index_o,constituent)
damageState(phase)%state(index_d,constituent) = &
min(damageState(phase)%state0(index_d,constituent), &
1.0_pReal/drivingForce)
endif
index_d = index_d + 1_pInt; index_o = index_o + 1_pInt index_d = index_d + 1_pInt; index_o = index_o + 1_pInt
enddo enddo

View File

@ -317,9 +317,8 @@ subroutine damage_anisoDuctile_dotState(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, & localDamage = minval(damageState(phase)%state(2:1+damage_anisoDuctile_totalNslip(instance),constituent))
1.0_pReal - sum(1.0_pReal - damageState(phase)% &
state(2:1+damage_anisoDuctile_totalNslip(instance),constituent)))
damageState(phase)%dotState(1,constituent) = & damageState(phase)%dotState(1,constituent) = &
(localDamage - damageState(phase)%state(1,constituent))/lattice_DamageMobility(phase) (localDamage - damageState(phase)%state(1,constituent))/lattice_DamageMobility(phase)
@ -351,25 +350,29 @@ subroutine damage_anisoDuctile_microstructure(nSlip, accumulatedSlip, ipc, ip, e
index, f, i index, f, i
real(pReal) :: & real(pReal) :: &
localDamage, & localDamage, &
nonlocalFactor drivingForce
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, & localDamage = minval(damageState(phase)%state(2:1+damage_anisoDuctile_totalNslip(instance),constituent))
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
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
if (localDamage == damageState(phase)%state(index+1,constituent)) then
drivingForce = accumulatedSlip(index)/damage_anisoDuctile_critPlasticStrain(f,instance) - &
damage_anisoDuctile_getDamage(ipc, ip, el)
damageState(phase)%state(index+1,constituent) = & damageState(phase)%state(index+1,constituent) = &
min(damageState(phase)%state0(index+1,constituent), & min(damageState(phase)%state0(index+1,constituent), &
1.0_pReal/max(0.0_pReal,accumulatedSlip(index)/ & (sqrt(drivingForce*drivingForce + 4.0_pReal) - drivingForce)/2.0_pReal)
damage_anisoDuctile_critPlasticStrain(f,instance) - & else
nonlocalFactor)) drivingForce = accumulatedSlip(index)/damage_anisoDuctile_critPlasticStrain(f,instance)
damageState(phase)%state(index+1,constituent) = &
min(damageState(phase)%state0(index+1,constituent), &
1.0_pReal/drivingForce)
endif
index = index + 1_pInt index = index + 1_pInt
enddo enddo
enddo enddo
@ -479,7 +482,6 @@ function damage_anisoDuctile_getSlipDamage(ipc, ip, el)
instance = phase_damageInstance(phase) instance = phase_damageInstance(phase)
damage_anisoDuctile_getSlipDamage = & damage_anisoDuctile_getSlipDamage = &
damageState(phase)%state0(2:1+damage_anisoDuctile_totalNslip(instance),constituent)* &
damageState(phase)%state0(2:1+damage_anisoDuctile_totalNslip(instance),constituent) damageState(phase)%state0(2:1+damage_anisoDuctile_totalNslip(instance),constituent)
end function damage_anisoDuctile_getSlipDamage end function damage_anisoDuctile_getSlipDamage