added helper functions to communicate accumulated slip between damage and plasticity modules

This commit is contained in:
Luv Sharma 2014-10-10 16:34:51 +00:00
parent e943a3a8b0
commit 9b1e55f0e4
10 changed files with 416 additions and 59 deletions

View File

@ -36,7 +36,8 @@ module constitutive
constitutive_postResults constitutive_postResults
private :: & private :: &
constitutive_hooke_TandItsTangent constitutive_hooke_TandItsTangent, &
constitutive_getAccumulatedSlip
contains contains
@ -60,7 +61,9 @@ subroutine constitutive_init
debug_constitutive, & debug_constitutive, &
debug_levelBasic debug_levelBasic
use numerics, only: & use numerics, only: &
#ifdef FEM
worldrank, & worldrank, &
#endif
numerics_integrator numerics_integrator
use IO, only: & use IO, only: &
IO_error, & IO_error, &
@ -186,12 +189,16 @@ subroutine constitutive_init
if (any(phase_thermal == LOCAL_THERMAL_adiabatic_ID)) call thermal_adiabatic_init(FILEUNIT) if (any(phase_thermal == LOCAL_THERMAL_adiabatic_ID)) call thermal_adiabatic_init(FILEUNIT)
close(FILEUNIT) close(FILEUNIT)
mainProcess: if (worldrank == 0) then #ifdef FEM
if (worldrank == 0) then
#endif
write(6,'(/,a)') ' <<<+- constitutive init -+>>>' write(6,'(/,a)') ' <<<+- constitutive init -+>>>'
write(6,'(a)') ' $Id$' write(6,'(a)') ' $Id$'
write(6,'(a15,a)') ' Current time: ',IO_timeStamp() write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
#include "compilation_info.f90" #include "compilation_info.f90"
endif mainProcess #ifdef FEM
endif
#endif
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
! write description file for constitutive phase output ! write description file for constitutive phase output
@ -464,6 +471,10 @@ subroutine constitutive_microstructure(Tstar_v, Fe, Fp, ipc, ip, el)
real(pReal) :: & real(pReal) :: &
damage, & damage, &
Tstar_v_effective(6) Tstar_v_effective(6)
real(pReal), dimension(:), allocatable :: &
accumulatedSlip
integer(pInt) :: &
nSlip
select case (phase_plasticity(material_phase(ipc,ip,el))) select case (phase_plasticity(material_phase(ipc,ip,el)))
@ -486,7 +497,8 @@ subroutine constitutive_microstructure(Tstar_v, Fe, Fp, ipc, ip, el)
Tstar_v_effective = Tstar_v/(damage*damage) Tstar_v_effective = Tstar_v/(damage*damage)
call damage_brittle_microstructure(Tstar_v_effective, Fe, ipc, ip, el) call damage_brittle_microstructure(Tstar_v_effective, Fe, ipc, ip, el)
case (LOCAL_DAMAGE_ductile_ID) case (LOCAL_DAMAGE_ductile_ID)
call damage_ductile_microstructure(ipc, ip, el) call constitutive_getAccumulatedSlip(nSlip,accumulatedSlip,Fp,ipc, ip, el)
call damage_ductile_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)
@ -1041,6 +1053,74 @@ function constitutive_getTemperature(ipc, ip, el)
end select end select
end function constitutive_getTemperature end function constitutive_getTemperature
!--------------------------------------------------------------------------------------------------
!> @brief returns accumulated slip on each system defined
!--------------------------------------------------------------------------------------------------
subroutine constitutive_getAccumulatedSlip(nSlip,accumulatedSlip,Fp,ipc, ip, el)
use prec, only: &
pReal, &
pInt
use math, only: &
math_mul33xx33, &
math_norm33, &
math_I3
use material, only: &
phase_plasticity, &
material_phase, &
PLASTICITY_none_ID, &
PLASTICITY_j2_ID, &
PLASTICITY_phenopowerlaw_ID, &
PLASTICITY_dislotwin_ID, &
PLASTICITY_dislokmc_ID, &
PLASTICITY_titanmod_ID, &
PLASTICITY_nonlocal_ID
use constitutive_phenopowerlaw, only: &
constitutive_phenopowerlaw_getAccumulatedSlip
use constitutive_dislotwin, only: &
constitutive_dislotwin_getAccumulatedSlip
use constitutive_dislokmc, only: &
constitutive_dislokmc_getAccumulatedSlip
use constitutive_titanmod, only: &
constitutive_titanmod_getAccumulatedSlip
use constitutive_nonlocal, only: &
constitutive_nonlocal_getAccumulatedSlip
implicit none
real(pReal), dimension(:), allocatable :: &
accumulatedSlip
integer(pInt) :: &
nSlip
real(pReal), intent(in), dimension(3,3) :: &
Fp !< plastic velocity gradient
integer(pInt), intent(in) :: &
ipc, & !< grain number
ip, & !< integration point number
el !< element number
select case (phase_plasticity(material_phase(ipc,ip,el)))
case (PLASTICITY_none_ID)
nSlip = 0_pInt
allocate(accumulatedSlip(nSlip))
case (PLASTICITY_J2_ID)
nSlip = 1_pInt
allocate(accumulatedSlip(nSlip))
accumulatedSlip(1) = math_norm33(math_mul33xx33(transpose(Fp),Fp) - math_I3)/2.0_pReal
case (PLASTICITY_PHENOPOWERLAW_ID)
call constitutive_phenopowerlaw_getAccumulatedSlip(nSlip,accumulatedSlip,ipc, ip, el)
case (PLASTICITY_DISLOTWIN_ID)
call constitutive_dislotwin_getAccumulatedSlip(nSlip,accumulatedSlip,ipc, ip, el)
case (PLASTICITY_DISLOKMC_ID)
call constitutive_dislokmc_getAccumulatedSlip(nSlip,accumulatedSlip,ipc, ip, el)
case (PLASTICITY_TITANMOD_ID)
call constitutive_titanmod_getAccumulatedSlip(nSlip,accumulatedSlip,ipc, ip, el)
case (PLASTICITY_NONLOCAL_ID)
call constitutive_nonlocal_getAccumulatedSlip(nSlip,accumulatedSlip,ipc, ip, el)
end select
end subroutine constitutive_getAccumulatedSlip
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
!> @brief returns array of constitutive results !> @brief returns array of constitutive results
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------

