using analytic solution for local/nonlocal coupled damage (as opposed to having crystallite iterate to find a consistent solution)
This commit is contained in:
parent
61bb9a373e
commit
54de033c45
|
@ -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
|
||||||
damageState(phase)%state(index_d,constituent) = &
|
if (localDamage == damageState(phase)%state(index_d,constituent)) then
|
||||||
min(damageState(phase)%state0(index_d,constituent), &
|
drivingForce = damageState(phase)%state(index_o,constituent) - &
|
||||||
1.0_pReal/max(0.0_pReal,damageState(phase)%state(index_o,constituent) - &
|
damage_anisoBrittle_getDamage(ipc, ip, el)
|
||||||
nonlocalFactor))
|
damageState(phase)%state(index_d,constituent) = &
|
||||||
|
min(damageState(phase)%state0(index_d,constituent), &
|
||||||
|
(sqrt(drivingForce*drivingForce + 4.0_pReal) - drivingForce)/2.0_pReal)
|
||||||
|
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
|
||||||
|
|
|
@ -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
|
||||||
damageState(phase)%state(index+1,constituent) = &
|
if (localDamage == damageState(phase)%state(index+1,constituent)) then
|
||||||
min(damageState(phase)%state0(index+1,constituent), &
|
drivingForce = accumulatedSlip(index)/damage_anisoDuctile_critPlasticStrain(f,instance) - &
|
||||||
1.0_pReal/max(0.0_pReal,accumulatedSlip(index)/ &
|
damage_anisoDuctile_getDamage(ipc, ip, el)
|
||||||
damage_anisoDuctile_critPlasticStrain(f,instance) - &
|
damageState(phase)%state(index+1,constituent) = &
|
||||||
nonlocalFactor))
|
min(damageState(phase)%state0(index+1,constituent), &
|
||||||
|
(sqrt(drivingForce*drivingForce + 4.0_pReal) - drivingForce)/2.0_pReal)
|
||||||
|
else
|
||||||
|
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
|
||||||
|
|
Loading…
Reference in New Issue