added helper functions to communicate accumulated slip between damage and plasticity modules
This commit is contained in:
parent
e943a3a8b0
commit
9b1e55f0e4
|
@ -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
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -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
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -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
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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) = &
|
||||||
|
|
Loading…
Reference in New Issue