View File

@ -152,6 +152,7 @@ module constitutive_dislokmc
constitutive_dislokmc_microstructure, & constitutive_dislokmc_microstructure, &
constitutive_dislokmc_LpAndItsTangent, & constitutive_dislokmc_LpAndItsTangent, &
constitutive_dislokmc_dotState, & constitutive_dislokmc_dotState, &
constitutive_dislokmc_getAccumulatedSlip, &
constitutive_dislokmc_postResults constitutive_dislokmc_postResults
private :: & private :: &
constitutive_dislokmc_stateInit, & constitutive_dislokmc_stateInit, &
@ -202,7 +203,9 @@ subroutine constitutive_dislokmc_init(fileUnit)
MATERIAL_partPhase MATERIAL_partPhase
use lattice use lattice
use numerics,only: & use numerics,only: &
#ifdef FEM
worldrank, & worldrank, &
#endif
numerics_integrator numerics_integrator
implicit none implicit none
@ -222,12 +225,16 @@ subroutine constitutive_dislokmc_init(fileUnit)
line = '' line = ''
real(pReal), dimension(:), allocatable :: tempPerSlip, tempPerTwin real(pReal), dimension(:), allocatable :: tempPerSlip, tempPerTwin
mainProcess: if (worldrank == 0) then #ifdef FEM
if (worldrank == 0) then
#endif
write(6,'(/,a)') ' <<<+- constitutive_'//PLASTICITY_DISLOKMC_label//' init -+>>>' write(6,'(/,a)') ' <<<+- constitutive_'//PLASTICITY_DISLOKMC_label//' init -+>>>'
write(6,'(a)') ' $Id$' write(6,'(a)') ' $Id$'
write(6,'(a15,a)') ' Current time: ',IO_timeStamp() write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
#include "compilation_info.f90" #include "compilation_info.f90"
endif mainProcess #ifdef FEM
endif
#endif
maxNinstance = int(count(phase_plasticity == PLASTICITY_DISLOKMC_ID),pInt) maxNinstance = int(count(phase_plasticity == PLASTICITY_DISLOKMC_ID),pInt)
if (maxNinstance == 0_pInt) return if (maxNinstance == 0_pInt) return
@ -1673,6 +1680,51 @@ subroutine constitutive_dislokmc_dotState(Tstar_v,Temperature,ipc,ip,el)
enddo enddo
end subroutine constitutive_dislokmc_dotState end subroutine constitutive_dislokmc_dotState
!--------------------------------------------------------------------------------------------------
!> @brief returns accumulated slip
!--------------------------------------------------------------------------------------------------
subroutine constitutive_dislokmc_getAccumulatedSlip(nSlip,accumulatedSlip,ipc, ip, el)
use lattice, only: &
lattice_maxNslipFamily
use material, only: &
mappingConstitutive, &
plasticState, &
phase_plasticityInstance
implicit none
real(pReal), dimension(:), allocatable :: &
accumulatedSlip
integer(pInt) :: &
nSlip
integer(pInt), intent(in) :: &
ipc, & !< grain number
ip, & !< integration point number
el !< element number
integer(pInt) :: &
offset, &
phase, &
instance, &
offset_accshear_slip, &
f, j, i
offset = mappingConstitutive(1,ipc,ip,el)
phase = mappingConstitutive(2,ipc,ip,el)
instance = phase_plasticityInstance(phase)
nSlip = constitutive_dislokmc_totalNslip(instance)
allocate(accumulatedSlip(nSlip))
offset_accshear_slip = 2_pInt*nSlip
j = 0_pInt
do f = 1_pInt,lattice_maxNslipFamily ! loop over all slip families
do i = 1_pInt,constitutive_dislokmc_Nslip(f,instance) ! process each (active) slip system in family
j = j+1_pInt
accumulatedSlip(j) = plasticState(phase)%state(offset_accshear_slip+j,offset)
enddo
enddo
end subroutine constitutive_dislokmc_getAccumulatedSlip
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------

