use slip system families for anisotropic ductile damage

This commit is contained in:
Pratheek Shanthraj 2014-10-16 02:11:14 +00:00
parent 4a445a9f54
commit 898aa0e9bf
1 changed files with 67 additions and 30 deletions

View File

@ -25,11 +25,16 @@ module damage_anisotropic
integer(pInt), dimension(:), allocatable, target, public :: & integer(pInt), dimension(:), allocatable, target, public :: &
damage_anisotropic_Noutput !< number of outputs per instance of this damage damage_anisotropic_Noutput !< number of outputs per instance of this damage
integer(pInt), dimension(:), allocatable, target, private :: & integer(pInt), dimension(:), allocatable, private :: &
damage_anisotropic_nSlip !< Todo damage_anisotropic_totalNslip !< Todo
integer(pInt), dimension(:,:), allocatable, private :: &
damage_anisotropic_Nslip !< Todo
real(pReal), dimension(:), allocatable, private :: & real(pReal), dimension(:), allocatable, private :: &
damage_anisotropic_aTol, & damage_anisotropic_aTol
real(pReal), dimension(:,:), allocatable, private :: &
damage_anisotropic_critpStrain damage_anisotropic_critpStrain
enum, bind(c) enum, bind(c)
@ -93,6 +98,8 @@ subroutine damage_anisotropic_init(fileUnit)
use numerics,only: & use numerics,only: &
worldrank, & worldrank, &
numerics_integrator numerics_integrator
use lattice, only: &
lattice_maxNslipFamily
implicit none implicit none
integer(pInt), intent(in) :: fileUnit integer(pInt), intent(in) :: fileUnit
@ -125,8 +132,9 @@ subroutine damage_anisotropic_init(fileUnit)
damage_anisotropic_output = '' damage_anisotropic_output = ''
allocate(damage_anisotropic_outputID(maxval(phase_Noutput),maxNinstance), source=undefined_ID) allocate(damage_anisotropic_outputID(maxval(phase_Noutput),maxNinstance), source=undefined_ID)
allocate(damage_anisotropic_Noutput(maxNinstance), source=0_pInt) allocate(damage_anisotropic_Noutput(maxNinstance), source=0_pInt)
allocate(damage_anisotropic_critpStrain(maxNinstance), source=0.0_pReal) allocate(damage_anisotropic_critpStrain(lattice_maxNslipFamily,maxNinstance), source=0.0_pReal)
allocate(damage_anisotropic_nSlip(maxNinstance), source=0_pInt) allocate(damage_anisotropic_Nslip(lattice_maxNslipFamily,maxNinstance), source=0_pInt)
allocate(damage_anisotropic_totalNslip(maxNinstance), source=0_pInt)
allocate(damage_anisotropic_aTol(maxNinstance), source=0.0_pReal) allocate(damage_anisotropic_aTol(maxNinstance), source=0.0_pReal)
rewind(fileUnit) rewind(fileUnit)
@ -160,14 +168,20 @@ subroutine damage_anisotropic_init(fileUnit)
IO_lc(IO_stringValue(line,positions,2_pInt)) IO_lc(IO_stringValue(line,positions,2_pInt))
end select end select
case ('critical_plastic_strain')
damage_anisotropic_critpStrain(instance) = IO_floatValue(line,positions,2_pInt)
case ('atol_damage') case ('atol_damage')
damage_anisotropic_aTol(instance) = IO_floatValue(line,positions,2_pInt) damage_anisotropic_aTol(instance) = IO_floatValue(line,positions,2_pInt)
case ('Nslip') ! case ('Nslip') !
damage_anisotropic_nSlip(instance) = IO_floatValue(line,positions,2_pInt) Nchunks_SlipFamilies = positions(1) - 1_pInt
do j = 1_pInt, Nchunks_SlipFamilies
damage_anisotropic_Nslip(j,instance) = IO_intValue(line,positions,1_pInt+j)
enddo
damage_anisotropic_totalNslip(instance) = sum(damage_anisotropic_Nslip(:,instance))
case ('critical_plastic_strain')
do j = 1_pInt, Nchunks_SlipFamilies
damage_anisotropic_critpStrain(j,instance) = IO_floatValue(line,positions,1_pInt+j)
enddo
end select end select
endif; endif endif; endif
@ -183,7 +197,7 @@ subroutine damage_anisotropic_init(fileUnit)
outputsLoop: do o = 1_pInt,damage_anisotropic_Noutput(instance) outputsLoop: do o = 1_pInt,damage_anisotropic_Noutput(instance)
select case(damage_anisotropic_outputID(o,instance)) select case(damage_anisotropic_outputID(o,instance))
case(local_damage_ID) case(local_damage_ID)
mySize = 1_pInt mySize = damage_anisotropic_totalNslip(instance)
end select end select
if (mySize > 0_pInt) then ! any meaningful output found if (mySize > 0_pInt) then ! any meaningful output found
@ -192,8 +206,8 @@ subroutine damage_anisotropic_init(fileUnit)
endif endif
enddo outputsLoop enddo outputsLoop
! Determine size of state array ! Determine size of state array
sizeDotState = damage_anisotropic_nSlip(instance) sizeDotState = damage_anisotropic_totalNslip(instance)
sizeState = 2_pInt * damage_anisotropic_nSlip(instance) sizeState = 2_pInt * damage_anisotropic_totalNslip(instance)
damageState(phase)%sizeState = sizeState damageState(phase)%sizeState = sizeState
damageState(phase)%sizeDotState = sizeDotState damageState(phase)%sizeDotState = sizeDotState
@ -265,6 +279,7 @@ end subroutine damage_anisotropic_aTolState
subroutine damage_anisotropic_dotState(ipc, ip, el) subroutine damage_anisotropic_dotState(ipc, ip, el)
use material, only: & use material, only: &
mappingConstitutive, & mappingConstitutive, &
phase_damageInstance, &
damageState damageState
use math, only: & use math, only: &
math_norm33 math_norm33
@ -279,16 +294,19 @@ subroutine damage_anisotropic_dotState(ipc, ip, el)
integer(pInt) :: & integer(pInt) :: &
phase, & phase, &
constituent, & constituent, &
instance, &
i 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)
forall (i = 1_pInt:damageState(phase)%sizeState) & do i = 1_pInt,damage_anisotropic_totalNslip(instance)
damageState(phase)%dotState(i,constituent) = & damageState(phase)%dotState(i,constituent) = &
(1.0_pReal/lattice_DamageMobility(phase))* & (1.0_pReal/lattice_DamageMobility(phase))* &
(damageState(phase)%state(i+damageState(phase)%sizeState,constituent) - & (damageState(phase)%state(i+damage_anisotropic_totalNslip(instance),constituent) - &
damageState(phase)%state(i,constituent)) damageState(phase)%state(i,constituent))
enddo
end subroutine damage_anisotropic_dotState end subroutine damage_anisotropic_dotState
@ -306,6 +324,8 @@ subroutine damage_anisotropic_microstructure(nSlip,accumulatedSlip,ipc, ip, el)
math_transpose33, & math_transpose33, &
math_I3, & math_I3, &
math_norm33 math_norm33
use lattice, only: &
lattice_maxNslipFamily
implicit none implicit none
integer(pInt), intent(in) :: & integer(pInt), intent(in) :: &
@ -316,17 +336,22 @@ subroutine damage_anisotropic_microstructure(nSlip,accumulatedSlip,ipc, ip, el)
real(pReal), dimension(nSlip), intent(in) :: & real(pReal), dimension(nSlip), intent(in) :: &
accumulatedSlip accumulatedSlip
integer(pInt) :: & integer(pInt) :: &
phase, constituent, i phase, constituent, instance, i, j, f
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)
forall (i = 1_pInt:damageState(phase)%sizeState) & j = 0_pInt
damageState(phase)%state(damageState(phase)%sizeState + i,constituent) = & do f = 1_pInt,lattice_maxNslipFamily
min(damageState(phase)%state(i,constituent), & do i = 1_pInt,damage_anisotropic_Nslip(f,instance) ! process each (active) slip system in family
damage_anisotropic_critpStrain(phase)/ & j = j+1_pInt
accumulatedSlip(i)) damageState(phase)%state(j+damage_anisotropic_totalNslip(instance),constituent) = &
min(damageState(phase)%state(j+damage_anisotropic_totalNslip(instance),constituent), &
damage_anisotropic_critpStrain(f,instance)/accumulatedSlip(j))
enddo
enddo
end subroutine damage_anisotropic_microstructure end subroutine damage_anisotropic_microstructure
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
@ -335,6 +360,7 @@ end subroutine damage_anisotropic_microstructure
function constitutive_anisotropic_getDamage(ipc, ip, el) function constitutive_anisotropic_getDamage(ipc, ip, el)
use material, only: & use material, only: &
mappingConstitutive, & mappingConstitutive, &
phase_damageInstance, &
damageState damageState
implicit none implicit none
@ -342,10 +368,13 @@ function constitutive_anisotropic_getDamage(ipc, ip, el)
ipc, & !< grain number ipc, & !< grain number
ip, & !< integration point number ip, & !< integration point number
el !< element number el !< element number
real(pReal) :: constitutive_anisotropic_getDamage real(pReal) :: &
constitutive_anisotropic_getDamage(damage_anisotropic_totalNslip(phase_damageInstance(mappingConstitutive(2,ipc,ip,el))))
constitutive_anisotropic_getDamage = & constitutive_anisotropic_getDamage = &
damageState(mappingConstitutive(2,ipc,ip,el))%state(1,mappingConstitutive(1,ipc,ip,el)) damageState(mappingConstitutive(2,ipc,ip,el))% &
state(1:damage_anisotropic_totalNslip(phase_damageInstance(mappingConstitutive(2,ipc,ip,el))), &
mappingConstitutive(1,ipc,ip,el))
end function constitutive_anisotropic_getDamage end function constitutive_anisotropic_getDamage
@ -355,6 +384,7 @@ end function constitutive_anisotropic_getDamage
subroutine constitutive_anisotropic_putDamage(ipc, ip, el, localDamage) subroutine constitutive_anisotropic_putDamage(ipc, ip, el, localDamage)
use material, only: & use material, only: &
mappingConstitutive, & mappingConstitutive, &
phase_damageInstance, &
damageState damageState
implicit none implicit none
@ -362,9 +392,15 @@ subroutine constitutive_anisotropic_putDamage(ipc, ip, el, localDamage)
ipc, & !< grain number ipc, & !< grain number
ip, & !< integration point number ip, & !< integration point number
el !< element number el !< element number
real(pReal), intent(in) :: localDamage real(pReal), intent(in) :: &
localDamage(damage_anisotropic_totalNslip(phase_damageInstance(mappingConstitutive(2,ipc,ip,el))))
integer(pInt) :: &
phase, constituent, instance
damageState(mappingConstitutive(2,ipc,ip,el))%state(1,mappingConstitutive(1,ipc,ip,el)) = & phase = mappingConstitutive(2,ipc,ip,el)
constituent = mappingConstitutive(1,ipc,ip,el)
instance = phase_damageInstance(phase)
damageState(phase)%state(1:damage_anisotropic_totalNslip(instance),constituent) = &
localDamage localDamage
end subroutine constitutive_anisotropic_putDamage end subroutine constitutive_anisotropic_putDamage
@ -399,8 +435,9 @@ function damage_anisotropic_postResults(ipc,ip,el)
do o = 1_pInt,damage_anisotropic_Noutput(instance) do o = 1_pInt,damage_anisotropic_Noutput(instance)
select case(damage_anisotropic_outputID(o,instance)) select case(damage_anisotropic_outputID(o,instance))
case (local_damage_ID) case (local_damage_ID)
damage_anisotropic_postResults(c+1_pInt) = damageState(phase)%state(1,constituent) damage_anisotropic_postResults(c+1_pInt:c+damage_anisotropic_totalNslip(instance)) = &
c = c + 1 damageState(phase)%state(1,constituent)
c = c + damage_anisotropic_totalNslip(instance)
end select end select
enddo enddo