THIS IS A MAJOR UPDATE

The different blocks required for the twinning model are now implemented (I guess correctly...)
Keywords in the material.config are changed. Since the flow rule for twin systems remains under investigation, this part is susceptible to further changes.
This commit is contained in:
Luc Hantcherli 2009-07-14 11:26:52 +00:00
parent d3343ef795
commit ce515beb39
1 changed files with 449 additions and 252 deletions

View File

@ -8,71 +8,48 @@
!* - orientations * !* - orientations *
!************************************ !************************************
! [Alu]
! constitution dislobased
! (output) dislodensity
! (output) rateofshear
! lattice_structure 1
! Nslip 12
!
! c11 106.75e9
! c12 60.41e9
! c44 28.34e9
!
! burgers 2.86e-10 # Burgers vector [m]
! Qedge 3e-19 # Activation energy for dislocation glide [J/K] (0.5*G*b^3)
! Qsd 2.4e-19 # Activation energy for self diffusion [J/K] (gamma-iron)
! diff0 1e-3 # prefactor vacancy diffusion coeffficent (gamma-iron)
! interaction_coefficients 1.0 2.2 3.0 1.6 3.8 4.5 # Dislocation interaction coefficients
!
! rho0 6.0e12 # Initial dislocation density [m/m^3]
!
! c1 0.1 # Passing stress adjustment
! c2 2.0 # Jump width adjustment
! c3 1.0 # Activation volume adjustment
! c4 50.0 # Average slip distance adjustment for lock formation
! c7 8.0 # Athermal recovery adjustment
! c8 1.0e10 # Thermal recovery adjustment (plays no role for me)
MODULE constitutive_dislobased MODULE constitutive_dislobased
!*** Include other modules *** !*** Include other modules ***
use prec, only: pReal,pInt use prec, only: pReal,pInt
implicit none implicit none
character (len=*), parameter :: constitutive_dislobased_label = 'dislobased' character (len=*), parameter :: constitutive_dislobased_label = 'dislobased'
integer(pInt), dimension(:), allocatable :: constitutive_dislobased_sizeDotState, &
integer(pInt), dimension(:), allocatable :: constitutive_dislobased_sizeDotState, & constitutive_dislobased_sizeState, &
constitutive_dislobased_sizeState, & constitutive_dislobased_sizePostResults
constitutive_dislobased_sizePostResults character(len=64), dimension(:,:), allocatable :: constitutive_dislobased_output
character(len=64), dimension(:,:), allocatable :: constitutive_dislobased_output character(len=32), dimension(:), allocatable :: constitutive_dislobased_structureName
character(len=32), dimension(:), allocatable :: constitutive_dislobased_structureName integer(pInt), dimension(:), allocatable :: constitutive_dislobased_structure
integer(pInt), dimension(:), allocatable :: constitutive_dislobased_structure integer(pInt), dimension(:), allocatable :: constitutive_dislobased_Nslip
integer(pInt), dimension(:), allocatable :: constitutive_dislobased_Nslip integer(pInt), dimension(:), allocatable :: constitutive_dislobased_Ntwin
real(pReal), dimension(:), allocatable :: constitutive_dislobased_C11 real(pReal), dimension(:), allocatable :: constitutive_dislobased_C11
real(pReal), dimension(:), allocatable :: constitutive_dislobased_C12 real(pReal), dimension(:), allocatable :: constitutive_dislobased_C12
real(pReal), dimension(:), allocatable :: constitutive_dislobased_C13 real(pReal), dimension(:), allocatable :: constitutive_dislobased_C13
real(pReal), dimension(:), allocatable :: constitutive_dislobased_C33 real(pReal), dimension(:), allocatable :: constitutive_dislobased_C33
real(pReal), dimension(:), allocatable :: constitutive_dislobased_C44 real(pReal), dimension(:), allocatable :: constitutive_dislobased_C44
real(pReal), dimension(:), allocatable :: constitutive_dislobased_Gmod real(pReal), dimension(:), allocatable :: constitutive_dislobased_Gmod
real(pReal), dimension(:,:,:), allocatable :: constitutive_dislobased_Cslip_66 real(pReal), dimension(:,:,:), allocatable :: constitutive_dislobased_Cslip_66
!* Visco-plastic constitutive_phenomenological parameters real(pReal), dimension(:,:,:,:), allocatable :: constitutive_dislobased_Ctwin_66
real(pReal), dimension(:), allocatable :: constitutive_dislobased_rho0 real(pReal), dimension(:,:,:,:,:), allocatable :: constitutive_dislobased_Cslip_3333
real(pReal), dimension(:), allocatable :: constitutive_dislobased_bg real(pReal), dimension(:,:,:,:,:,:), allocatable :: constitutive_dislobased_Ctwin_3333
real(pReal), dimension(:), allocatable :: constitutive_dislobased_Qedge real(pReal), dimension(:), allocatable :: constitutive_dislobased_rho0
real(pReal), dimension(:), allocatable :: constitutive_dislobased_Qsd real(pReal), dimension(:), allocatable :: constitutive_dislobased_bg
real(pReal), dimension(:), allocatable :: constitutive_dislobased_D0 real(pReal), dimension(:), allocatable :: constitutive_dislobased_Qedge
real(pReal), dimension(:), allocatable :: constitutive_dislobased_c1 real(pReal), dimension(:), allocatable :: constitutive_dislobased_grainsize
real(pReal), dimension(:), allocatable :: constitutive_dislobased_c2 real(pReal), dimension(:), allocatable :: constitutive_dislobased_stacksize
real(pReal), dimension(:), allocatable :: constitutive_dislobased_c3 real(pReal), dimension(:), allocatable :: constitutive_dislobased_fmax
real(pReal), dimension(:), allocatable :: constitutive_dislobased_c4 real(pReal), dimension(:), allocatable :: constitutive_dislobased_Ndot0
real(pReal), dimension(:), allocatable :: constitutive_dislobased_c5 real(pReal), dimension(:), allocatable :: constitutive_dislobased_Cmfpslip
real(pReal), dimension(:), allocatable :: constitutive_dislobased_c6 real(pReal), dimension(:), allocatable :: constitutive_dislobased_Cmfptwin
real(pReal), dimension(:), allocatable :: constitutive_dislobased_c7 real(pReal), dimension(:), allocatable :: constitutive_dislobased_Cthresholdslip
real(pReal), dimension(:), allocatable :: constitutive_dislobased_c8 real(pReal), dimension(:), allocatable :: constitutive_dislobased_Cthresholdtwin
real(pReal), dimension(:), allocatable :: constitutive_dislobased_CoverA real(pReal), dimension(:), allocatable :: constitutive_dislobased_Cactivolume
real(pReal), dimension(:,:), allocatable :: constitutive_dislobased_SlipIntCoeff real(pReal), dimension(:), allocatable :: constitutive_dislobased_Cstorage
real(pReal), dimension(:,:,:), allocatable :: constitutive_dislobased_Iparallel real(pReal), dimension(:), allocatable :: constitutive_dislobased_Carecovery
real(pReal), dimension(:,:,:), allocatable :: constitutive_dislobased_Iforest real(pReal), dimension(:), allocatable :: constitutive_dislobased_CoverA
real(pReal), dimension(:,:), allocatable :: constitutive_dislobased_SlipIntCoeff
real(pReal), dimension(:,:,:), allocatable :: constitutive_dislobased_Iparallel
real(pReal), dimension(:,:,:), allocatable :: constitutive_dislobased_Iforest
!************************************* !*************************************
!* Definition of material properties * !* Definition of material properties *
@ -105,49 +82,50 @@ subroutine constitutive_dislobased_init(file)
use math, only: math_Mandel3333to66, math_Voigt66to3333, math_mul3x3 use math, only: math_Mandel3333to66, math_Voigt66to3333, math_mul3x3
use IO use IO
use material use material
use lattice, only: lattice_sn, lattice_st, lattice_interactionSlipSlip, lattice_initializeStructure use lattice, only: lattice_sn,lattice_st,lattice_interactionSlipSlip,lattice_initializeStructure,lattice_Qtwin,lattice_tn
integer(pInt), intent(in) :: file integer(pInt), intent(in) :: file
integer(pInt), parameter :: maxNchunks = 7 integer(pInt), parameter :: maxNchunks = 7
integer(pInt), dimension(1+2*maxNchunks) :: positions integer(pInt), dimension(1+2*maxNchunks) :: positions
integer(pInt) section, maxNinstance, i,j,k,l, output integer(pInt) section,maxNinstance,i,j,k,l,m,n,o,p,q,r,s,output
character(len=64) tag character(len=64) tag
character(len=1024) line character(len=1024) line
real(pReal) x,y real(pReal) x,y
maxNinstance = count(phase_constitution == constitutive_dislobased_label) maxNinstance = count(phase_constitution == constitutive_dislobased_label)
if (maxNinstance == 0) return if (maxNinstance == 0) return
allocate(constitutive_dislobased_sizeDotState(maxNinstance)) ; constitutive_dislobased_sizeDotState = 0_pInt allocate(constitutive_dislobased_sizeDotState(maxNinstance)) ; constitutive_dislobased_sizeDotState = 0_pInt
allocate(constitutive_dislobased_sizeState(maxNinstance)) ; constitutive_dislobased_sizeState = 0_pInt allocate(constitutive_dislobased_sizeState(maxNinstance)) ; constitutive_dislobased_sizeState = 0_pInt
allocate(constitutive_dislobased_sizePostResults(maxNinstance)); constitutive_dislobased_sizePostResults = 0_pInt allocate(constitutive_dislobased_sizePostResults(maxNinstance)) ; constitutive_dislobased_sizePostResults = 0_pInt
allocate(constitutive_dislobased_output(maxval(phase_Noutput), & allocate(constitutive_dislobased_structureName(maxNinstance)) ; constitutive_dislobased_structureName = ''
maxNinstance)) ; constitutive_dislobased_output = '' allocate(constitutive_dislobased_structure(maxNinstance)) ; constitutive_dislobased_structure = 0_pInt
allocate(constitutive_dislobased_structureName(maxNinstance)) ; constitutive_dislobased_structureName = '' allocate(constitutive_dislobased_Nslip(maxNinstance)) ; constitutive_dislobased_Nslip = 0_pInt
allocate(constitutive_dislobased_structure(maxNinstance)) ; constitutive_dislobased_structure = 0_pInt allocate(constitutive_dislobased_Ntwin(maxNinstance)) ; constitutive_dislobased_Ntwin = 0_pInt
allocate(constitutive_dislobased_Nslip(maxNinstance)) ; constitutive_dislobased_Nslip = 0_pInt allocate(constitutive_dislobased_C11(maxNinstance)) ; constitutive_dislobased_C11 = 0.0_pReal
allocate(constitutive_dislobased_C11(maxNinstance)) ; constitutive_dislobased_C11 = 0.0_pReal allocate(constitutive_dislobased_C12(maxNinstance)) ; constitutive_dislobased_C12 = 0.0_pReal
allocate(constitutive_dislobased_C12(maxNinstance)) ; constitutive_dislobased_C12 = 0.0_pReal allocate(constitutive_dislobased_C13(maxNinstance)) ; constitutive_dislobased_C13 = 0.0_pReal
allocate(constitutive_dislobased_C13(maxNinstance)) ; constitutive_dislobased_C13 = 0.0_pReal allocate(constitutive_dislobased_C33(maxNinstance)) ; constitutive_dislobased_C33 = 0.0_pReal
allocate(constitutive_dislobased_C33(maxNinstance)) ; constitutive_dislobased_C33 = 0.0_pReal allocate(constitutive_dislobased_C44(maxNinstance)) ; constitutive_dislobased_C44 = 0.0_pReal
allocate(constitutive_dislobased_C44(maxNinstance)) ; constitutive_dislobased_C44 = 0.0_pReal allocate(constitutive_dislobased_Gmod(maxNinstance)) ; constitutive_dislobased_Gmod = 0.0_pReal
allocate(constitutive_dislobased_Gmod(maxNinstance)) ; constitutive_dislobased_Gmod = 0.0_pReal allocate(constitutive_dislobased_Cslip_66(6,6,maxNinstance)) ; constitutive_dislobased_Cslip_66 = 0.0_pReal
allocate(constitutive_dislobased_Cslip_66(6,6,maxNinstance)) ; constitutive_dislobased_Cslip_66 = 0.0_pReal allocate(constitutive_dislobased_Cslip_3333(3,3,3,3,maxNinstance)) ; constitutive_dislobased_Ctwin_3333 = 0.0_pReal
allocate(constitutive_dislobased_rho0(maxNinstance)) ; constitutive_dislobased_rho0 = 0.0_pReal allocate(constitutive_dislobased_rho0(maxNinstance)) ; constitutive_dislobased_rho0 = 0.0_pReal
allocate(constitutive_dislobased_bg(maxNinstance)) ; constitutive_dislobased_bg = 0.0_pReal allocate(constitutive_dislobased_bg(maxNinstance)) ; constitutive_dislobased_bg = 0.0_pReal
allocate(constitutive_dislobased_Qedge(maxNinstance)) ; constitutive_dislobased_Qedge = 0.0_pReal allocate(constitutive_dislobased_Qedge(maxNinstance)) ; constitutive_dislobased_Qedge = 0.0_pReal
allocate(constitutive_dislobased_Qsd(maxNinstance)) ; constitutive_dislobased_Qsd = 0.0_pReal allocate(constitutive_dislobased_grainsize(maxNinstance)) ; constitutive_dislobased_grainsize = 0.0_pReal
allocate(constitutive_dislobased_D0(maxNinstance)) ; constitutive_dislobased_D0 = 0.0_pReal allocate(constitutive_dislobased_stacksize(maxNinstance)) ; constitutive_dislobased_stacksize = 0.0_pReal
allocate(constitutive_dislobased_c1(maxNinstance)) ; constitutive_dislobased_c1 = 0.0_pReal allocate(constitutive_dislobased_fmax(maxNinstance)) ; constitutive_dislobased_fmax = 0.0_pReal
allocate(constitutive_dislobased_c2(maxNinstance)) ; constitutive_dislobased_c2 = 0.0_pReal allocate(constitutive_dislobased_Ndot0(maxNinstance)) ; constitutive_dislobased_Ndot0 = 0.0_pReal
allocate(constitutive_dislobased_c3(maxNinstance)) ; constitutive_dislobased_c3 = 0.0_pReal allocate(constitutive_dislobased_Cmfpslip(maxNinstance)) ; constitutive_dislobased_Cmfpslip = 0.0_pReal
allocate(constitutive_dislobased_c4(maxNinstance)) ; constitutive_dislobased_c4 = 0.0_pReal allocate(constitutive_dislobased_Cmfptwin(maxNinstance)) ; constitutive_dislobased_Cmfptwin = 0.0_pReal
allocate(constitutive_dislobased_c5(maxNinstance)) ; constitutive_dislobased_c5 = 0.0_pReal allocate(constitutive_dislobased_Cthresholdslip(maxNinstance)) ; constitutive_dislobased_Cthresholdslip = 0.0_pReal
allocate(constitutive_dislobased_c6(maxNinstance)) ; constitutive_dislobased_c6 = 0.0_pReal allocate(constitutive_dislobased_Cthresholdtwin(maxNinstance)) ; constitutive_dislobased_Cthresholdtwin = 0.0_pReal
allocate(constitutive_dislobased_c7(maxNinstance)) ; constitutive_dislobased_c7 = 0.0_pReal allocate(constitutive_dislobased_Cactivolume(maxNinstance)) ; constitutive_dislobased_Cactivolume = 0.0_pReal
allocate(constitutive_dislobased_c8(maxNinstance)) ; constitutive_dislobased_c8 = 0.0_pReal allocate(constitutive_dislobased_Cstorage(maxNinstance)) ; constitutive_dislobased_Cstorage = 0.0_pReal
allocate(constitutive_dislobased_CoverA(maxNinstance)) ; constitutive_dislobased_CoverA = 0.0_pReal allocate(constitutive_dislobased_Carecovery(maxNinstance)) ; constitutive_dislobased_Carecovery = 0.0_pReal
allocate(constitutive_dislobased_SlipIntCoeff(6,maxNinstance)) ; constitutive_dislobased_SlipIntCoeff = 0.0_pReal allocate(constitutive_dislobased_CoverA(maxNinstance)) ; constitutive_dislobased_CoverA = 0.0_pReal
allocate(constitutive_dislobased_SlipIntCoeff(6,maxNinstance)) ; constitutive_dislobased_SlipIntCoeff = 0.0_pReal
allocate(constitutive_dislobased_output(maxval(phase_Noutput),maxNinstance)) ; constitutive_dislobased_output = ''
rewind(file) rewind(file)
line = '' line = ''
@ -179,6 +157,8 @@ subroutine constitutive_dislobased_init(file)
constitutive_dislobased_CoverA(i) = IO_floatValue(line,positions,2) constitutive_dislobased_CoverA(i) = IO_floatValue(line,positions,2)
case ('nslip') case ('nslip')
constitutive_dislobased_Nslip(i) = IO_intValue(line,positions,2) constitutive_dislobased_Nslip(i) = IO_intValue(line,positions,2)
case ('ntwin')
constitutive_dislobased_Ntwin(i) = IO_intValue(line,positions,2)
case ('c11') case ('c11')
constitutive_dislobased_C11(i) = IO_floatValue(line,positions,2) constitutive_dislobased_C11(i) = IO_floatValue(line,positions,2)
case ('c12') case ('c12')
@ -195,26 +175,28 @@ subroutine constitutive_dislobased_init(file)
constitutive_dislobased_bg(i) = IO_floatValue(line,positions,2) constitutive_dislobased_bg(i) = IO_floatValue(line,positions,2)
case ('qedge') case ('qedge')
constitutive_dislobased_Qedge(i) = IO_floatValue(line,positions,2) constitutive_dislobased_Qedge(i) = IO_floatValue(line,positions,2)
case ('qsd') case ('grainsize')
constitutive_dislobased_Qsd(i) = IO_floatValue(line,positions,2) constitutive_dislobased_grainsize(i) = IO_floatValue(line,positions,2)
case ('diff0') case ('stacksize')
constitutive_dislobased_D0(i) = IO_floatValue(line,positions,2) constitutive_dislobased_stacksize(i) = IO_floatValue(line,positions,2)
case ('c1') case ('fmax')
constitutive_dislobased_c1(i) = IO_floatValue(line,positions,2) constitutive_dislobased_fmax(i) = IO_floatValue(line,positions,2)
case ('c2') case ('ndot0')
constitutive_dislobased_c2(i) = IO_floatValue(line,positions,2) constitutive_dislobased_Ndot0(i) = IO_floatValue(line,positions,2)
case ('c3') case ('cmfpslip')
constitutive_dislobased_c3(i) = IO_floatValue(line,positions,2) constitutive_dislobased_Cmfpslip(i) = IO_floatValue(line,positions,2)
case ('c4') case ('cmfptwin')
constitutive_dislobased_c4(i) = IO_floatValue(line,positions,2) constitutive_dislobased_Cmfptwin(i) = IO_floatValue(line,positions,2)
case ('c5') case ('cthresholdslip')
constitutive_dislobased_c5(i) = IO_floatValue(line,positions,2) constitutive_dislobased_Cthresholdslip(i) = IO_floatValue(line,positions,2)
case ('c6') case ('cthresholdtwin')
constitutive_dislobased_c6(i) = IO_floatValue(line,positions,2) constitutive_dislobased_Cthresholdtwin(i) = IO_floatValue(line,positions,2)
case ('c7') case ('cactivolume')
constitutive_dislobased_c7(i) = IO_floatValue(line,positions,2) constitutive_dislobased_Cactivolume(i) = IO_floatValue(line,positions,2)
case ('c8') case ('cstorage')
constitutive_dislobased_c8(i) = IO_floatValue(line,positions,2) constitutive_dislobased_Cstorage(i) = IO_floatValue(line,positions,2)
case ('carecovery')
constitutive_dislobased_Carecovery(i) = IO_floatValue(line,positions,2)
case ('interaction_coefficients') case ('interaction_coefficients')
forall (j=2:min(7,positions(1))) & forall (j=2:min(7,positions(1))) &
constitutive_dislobased_SlipIntCoeff(j-1,i) = IO_floatValue(line,positions,j) constitutive_dislobased_SlipIntCoeff(j-1,i) = IO_floatValue(line,positions,j)
@ -232,30 +214,39 @@ subroutine constitutive_dislobased_init(file)
if (constitutive_dislobased_rho0(i) < 0.0_pReal) call IO_error(220) if (constitutive_dislobased_rho0(i) < 0.0_pReal) call IO_error(220)
if (constitutive_dislobased_bg(i) <= 0.0_pReal) call IO_error(221) if (constitutive_dislobased_bg(i) <= 0.0_pReal) call IO_error(221)
if (constitutive_dislobased_Qedge(i) <= 0.0_pReal) call IO_error(222) if (constitutive_dislobased_Qedge(i) <= 0.0_pReal) call IO_error(222)
if (constitutive_dislobased_Qsd(i) <= 0.0_pReal) call IO_error(223)
if (constitutive_dislobased_D0(i) <= 0.0_pReal) call IO_error(224)
enddo enddo
allocate(constitutive_dislobased_Iparallel(maxval(constitutive_dislobased_Nslip),& allocate(constitutive_dislobased_Iparallel(maxval(constitutive_dislobased_Nslip),maxval(constitutive_dislobased_Nslip),maxNinstance))
maxval(constitutive_dislobased_Nslip),& constitutive_dislobased_Iparallel = 0.0_pReal
maxNinstance)) allocate(constitutive_dislobased_Iforest(maxval(constitutive_dislobased_Nslip),maxval(constitutive_dislobased_Nslip),maxNinstance))
constitutive_dislobased_Iforest = 0.0_pReal
allocate(constitutive_dislobased_Ctwin_66(6,6,maxval(constitutive_dislobased_Ntwin),maxNinstance))
constitutive_dislobased_Ctwin_66 = 0.0_pReal
allocate(constitutive_dislobased_Ctwin_3333(3,3,3,3,maxval(constitutive_dislobased_Ntwin),maxNinstance))
constitutive_dislobased_Ctwin_3333 = 0.0_pReal
allocate(constitutive_dislobased_Iforest(maxval(constitutive_dislobased_Nslip),& do i = 1,maxNinstance
maxval(constitutive_dislobased_Nslip),& constitutive_dislobased_sizeDotState(i) = constitutive_dislobased_Nslip(i)+constitutive_dislobased_Ntwin(i)
maxNinstance)) constitutive_dislobased_sizeState(i) = 10*constitutive_dislobased_Nslip(i)+5*constitutive_dislobased_Ntwin(i)
do i = 1,maxNinstance
constitutive_dislobased_sizeDotState(i) = constitutive_dislobased_Nslip(i)
constitutive_dislobased_sizeState(i) = 8*constitutive_dislobased_Nslip(i)
do j = 1,maxval(phase_Noutput) do j = 1,maxval(phase_Noutput)
select case(constitutive_dislobased_output(j,i)) select case(constitutive_dislobased_output(j,i))
case('dislodensity') case('state_slip')
constitutive_dislobased_sizePostResults(i) = & constitutive_dislobased_sizePostResults(i) = constitutive_dislobased_sizePostResults(i) + constitutive_dislobased_Nslip(i)
constitutive_dislobased_sizePostResults(i) + constitutive_dislobased_Nslip(i) case('rateofshear_slip')
case('rateofshear') constitutive_dislobased_sizePostResults(i) = constitutive_dislobased_sizePostResults(i) + constitutive_dislobased_Nslip(i)
constitutive_dislobased_sizePostResults(i) = & case('mfp_slip')
constitutive_dislobased_sizePostResults(i) + constitutive_dislobased_Nslip(i) constitutive_dislobased_sizePostResults(i) = constitutive_dislobased_sizePostResults(i) + constitutive_dislobased_Nslip(i)
case('thresholdstress_slip')
constitutive_dislobased_sizePostResults(i) = constitutive_dislobased_sizePostResults(i) + constitutive_dislobased_Nslip(i)
case('state_twin')
constitutive_dislobased_sizePostResults(i) = constitutive_dislobased_sizePostResults(i) + constitutive_dislobased_Ntwin(i)
case('rateofshear_twin')
constitutive_dislobased_sizePostResults(i) = constitutive_dislobased_sizePostResults(i) + constitutive_dislobased_Ntwin(i)
case('mfp_twin')
constitutive_dislobased_sizePostResults(i) = constitutive_dislobased_sizePostResults(i) + constitutive_dislobased_Ntwin(i)
case('thresholdstress_twin')
constitutive_dislobased_sizePostResults(i) = constitutive_dislobased_sizePostResults(i) + constitutive_dislobased_Ntwin(i)
end select end select
enddo enddo
@ -283,9 +274,33 @@ subroutine constitutive_dislobased_init(file)
constitutive_dislobased_Cslip_66(6,6,i) = 0.5_pReal*(constitutive_dislobased_C11(i)- & constitutive_dislobased_Cslip_66(6,6,i) = 0.5_pReal*(constitutive_dislobased_C11(i)- &
constitutive_dislobased_C12(i)) constitutive_dislobased_C12(i))
end select end select
constitutive_dislobased_Cslip_66(:,:,i) = & constitutive_dislobased_Cslip_66(:,:,i) = math_Mandel3333to66(math_Voigt66to3333(constitutive_dislobased_Cslip_66(:,:,i)))
math_Mandel3333to66(math_Voigt66to3333(constitutive_dislobased_Cslip_66(:,:,i)))
!* Construction of the twin elasticity matrices
!* Iteration over the systems
constitutive_dislobased_Cslip_3333(:,:,:,:,i) = math_Voigt66to3333(constitutive_dislobased_Cslip_66(:,:,i))
do j=1,constitutive_dislobased_Ntwin(i)
do k=1,3
do l=1,3
do m=1,3
do n=1,3
do p=1,3
do q=1,3
do r=1,3
do s=1,3
constitutive_dislobased_Ctwin_3333(k,l,m,n,j,i) = constitutive_dislobased_Ctwin_3333(k,l,m,n,j,i) + &
constitutive_dislobased_Cslip_3333(p,q,r,s,i)*&
lattice_Qtwin(k,p,j,i)*lattice_Qtwin(l,q,j,i)*lattice_Qtwin(m,r,j,i)*lattice_Qtwin(n,s,j,i)
enddo
enddo
enddo
enddo
enddo
enddo
enddo
enddo
constitutive_dislobased_Ctwin_66(:,:,j,i) = math_Mandel3333to66(constitutive_dislobased_Ctwin_3333(:,:,:,:,j,i))
enddo
!* Construction of the hardening matrices !* Construction of the hardening matrices
!* Iteration over the systems !* Iteration over the systems
@ -306,7 +321,6 @@ subroutine constitutive_dislobased_init(file)
enddo enddo
return return
end subroutine end subroutine
@ -317,108 +331,193 @@ function constitutive_dislobased_stateInit(myInstance)
use prec, only: pReal,pInt use prec, only: pReal,pInt
implicit none implicit none
!* Definition of variables !* Definition of variables
integer(pInt), intent(in) :: myInstance integer(pInt), intent(in) :: myInstance
real(pReal), dimension(constitutive_dislobased_Nslip(myInstance)) :: constitutive_dislobased_stateInit real(pReal), dimension(constitutive_dislobased_sizeState(myInstance)) :: constitutive_dislobased_stateInit
constitutive_dislobased_stateInit = constitutive_dislobased_rho0(myInstance) constitutive_dislobased_stateInit = 0.0_pReal
constitutive_dislobased_stateInit(1:constitutive_dislobased_Nslip(myInstance)) = constitutive_dislobased_rho0(myInstance)
return return
end function end function
function constitutive_dislobased_homogenizedC(state,ipc,ip,el) function constitutive_dislobased_homogenizedC(state,ipc,ip,el)
!********************************************************************* !*********************************************************************
!* homogenized elacticity matrix * !* calculates homogenized elacticity matrix *
!* INPUT: * !* - state : microstructure quantities *
!* - state : state variables *
!* - ipc : component-ID of current integration point * !* - ipc : component-ID of current integration point *
!* - ip : current integration point * !* - ip : current integration point *
!* - el : current element * !* - el : current element *
!********************************************************************* !*********************************************************************
use prec, only: pReal,pInt,p_vec use prec, only: pReal,pInt,p_vec
use mesh, only: mesh_NcpElems,mesh_maxNips use mesh, only: mesh_NcpElems,mesh_maxNips
use material, only: homogenization_maxNgrains,material_phase, phase_constitutionInstance use material, only: homogenization_maxNgrains,material_phase, phase_constitutionInstance
implicit none implicit none
!* Definition of variables !* Definition of variables
integer(pInt), intent(in) :: ipc,ip,el integer(pInt), intent(in) :: ipc,ip,el
integer(pInt) matID integer(pInt) matID,ns,nt,i
real(pReal) sumf
real(pReal), dimension(6,6) :: constitutive_dislobased_homogenizedC real(pReal), dimension(6,6) :: constitutive_dislobased_homogenizedC
type(p_vec), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems) :: state type(p_vec), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems) :: state
!* Shortened notation
matID = phase_constitutionInstance(material_phase(ipc,ip,el)) matID = phase_constitutionInstance(material_phase(ipc,ip,el))
constitutive_dislobased_homogenizedC = constitutive_dislobased_Cslip_66(:,:,matID) ns = constitutive_dislobased_Nslip(matID)
nt = constitutive_dislobased_Ntwin(matID)
!* Total twin volume fraction
sumf = 0.0_pReal
if (nt > 0_pInt) sumf = sum(state(ipc,ip,el)%p((ns+1):(ns+nt)))
!* Homogenized elasticity matrix
constitutive_dislobased_homogenizedC = (1.0_pReal-sumf)*constitutive_dislobased_Cslip_66(:,:,matID)
do i=1,nt
constitutive_dislobased_homogenizedC = constitutive_dislobased_homogenizedC + &
state(ipc,ip,el)%p(ns+i)*constitutive_dislobased_Ctwin_66(:,:,i,matID)
enddo
return return
end function end function
subroutine constitutive_dislobased_microstructure(Temperature,state,ipc,ip,el) subroutine constitutive_dislobased_microstructure(Temperature,state,ipc,ip,el)
!********************************************************************* !*********************************************************************
!* calculate derived quantities from state (not used here) * !* calculates quantities characterizing the microstructure *
!* INPUT: * !* - Temperature : temperature *
!* - Tp : temperature * !* - state : microstructure quantities *
!* - ipc : component-ID of current integration point * !* - ipc : component-ID of current integration point *
!* - ip : current integration point * !* - ip : current integration point *
!* - el : current element * !* - el : current element *
!********************************************************************* !*********************************************************************
use prec, only: pReal,pInt,p_vec use prec, only: pReal,pInt,p_vec
use mesh, only: mesh_NcpElems,mesh_maxNips use math, only: pi
use material, only: homogenization_maxNgrains,material_phase, phase_constitutionInstance use mesh, only: mesh_NcpElems,mesh_maxNips
use material, only: homogenization_maxNgrains,material_phase,phase_constitutionInstance
use lattice, only: lattice_interactionSlipTwin,lattice_interactionTwinTwin
implicit none implicit none
!* Definition of variables !* Definition of variables
integer(pInt) ipc,ip,el,matID,n,i integer(pInt), intent(in) :: ipc,ip,el
real(pReal) Temperature integer(pInt) matID,ns,nt,i
real(pReal) Temperature,sumf
type(p_vec), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems) :: state type(p_vec), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems) :: state
!* Shortened notation
matID = phase_constitutionInstance(material_phase(ipc,ip,el)) matID = phase_constitutionInstance(material_phase(ipc,ip,el))
n = constitutive_dislobased_Nslip(matID) ns = constitutive_dislobased_Nslip(matID)
!* Quantities derived from state - slip nt = constitutive_dislobased_Ntwin(matID)
!* State: 1 : n rho !* State: 1 : ns rho_ssd
!* n+1 : 2n rho_f !* State: ns+1 : ns+nt f
!* 2n+1 : 3n rho_p !* State: ns+nt+1 : 2*ns+nt rho_forest
!* 3n+1 : 4n passing stress !* State: 2*ns+nt+1 : 3*ns+nt rho_parallel
!* 4n+1 : 5n jump width !* State: 3*ns+nt+1 : 4*ns+nt 1/lambda_slip
!* 5n+1 : 6n activation volume !* State: 4*ns+nt+1 : 5*ns+nt 1/lambda_sliptwin
!* 6n+1 : 7n rho_m !* State: 5*ns+nt+1 : 5*ns+2*nt 1/lambda_twin
!* 7n+1 : 8n g0_slip !* State: 5*ns+2*nt+1 : 6*ns+2*nt mfp_slip
!* State: 6*ns+2*nt+1 : 6*ns+3*nt mfp_twin
!* State: 6*ns+3*nt+1 : 7*ns+3*nt threshold_stress_slip
!* State: 7*ns+3*nt+1 : 7*ns+4*nt threshold_stress_twin
!* State: 7*ns+4*nt+1 : 8*ns+4*nt activation volume
!* State: 8*ns+4*nt+1 : 8*ns+5*nt twin volume
!* State: 8*ns+5*nt+1 : 9*ns+5*nt rho_mobile
!* State: 9*ns+5*nt+1 : 10*ns+5*nt initial shear rate
!* Total twin volume fraction
sumf = 0.0_pReal
if (nt > 0_pInt) sumf = sum(state(ipc,ip,el)%p((ns+1):(ns+nt)))
!* Forest and parallel dislocation densities
!$OMP CRITICAL (evilmatmul) !$OMP CRITICAL (evilmatmul)
state(ipc,ip,el)%p((n+1):(2*n)) = matmul(constitutive_dislobased_Iforest (1:n,1:n,matID),state(ipc,ip,el)%p(1:n)) state(ipc,ip,el)%p((ns+nt+1):(2*ns+nt)) = matmul(constitutive_dislobased_Iforest (1:ns,1:ns,matID),state(ipc,ip,el)%p(1:ns))
state(ipc,ip,el)%p((2*n+1):(3*n)) = matmul(constitutive_dislobased_Iparallel(1:n,1:n,matID),state(ipc,ip,el)%p(1:n)) state(ipc,ip,el)%p((2*ns+nt+1):(3*ns+nt)) = matmul(constitutive_dislobased_Iparallel(1:ns,1:ns,matID),state(ipc,ip,el)%p(1:ns))
!$OMP END CRITICAL (evilmatmul)
!* 1/mean free distance between 2 forest dislocations seen by a moving dislocation
do i=1,ns
state(ipc,ip,el)%p(3*ns+nt+i) = sqrt(state(ipc,ip,el)%p(ns+nt+i))
enddo
!* 1/mean free distance between 2 twin stacks from different systems seen by a moving dislocation
!$OMP CRITICAL (evilmatmul)
state(ipc,ip,el)%p((4*ns+nt+1):(5*ns+nt)) = 0.0_pReal
if (nt > 0_pInt) state(ipc,ip,el)%p((4*ns+nt+1):(5*ns+nt)) = &
matmul(lattice_interactionSlipTwin(1:ns,1:nt,constitutive_dislobased_structure(matID)),state(ipc,ip,el)%p((ns+1):(ns+nt)))/&
(2.0_pReal*constitutive_dislobased_stacksize(matID)*(1.0_pReal-sumf))
!$OMP END CRITICAL (evilmatmul) !$OMP END CRITICAL (evilmatmul)
do i=1,n !* 1/mean free distance between 2 twin stacks from different systems seen by a growing twin
!$OMP CRITICAL (evilmatmul)
state(ipc,ip,el)%p(3*n+i) = & if (nt > 0_pInt) state(ipc,ip,el)%p((5*ns+nt+1):(5*ns+2*nt)) = &
constitutive_dislobased_c1(matID)*constitutive_dislobased_Gmod(matID)*& matmul(lattice_interactionTwinTwin(1:nt,1:nt,constitutive_dislobased_structure(matID)),state(ipc,ip,el)%p((ns+1):(ns+nt)))/&
constitutive_dislobased_bg(matID)*sqrt(state(ipc,ip,el)%p(2*n+i)) (2.0_pReal*constitutive_dislobased_stacksize(matID)*(1.0_pReal-sumf))
!$OMP END CRITICAL (evilmatmul)
state(ipc,ip,el)%p(4*n+i) = &
constitutive_dislobased_c2(matID)/sqrt(state(ipc,ip,el)%p(n+i))
state(ipc,ip,el)%p(5*n+i) = &
constitutive_dislobased_c3(matID)*state(ipc,ip,el)%p(4*n+i)*constitutive_dislobased_bg(matID)**2.0_pReal
state(ipc,ip,el)%p(6*n+i) = &
(2.0_pReal*kB*Temperature)/(constitutive_dislobased_c1(matID)*constitutive_dislobased_c2(matID)*&
constitutive_dislobased_c3(matID)*constitutive_dislobased_Gmod(matID)*constitutive_dislobased_bg(matID)**3.0_pReal)*&
sqrt(state(ipc,ip,el)%p(n+i)*state(ipc,ip,el)%p(2*n+i))
state(ipc,ip,el)%p(7*n+i) = &
state(ipc,ip,el)%p(6*n+i)*constitutive_dislobased_bg(matID)*attack_frequency*state(ipc,ip,el)%p(4*n+i)*&
exp(-constitutive_dislobased_Qedge(matID)/(kB*Temperature))
!* mean free path between 2 obstacles seen by a moving dislocation
do i=1,ns
if (nt > 0_pInt) then
state(ipc,ip,el)%p(5*ns+2*nt+i) = (constitutive_dislobased_Cmfpslip(matID)*constitutive_dislobased_grainsize(matID))/&
(1.0_pReal+constitutive_dislobased_grainsize(matID)*&
(state(ipc,ip,el)%p(3*ns+nt+i)+state(ipc,ip,el)%p(4*ns+nt+i)))
else
state(ipc,ip,el)%p(5*ns+i) = (constitutive_dislobased_Cmfpslip(matID)*constitutive_dislobased_grainsize(matID))/&
(1.0_pReal+constitutive_dislobased_grainsize(matID)*(state(ipc,ip,el)%p(3*ns+i)))
endif
enddo enddo
!* mean free path between 2 obstacles seen by a growing twin
do i=1,nt
state(ipc,ip,el)%p(6*ns+2*nt+i) = (constitutive_dislobased_Cmfptwin(matID)*constitutive_dislobased_grainsize(matID))/&
(1.0_pReal+constitutive_dislobased_grainsize(matID)*state(ipc,ip,el)%p(5*ns+nt+i))
enddo
!* threshold stress for dislocation motion
do i=1,ns
state(ipc,ip,el)%p(6*ns+3*nt+i) = constitutive_dislobased_Cthresholdslip(matID)*&
constitutive_dislobased_bg(matID)*constitutive_dislobased_Gmod(matID)*sqrt(state(ipc,ip,el)%p(2*ns+nt+i))
enddo
!* threshold stress for growing twin
do i=1,nt
state(ipc,ip,el)%p(7*ns+3*nt+i) = constitutive_dislobased_Cthresholdtwin(matID)*(sqrt(3.0_pReal)/3.0_pReal)*(&
(0.0002_pReal*Temperature-0.0396_pReal)/constitutive_dislobased_bg(matID)+&
(constitutive_dislobased_bg(matID)*constitutive_dislobased_Gmod(matID))/state(ipc,ip,el)%p(5*ns+2*nt+i))
enddo
!* activation volume for dislocation glide
do i=1,ns
state(ipc,ip,el)%p(7*ns+4*nt+i) = constitutive_dislobased_Cactivolume(matID)*&
constitutive_dislobased_bg(matID)*constitutive_dislobased_bg(matID)*state(ipc,ip,el)%p(5*ns+2*nt+i)
enddo
!* final twin volume after growth
do i=1,nt
state(ipc,ip,el)%p(8*ns+4*nt+i) = (pi/6.0_pReal)*constitutive_dislobased_stacksize(matID)*&
state(ipc,ip,el)%p(6*ns+2*nt+i)*state(ipc,ip,el)%p(6*ns+2*nt+i)
enddo
!* mobile dislocation densities
do i=1,ns
state(ipc,ip,el)%p(8*ns+5*nt+i) = (2.0_pReal*kB*Temperature*state(ipc,ip,el)%p(2*ns+nt+i))/&
(state(ipc,ip,el)%p(6*ns+3*nt+i)*state(ipc,ip,el)%p(7*ns+4*nt+i))
enddo
!* initial shear rate for slip
do i=1,ns
state(ipc,ip,el)%p(9*ns+5*nt+i) = state(ipc,ip,el)%p(8*ns+5*nt+i)*constitutive_dislobased_bg(matID)*attack_frequency*&
state(ipc,ip,el)%p(5*ns+2*nt+i)*exp(-constitutive_dislobased_Qedge(matID)/(kB*Temperature))
enddo
end subroutine end subroutine
subroutine constitutive_dislobased_LpAndItsTangent(Lp,dLp_dTstar,Tstar_v,Temperature,state,ipc,ip,el) subroutine constitutive_dislobased_LpAndItsTangent(Lp,dLp_dTstar,Tstar_v,Temperature,state,ipc,ip,el)
!********************************************************************* !*********************************************************************
!* plastic velocity gradient and its tangent * !* calculates plastic velocity gradient and its tangent *
!* INPUT: * !* INPUT: *
!* - Temperature : temperature *
!* - state : microstructure quantities *
!* - Tstar_v : 2nd Piola Kirchhoff stress tensor (Mandel) * !* - Tstar_v : 2nd Piola Kirchhoff stress tensor (Mandel) *
!* - ipc : component-ID at current integration point * !* - ipc : component-ID at current integration point *
!* - ip : current integration point * !* - ip : current integration point *
@ -427,18 +526,17 @@ subroutine constitutive_dislobased_LpAndItsTangent(Lp,dLp_dTstar,Tstar_v,Tempera
!* - Lp : plastic velocity gradient * !* - Lp : plastic velocity gradient *
!* - dLp_dTstar : derivative of Lp (4th-rank tensor) * !* - dLp_dTstar : derivative of Lp (4th-rank tensor) *
!********************************************************************* !*********************************************************************
use prec, only: pReal,pInt,p_vec use prec, only: pReal,pInt,p_vec
use math, only: math_Plain3333to99 use math, only: math_Plain3333to99
use lattice, only: lattice_Sslip,lattice_Sslip_v use mesh, only: mesh_NcpElems,mesh_maxNips
use mesh, only: mesh_NcpElems,mesh_maxNips
use material, only: homogenization_maxNgrains,material_phase, phase_constitutionInstance use material, only: homogenization_maxNgrains,material_phase, phase_constitutionInstance
use lattice, only: lattice_Sslip,lattice_Stwin,lattice_Sslip_v,lattice_Stwin_v,lattice_shearTwin
implicit none implicit none
!* Definition of variables !* Definition of variables
integer(pInt) ipc,ip,el integer(pInt) ipc,ip,el
integer(pInt) matID,i,k,l,m,n integer(pInt) matID,i,k,l,m,n,ns,nt
real(pReal) Temperature real(pReal) Temperature,sumf
type(p_vec), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems) :: state type(p_vec), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems) :: state
real(pReal), dimension(6) :: Tstar_v real(pReal), dimension(6) :: Tstar_v
real(pReal), dimension(3,3) :: Lp real(pReal), dimension(3,3) :: Lp
@ -446,37 +544,71 @@ subroutine constitutive_dislobased_LpAndItsTangent(Lp,dLp_dTstar,Tstar_v,Tempera
real(pReal), dimension(9,9) :: dLp_dTstar real(pReal), dimension(9,9) :: dLp_dTstar
real(pReal), dimension(constitutive_dislobased_Nslip(phase_constitutionInstance(material_phase(ipc,ip,el)))) :: & real(pReal), dimension(constitutive_dislobased_Nslip(phase_constitutionInstance(material_phase(ipc,ip,el)))) :: &
gdot_slip,dgdot_dtauslip,tau_slip gdot_slip,dgdot_dtauslip,tau_slip
real(pReal), dimension(constitutive_dislobased_Ntwin(phase_constitutionInstance(material_phase(ipc,ip,el)))) :: &
gdot_twin,dgdot_dtautwin,tau_twin
!* Shortened notation
matID = phase_constitutionInstance(material_phase(ipc,ip,el)) matID = phase_constitutionInstance(material_phase(ipc,ip,el))
n = constitutive_dislobased_Nslip(matID) ns = constitutive_dislobased_Nslip(matID)
nt = constitutive_dislobased_Ntwin(matID)
!* Calculation of Lp !* Total twin volume fraction
sumf = 0.0_pReal
if (nt > 0_pInt) sumf = sum(state(ipc,ip,el)%p((ns+1):(ns+nt)))
!* Calculation of Lp from dislocation glide
Lp = 0.0_pReal Lp = 0.0_pReal
gdot_slip = 0.0_pReal gdot_slip = 0.0_pReal
do i = 1,constitutive_dislobased_Nslip(matID) do i = 1,ns
tau_slip(i) = dot_product(Tstar_v,lattice_Sslip_v(:,i,constitutive_dislobased_structure(matID))) tau_slip(i) = dot_product(Tstar_v,lattice_Sslip_v(:,i,constitutive_dislobased_structure(matID)))
if (abs(tau_slip(i))-state(ipc,ip,el)%p(3*n+i)>0) & if ( abs(tau_slip(i)) > state(ipc,ip,el)%p(6*ns+3*nt+i) ) &
gdot_slip(i) = state(ipc,ip,el)%p(7*n+i)*sign(1.0_pReal,tau_slip(i))*& gdot_slip(i) = state(ipc,ip,el)%p(9*ns+5*nt+i)*sign(1.0_pReal,tau_slip(i))*&
sinh(((abs(tau_slip(i))-state(ipc,ip,el)%p(3*n+i))*state(ipc,ip,el)%p(5*n+i))/(kB*Temperature) ) sinh(((abs(tau_slip(i))-state(ipc,ip,el)%p(6*ns+3*nt+i))*state(ipc,ip,el)%p(7*ns+4*nt+i))/(kB*Temperature))
Lp = Lp + gdot_slip(i)*lattice_Sslip(:,:,i,constitutive_dislobased_structure(matID)) Lp = Lp + (1.0_pReal - sumf)*gdot_slip(i)*lattice_Sslip(:,:,i,constitutive_dislobased_structure(matID))
enddo enddo
!* Calculation of the tangent of Lp !* Calculation of Lp from deformation twinning
gdot_twin = 0.0_pReal
do i = 1,nt
tau_twin(i) = dot_product(Tstar_v,lattice_Stwin_v(:,i,constitutive_dislobased_structure(matID)))
if ( tau_twin(i) > 0.0_pReal ) &
gdot_twin(i) = (constitutive_dislobased_fmax(matID) - sumf)*lattice_shearTwin(i,constitutive_dislobased_structure(matID))*&
state(ipc,ip,el)%p(8*ns+4*nt+i)*constitutive_dislobased_Ndot0(matID)*&
exp(-(state(ipc,ip,el)%p(7*ns+3*nt+i)/tau_twin(i))**10.0_pReal)
Lp = Lp + gdot_twin(i)*lattice_Stwin(:,:,i,constitutive_dislobased_structure(matID))
enddo
!* Calculation of the tangent of Lp from dislocation glide
dLp_dTstar3333 = 0.0_pReal dLp_dTstar3333 = 0.0_pReal
dLp_dTstar = 0.0_pReal dLp_dTstar = 0.0_pReal
dgdot_dtauslip = 0.0_pReal dgdot_dtauslip = 0.0_pReal
do i = 1,constitutive_dislobased_Nslip(matID) do i = 1,ns
if ((abs(tau_slip(i))-state(ipc,ip,el)%p(3*n+i))>0) & if ( abs(tau_slip(i)) > state(ipc,ip,el)%p(6*ns+3*nt+i) ) &
dgdot_dtauslip(i) = (state(ipc,ip,el)%p(7*n+i)*state(ipc,ip,el)%p(5*n+i))/(kB*Temperature)*& dgdot_dtauslip(i) = (state(ipc,ip,el)%p(9*ns+5*nt+i)*state(ipc,ip,el)%p(7*ns+4*nt+i))/(kB*Temperature)*&
cosh(((abs(tau_slip(i))-state(ipc,ip,el)%p(3*n+i))*state(ipc,ip,el)%p(5*n+i))/(kB*Temperature)) cosh(((abs(tau_slip(i))-state(ipc,ip,el)%p(6*ns+3*nt+i))*state(ipc,ip,el)%p(7*ns+4*nt+i))/(kB*Temperature))
forall (k=1:3,l=1:3,m=1:3,n=1:3) & forall (k=1:3,l=1:3,m=1:3,n=1:3) &
dLp_dTstar3333(k,l,m,n) = dLp_dTstar3333(k,l,m,n) + & dLp_dTstar3333(k,l,m,n) = dLp_dTstar3333(k,l,m,n) + &
dgdot_dtauslip(i)*lattice_Sslip(k,l,i,constitutive_dislobased_structure(matID))* & dgdot_dtauslip(i)*lattice_Sslip(k,l,i,constitutive_dislobased_structure(matID))&
lattice_Sslip(m,n,i,constitutive_dislobased_structure(matID)) *lattice_Sslip(m,n,i,constitutive_dislobased_structure(matID))
enddo
!* Calculation of the tangent of Lp from deformation twinning
dgdot_dtautwin = 0.0_pReal
do i = 1,nt
if ( tau_twin(i) > 0.0_pReal ) &
dgdot_dtautwin(i) = (gdot_twin(i)*10.0_pReal*state(ipc,ip,el)%p(7*ns+3*nt+i)**10.0_pReal)/(tau_twin(i)**11.0_pReal)
forall (k=1:3,l=1:3,m=1:3,n=1:3) &
dLp_dTstar3333(k,l,m,n) = dLp_dTstar3333(k,l,m,n) + &
dgdot_dtautwin(i)*lattice_Stwin(k,l,i,constitutive_dislobased_structure(matID)) &
*lattice_Stwin(m,n,i,constitutive_dislobased_structure(matID))
enddo enddo
dLp_dTstar = math_Plain3333to99(dLp_dTstar3333) dLp_dTstar = math_Plain3333to99(dLp_dTstar3333)
@ -488,6 +620,8 @@ function constitutive_dislobased_dotState(Tstar_v,Temperature,state,ipc,ip,el)
!********************************************************************* !*********************************************************************
!* rate of change of microstructure * !* rate of change of microstructure *
!* INPUT: * !* INPUT: *
!* - Temperature : temperature *
!* - state : microstructure quantities *
!* - Tstar_v : 2nd Piola Kirchhoff stress tensor (Mandel) * !* - Tstar_v : 2nd Piola Kirchhoff stress tensor (Mandel) *
!* - ipc : component-ID at current integration point * !* - ipc : component-ID at current integration point *
!* - ip : current integration point * !* - ip : current integration point *
@ -495,43 +629,61 @@ function constitutive_dislobased_dotState(Tstar_v,Temperature,state,ipc,ip,el)
!* OUTPUT: * !* OUTPUT: *
!* - constitutive_dotState : evolution of state variable * !* - constitutive_dotState : evolution of state variable *
!********************************************************************* !*********************************************************************
use prec, only: pReal,pInt,p_vec use prec, only: pReal,pInt,p_vec
use lattice, only: lattice_Sslip_v use mesh, only: mesh_NcpElems,mesh_maxNips
use mesh, only: mesh_NcpElems,mesh_maxNips
use material, only: homogenization_maxNgrains,material_phase, phase_constitutionInstance use material, only: homogenization_maxNgrains,material_phase, phase_constitutionInstance
use lattice, only: lattice_Sslip_v,lattice_Stwin_v
implicit none implicit none
!* Definition of variables !* Definition of variables
integer(pInt) ipc,ip,el integer(pInt) ipc,ip,el
integer(pInt) matID,i,n integer(pInt) matID,i,ns,nt
real(pReal) Temperature,tau_slip,gdot_slip,locks,athermal_recovery,thermal_recovery real(pReal) Temperature,sumf,tau_slip,tau_twin,gdot_slip,gdot_twin,storage,arecovery
type(p_vec), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems) :: state type(p_vec), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems) :: state
real(pReal), dimension(6) :: Tstar_v real(pReal), dimension(6) :: Tstar_v
real(pReal), dimension(constitutive_dislobased_Nslip(phase_constitutionInstance(material_phase(ipc,ip,el)))) :: & real(pReal), dimension(constitutive_dislobased_sizeDotState(phase_constitutionInstance(material_phase(ipc,ip,el)))) :: &
constitutive_dislobased_dotState constitutive_dislobased_dotState
!* Shortened notation
matID = phase_constitutionInstance(material_phase(ipc,ip,el)) matID = phase_constitutionInstance(material_phase(ipc,ip,el))
n = constitutive_dislobased_Nslip(matID) ns = constitutive_dislobased_Nslip(matID)
nt = constitutive_dislobased_Ntwin(matID)
!* Dislocation density evolution !* Total twin volume fraction
sumf = 0.0_pReal
if (nt > 0_pInt) sumf = sum(state(ipc,ip,el)%p((ns+1):(ns+nt)))
!* Dislocation density evolution
constitutive_dislobased_dotState = 0.0_pReal constitutive_dislobased_dotState = 0.0_pReal
do i = 1,n do i = 1,ns
tau_slip = dot_product(Tstar_v,lattice_Sslip_v(:,i,constitutive_dislobased_structure(matID))) tau_slip = dot_product(Tstar_v,lattice_Sslip_v(:,i,constitutive_dislobased_structure(matID)))
if (abs(tau_slip) > state(ipc,ip,el)%p(3*n+i)) then if ( abs(tau_slip) > state(ipc,ip,el)%p(6*ns+3*nt+i) ) then
gdot_slip = state(ipc,ip,el)%p(7*n+i)*sign(1.0_pReal,tau_slip)*& gdot_slip = state(ipc,ip,el)%p(9*ns+5*nt+i)*sign(1.0_pReal,tau_slip)*&
sinh(((abs(tau_slip)-state(ipc,ip,el)%p(3*n+i))*state(ipc,ip,el)%p(5*n+i))/(kB*Temperature)) sinh(((abs(tau_slip)-state(ipc,ip,el)%p(6*ns+3*nt+i))*state(ipc,ip,el)%p(7*ns+4*nt+i))/(kB*Temperature) )
locks = (sqrt(state(ipc,ip,el)%p(n+i))*abs(gdot_slip))/& storage = (constitutive_dislobased_Cstorage(matID)*abs(gdot_slip))/&
(constitutive_dislobased_c4(matID)*constitutive_dislobased_bg(matID)) (constitutive_dislobased_bg(matID)*state(ipc,ip,el)%p(5*ns+2*nt+i))
athermal_recovery = constitutive_dislobased_c7(matID)*state(ipc,ip,el)%p(i)*abs(gdot_slip) arecovery = constitutive_dislobased_Carecovery(matID)*state(ipc,ip,el)%p(i)*abs(gdot_slip)
constitutive_dislobased_dotState(i) = locks - athermal_recovery constitutive_dislobased_dotState(i) = storage - arecovery
endif endif
enddo enddo
!* Twin volume fraction evolution
do i = 1,nt
tau_twin = dot_product(Tstar_v,lattice_Stwin_v(:,i,constitutive_dislobased_structure(matID)))
if ( tau_twin > 0.0_pReal ) &
constitutive_dislobased_dotState(ns+i) = (constitutive_dislobased_fmax(matID) - sumf)*&
state(ipc,ip,el)%p(8*ns+4*nt+i)*constitutive_dislobased_Ndot0(matID)*&
exp(-(state(ipc,ip,el)%p(7*ns+3*nt+i)/tau_twin)**10.0_pReal)
enddo
return return
end function end function
@ -547,9 +699,9 @@ function constitutive_dislobased_dotTemperature(Tstar_v,Temperature,state,ipc,ip
!* OUTPUT: * !* OUTPUT: *
!* - constitutive_dotTemperature : evolution of Temperature * !* - constitutive_dotTemperature : evolution of Temperature *
!********************************************************************* !*********************************************************************
use prec, only: pReal,pInt,p_vec use prec, only: pReal,pInt,p_vec
use lattice, only: lattice_Sslip_v use lattice, only: lattice_Sslip_v
use mesh, only: mesh_NcpElems,mesh_maxNips use mesh, only: mesh_NcpElems,mesh_maxNips
use material, only: homogenization_maxNgrains,material_phase, phase_constitutionInstance use material, only: homogenization_maxNgrains,material_phase, phase_constitutionInstance
implicit none implicit none
@ -577,9 +729,9 @@ pure function constitutive_dislobased_postResults(Tstar_v,Temperature,dt,state,i
!* - ip : current integration point * !* - ip : current integration point *
!* - el : current element * !* - el : current element *
!********************************************************************* !*********************************************************************
use prec, only: pReal,pInt,p_vec use prec, only: pReal,pInt,p_vec
use lattice, only: lattice_Sslip_v use lattice, only: lattice_Sslip_v,lattice_Stwin_v,lattice_shearTwin
use mesh, only: mesh_NcpElems,mesh_maxNips use mesh, only: mesh_NcpElems,mesh_maxNips
use material, only: homogenization_maxNgrains,material_phase,phase_constitutionInstance,phase_Noutput use material, only: homogenization_maxNgrains,material_phase,phase_constitutionInstance,phase_Noutput
implicit none implicit none
@ -588,40 +740,85 @@ pure function constitutive_dislobased_postResults(Tstar_v,Temperature,dt,state,i
real(pReal), intent(in) :: dt,Temperature real(pReal), intent(in) :: dt,Temperature
real(pReal), dimension(6), intent(in) :: Tstar_v real(pReal), dimension(6), intent(in) :: Tstar_v
type(p_vec), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), intent(in) :: state type(p_vec), dimension(homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), intent(in) :: state
integer(pInt) matID,o,i,c,n integer(pInt) matID,o,i,c,ns,nt
real(pReal) tau_slip real(pReal) sumf,tau_slip,tau_twin
real(pReal), dimension(constitutive_dislobased_sizePostResults(phase_constitutionInstance(material_phase(ipc,ip,el)))) :: & real(pReal), dimension(constitutive_dislobased_sizePostResults(phase_constitutionInstance(material_phase(ipc,ip,el)))) :: &
constitutive_dislobased_postResults constitutive_dislobased_postResults
!* Shortened notation
matID = phase_constitutionInstance(material_phase(ipc,ip,el)) matID = phase_constitutionInstance(material_phase(ipc,ip,el))
n = constitutive_dislobased_Nslip(matID) ns = constitutive_dislobased_Nslip(matID)
nt = constitutive_dislobased_Ntwin(matID)
!* Total twin volume fraction
sumf = 0.0_pReal
if (nt > 0_pInt) sumf = sum(state(ipc,ip,el)%p((ns+1):(ns+nt)))
!* Required output
c = 0_pInt c = 0_pInt
constitutive_dislobased_postResults = 0.0_pReal constitutive_dislobased_postResults = 0.0_pReal
do o = 1,phase_Noutput(material_phase(ipc,ip,el)) do o = 1,phase_Noutput(material_phase(ipc,ip,el))
select case(constitutive_dislobased_output(o,matID)) select case(constitutive_dislobased_output(o,matID))
case ('dislodensity') case ('state_slip')
constitutive_dislobased_postResults(c+1:c+n) = state(ipc,ip,el)%p(6*n+1:7*n) constitutive_dislobased_postResults(c+1:c+ns) = state(ipc,ip,el)%p(1:ns)
c = c + n c = c + ns
case ('rateofshear') case ('rateofshear_slip')
do i = 1,n do i = 1,ns
tau_slip = dot_product(Tstar_v,lattice_Sslip_v(:,i,constitutive_dislobased_structure(matID))) tau_slip = dot_product(Tstar_v,lattice_Sslip_v(:,i,constitutive_dislobased_structure(matID)))
if ((abs(tau_slip)-state(ipc,ip,el)%p(3*n+i))>0) then
constitutive_dislobased_postResults(c+i) = state(ipc,ip,el)%p(7*n+i)*sign(1.0_pReal,tau_slip)*& if ( abs(tau_slip) > state(ipc,ip,el)%p(6*ns+3*nt+i) ) then
sinh(((abs(tau_slip)-state(ipc,ip,el)%p(3*n+i))*state(ipc,ip,el)%p(5*n+i))/(kB*Temperature)) constitutive_dislobased_postResults(c+i) = state(ipc,ip,el)%p(9*ns+5*nt+i)*sign(1.0_pReal,tau_slip)*&
sinh(((abs(tau_slip)-state(ipc,ip,el)%p(6*ns+3*nt+i))*state(ipc,ip,el)%p(7*ns+4*nt+i))/(kB*Temperature) )
else else
constitutive_dislobased_postResults(c+i) = 0.0_pReal constitutive_dislobased_postResults(c+i) = 0.0_pReal
endif endif
enddo enddo
c = c + n c = c + ns
case ('mfp_slip')
constitutive_dislobased_postResults(c+1:c+ns) = state(ipc,ip,el)%p((5*ns+2*nt+1):(6*ns+2*nt))
c = c + ns
case ('thresholdstress_slip')
constitutive_dislobased_postResults(c+1:c+ns) = state(ipc,ip,el)%p((6*ns+3*nt+1):(7*ns+3*nt))
c = c + ns
case ('state_twin')
if (nt > 0_pInt) constitutive_dislobased_postResults(c+1:c+nt) = state(ipc,ip,el)%p((ns+1):(ns+nt))
c = c + nt
case ('rateofshear_twin')
if (nt > 0_pInt) then
do i = 1,nt
tau_twin = dot_product(Tstar_v,lattice_Stwin_v(:,i,constitutive_dislobased_structure(matID)))
if ( tau_twin > 0.0_pReal ) then
constitutive_dislobased_postResults(c+i) = (constitutive_dislobased_fmax(matID) - sumf)*&
lattice_shearTwin(i,constitutive_dislobased_structure(matID))*&
state(ipc,ip,el)%p(8*ns+4*nt+i)*constitutive_dislobased_Ndot0(matID)*&
exp(-(state(ipc,ip,el)%p(7*ns+3*nt+i)/tau_twin)**10.0_pReal)
else
constitutive_dislobased_postResults(c+i) = 0.0_pReal
endif
enddo
endif
c = c + nt
case ('mfp_twin')
if (nt > 0_pInt) constitutive_dislobased_postResults(c+1:c+nt) = state(ipc,ip,el)%p((6*ns+2*nt+1):(6*ns+3*nt))
c = c + nt
case ('thresholdstress_twin')
if (nt > 0_pInt) constitutive_dislobased_postResults(c+1:c+nt) = state(ipc,ip,el)%p((7*ns+3*nt+1):(7*ns+4*nt))
c = c + nt
end select end select
enddo enddo
return return
end function end function
END MODULE END MODULE