View File

@ -166,6 +166,7 @@ module constitutive_dislotwin
constitutive_dislotwin_microstructure, & constitutive_dislotwin_microstructure, &
constitutive_dislotwin_LpAndItsTangent, & constitutive_dislotwin_LpAndItsTangent, &
constitutive_dislotwin_dotState, & constitutive_dislotwin_dotState, &
constitutive_dislotwin_getAccumulatedSlip, &
constitutive_dislotwin_postResults constitutive_dislotwin_postResults
private :: & private :: &
constitutive_dislotwin_stateInit, & constitutive_dislotwin_stateInit, &
@ -216,7 +217,9 @@ subroutine constitutive_dislotwin_init(fileUnit)
MATERIAL_partPhase MATERIAL_partPhase
use lattice use lattice
use numerics,only: & use numerics,only: &
#ifdef FEM
worldrank, & worldrank, &
#endif
numerics_integrator numerics_integrator
implicit none implicit none
@ -236,12 +239,16 @@ subroutine constitutive_dislotwin_init(fileUnit)
line = '' line = ''
real(pReal), dimension(:), allocatable :: tempPerSlip, tempPerTwin, tempPerTrans real(pReal), dimension(:), allocatable :: tempPerSlip, tempPerTwin, tempPerTrans
mainProcess: if (worldrank == 0) then #ifdef FEM
if (worldrank == 0) then
#endif
write(6,'(/,a)') ' <<<+- constitutive_'//PLASTICITY_DISLOTWIN_label//' init -+>>>' write(6,'(/,a)') ' <<<+- constitutive_'//PLASTICITY_DISLOTWIN_label//' init -+>>>'
write(6,'(a)') ' $Id$' write(6,'(a)') ' $Id$'
write(6,'(a15,a)') ' Current time: ',IO_timeStamp() write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
#include "compilation_info.f90" #include "compilation_info.f90"
endif mainProcess #ifdef FEM
endif
#endif
maxNinstance = int(count(phase_plasticity == PLASTICITY_DISLOTWIN_ID),pInt) maxNinstance = int(count(phase_plasticity == PLASTICITY_DISLOTWIN_ID),pInt)
if (maxNinstance == 0_pInt) return if (maxNinstance == 0_pInt) return
@ -1895,6 +1902,52 @@ subroutine constitutive_dislotwin_dotState(Tstar_v,Temperature,ipc,ip,el)
end subroutine constitutive_dislotwin_dotState end subroutine constitutive_dislotwin_dotState
!--------------------------------------------------------------------------------------------------
!> @brief returns accumulated slip
!--------------------------------------------------------------------------------------------------
subroutine constitutive_dislotwin_getAccumulatedSlip(nSlip,accumulatedSlip,ipc, ip, el)
use lattice, only: &
lattice_maxNslipFamily
use material, only: &
mappingConstitutive, &
plasticState, &
phase_plasticityInstance
implicit none
real(pReal), dimension(:), allocatable :: &
accumulatedSlip
integer(pInt) :: &
nSlip
integer(pInt), intent(in) :: &
ipc, & !< grain number
ip, & !< integration point number
el !< element number
integer(pInt) :: &
offset, &
phase, &
instance, &
offset_accshear_slip, &
f, j, i
offset = mappingConstitutive(1,ipc,ip,el)
phase = mappingConstitutive(2,ipc,ip,el)
instance = phase_plasticityInstance(phase)
nSlip = constitutive_dislotwin_totalNslip(instance)
allocate(accumulatedSlip(nSlip))
offset_accshear_slip = 2_pInt*nSlip
j = 0_pInt
do f = 1_pInt,lattice_maxNslipFamily ! loop over all slip families
do i = 1_pInt,constitutive_dislotwin_Nslip(f,instance) ! process each (active) slip system in family
j = j+1_pInt
accumulatedSlip(j) = plasticState(phase)%state(offset_accshear_slip+j,offset)
enddo
enddo
end subroutine constitutive_dislotwin_getAccumulatedSlip
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
!> @brief return array of constitutive results !> @brief return array of constitutive results
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------

View File

@ -94,7 +94,9 @@ subroutine constitutive_j2_init(fileUnit)
debug_constitutive, & debug_constitutive, &
debug_levelBasic debug_levelBasic
use numerics, only: & use numerics, only: &
#ifdef FEM
worldrank, & worldrank, &
#endif
numerics_integrator numerics_integrator
use math, only: & use math, only: &
math_Mandel3333to66, & math_Mandel3333to66, &
@ -153,12 +155,16 @@ subroutine constitutive_j2_init(fileUnit)
integer(HID_T) :: ID,ID2,ID4 integer(HID_T) :: ID,ID2,ID4
#endif #endif
mainProcess: if (worldrank == 0) then #ifdef FEM
if (worldrank == 0) then
#endif
write(6,'(/,a)') ' <<<+- constitutive_'//PLASTICITY_J2_label//' init -+>>>' write(6,'(/,a)') ' <<<+- constitutive_'//PLASTICITY_J2_label//' init -+>>>'
write(6,'(a)') ' $Id$' write(6,'(a)') ' $Id$'
write(6,'(a15,a)') ' Current time: ',IO_timeStamp() write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
#include "compilation_info.f90" #include "compilation_info.f90"
endif mainProcess #ifdef FEM
endif
#endif
maxNinstance = int(count(phase_plasticity == PLASTICITY_J2_ID),pInt) maxNinstance = int(count(phase_plasticity == PLASTICITY_J2_ID),pInt)
if (maxNinstance == 0_pInt) return if (maxNinstance == 0_pInt) return

View File

@ -250,6 +250,7 @@ module constitutive_nonlocal
constitutive_nonlocal_dotState, & constitutive_nonlocal_dotState, &
constitutive_nonlocal_deltaState, & constitutive_nonlocal_deltaState, &
constitutive_nonlocal_updateCompatibility, & constitutive_nonlocal_updateCompatibility, &
constitutive_nonlocal_getAccumulatedSlip, &
constitutive_nonlocal_postResults constitutive_nonlocal_postResults
private :: & private :: &
@ -300,7 +301,9 @@ use material, only: homogenization_maxNgrains, &
material_phase material_phase
use lattice use lattice
use numerics,only: & use numerics,only: &
#ifdef FEM
worldrank, & worldrank, &
#endif
numerics_integrator numerics_integrator
@ -338,12 +341,16 @@ integer(pInt) :: phase, &
integer(pInt) :: NofMyPhase integer(pInt) :: NofMyPhase
mainProcess: if (worldrank == 0) then #ifdef FEM
if (worldrank == 0) then
#endif
write(6,'(/,a)') ' <<<+- constitutive_'//PLASTICITY_NONLOCAL_label//' init -+>>>' write(6,'(/,a)') ' <<<+- constitutive_'//PLASTICITY_NONLOCAL_label//' init -+>>>'
write(6,'(a)') ' $Id$' write(6,'(a)') ' $Id$'
write(6,'(a15,a)') ' Current time: ',IO_timeStamp() write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
#include "compilation_info.f90" #include "compilation_info.f90"
endif mainProcess #ifdef FEM
endif
#endif
maxNinstances = int(count(phase_plasticity == PLASTICITY_NONLOCAL_ID),pInt) maxNinstances = int(count(phase_plasticity == PLASTICITY_NONLOCAL_ID),pInt)
if (maxNinstances == 0) return ! we don't have to do anything if there's no instance for this constitutive law if (maxNinstances == 0) return ! we don't have to do anything if there's no instance for this constitutive law
@ -3545,6 +3552,45 @@ endif
end function constitutive_nonlocal_dislocationstress end function constitutive_nonlocal_dislocationstress
!--------------------------------------------------------------------------------------------------
!> @brief returns accumulated slip
!--------------------------------------------------------------------------------------------------
subroutine constitutive_nonlocal_getAccumulatedSlip(nSlip,accumulatedSlip,ipc, ip, el)
use lattice, only: &
lattice_maxNslipFamily
use material, only: &
mappingConstitutive, &
plasticState, &
phase_plasticityInstance
implicit none
real(pReal), dimension(:), allocatable :: &
accumulatedSlip
integer(pInt) :: &
nSlip
integer(pInt), intent(in) :: &
ipc, & !< grain number
ip, & !< integration point number
el !< element number
integer(pInt) :: &
offset, &
phase, &
instance, &
offset_accshear_slip, &
s
offset = mappingConstitutive(1,ipc,ip,el)
phase = mappingConstitutive(2,ipc,ip,el)
instance = phase_plasticityInstance(phase)
nSlip = totalNslip(instance)
allocate(accumulatedSlip(nSlip))
forall (s = 1:nSlip) &
accumulatedSlip(s) = plasticState(phase)%dotState(iGamma(s,instance),offset)
end subroutine constitutive_nonlocal_getAccumulatedSlip
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
!> @brief return array of constitutive results !> @brief return array of constitutive results
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------

View File

@ -89,6 +89,7 @@ module constitutive_phenopowerlaw
constitutive_phenopowerlaw_init, & constitutive_phenopowerlaw_init, &
constitutive_phenopowerlaw_LpAndItsTangent, & constitutive_phenopowerlaw_LpAndItsTangent, &
constitutive_phenopowerlaw_dotState, & constitutive_phenopowerlaw_dotState, &
constitutive_phenopowerlaw_getAccumulatedSlip, &
constitutive_phenopowerlaw_postResults constitutive_phenopowerlaw_postResults
private :: & private :: &
constitutive_phenopowerlaw_aTolState, & constitutive_phenopowerlaw_aTolState, &
@ -138,7 +139,9 @@ subroutine constitutive_phenopowerlaw_init(fileUnit)
MATERIAL_partPhase MATERIAL_partPhase
use lattice use lattice
use numerics,only: & use numerics,only: &
#ifdef FEM
worldrank, & worldrank, &
#endif
numerics_integrator numerics_integrator
implicit none implicit none
@ -159,12 +162,16 @@ subroutine constitutive_phenopowerlaw_init(fileUnit)
integer(pInt) :: NofMyPhase integer(pInt) :: NofMyPhase
real(pReal), dimension(:), allocatable :: tempPerSlip real(pReal), dimension(:), allocatable :: tempPerSlip
mainProcess: if (worldrank == 0) then #ifdef FEM
if (worldrank == 0) then
#endif
write(6,'(/,a)') ' <<<+- constitutive_'//PLASTICITY_PHENOPOWERLAW_label//' init -+>>>' write(6,'(/,a)') ' <<<+- constitutive_'//PLASTICITY_PHENOPOWERLAW_label//' init -+>>>'
write(6,'(a)') ' $Id$' write(6,'(a)') ' $Id$'
write(6,'(a15,a)') ' Current time: ',IO_timeStamp() write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
#include "compilation_info.f90" #include "compilation_info.f90"
endif mainProcess #ifdef FEM
endif
#endif
maxNinstance = int(count(phase_plasticity == PLASTICITY_PHENOPOWERLAW_ID),pInt) maxNinstance = int(count(phase_plasticity == PLASTICITY_PHENOPOWERLAW_ID),pInt)
if (maxNinstance == 0_pInt) return if (maxNinstance == 0_pInt) return
@ -990,6 +997,54 @@ subroutine constitutive_phenopowerlaw_dotState(Tstar_v,ipc,ip,el)
end subroutine constitutive_phenopowerlaw_dotState end subroutine constitutive_phenopowerlaw_dotState
!--------------------------------------------------------------------------------------------------
!> @brief returns accumulated slip
!--------------------------------------------------------------------------------------------------
subroutine constitutive_phenopowerlaw_getAccumulatedSlip(nSlip,accumulatedSlip,ipc, ip, el)
use lattice, only: &
lattice_maxNslipFamily
use material, only: &
mappingConstitutive, &
plasticState, &
phase_plasticityInstance
implicit none
real(pReal), dimension(:), allocatable :: &
accumulatedSlip
integer(pInt) :: &
nSlip
integer(pInt), intent(in) :: &
ipc, & !< grain number
ip, & !< integration point number
el !< element number
integer(pInt) :: &
offset, &
phase, &
instance, &
offset_accshear_slip, &
nTwin, &
f, j, i
offset = mappingConstitutive(1,ipc,ip,el)
phase = mappingConstitutive(2,ipc,ip,el)
instance = phase_plasticityInstance(phase)
nSlip = constitutive_phenopowerlaw_totalNslip(instance)
nTwin = constitutive_phenopowerlaw_totalNtwin(instance)
offset_accshear_slip = nSlip + nTwin + 2_pInt
allocate(accumulatedSlip(nSlip))
j = 0_pInt
slipFamiliesLoop: do f = 1_pInt,lattice_maxNslipFamily
do i = 1_pInt,constitutive_phenopowerlaw_Nslip(f,instance) ! process each (active) slip system in family
j = j+1_pInt
accumulatedSlip(j) = plasticState(phase)%state(offset_accshear_slip+j,offset)
enddo
enddo slipFamiliesLoop
end subroutine constitutive_phenopowerlaw_getAccumulatedSlip
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
!> @brief return array of constitutive results !> @brief return array of constitutive results
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------

View File

@ -176,6 +176,7 @@ module constitutive_titanmod
constitutive_titanmod_init, & constitutive_titanmod_init, &
constitutive_titanmod_LpAndItsTangent, & constitutive_titanmod_LpAndItsTangent, &
constitutive_titanmod_dotState, & constitutive_titanmod_dotState, &
constitutive_titanmod_getAccumulatedSlip, &
constitutive_titanmod_postResults, & constitutive_titanmod_postResults, &
constitutive_titanmod_homogenizedC constitutive_titanmod_homogenizedC
@ -219,7 +220,9 @@ subroutine constitutive_titanmod_init(fileUnit)
MATERIAL_partPhase MATERIAL_partPhase
use lattice use lattice
use numerics,only: & use numerics,only: &
#ifdef FEM
worldrank, & worldrank, &
#endif
numerics_integrator numerics_integrator
implicit none implicit none
@ -244,12 +247,16 @@ subroutine constitutive_titanmod_init(fileUnit)
tag = '', & tag = '', &
line = '' line = ''
mainProcess: if (worldrank == 0) then #ifdef FEM
if (worldrank == 0) then
#endif
write(6,'(/,a)') ' <<<+- constitutive_'//PLASTICITY_TITANMOD_label//' init -+>>>' write(6,'(/,a)') ' <<<+- constitutive_'//PLASTICITY_TITANMOD_label//' init -+>>>'
write(6,'(a)') ' $Id$' write(6,'(a)') ' $Id$'
write(6,'(a15,a)') ' Current time: ',IO_timeStamp() write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
#include "compilation_info.f90" #include "compilation_info.f90"
endif mainProcess #ifdef FEM
endif
#endif
maxNinstance = int(count(phase_plasticity == PLASTICITY_TITANMOD_ID),pInt) maxNinstance = int(count(phase_plasticity == PLASTICITY_TITANMOD_ID),pInt)
if (maxNinstance == 0_pInt) return if (maxNinstance == 0_pInt) return
@ -1775,6 +1782,52 @@ implicit none
enddo twinFamiliesLoop enddo twinFamiliesLoop
end subroutine constitutive_titanmod_dotState end subroutine constitutive_titanmod_dotState
!--------------------------------------------------------------------------------------------------
!> @brief returns accumulated slip
!--------------------------------------------------------------------------------------------------
subroutine constitutive_titanmod_getAccumulatedSlip(nSlip,accumulatedSlip,ipc, ip, el)
use lattice, only: &
lattice_maxNslipFamily
use material, only: &
mappingConstitutive, &
plasticState, &
phase_plasticityInstance
implicit none
real(pReal), dimension(:), allocatable :: &
accumulatedSlip
integer(pInt) :: &
nSlip
integer(pInt), intent(in) :: &
ipc, & !< grain number
ip, & !< integration point number
el !< element number
integer(pInt) :: &
offset, &
phase, &
instance, &
offset_accshear_slip, &
f, j, i
offset = mappingConstitutive(1,ipc,ip,el)
phase = mappingConstitutive(2,ipc,ip,el)
instance = phase_plasticityInstance(phase)
nSlip = constitutive_titanmod_totalNslip(instance)
allocate(accumulatedSlip(nSlip))
offset_accshear_slip = 2_pInt*nSlip
j = 0_pInt
do f = 1_pInt,lattice_maxNslipFamily ! loop over all slip families
do i = 1_pInt,constitutive_titanmod_Nslip(f,instance) ! process each (active) slip system in family
j = j+1_pInt
accumulatedSlip(j) = plasticState(phase)%state(offset_accshear_slip+j,offset)
enddo
enddo
end subroutine constitutive_titanmod_getAccumulatedSlip
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------

View File

@ -88,7 +88,9 @@ subroutine damage_brittle_init(fileUnit)
damageState, & damageState, &
MATERIAL_partPhase MATERIAL_partPhase
use numerics,only: & use numerics,only: &
#ifdef FEM
worldrank, & worldrank, &
#endif
numerics_integrator numerics_integrator
implicit none implicit none
@ -103,12 +105,16 @@ subroutine damage_brittle_init(fileUnit)
tag = '', & tag = '', &
line = '' line = ''
mainProcess: if (worldrank == 0) then #ifdef FEM
if (worldrank == 0) then
#endif
write(6,'(/,a)') ' <<<+- damage_'//LOCAL_DAMAGE_BRITTLE_label//' init -+>>>' write(6,'(/,a)') ' <<<+- damage_'//LOCAL_DAMAGE_BRITTLE_label//' init -+>>>'
write(6,'(a)') ' $Id: damage_brittle.f90 3210 2014-06-17 15:24:44Z MPIE\m.diehl $' write(6,'(a)') ' $Id: damage_brittle.f90 3210 2014-06-17 15:24:44Z MPIE\m.diehl $'
write(6,'(a15,a)') ' Current time: ',IO_timeStamp() write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
#include "compilation_info.f90" #include "compilation_info.f90"
endif mainProcess #ifdef FEM
endif
#endif
maxNinstance = int(count(phase_damage == LOCAL_DAMAGE_BRITTLE_ID),pInt) maxNinstance = int(count(phase_damage == LOCAL_DAMAGE_BRITTLE_ID),pInt)
if (maxNinstance == 0_pInt) return if (maxNinstance == 0_pInt) return

View File

@ -88,7 +88,9 @@ subroutine damage_ductile_init(fileUnit)
damageState, & damageState, &
MATERIAL_partPhase MATERIAL_partPhase
use numerics,only: & use numerics,only: &
#ifdef FEM
worldrank, & worldrank, &
#endif
numerics_integrator numerics_integrator
implicit none implicit none
@ -103,12 +105,16 @@ subroutine damage_ductile_init(fileUnit)
tag = '', & tag = '', &
line = '' line = ''
mainProcess: if (worldrank == 0) then #ifdef FEM
if (worldrank == 0) then
#endif
write(6,'(/,a)') ' <<<+- damage_'//LOCAL_DAMAGE_DUCTILE_LABEL//' init -+>>>' write(6,'(/,a)') ' <<<+- damage_'//LOCAL_DAMAGE_DUCTILE_LABEL//' init -+>>>'
write(6,'(a)') ' $Id: damage_ductile.f90 3210 2014-06-17 15:24:44Z MPIE\m.diehl $' write(6,'(a)') ' $Id: damage_ductile.f90 3210 2014-06-17 15:24:44Z MPIE\m.diehl $'
write(6,'(a15,a)') ' Current time: ',IO_timeStamp() write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
#include "compilation_info.f90" #include "compilation_info.f90"
endif mainProcess #ifdef FEM
endif
#endif
maxNinstance = int(count(phase_damage == LOCAL_DAMAGE_DUCTILE_ID),pInt) maxNinstance = int(count(phase_damage == LOCAL_DAMAGE_DUCTILE_ID),pInt)
if (maxNinstance == 0_pInt) return if (maxNinstance == 0_pInt) return
@ -185,8 +191,8 @@ subroutine damage_ductile_init(fileUnit)
endif endif
enddo outputsLoop enddo outputsLoop
! Determine size of state array ! Determine size of state array
sizeDotState = 2_pInt sizeDotState = 1_pInt
sizeState = 3_pInt sizeState = 2_pInt
damageState(phase)%sizeState = sizeState damageState(phase)%sizeState = sizeState
damageState(phase)%sizeDotState = sizeDotState damageState(phase)%sizeDotState = sizeDotState
@ -283,18 +289,15 @@ subroutine damage_ductile_dotState(Lp, ipc, ip, el)
damageState(phase)%dotState(1,constituent) = & damageState(phase)%dotState(1,constituent) = &
(1.0_pReal/lattice_DamageMobility(phase))* & (1.0_pReal/lattice_DamageMobility(phase))* &
(damageState(phase)%state(3,constituent) - & (damageState(phase)%state(2,constituent) - &
damageState(phase)%state(1,constituent)) damageState(phase)%state(1,constituent))
damageState(phase)%dotState(2,constituent) = &
math_norm33(Lp)
end subroutine damage_ductile_dotState end subroutine damage_ductile_dotState
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
!> @brief calculates derived quantities from state !> @brief calculates derived quantities from state
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
subroutine damage_ductile_microstructure(ipc, ip, el) subroutine damage_ductile_microstructure(nSlip,accumulatedSlip,ipc, ip, el)
use material, only: & use material, only: &
mappingConstitutive, & mappingConstitutive, &
phase_damageInstance, & phase_damageInstance, &
@ -308,17 +311,20 @@ subroutine damage_ductile_microstructure(ipc, ip, el)
implicit none implicit none
integer(pInt), intent(in) :: & integer(pInt), intent(in) :: &
nSlip, &
ipc, & !< component-ID of integration point ipc, & !< component-ID of integration point
ip, & !< integration point ip, & !< integration point
el !< element el !< element
real(pReal), dimension(nSlip), intent(in) :: &
accumulatedSlip
integer(pInt) :: & integer(pInt) :: &
phase, constituent phase, constituent
phase = mappingConstitutive(2,ipc,ip,el) phase = mappingConstitutive(2,ipc,ip,el)
constituent = mappingConstitutive(1,ipc,ip,el) constituent = mappingConstitutive(1,ipc,ip,el)
damageState(phase)%state(3,constituent) = min(damageState(phase)%state(3,constituent), & damageState(phase)%state(2,constituent) = min(damageState(phase)%state(2,constituent), &
damage_ductile_critpStrain(phase)/ & damage_ductile_critpStrain(phase)/ &
damageState(phase)%state(2,constituent)) !< akin to damage surface sum(accumulatedSlip)) !< akin to damage surface
end subroutine damage_ductile_microstructure end subroutine damage_ductile_microstructure

2
code/damage_gurson.f90 Normal file → Executable file
View File

@ -288,7 +288,7 @@ subroutine damage_gurson_dotState(Lp, ipc, ip, el)
damageState(phase)%dotState(4,constituent) ! total rate of void fraction evolution damageState(phase)%dotState(4,constituent) ! total rate of void fraction evolution
damageState(phase)%dotState(3,constituent) = & damageState(phase)%dotState(3,constituent) = &
damageState(phase)%state(6,constituent) + & damageState(phase)%state(6,constituent) * &
damageState(phase)%dotState(4,constituent) ! void nucleation rate damageState(phase)%dotState(4,constituent) ! void nucleation rate
damageState(phase)%dotState(4,constituent) = & damageState(phase)%dotState(4,constituent) = &