constitutive_nonlocal:
- read in activation energy for dislocation glide from material.config - changed naming of dDipMin/Max to dLower/dUpper - added new outputs: rho_dot, rho_dot_dip, rho_dot_gen, rho_dot_sgl2dip, rho_dot_dip2sgl, rho_dot_ann_ath, rho_dot_ann_the, rho_dot_flux, d_upper_edge, d_upper_screw, d_upper_dot_edge, d_upper_dot_screw - poisson's ratio is now calculated from elastic constants - microstrucutre has state as first argument, since this is our output variable - periodic boundary conditions are taken into account for fluxes and internal stresses. for the moment, flag has to be set in constitutive_nonlocal. - corrected calculation for dipole formation by glide - added terms for dipole formation/annihilation by stress decrease/increase constitutive: - passing of arguments is adapted for constitutive_nonlocal model crystallite: - in stiffness calculation: call to collect_dotState used wrong arguments - crystallite_postResults uses own Tstar_v and temperature, no need for passing them from materialpoint_postResults homogenization: - crystallite_postResults uses own Tstar_v and temperature, no need for passing them from materialpoint_postResults IO: - changed error message 229 material.config: - changed example for nonlocal constitution according to constitutive_nonlocal all: - added some flush statements
This commit is contained in:
parent
48e642bb15
commit
c1ee34d235
|
@ -994,7 +994,7 @@ endfunction
|
||||||
case (228)
|
case (228)
|
||||||
msg = 'Non-positive minimum stable dipole distance'
|
msg = 'Non-positive minimum stable dipole distance'
|
||||||
case (229)
|
case (229)
|
||||||
msg = 'Hardening interaction coefficients below one'
|
msg = 'Non-positive hardening interaction coefficients'
|
||||||
case (230)
|
case (230)
|
||||||
msg = 'Non-positive atomic volume'
|
msg = 'Non-positive atomic volume'
|
||||||
case (231)
|
case (231)
|
||||||
|
@ -1129,6 +1129,7 @@ endfunction
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
write(6,'(a38)') '+------------------------------------+'
|
write(6,'(a38)') '+------------------------------------+'
|
||||||
|
call flush(6)
|
||||||
|
|
||||||
endsubroutine
|
endsubroutine
|
||||||
|
|
||||||
|
|
|
@ -205,6 +205,7 @@ subroutine constitutive_init()
|
||||||
write(6,'(a32,x,7(i5,x))') 'constitutive_sizePostResults: ', shape(constitutive_sizePostResults)
|
write(6,'(a32,x,7(i5,x))') 'constitutive_sizePostResults: ', shape(constitutive_sizePostResults)
|
||||||
write(6,*)
|
write(6,*)
|
||||||
write(6,'(a32,x,7(i5,x))') 'maxSizeState: ', constitutive_maxSizeState
|
write(6,'(a32,x,7(i5,x))') 'maxSizeState: ', constitutive_maxSizeState
|
||||||
|
write(6,'(a32,x,7(i5,x))') 'maxSizeDotState: ', constitutive_maxSizeDotState
|
||||||
write(6,'(a32,x,7(i5,x))') 'maxSizePostResults: ', constitutive_maxSizePostResults
|
write(6,'(a32,x,7(i5,x))') 'maxSizePostResults: ', constitutive_maxSizePostResults
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -293,7 +294,7 @@ real(pReal), dimension(3,3,homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems)
|
||||||
call constitutive_dislotwin_microstructure(Temperature,constitutive_state,ipc,ip,el)
|
call constitutive_dislotwin_microstructure(Temperature,constitutive_state,ipc,ip,el)
|
||||||
|
|
||||||
case (constitutive_nonlocal_label)
|
case (constitutive_nonlocal_label)
|
||||||
call constitutive_nonlocal_microstructure(Temperature, Fe, Fp, constitutive_state, ipc, ip, el)
|
call constitutive_nonlocal_microstructure(constitutive_state, Temperature, Fe, Fp, ipc, ip, el)
|
||||||
|
|
||||||
end select
|
end select
|
||||||
|
|
||||||
|
@ -374,7 +375,7 @@ subroutine constitutive_collectDotState(Tstar_v, subTstar0_v, Fe, Fp, Temperatur
|
||||||
!* Definition of variables
|
!* Definition of variables
|
||||||
integer(pInt), intent(in) :: ipc,ip,el
|
integer(pInt), intent(in) :: ipc,ip,el
|
||||||
real(pReal), intent(in) :: Temperature, subdt
|
real(pReal), intent(in) :: Temperature, subdt
|
||||||
real(pReal), dimension(3,3,homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), intent(in) :: Fe, Fp
|
real(pReal), dimension(3,3,homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems), intent(in) :: Fe, Fp
|
||||||
real(pReal), dimension(6), intent(in) :: Tstar_v, subTstar0_v
|
real(pReal), dimension(6), intent(in) :: Tstar_v, subTstar0_v
|
||||||
|
|
||||||
select case (phase_constitution(material_phase(ipc,ip,el)))
|
select case (phase_constitution(material_phase(ipc,ip,el)))
|
||||||
|
@ -443,7 +444,7 @@ function constitutive_dotTemperature(Tstar_v,Temperature,ipc,ip,el)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
pure function constitutive_postResults(Tstar_v,Temperature,dt,ipc,ip,el)
|
pure function constitutive_postResults(Tstar_v,subTstar0_v,Temperature,dt,subdt,ipc,ip,el)
|
||||||
!*********************************************************************
|
!*********************************************************************
|
||||||
!* return array of constitutive results *
|
!* return array of constitutive results *
|
||||||
!* INPUT: *
|
!* INPUT: *
|
||||||
|
@ -463,8 +464,8 @@ pure function constitutive_postResults(Tstar_v,Temperature,dt,ipc,ip,el)
|
||||||
|
|
||||||
!* Definition of variables
|
!* Definition of variables
|
||||||
integer(pInt), intent(in) :: ipc,ip,el
|
integer(pInt), intent(in) :: ipc,ip,el
|
||||||
real(pReal), intent(in) :: dt,Temperature
|
real(pReal), intent(in) :: dt, Temperature, subdt
|
||||||
real(pReal), dimension(6), intent(in) :: Tstar_v
|
real(pReal), dimension(6), intent(in) :: Tstar_v, subTstar0_v
|
||||||
real(pReal), dimension(constitutive_sizePostResults(ipc,ip,el)) :: constitutive_postResults
|
real(pReal), dimension(constitutive_sizePostResults(ipc,ip,el)) :: constitutive_postResults
|
||||||
|
|
||||||
constitutive_postResults = 0.0_pReal
|
constitutive_postResults = 0.0_pReal
|
||||||
|
@ -480,8 +481,8 @@ pure function constitutive_postResults(Tstar_v,Temperature,dt,ipc,ip,el)
|
||||||
constitutive_postResults = constitutive_dislotwin_postResults(Tstar_v,Temperature,dt,constitutive_state,ipc,ip,el)
|
constitutive_postResults = constitutive_dislotwin_postResults(Tstar_v,Temperature,dt,constitutive_state,ipc,ip,el)
|
||||||
|
|
||||||
case (constitutive_nonlocal_label)
|
case (constitutive_nonlocal_label)
|
||||||
constitutive_postResults = constitutive_nonlocal_postResults(Tstar_v,Temperature,dt,constitutive_state,ipc,ip,el)
|
constitutive_postResults = constitutive_nonlocal_postResults(Tstar_v, subTstar0_v, Temperature, dt, subdt, constitutive_state,&
|
||||||
|
constitutive_subState0, constitutive_dotstate, ipc, ip, el)
|
||||||
end select
|
end select
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
|
@ -27,7 +27,6 @@ character(len=16), dimension(3), parameter :: constitutive_nonlocal_listDependen
|
||||||
'tauSlipThreshold', &
|
'tauSlipThreshold', &
|
||||||
'Tdislocation_v ' /) ! list of microstructural state variables that depend on other state variables
|
'Tdislocation_v ' /) ! list of microstructural state variables that depend on other state variables
|
||||||
real(pReal), parameter :: kB = 1.38e-23_pReal ! Physical parameter, Boltzmann constant in J/Kelvin
|
real(pReal), parameter :: kB = 1.38e-23_pReal ! Physical parameter, Boltzmann constant in J/Kelvin
|
||||||
real(pReal), parameter :: constitutive_nonlocal_G = 2.5e-19_pReal
|
|
||||||
|
|
||||||
!* Definition of global variables
|
!* Definition of global variables
|
||||||
integer(pInt), dimension(:), allocatable :: constitutive_nonlocal_sizeDotState, & ! number of dotStates
|
integer(pInt), dimension(:), allocatable :: constitutive_nonlocal_sizeDotState, & ! number of dotStates
|
||||||
|
@ -51,9 +50,10 @@ real(pReal), dimension(:), allocatable :: constitutive_nonlocal_
|
||||||
constitutive_nonlocal_C44, & ! C44 element in elasticity matrix
|
constitutive_nonlocal_C44, & ! C44 element in elasticity matrix
|
||||||
constitutive_nonlocal_Gmod, & ! shear modulus
|
constitutive_nonlocal_Gmod, & ! shear modulus
|
||||||
constitutive_nonlocal_nu, & ! poisson's ratio
|
constitutive_nonlocal_nu, & ! poisson's ratio
|
||||||
|
constitutive_nonlocal_Q0, & ! activation energy for dislocation glide
|
||||||
constitutive_nonlocal_atomicVolume, & ! atomic volume
|
constitutive_nonlocal_atomicVolume, & ! atomic volume
|
||||||
constitutive_nonlocal_D0, & ! prefactor for self-diffusion coefficient
|
constitutive_nonlocal_D0, & ! prefactor for self-diffusion coefficient
|
||||||
constitutive_nonlocal_Qsd, & ! activation energy for dislocation climb
|
constitutive_nonlocal_Qsd, & ! activation enthalpy for diffusion
|
||||||
constitutive_nonlocal_relevantRho ! dislocation density considered relevant
|
constitutive_nonlocal_relevantRho ! dislocation density considered relevant
|
||||||
real(pReal), dimension(:,:,:), allocatable :: constitutive_nonlocal_Cslip_66 ! elasticity matrix in Mandel notation for each instance
|
real(pReal), dimension(:,:,:), allocatable :: constitutive_nonlocal_Cslip_66 ! elasticity matrix in Mandel notation for each instance
|
||||||
real(pReal), dimension(:,:,:,:,:), allocatable :: constitutive_nonlocal_Cslip_3333 ! elasticity matrix for each instance
|
real(pReal), dimension(:,:,:,:,:), allocatable :: constitutive_nonlocal_Cslip_3333 ! elasticity matrix for each instance
|
||||||
|
@ -69,16 +69,18 @@ real(pReal), dimension(:,:), allocatable :: constitutive_nonlocal_
|
||||||
constitutive_nonlocal_lambda0PerSlipSystem, & ! mean free path prefactor for each slip system and instance
|
constitutive_nonlocal_lambda0PerSlipSystem, & ! mean free path prefactor for each slip system and instance
|
||||||
constitutive_nonlocal_burgersPerSlipFamily, & ! absolute length of burgers vector [m] for each family and instance
|
constitutive_nonlocal_burgersPerSlipFamily, & ! absolute length of burgers vector [m] for each family and instance
|
||||||
constitutive_nonlocal_burgersPerSlipSystem, & ! absolute length of burgers vector [m] for each slip system and instance
|
constitutive_nonlocal_burgersPerSlipSystem, & ! absolute length of burgers vector [m] for each slip system and instance
|
||||||
constitutive_nonlocal_dDipMinEdgePerSlipFamily, & ! minimum stable edge dipole height for each family and instance
|
constitutive_nonlocal_dLowerEdgePerSlipFamily, & ! minimum stable edge dipole height for each family and instance
|
||||||
constitutive_nonlocal_dDipMinEdgePerSlipSystem, & ! minimum stable edge dipole height for each slip system and instance
|
constitutive_nonlocal_dLowerEdgePerSlipSystem, & ! minimum stable edge dipole height for each slip system and instance
|
||||||
constitutive_nonlocal_dDipMinScrewPerSlipFamily, & ! minimum stable screw dipole height for each family and instance
|
constitutive_nonlocal_dLowerScrewPerSlipFamily, & ! minimum stable screw dipole height for each family and instance
|
||||||
constitutive_nonlocal_dDipMinScrewPerSlipSystem, & ! minimum stable screw dipole height for each slip system and instance
|
constitutive_nonlocal_dLowerScrewPerSlipSystem, & ! minimum stable screw dipole height for each slip system and instance
|
||||||
constitutive_nonlocal_interactionSlipSlip ! coefficients for slip-slip interaction for each interaction type and instance
|
constitutive_nonlocal_interactionSlipSlip ! coefficients for slip-slip interaction for each interaction type and instance
|
||||||
|
|
||||||
real(pReal), dimension(:,:,:), allocatable :: constitutive_nonlocal_forestProjectionEdge, & ! matrix of forest projections of edge dislocations for each instance
|
real(pReal), dimension(:,:,:), allocatable :: constitutive_nonlocal_forestProjectionEdge, & ! matrix of forest projections of edge dislocations for each instance
|
||||||
constitutive_nonlocal_forestProjectionScrew, & ! matrix of forest projections of screw dislocations for each instance
|
constitutive_nonlocal_forestProjectionScrew, & ! matrix of forest projections of screw dislocations for each instance
|
||||||
constitutive_nonlocal_interactionMatrixSlipSlip ! interaction matrix of the different slip systems for each instance
|
constitutive_nonlocal_interactionMatrixSlipSlip ! interaction matrix of the different slip systems for each instance
|
||||||
|
|
||||||
|
logical periodicBC = .false.
|
||||||
|
|
||||||
|
|
||||||
CONTAINS
|
CONTAINS
|
||||||
!****************************************
|
!****************************************
|
||||||
|
@ -199,6 +201,7 @@ allocate(constitutive_nonlocal_C33(maxNinstance))
|
||||||
allocate(constitutive_nonlocal_C44(maxNinstance))
|
allocate(constitutive_nonlocal_C44(maxNinstance))
|
||||||
allocate(constitutive_nonlocal_Gmod(maxNinstance))
|
allocate(constitutive_nonlocal_Gmod(maxNinstance))
|
||||||
allocate(constitutive_nonlocal_nu(maxNinstance))
|
allocate(constitutive_nonlocal_nu(maxNinstance))
|
||||||
|
allocate(constitutive_nonlocal_Q0(maxNinstance))
|
||||||
allocate(constitutive_nonlocal_atomicVolume(maxNinstance))
|
allocate(constitutive_nonlocal_atomicVolume(maxNinstance))
|
||||||
allocate(constitutive_nonlocal_D0(maxNinstance))
|
allocate(constitutive_nonlocal_D0(maxNinstance))
|
||||||
allocate(constitutive_nonlocal_Qsd(maxNinstance))
|
allocate(constitutive_nonlocal_Qsd(maxNinstance))
|
||||||
|
@ -212,6 +215,7 @@ constitutive_nonlocal_C13 = 0.0_pReal
|
||||||
constitutive_nonlocal_C33 = 0.0_pReal
|
constitutive_nonlocal_C33 = 0.0_pReal
|
||||||
constitutive_nonlocal_C44 = 0.0_pReal
|
constitutive_nonlocal_C44 = 0.0_pReal
|
||||||
constitutive_nonlocal_Gmod = 0.0_pReal
|
constitutive_nonlocal_Gmod = 0.0_pReal
|
||||||
|
constitutive_nonlocal_Q0 = 0.0_pReal
|
||||||
constitutive_nonlocal_atomicVolume = 0.0_pReal
|
constitutive_nonlocal_atomicVolume = 0.0_pReal
|
||||||
constitutive_nonlocal_D0 = 0.0_pReal
|
constitutive_nonlocal_D0 = 0.0_pReal
|
||||||
constitutive_nonlocal_Qsd = 0.0_pReal
|
constitutive_nonlocal_Qsd = 0.0_pReal
|
||||||
|
@ -230,8 +234,8 @@ allocate(constitutive_nonlocal_v0PerSlipFamily(lattice_maxNslipFamily, maxNinsta
|
||||||
allocate(constitutive_nonlocal_burgersPerSlipFamily(lattice_maxNslipFamily, maxNinstance))
|
allocate(constitutive_nonlocal_burgersPerSlipFamily(lattice_maxNslipFamily, maxNinstance))
|
||||||
allocate(constitutive_nonlocal_Lambda0PerSlipFamily(lattice_maxNslipFamily, maxNinstance))
|
allocate(constitutive_nonlocal_Lambda0PerSlipFamily(lattice_maxNslipFamily, maxNinstance))
|
||||||
allocate(constitutive_nonlocal_interactionSlipSlip(lattice_maxNinteraction, maxNinstance))
|
allocate(constitutive_nonlocal_interactionSlipSlip(lattice_maxNinteraction, maxNinstance))
|
||||||
allocate(constitutive_nonlocal_dDipMinEdgePerSlipFamily(lattice_maxNslipFamily, maxNinstance))
|
allocate(constitutive_nonlocal_dLowerEdgePerSlipFamily(lattice_maxNslipFamily, maxNinstance))
|
||||||
allocate(constitutive_nonlocal_dDipMinScrewPerSlipFamily(lattice_maxNslipFamily, maxNinstance))
|
allocate(constitutive_nonlocal_dLowerScrewPerSlipFamily(lattice_maxNslipFamily, maxNinstance))
|
||||||
constitutive_nonlocal_rhoEdgePos0 = 0.0_pReal
|
constitutive_nonlocal_rhoEdgePos0 = 0.0_pReal
|
||||||
constitutive_nonlocal_rhoEdgeNeg0 = 0.0_pReal
|
constitutive_nonlocal_rhoEdgeNeg0 = 0.0_pReal
|
||||||
constitutive_nonlocal_rhoScrewPos0 = 0.0_pReal
|
constitutive_nonlocal_rhoScrewPos0 = 0.0_pReal
|
||||||
|
@ -242,8 +246,8 @@ constitutive_nonlocal_v0PerSlipFamily = 0.0_pReal
|
||||||
constitutive_nonlocal_burgersPerSlipFamily = 0.0_pReal
|
constitutive_nonlocal_burgersPerSlipFamily = 0.0_pReal
|
||||||
constitutive_nonlocal_lambda0PerSlipFamily = 0.0_pReal
|
constitutive_nonlocal_lambda0PerSlipFamily = 0.0_pReal
|
||||||
constitutive_nonlocal_interactionSlipSlip = 0.0_pReal
|
constitutive_nonlocal_interactionSlipSlip = 0.0_pReal
|
||||||
constitutive_nonlocal_dDipMinEdgePerSlipFamily = 0.0_pReal
|
constitutive_nonlocal_dLowerEdgePerSlipFamily = 0.0_pReal
|
||||||
constitutive_nonlocal_dDipMinScrewPerSlipFamily = 0.0_pReal
|
constitutive_nonlocal_dLowerScrewPerSlipFamily = 0.0_pReal
|
||||||
|
|
||||||
|
|
||||||
!*** readout data from material.config file
|
!*** readout data from material.config file
|
||||||
|
@ -308,10 +312,12 @@ do
|
||||||
forall (f = 1:lattice_maxNslipFamily) constitutive_nonlocal_burgersPerSlipFamily(f,i) = IO_floatValue(line,positions,1+f)
|
forall (f = 1:lattice_maxNslipFamily) constitutive_nonlocal_burgersPerSlipFamily(f,i) = IO_floatValue(line,positions,1+f)
|
||||||
case('ddipminedge')
|
case('ddipminedge')
|
||||||
forall (f = 1:lattice_maxNslipFamily) &
|
forall (f = 1:lattice_maxNslipFamily) &
|
||||||
constitutive_nonlocal_dDipMinEdgePerSlipFamily(f,i) = IO_floatValue(line,positions,1+f)
|
constitutive_nonlocal_dLowerEdgePerSlipFamily(f,i) = IO_floatValue(line,positions,1+f)
|
||||||
case('ddipminscrew')
|
case('ddipminscrew')
|
||||||
forall (f = 1:lattice_maxNslipFamily) &
|
forall (f = 1:lattice_maxNslipFamily) &
|
||||||
constitutive_nonlocal_dDipMinScrewPerSlipFamily(f,i) = IO_floatValue(line,positions,1+f)
|
constitutive_nonlocal_dLowerScrewPerSlipFamily(f,i) = IO_floatValue(line,positions,1+f)
|
||||||
|
case('q0')
|
||||||
|
constitutive_nonlocal_Q0(i) = IO_floatValue(line,positions,2)
|
||||||
case('atomicvolume')
|
case('atomicvolume')
|
||||||
constitutive_nonlocal_atomicVolume(i) = IO_floatValue(line,positions,2)
|
constitutive_nonlocal_atomicVolume(i) = IO_floatValue(line,positions,2)
|
||||||
case('d0')
|
case('d0')
|
||||||
|
@ -337,6 +343,9 @@ enddo
|
||||||
|
|
||||||
if (myStructure < 1 .or. myStructure > 3) call IO_error(205)
|
if (myStructure < 1 .or. myStructure > 3) call IO_error(205)
|
||||||
if (sum(constitutive_nonlocal_Nslip(:,i)) <= 0_pInt) call IO_error(225)
|
if (sum(constitutive_nonlocal_Nslip(:,i)) <= 0_pInt) call IO_error(225)
|
||||||
|
do o = 1,maxval(phase_Noutput)
|
||||||
|
if(len(constitutive_nonlocal_output(o,i)) > 64) call IO_error(666)
|
||||||
|
enddo
|
||||||
do f = 1,lattice_maxNslipFamily
|
do f = 1,lattice_maxNslipFamily
|
||||||
if (constitutive_nonlocal_Nslip(f,i) > 0_pInt) then
|
if (constitutive_nonlocal_Nslip(f,i) > 0_pInt) then
|
||||||
if (constitutive_nonlocal_rhoEdgePos0(f,i) < 0.0_pReal) call IO_error(220)
|
if (constitutive_nonlocal_rhoEdgePos0(f,i) < 0.0_pReal) call IO_error(220)
|
||||||
|
@ -348,12 +357,13 @@ enddo
|
||||||
if (constitutive_nonlocal_burgersPerSlipFamily(f,i) <= 0.0_pReal) call IO_error(221)
|
if (constitutive_nonlocal_burgersPerSlipFamily(f,i) <= 0.0_pReal) call IO_error(221)
|
||||||
if (constitutive_nonlocal_v0PerSlipFamily(f,i) <= 0.0_pReal) call IO_error(226)
|
if (constitutive_nonlocal_v0PerSlipFamily(f,i) <= 0.0_pReal) call IO_error(226)
|
||||||
if (constitutive_nonlocal_lambda0PerSlipFamily(f,i) <= 0.0_pReal) call IO_error(227)
|
if (constitutive_nonlocal_lambda0PerSlipFamily(f,i) <= 0.0_pReal) call IO_error(227)
|
||||||
if (constitutive_nonlocal_dDipMinEdgePerSlipFamily(f,i) <= 0.0_pReal) call IO_error(228)
|
if (constitutive_nonlocal_dLowerEdgePerSlipFamily(f,i) <= 0.0_pReal) call IO_error(228)
|
||||||
if (constitutive_nonlocal_dDipMinScrewPerSlipFamily(f,i) <= 0.0_pReal) call IO_error(228)
|
if (constitutive_nonlocal_dLowerScrewPerSlipFamily(f,i) <= 0.0_pReal) call IO_error(228)
|
||||||
endif
|
endif
|
||||||
enddo
|
enddo
|
||||||
if (any(constitutive_nonlocal_interactionSlipSlip(1:maxval(lattice_interactionSlipSlip(:,:,myStructure)),i) < 1.0_pReal)) &
|
if (any(constitutive_nonlocal_interactionSlipSlip(1:maxval(lattice_interactionSlipSlip(:,:,myStructure)),i) < 0.0_pReal)) &
|
||||||
call IO_error(229)
|
call IO_error(229)
|
||||||
|
if (constitutive_nonlocal_Q0(i) <= 0.0_pReal) call IO_error(-1)
|
||||||
if (constitutive_nonlocal_atomicVolume(i) <= 0.0_pReal) call IO_error(230)
|
if (constitutive_nonlocal_atomicVolume(i) <= 0.0_pReal) call IO_error(230)
|
||||||
if (constitutive_nonlocal_D0(i) <= 0.0_pReal) call IO_error(231)
|
if (constitutive_nonlocal_D0(i) <= 0.0_pReal) call IO_error(231)
|
||||||
if (constitutive_nonlocal_Qsd(i) <= 0.0_pReal) call IO_error(232)
|
if (constitutive_nonlocal_Qsd(i) <= 0.0_pReal) call IO_error(232)
|
||||||
|
@ -362,7 +372,7 @@ enddo
|
||||||
|
|
||||||
!*** determine total number of active slip systems
|
!*** determine total number of active slip systems
|
||||||
|
|
||||||
constitutive_nonlocal_Nslip(:,i) = min( lattice_NslipSystem(:, myStructure), constitutive_nonlocal_Nslip(:,i) ) ! we can't use more slip systems per family than specified in lattice
|
constitutive_nonlocal_Nslip(:,i) = min( lattice_NslipSystem(:, myStructure), constitutive_nonlocal_Nslip(:,i) ) ! we can't use more slip systems per family than specified in lattice
|
||||||
constitutive_nonlocal_totalNslip(i) = sum(constitutive_nonlocal_Nslip(:,i))
|
constitutive_nonlocal_totalNslip(i) = sum(constitutive_nonlocal_Nslip(:,i))
|
||||||
|
|
||||||
enddo
|
enddo
|
||||||
|
@ -381,11 +391,11 @@ constitutive_nonlocal_v0PerSlipSystem = 0.0_pReal
|
||||||
allocate(constitutive_nonlocal_lambda0PerSlipSystem(maxTotalNslip, maxNinstance))
|
allocate(constitutive_nonlocal_lambda0PerSlipSystem(maxTotalNslip, maxNinstance))
|
||||||
constitutive_nonlocal_lambda0PerSlipSystem = 0.0_pReal
|
constitutive_nonlocal_lambda0PerSlipSystem = 0.0_pReal
|
||||||
|
|
||||||
allocate(constitutive_nonlocal_dDipMinEdgePerSlipSystem(maxTotalNslip, maxNinstance))
|
allocate(constitutive_nonlocal_dLowerEdgePerSlipSystem(maxTotalNslip, maxNinstance))
|
||||||
constitutive_nonlocal_dDipMinEdgePerSlipSystem = 0.0_pReal
|
constitutive_nonlocal_dLowerEdgePerSlipSystem = 0.0_pReal
|
||||||
|
|
||||||
allocate(constitutive_nonlocal_dDipMinScrewPerSlipSystem(maxTotalNslip, maxNinstance))
|
allocate(constitutive_nonlocal_dLowerScrewPerSlipSystem(maxTotalNslip, maxNinstance))
|
||||||
constitutive_nonlocal_dDipMinScrewPerSlipSystem = 0.0_pReal
|
constitutive_nonlocal_dLowerScrewPerSlipSystem = 0.0_pReal
|
||||||
|
|
||||||
allocate(constitutive_nonlocal_forestProjectionEdge(maxTotalNslip, maxTotalNslip, maxNinstance))
|
allocate(constitutive_nonlocal_forestProjectionEdge(maxTotalNslip, maxTotalNslip, maxNinstance))
|
||||||
constitutive_nonlocal_forestProjectionEdge = 0.0_pReal
|
constitutive_nonlocal_forestProjectionEdge = 0.0_pReal
|
||||||
|
@ -422,9 +432,10 @@ do i = 1,maxNinstance
|
||||||
|
|
||||||
!*** determine size of postResults array
|
!*** determine size of postResults array
|
||||||
|
|
||||||
do o = 1,maxval(phase_Noutput)
|
do o = 1,maxval(phase_Noutput)
|
||||||
select case(constitutive_nonlocal_output(o,i))
|
select case(constitutive_nonlocal_output(o,i))
|
||||||
case( 'rho', &
|
case( 'rho', &
|
||||||
|
'delta', &
|
||||||
'rho_edge', &
|
'rho_edge', &
|
||||||
'rho_screw', &
|
'rho_screw', &
|
||||||
'excess_rho', &
|
'excess_rho', &
|
||||||
|
@ -432,11 +443,24 @@ do i = 1,maxNinstance
|
||||||
'excess_rho_screw', &
|
'excess_rho_screw', &
|
||||||
'rho_forest', &
|
'rho_forest', &
|
||||||
'rho_dip', &
|
'rho_dip', &
|
||||||
|
'delta_dip', &
|
||||||
'rho_edge_dip', &
|
'rho_edge_dip', &
|
||||||
'rho_screw_dip', &
|
'rho_screw_dip', &
|
||||||
'shearrate', &
|
'shearrate', &
|
||||||
'resolvedstress', &
|
'resolvedstress', &
|
||||||
'resistance')
|
'resistance', &
|
||||||
|
'rho_dot', &
|
||||||
|
'rho_dot_dip', &
|
||||||
|
'rho_dot_gen', &
|
||||||
|
'rho_dot_sgl2dip', &
|
||||||
|
'rho_dot_dip2sgl', &
|
||||||
|
'rho_dot_ann_ath', &
|
||||||
|
'rho_dot_ann_the', &
|
||||||
|
'rho_dot_flux', &
|
||||||
|
'd_upper_edge', &
|
||||||
|
'd_upper_screw', &
|
||||||
|
'd_upper_dot_edge', &
|
||||||
|
'd_upper_dot_screw' )
|
||||||
mySize = constitutive_nonlocal_totalNslip(i)
|
mySize = constitutive_nonlocal_totalNslip(i)
|
||||||
case default
|
case default
|
||||||
mySize = 0_pInt
|
mySize = 0_pInt
|
||||||
|
@ -476,8 +500,8 @@ do i = 1,maxNinstance
|
||||||
constitutive_nonlocal_Cslip_3333(:,:,:,:,i) = math_Voigt66to3333(constitutive_nonlocal_Cslip_66(:,:,i))
|
constitutive_nonlocal_Cslip_3333(:,:,:,:,i) = math_Voigt66to3333(constitutive_nonlocal_Cslip_66(:,:,i))
|
||||||
|
|
||||||
constitutive_nonlocal_Gmod(i) = constitutive_nonlocal_C44(i)
|
constitutive_nonlocal_Gmod(i) = constitutive_nonlocal_C44(i)
|
||||||
constitutive_nonlocal_nu(i) = 0.3_pReal ! harcoded version, since not clear how to exactly calculate that value from C11,C12,C44 etc
|
constitutive_nonlocal_nu(i) = 0.5_pReal * constitutive_nonlocal_C12(i) &
|
||||||
! constitutive_nonlocal_nu(i) = constitutive_nonlocal_C12(i) / constitutive_nonlocal_C11(i)
|
/ (constitutive_nonlocal_C12(i) + constitutive_nonlocal_C44(i))
|
||||||
|
|
||||||
|
|
||||||
do s1 = 1,ns
|
do s1 = 1,ns
|
||||||
|
@ -489,8 +513,8 @@ do i = 1,maxNinstance
|
||||||
constitutive_nonlocal_burgersPerSlipSystem(s1,i) = constitutive_nonlocal_burgersPerSlipFamily(f,i)
|
constitutive_nonlocal_burgersPerSlipSystem(s1,i) = constitutive_nonlocal_burgersPerSlipFamily(f,i)
|
||||||
constitutive_nonlocal_v0PerSlipSystem(s1,i) = constitutive_nonlocal_v0PerSlipFamily(f,i)
|
constitutive_nonlocal_v0PerSlipSystem(s1,i) = constitutive_nonlocal_v0PerSlipFamily(f,i)
|
||||||
constitutive_nonlocal_lambda0PerSlipSystem(s1,i) = constitutive_nonlocal_lambda0PerSlipFamily(f,i)
|
constitutive_nonlocal_lambda0PerSlipSystem(s1,i) = constitutive_nonlocal_lambda0PerSlipFamily(f,i)
|
||||||
constitutive_nonlocal_dDipMinEdgePerSlipSystem(s1,i) = constitutive_nonlocal_dDipMinEdgePerSlipFamily(f,i)
|
constitutive_nonlocal_dLowerEdgePerSlipSystem(s1,i) = constitutive_nonlocal_dLowerEdgePerSlipFamily(f,i)
|
||||||
constitutive_nonlocal_dDipMinScrewPerSlipSystem(s1,i) = constitutive_nonlocal_dDipMinScrewPerSlipFamily(f,i)
|
constitutive_nonlocal_dLowerScrewPerSlipSystem(s1,i) = constitutive_nonlocal_dLowerScrewPerSlipFamily(f,i)
|
||||||
|
|
||||||
do s2 = 1,ns
|
do s2 = 1,ns
|
||||||
|
|
||||||
|
@ -665,7 +689,7 @@ endfunction
|
||||||
!*********************************************************************
|
!*********************************************************************
|
||||||
!* calculates quantities characterizing the microstructure *
|
!* calculates quantities characterizing the microstructure *
|
||||||
!*********************************************************************
|
!*********************************************************************
|
||||||
subroutine constitutive_nonlocal_microstructure(Temperature, Fe, Fp, state, g, ip, el)
|
subroutine constitutive_nonlocal_microstructure(state, Temperature, Fe, Fp, g, ip, el)
|
||||||
|
|
||||||
use prec, only: pReal, &
|
use prec, only: pReal, &
|
||||||
pInt, &
|
pInt, &
|
||||||
|
@ -724,7 +748,7 @@ integer(pInt) myInstance, & ! current instance
|
||||||
neighboring_ip, & ! integration point of my neighbor
|
neighboring_ip, & ! integration point of my neighbor
|
||||||
n, & ! index of my current neighbor
|
n, & ! index of my current neighbor
|
||||||
s, & ! index of my current slip system
|
s, & ! index of my current slip system
|
||||||
sLattice ! index of my current slip system as specified by lattice
|
sLattice ! index of my current slip system according to lattice order
|
||||||
real(pReal) gb, & ! short notation for G*b/2/pi
|
real(pReal) gb, & ! short notation for G*b/2/pi
|
||||||
x, & ! coordinate in direction of lvec
|
x, & ! coordinate in direction of lvec
|
||||||
y, & ! coordinate in direction of bvec
|
y, & ! coordinate in direction of bvec
|
||||||
|
@ -758,6 +782,7 @@ real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_constitutionInstan
|
||||||
neighboring_rhoScrewExcess,&! screw excess dislocation density of my neighbor
|
neighboring_rhoScrewExcess,&! screw excess dislocation density of my neighbor
|
||||||
neighboring_Nedge, & ! total number of edge excess dislocations in my neighbor
|
neighboring_Nedge, & ! total number of edge excess dislocations in my neighbor
|
||||||
neighboring_Nscrew
|
neighboring_Nscrew
|
||||||
|
logical flipConnectingVector
|
||||||
|
|
||||||
|
|
||||||
myInstance = phase_constitutionInstance(material_phase(g,ip,el))
|
myInstance = phase_constitutionInstance(material_phase(g,ip,el))
|
||||||
|
@ -810,8 +835,35 @@ do n = 1,FE_NipNeighbors(mesh_element(2,el))
|
||||||
|
|
||||||
neighboring_el = mesh_ipNeighborhood(1,n,ip,el)
|
neighboring_el = mesh_ipNeighborhood(1,n,ip,el)
|
||||||
neighboring_ip = mesh_ipNeighborhood(2,n,ip,el)
|
neighboring_ip = mesh_ipNeighborhood(2,n,ip,el)
|
||||||
|
flipConnectingVector = .false.
|
||||||
|
|
||||||
if ( neighboring_el == 0 .or. neighboring_ip == 0 ) cycle
|
if ( neighboring_el == 0 .or. neighboring_ip == 0 ) then
|
||||||
|
if (.not. periodicBC) then
|
||||||
|
cycle
|
||||||
|
else
|
||||||
|
flipConnectingVector = .true.
|
||||||
|
select case (n)
|
||||||
|
case (1)
|
||||||
|
neighboring_el = mesh_ipNeighborhood(1,2,ip,el)
|
||||||
|
neighboring_ip = mesh_ipNeighborhood(2,2,ip,el)
|
||||||
|
case (2)
|
||||||
|
neighboring_el = mesh_ipNeighborhood(1,1,ip,el)
|
||||||
|
neighboring_ip = mesh_ipNeighborhood(2,1,ip,el)
|
||||||
|
case (3)
|
||||||
|
neighboring_el = mesh_ipNeighborhood(1,4,ip,el)
|
||||||
|
neighboring_ip = mesh_ipNeighborhood(2,4,ip,el)
|
||||||
|
case (4)
|
||||||
|
neighboring_el = mesh_ipNeighborhood(1,3,ip,el)
|
||||||
|
neighboring_ip = mesh_ipNeighborhood(2,3,ip,el)
|
||||||
|
case (5)
|
||||||
|
neighboring_el = mesh_ipNeighborhood(1,6,ip,el)
|
||||||
|
neighboring_ip = mesh_ipNeighborhood(2,6,ip,el)
|
||||||
|
case (6)
|
||||||
|
neighboring_el = mesh_ipNeighborhood(1,5,ip,el)
|
||||||
|
neighboring_ip = mesh_ipNeighborhood(2,5,ip,el)
|
||||||
|
endselect
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
! deformation gradients needed for mapping between configurations
|
! deformation gradients needed for mapping between configurations
|
||||||
neighboring_F = math_mul33x33(Fe(:,:,g,neighboring_ip,neighboring_el), Fp(:,:,g,neighboring_ip,neighboring_el))
|
neighboring_F = math_mul33x33(Fe(:,:,g,neighboring_ip,neighboring_el), Fp(:,:,g,neighboring_ip,neighboring_el))
|
||||||
|
@ -820,8 +872,13 @@ do n = 1,FE_NipNeighbors(mesh_element(2,el))
|
||||||
neighboring_invFe = math_inv3x3(Fe(:,:,g,neighboring_ip,neighboring_el))
|
neighboring_invFe = math_inv3x3(Fe(:,:,g,neighboring_ip,neighboring_el))
|
||||||
|
|
||||||
! calculate connection vector between me and my neighbor in its lattice configuration
|
! calculate connection vector between me and my neighbor in its lattice configuration
|
||||||
connectingVector = math_mul33x3(neighboring_invFe, math_mul33x3(Favg, &
|
if (flipConnectingVector) then
|
||||||
(mesh_ipCenterOfGravity(:,neighboring_ip,neighboring_el) - mesh_ipCenterOfGravity(:,ip,el)) ) )
|
connectingVector = math_mul33x3(neighboring_invFe, math_mul33x3(Favg, &
|
||||||
|
-(mesh_ipCenterOfGravity(:,neighboring_ip,neighboring_el) - mesh_ipCenterOfGravity(:,ip,el)) ) )
|
||||||
|
else
|
||||||
|
connectingVector = math_mul33x3(neighboring_invFe, math_mul33x3(Favg, &
|
||||||
|
(mesh_ipCenterOfGravity(:,neighboring_ip,neighboring_el) - mesh_ipCenterOfGravity(:,ip,el)) ) )
|
||||||
|
endif
|
||||||
|
|
||||||
! neighboring dislocation densities
|
! neighboring dislocation densities
|
||||||
neighboring_rhoEdgePos = state(1, neighboring_ip, neighboring_el)%p( 1: ns)
|
neighboring_rhoEdgePos = state(1, neighboring_ip, neighboring_el)%p( 1: ns)
|
||||||
|
@ -940,7 +997,7 @@ integer(pInt) myInstance, & ! curren
|
||||||
l, &
|
l, &
|
||||||
t, & ! dislocation type
|
t, & ! dislocation type
|
||||||
s, & ! index of my current slip system
|
s, & ! index of my current slip system
|
||||||
sLattice ! index of my current slip system as specified by lattice
|
sLattice ! index of my current slip system according to lattice order
|
||||||
real(pReal), dimension(6) :: Tdislocation_v ! dislocation stress (resulting from the neighboring excess dislocation densities) as 2nd Piola-Kirchhoff stress
|
real(pReal), dimension(6) :: Tdislocation_v ! dislocation stress (resulting from the neighboring excess dislocation densities) as 2nd Piola-Kirchhoff stress
|
||||||
real(pReal), dimension(3,3,3,3) :: dLp_dTstar3333 ! derivative of Lp with respect to Tstar (3x3x3x3 matrix)
|
real(pReal), dimension(3,3,3,3) :: dLp_dTstar3333 ! derivative of Lp with respect to Tstar (3x3x3x3 matrix)
|
||||||
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_constitutionInstance(material_phase(g,ip,el))),4) :: &
|
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_constitutionInstance(material_phase(g,ip,el))),4) :: &
|
||||||
|
@ -982,17 +1039,16 @@ forall (s =1:ns) &
|
||||||
!*** Calculation of gdot and its tangent
|
!*** Calculation of gdot and its tangent
|
||||||
|
|
||||||
v = constitutive_nonlocal_v0PerSlipSystem(:,myInstance) &
|
v = constitutive_nonlocal_v0PerSlipSystem(:,myInstance) &
|
||||||
* exp( - constitutive_nonlocal_G / ( kB * Temperature) * (1.0_pReal - (abs(tauSlip)/tauSlipThreshold) ) ) &
|
* exp( - constitutive_nonlocal_Q0(myInstance) / ( kB * Temperature) * (1.0_pReal - (abs(tauSlip)/tauSlipThreshold) ) ) &
|
||||||
* sign(1.0_pReal,tauSlip)
|
* sign(1.0_pReal,tauSlip)
|
||||||
|
|
||||||
gdotSlip = sum(rho,2) * constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) * v
|
gdotSlip = sum(rho,2) * constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) * v
|
||||||
|
|
||||||
dgdot_dtauSlip = gdotSlip * constitutive_nonlocal_G / ( kB * Temperature * tauSlipThreshold )
|
dgdot_dtauSlip = gdotSlip * constitutive_nonlocal_Q0(myInstance) / ( kB * Temperature * tauSlipThreshold )
|
||||||
|
|
||||||
!*** Calculation of Lp and its tangent
|
!*** Calculation of Lp and its tangent
|
||||||
|
|
||||||
do s = 1,ns
|
do s = 1,ns
|
||||||
|
|
||||||
sLattice = constitutive_nonlocal_slipSystemLattice(s,myInstance)
|
sLattice = constitutive_nonlocal_slipSystemLattice(s,myInstance)
|
||||||
|
|
||||||
Lp = Lp + gdotSlip(s) * lattice_Sslip(:,:,sLattice,myStructure)
|
Lp = Lp + gdotSlip(s) * lattice_Sslip(:,:,sLattice,myStructure)
|
||||||
|
@ -1004,17 +1060,20 @@ enddo
|
||||||
|
|
||||||
dLp_dTstar99 = math_Plain3333to99(dLp_dTstar3333)
|
dLp_dTstar99 = math_Plain3333to99(dLp_dTstar3333)
|
||||||
|
|
||||||
! if (debugger) then
|
if (debugger) then
|
||||||
! !$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
! write(6,*) '::: LpandItsTangent',g,ip,el
|
write(6,*) '::: LpandItsTangent',g,ip,el
|
||||||
! write(6,*)
|
write(6,*)
|
||||||
! write(6,'(a,/,12(f12.5,x),/)') 'tauSlip / MPa', tauSlip/1e6_pReal
|
write(6,'(a,/,3(3(f12.3,x)/))') 'Tdislocation / MPa', math_Mandel6to33(Tdislocation_v/1e6)
|
||||||
! write(6,'(a,/,12(f12.5,x),/)') 'tauSlipThreshold / MPa', tauSlipThreshold/1e6_pReal
|
write(6,'(a,/,3(3(f12.3,x)/))') 'Tstar / MPa', math_Mandel6to33(Tstar_v/1e6)
|
||||||
! write(6,'(a,/,12(f12.5,x),/)') 'v', v
|
write(6,'(a,/,12(f12.5,x),/)') 'tauSlip / MPa', tauSlip/1e6_pReal
|
||||||
! write(6,'(a,/,12(f12.5,x),/)') 'gdot total /1e-3',gdotSlip*1e3_pReal
|
! write(6,'(a,/,12(f12.5,x),/)') 'tauSlipThreshold / MPa', tauSlipThreshold/1e6_pReal
|
||||||
! write(6,'(a,/,3(3(f12.7,x)/))') 'Lp',Lp
|
! write(6,'(a,/,12(f12.5,x),/)') 'v', v
|
||||||
! !$OMPEND CRITICAL (write2out)
|
! write(6,'(a,/,12(f12.5,x),/)') 'gdot total /1e-3',gdotSlip*1e3_pReal
|
||||||
! endif
|
! write(6,'(a,/,3(3(f12.7,x)/))') 'Lp',Lp
|
||||||
|
call flush(6)
|
||||||
|
!$OMPEND CRITICAL (write2out)
|
||||||
|
endif
|
||||||
|
|
||||||
endsubroutine
|
endsubroutine
|
||||||
|
|
||||||
|
@ -1087,7 +1146,8 @@ integer(pInt) myInstance, & ! current
|
||||||
c, & ! character of dislocation
|
c, & ! character of dislocation
|
||||||
n, & ! index of my current neighbor
|
n, & ! index of my current neighbor
|
||||||
t, & ! type of dislocation
|
t, & ! type of dislocation
|
||||||
s ! index of my current slip system
|
s, & ! index of my current slip system
|
||||||
|
sLattice ! index of my current slip system according to lattice order
|
||||||
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_constitutionInstance(material_phase(g,ip,el))),4) :: &
|
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_constitutionInstance(material_phase(g,ip,el))),4) :: &
|
||||||
rho, & ! dislocation densities (positive/negative screw and edge without dipoles)
|
rho, & ! dislocation densities (positive/negative screw and edge without dipoles)
|
||||||
totalRhoDot, & ! total rate of change of dislocation densities
|
totalRhoDot, & ! total rate of change of dislocation densities
|
||||||
|
@ -1106,10 +1166,10 @@ real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_constitutionInstan
|
||||||
rhoDip, & ! dipole dislocation densities (screw and edge dipoles)
|
rhoDip, & ! dipole dislocation densities (screw and edge dipoles)
|
||||||
totalRhoDipDot, & ! total rate of change of dipole dislocation densities
|
totalRhoDipDot, & ! total rate of change of dipole dislocation densities
|
||||||
thisRhoDipDot, & ! rate of change of dipole dislocation densities for this mechanism
|
thisRhoDipDot, & ! rate of change of dipole dislocation densities for this mechanism
|
||||||
dDipMin, & ! minimum stable dipole distance for edges and screws
|
dLower, & ! minimum stable dipole distance for edges and screws
|
||||||
dDipMax, & ! current maximum stable dipole distance for edges and screws
|
dUpper, & ! current maximum stable dipole distance for edges and screws
|
||||||
dDipMax0, & ! maximum stable dipole distance for edges and screws at start of crystallite increment
|
dUpper0, & ! maximum stable dipole distance for edges and screws at start of crystallite increment
|
||||||
dDipMaxDot ! rate of change of the maximum stable dipole distance for edges and screws
|
dUpperDot ! rate of change of the maximum stable dipole distance for edges and screws
|
||||||
real(pReal), dimension(3,constitutive_nonlocal_totalNslip(phase_constitutionInstance(material_phase(g,ip,el))),4) :: &
|
real(pReal), dimension(3,constitutive_nonlocal_totalNslip(phase_constitutionInstance(material_phase(g,ip,el))),4) :: &
|
||||||
m ! direction of dislocation motion
|
m ! direction of dislocation motion
|
||||||
real(pReal), dimension(3,3) :: F, & ! total deformation gradient
|
real(pReal), dimension(3,3) :: F, & ! total deformation gradient
|
||||||
|
@ -1122,6 +1182,7 @@ real(pReal) norm_surfaceNormal, & ! euclidic
|
||||||
area, & ! area of the current interface
|
area, & ! area of the current interface
|
||||||
detFe, & ! determinant of elastic defornmation gradient
|
detFe, & ! determinant of elastic defornmation gradient
|
||||||
D ! self diffusion
|
D ! self diffusion
|
||||||
|
logical flipAreaNormal
|
||||||
|
|
||||||
myInstance = phase_constitutionInstance(material_phase(g,ip,el))
|
myInstance = phase_constitutionInstance(material_phase(g,ip,el))
|
||||||
myStructure = constitutive_nonlocal_structure(myInstance)
|
myStructure = constitutive_nonlocal_structure(myInstance)
|
||||||
|
@ -1131,10 +1192,10 @@ tauSlip = 0.0_pReal
|
||||||
subTauSlip0 = 0.0_pReal
|
subTauSlip0 = 0.0_pReal
|
||||||
v = 0.0_pReal
|
v = 0.0_pReal
|
||||||
gdot = 0.0_pReal
|
gdot = 0.0_pReal
|
||||||
dDipMin = 0.0_pReal
|
dLower = 0.0_pReal
|
||||||
dDipMax = 0.0_pReal
|
dUpper = 0.0_pReal
|
||||||
dDipMax0 = 0.0_pReal
|
dUpper0 = 0.0_pReal
|
||||||
dDipMaxDot = 0.0_pReal
|
dUpperDot = 0.0_pReal
|
||||||
totalRhoDot = 0.0_pReal
|
totalRhoDot = 0.0_pReal
|
||||||
thisRhoDot = 0.0_pReal
|
thisRhoDot = 0.0_pReal
|
||||||
totalRhoDipDot = 0.0_pReal
|
totalRhoDipDot = 0.0_pReal
|
||||||
|
@ -1154,16 +1215,15 @@ subTdislocation0_v = subState0(g,ip,el)%p(8*ns+1:8*ns+6)
|
||||||
!*** Calculate shear rate
|
!*** Calculate shear rate
|
||||||
|
|
||||||
do s = 1,ns ! loop over slip systems
|
do s = 1,ns ! loop over slip systems
|
||||||
|
sLattice = constitutive_nonlocal_slipSystemLattice(s,myInstance)
|
||||||
|
|
||||||
tauSlip(s) = math_mul6x6( Tstar_v + Tdislocation_v, &
|
tauSlip(s) = math_mul6x6( Tstar_v + Tdislocation_v, lattice_Sslip_v(:,sLattice,myStructure) )
|
||||||
lattice_Sslip_v(:,constitutive_nonlocal_slipSystemLattice(s,myInstance),myStructure) )
|
subTauSlip0(s) = math_mul6x6( subTstar0_v + subTdislocation0_v, lattice_Sslip_v(:,sLattice,myStructure) )
|
||||||
|
|
||||||
subTauSlip0(s) = math_mul6x6( subTstar0_v - subTdislocation0_v, &
|
|
||||||
lattice_Sslip_v(:,constitutive_nonlocal_slipSystemLattice(s,myInstance),myStructure) )
|
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
v = constitutive_nonlocal_v0PerSlipSystem(:,myInstance) &
|
v = constitutive_nonlocal_v0PerSlipSystem(:,myInstance) &
|
||||||
* exp( - constitutive_nonlocal_G / ( kB * Temperature) * (1.0_pReal - (abs(tauSlip)/tauSlipThreshold) ) ) &
|
* exp( - constitutive_nonlocal_Q0(myInstance) / ( kB * Temperature) * (1.0_pReal - (abs(tauSlip)/tauSlipThreshold) ) ) &
|
||||||
* sign(1.0_pReal,tauSlip)
|
* sign(1.0_pReal,tauSlip)
|
||||||
|
|
||||||
forall (t = 1:4) &
|
forall (t = 1:4) &
|
||||||
|
@ -1178,6 +1238,32 @@ if (debugger) then
|
||||||
write(6,'(a,/,12(e12.3,x),/)') 'v', v
|
write(6,'(a,/,12(e12.3,x),/)') 'v', v
|
||||||
write(6,'(a,/,4(12(f12.5,x),/))') 'gdot / 1e-3', gdot*1e3_pReal
|
write(6,'(a,/,4(12(f12.5,x),/))') 'gdot / 1e-3', gdot*1e3_pReal
|
||||||
write(6,'(a,/,(12(f12.5,x),/))') 'gdot total/ 1e-3', sum(gdot,2)*1e3_pReal
|
write(6,'(a,/,(12(f12.5,x),/))') 'gdot total/ 1e-3', sum(gdot,2)*1e3_pReal
|
||||||
|
call flush(6)
|
||||||
|
!$OMP CRITICAL (write2out)
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
!****************************************************************************
|
||||||
|
!*** calculate limits for stable dipole height and its rate of change
|
||||||
|
|
||||||
|
dLower(:,1) = constitutive_nonlocal_dLowerEdgePerSlipSystem(:,myInstance)
|
||||||
|
dLower(:,2) = constitutive_nonlocal_dLowerScrewPerSlipSystem(:,myInstance)
|
||||||
|
dUpper(:,2) = min( constitutive_nonlocal_Gmod(myInstance) * constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) &
|
||||||
|
/ ( 8.0_pReal * pi * abs(tauSlip) ), &
|
||||||
|
1.0_pReal / sqrt( sum(rho,2)+sum(rhoDip,2) ) )
|
||||||
|
dUpper(:,1) = dUpper(:,2) / ( 1.0_pReal - constitutive_nonlocal_nu(myInstance) )
|
||||||
|
dUpper0(:,2) = min( constitutive_nonlocal_Gmod(myInstance) * constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) &
|
||||||
|
/ ( 8.0_pReal * pi * abs(subTauSlip0) ), &
|
||||||
|
1.0_pReal / sqrt( sum(rho,2)+sum(rhoDip,2) ) )
|
||||||
|
dUpper0(:,1) = dUpper0(:,2) / ( 1.0_pReal - constitutive_nonlocal_nu(myInstance) )
|
||||||
|
|
||||||
|
if (subdt > 0) dUpperDot = (dUpper - dUpper0) / subdt
|
||||||
|
|
||||||
|
if (debugger) then
|
||||||
|
!$OMP CRITICAL (write2out)
|
||||||
|
write(6,'(a,/,2(12(e12.5,x),/))') 'dUpper:',dUpper
|
||||||
|
write(6,'(a,/,2(12(e12.5,x),/))') 'dUpperDot:',dUpperDot
|
||||||
|
call flush(6)
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -1185,12 +1271,10 @@ endif
|
||||||
!****************************************************************************
|
!****************************************************************************
|
||||||
!*** calculate dislocation multiplication
|
!*** calculate dislocation multiplication
|
||||||
|
|
||||||
thisRhoDot = 0.0_pReal
|
|
||||||
thisRhoDipDot = 0.0_pReal
|
|
||||||
|
|
||||||
invLambda = sqrt(rhoForest) / constitutive_nonlocal_lambda0PerSlipSystem(:,myInstance)
|
invLambda = sqrt(rhoForest) / constitutive_nonlocal_lambda0PerSlipSystem(:,myInstance)
|
||||||
|
|
||||||
thisRhoDot = spread(0.25_pReal * sum(abs(gdot),2) * invLambda / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance), 2, 4)
|
thisRhoDot = spread(0.25_pReal * sum(abs(gdot),2) * invLambda / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance), 2, 4)
|
||||||
|
thisRhoDipDot = 0.0_pReal ! dipoles don't multiplicate
|
||||||
|
|
||||||
totalRhoDot = totalRhoDot + thisRhoDot
|
totalRhoDot = totalRhoDot + thisRhoDot
|
||||||
totalRhoDipDot = totalRhoDipDot + thisRhoDipDot
|
totalRhoDipDot = totalRhoDipDot + thisRhoDipDot
|
||||||
|
@ -1198,6 +1282,7 @@ totalRhoDipDot = totalRhoDipDot + thisRhoDipDot
|
||||||
if (debugger) then
|
if (debugger) then
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,'(a,/,6(12(e12.5,x),/))') 'dislocation multiplication', thisRhoDot * subdt, thisRhoDipDot * subdt
|
write(6,'(a,/,6(12(e12.5,x),/))') 'dislocation multiplication', thisRhoDot * subdt, thisRhoDipDot * subdt
|
||||||
|
call flush(6)
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -1220,8 +1305,32 @@ do n = 1,FE_NipNeighbors(mesh_element(2,el))
|
||||||
|
|
||||||
neighboring_el = mesh_ipNeighborhood(1,n,ip,el)
|
neighboring_el = mesh_ipNeighborhood(1,n,ip,el)
|
||||||
neighboring_ip = mesh_ipNeighborhood(2,n,ip,el)
|
neighboring_ip = mesh_ipNeighborhood(2,n,ip,el)
|
||||||
|
flipAreaNormal = .false.
|
||||||
|
|
||||||
! if neighbor exists, total deformation gradient is averaged over me and my neighbor
|
! if neighbor exists, total deformation gradient is averaged over me and my neighbor
|
||||||
|
if (periodicBC .and. (neighboring_el == 0 .or. neighboring_ip == 0) ) then
|
||||||
|
flipAreaNormal = .true.
|
||||||
|
select case (n)
|
||||||
|
case (1)
|
||||||
|
neighboring_el = mesh_ipNeighborhood(1,2,ip,el)
|
||||||
|
neighboring_ip = mesh_ipNeighborhood(2,2,ip,el)
|
||||||
|
case (2)
|
||||||
|
neighboring_el = mesh_ipNeighborhood(1,1,ip,el)
|
||||||
|
neighboring_ip = mesh_ipNeighborhood(2,1,ip,el)
|
||||||
|
case (3)
|
||||||
|
neighboring_el = mesh_ipNeighborhood(1,4,ip,el)
|
||||||
|
neighboring_ip = mesh_ipNeighborhood(2,4,ip,el)
|
||||||
|
case (4)
|
||||||
|
neighboring_el = mesh_ipNeighborhood(1,3,ip,el)
|
||||||
|
neighboring_ip = mesh_ipNeighborhood(2,3,ip,el)
|
||||||
|
case (5)
|
||||||
|
neighboring_el = mesh_ipNeighborhood(1,6,ip,el)
|
||||||
|
neighboring_ip = mesh_ipNeighborhood(2,6,ip,el)
|
||||||
|
case (6)
|
||||||
|
neighboring_el = mesh_ipNeighborhood(1,5,ip,el)
|
||||||
|
neighboring_ip = mesh_ipNeighborhood(2,5,ip,el)
|
||||||
|
endselect
|
||||||
|
endif
|
||||||
if ( neighboring_el > 0 .and. neighboring_ip > 0 ) then
|
if ( neighboring_el > 0 .and. neighboring_ip > 0 ) then
|
||||||
neighboring_F = math_mul33x33(Fe(:,:,g,neighboring_ip,neighboring_el), Fp(:,:,g,neighboring_ip,neighboring_el))
|
neighboring_F = math_mul33x33(Fe(:,:,g,neighboring_ip,neighboring_el), Fp(:,:,g,neighboring_ip,neighboring_el))
|
||||||
Favg = 0.5_pReal * (F + neighboring_F)
|
Favg = 0.5_pReal * (F + neighboring_F)
|
||||||
|
@ -1230,8 +1339,13 @@ do n = 1,FE_NipNeighbors(mesh_element(2,el))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
! calculate the area and the surface normal (of unit length) of the interface in lattice configuration
|
! calculate the area and the surface normal (of unit length) of the interface in lattice configuration
|
||||||
surfaceNormal = math_det3x3(Favg) / detFe &
|
if (flipAreaNormal) then
|
||||||
* math_mul33x3(transpose(Fe(:,:,g,ip,el)), math_mul33x3(Favg,mesh_ipAreaNormal(:,n,ip,el)))
|
surfaceNormal = math_det3x3(Favg) / detFe &
|
||||||
|
* math_mul33x3(transpose(Fe(:,:,g,ip,el)), math_mul33x3(Favg,-mesh_ipAreaNormal(:,n,ip,el)))
|
||||||
|
else
|
||||||
|
surfaceNormal = math_det3x3(Favg) / detFe &
|
||||||
|
* math_mul33x3(transpose(Fe(:,:,g,ip,el)), math_mul33x3(Favg,mesh_ipAreaNormal(:,n,ip,el)))
|
||||||
|
endif
|
||||||
norm_surfaceNormal = math_norm3(surfaceNormal)
|
norm_surfaceNormal = math_norm3(surfaceNormal)
|
||||||
surfaceNormal = surfaceNormal / norm_surfaceNormal
|
surfaceNormal = surfaceNormal / norm_surfaceNormal
|
||||||
area = mesh_ipArea(n,ip,el) * norm_surfaceNormal
|
area = mesh_ipArea(n,ip,el) * norm_surfaceNormal
|
||||||
|
@ -1245,7 +1359,7 @@ do n = 1,FE_NipNeighbors(mesh_element(2,el))
|
||||||
lineLength(s,t) = gdot(s,t) / constitutive_nonlocal_burgersPerSlipSystem(s,myInstance) &
|
lineLength(s,t) = gdot(s,t) / constitutive_nonlocal_burgersPerSlipSystem(s,myInstance) &
|
||||||
* math_mul3x3(m(:,s,t),surfaceNormal) * area ! dislocation line length that leaves this interface per second
|
* math_mul3x3(m(:,s,t),surfaceNormal) * area ! dislocation line length that leaves this interface per second
|
||||||
|
|
||||||
thisRhoDot(s,t) = thisRhoDot(s,t) - lineLength(s,t) / mesh_ipVolume(ip,el) ! subtract dislocation density rate (= line length over volume) that leaves through an interface from my dotState ...
|
thisRhoDot(s,t) = thisRhoDot(s,t) - lineLength(s,t) / mesh_ipVolume(ip,el) ! subtract dislocation density rate (= line length over volume) that leaves through an interface from my dotState ...
|
||||||
|
|
||||||
if ( neighboring_el > 0 .and. neighboring_ip > 0 ) then
|
if ( neighboring_el > 0 .and. neighboring_ip > 0 ) then
|
||||||
!*****************************************************************************************************
|
!*****************************************************************************************************
|
||||||
|
@ -1265,6 +1379,7 @@ totalRhoDipDot = totalRhoDipDot + thisRhoDipDot
|
||||||
if (debugger) then
|
if (debugger) then
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,'(a,/,6(12(e12.5,x),/))') 'dislocation flux', thisRhoDot * subdt, thisRhoDipDot * subdt
|
write(6,'(a,/,6(12(e12.5,x),/))') 'dislocation flux', thisRhoDot * subdt, thisRhoDipDot * subdt
|
||||||
|
call flush(6)
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -1272,36 +1387,14 @@ endif
|
||||||
!****************************************************************************
|
!****************************************************************************
|
||||||
!*** calculate dipole formation and annihilation
|
!*** calculate dipole formation and annihilation
|
||||||
|
|
||||||
!*** limits for stable dipole height and its tate of change
|
|
||||||
|
|
||||||
dDipMin(:,1) = constitutive_nonlocal_dDipMinEdgePerSlipSystem(:,myInstance)
|
|
||||||
dDipMin(:,2) = constitutive_nonlocal_dDipMinScrewPerSlipSystem(:,myInstance)
|
|
||||||
dDipMax(:,2) = min( constitutive_nonlocal_Gmod(myInstance) * constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) &
|
|
||||||
/ ( 8.0_pReal * pi * abs(tauSlip) ), &
|
|
||||||
1.0_pReal / sqrt( 0.5_pReal * (rhoDip(:,1)+rhoDip(:,2)) ) )
|
|
||||||
dDipMax(:,1) = dDipMax(:,2) / ( 1.0_pReal - constitutive_nonlocal_nu(myInstance) )
|
|
||||||
dDipMax0(:,2) = min( constitutive_nonlocal_Gmod(myInstance) * constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) &
|
|
||||||
/ ( 8.0_pReal * pi * abs(subTauSlip0) ), &
|
|
||||||
1.0_pReal / sqrt( 0.5_pReal * (rhoDip(:,1)+rhoDip(:,2)) ) )
|
|
||||||
dDipMax0(:,1) = dDipMax0(:,2) / ( 1.0_pReal - constitutive_nonlocal_nu(myInstance) )
|
|
||||||
|
|
||||||
dDipMaxDot(:,1) = (dDipMax(:,1) - dDipMax0(:,1)) / subdt
|
|
||||||
dDipMaxDot(:,2) = (dDipMax(:,2) - dDipMax0(:,2)) / subdt
|
|
||||||
! if (debugger) write(6,'(a,/,2(12(e12.5,x),/))') 'dDipMax:',dDipMax
|
|
||||||
! if (debugger) write(6,'(a,/,2(12(e12.5,x),/))') 'dDipMaxDot:',dDipMaxDot
|
|
||||||
|
|
||||||
|
|
||||||
!*** formation by glide
|
!*** formation by glide
|
||||||
|
|
||||||
thisRhoDot = 0.0_pReal
|
|
||||||
thisRhoDipDot = 0.0_pReal
|
|
||||||
|
|
||||||
forall (c=1:2) &
|
forall (c=1:2) &
|
||||||
thisRhoDipDot(:,c) = 4.0_pReal * dDipMax(:,c) / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) &
|
thisRhoDipDot(:,c) = 4.0_pReal * dUpper(:,c) / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) &
|
||||||
* ( rho(:,2*c-1)*abs(gdot(:,2*c)) + rho(:,2*c)*abs(gdot(:,2*c-1)) )
|
* ( rho(:,2*c-1)*abs(gdot(:,2*c)) + rho(:,2*c)*abs(gdot(:,2*c-1)) )
|
||||||
|
|
||||||
forall (t=1:4) &
|
forall (t=1:4) &
|
||||||
thisRhoDot(:,t) = 0.5_pReal * thisRhoDipDot(:,mod(t+1,2)+1)
|
thisRhoDot(:,t) = -0.5_pReal * thisRhoDipDot(:,(t-1)/2+1)
|
||||||
|
|
||||||
totalRhoDot = totalRhoDot + thisRhoDot
|
totalRhoDot = totalRhoDot + thisRhoDot
|
||||||
totalRhoDipDot = totalRhoDipDot + thisRhoDipDot
|
totalRhoDipDot = totalRhoDipDot + thisRhoDipDot
|
||||||
|
@ -1309,19 +1402,18 @@ totalRhoDipDot = totalRhoDipDot + thisRhoDipDot
|
||||||
if (debugger) then
|
if (debugger) then
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,'(a,/,6(12(e12.5,x),/))') 'dipole formation by glide', thisRhoDot * subdt, thisRhoDipDot * subdt
|
write(6,'(a,/,6(12(e12.5,x),/))') 'dipole formation by glide', thisRhoDot * subdt, thisRhoDipDot * subdt
|
||||||
|
call flush(6)
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
!*** athermal annihilation
|
!*** athermal annihilation
|
||||||
|
|
||||||
thisRhoDot = 0.0_pReal
|
|
||||||
thisRhoDipDot = 0.0_pReal
|
|
||||||
|
|
||||||
forall (c=1:2) &
|
forall (c=1:2) &
|
||||||
thisRhoDipDot(:,c) = - 4.0_pReal * dDipMin(:,c) / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) &
|
thisRhoDipDot(:,c) = - 4.0_pReal * dLower(:,c) / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) &
|
||||||
* ( rho(:,2*c-1)*abs(gdot(:,2*c)) + rho(:,2*c)*abs(gdot(:,2*c-1)) & ! single hits single
|
* ( rho(:,2*c-1)*abs(gdot(:,2*c)) + rho(:,2*c)*abs(gdot(:,2*c-1)) & ! was single hitting single
|
||||||
+ 0.5_pReal * rhoDip(:,c) * (abs(gdot(:,2*c-1))+abs(gdot(:,2*c))) ) ! single knocks dipole constituent
|
+ 0.5_pReal * rhoDip(:,c) * (abs(gdot(:,2*c-1))+abs(gdot(:,2*c))) ) ! single knocks dipole constituent
|
||||||
|
thisRhoDot = 0.0_pReal ! singles themselves don't annihilate
|
||||||
|
|
||||||
totalRhoDot = totalRhoDot + thisRhoDot
|
totalRhoDot = totalRhoDot + thisRhoDot
|
||||||
totalRhoDipDot = totalRhoDipDot + thisRhoDipDot
|
totalRhoDipDot = totalRhoDipDot + thisRhoDipDot
|
||||||
|
@ -1329,22 +1421,22 @@ totalRhoDipDot = totalRhoDipDot + thisRhoDipDot
|
||||||
if (debugger) then
|
if (debugger) then
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,'(a,/,6(12(e12.5,x),/))') 'athermal dipole annihilation', thisRhoDot * subdt, thisRhoDipDot * subdt
|
write(6,'(a,/,6(12(e12.5,x),/))') 'athermal dipole annihilation', thisRhoDot * subdt, thisRhoDipDot * subdt
|
||||||
|
call flush(6)
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
!*** thermally activated annihilation
|
!*** thermally activated annihilation of dipoles
|
||||||
|
|
||||||
thisRhoDot = 0.0_pReal
|
|
||||||
thisRhoDipDot = 0.0_pReal
|
|
||||||
|
|
||||||
D = constitutive_nonlocal_D0(myInstance) * exp(-constitutive_nonlocal_Qsd(myInstance) / (kB * Temperature))
|
D = constitutive_nonlocal_D0(myInstance) * exp(-constitutive_nonlocal_Qsd(myInstance) / (kB * Temperature))
|
||||||
|
|
||||||
vClimb = constitutive_nonlocal_atomicVolume(myInstance) * D / ( kB * Temperature ) &
|
vClimb = constitutive_nonlocal_atomicVolume(myInstance) * D / ( kB * Temperature ) &
|
||||||
* constitutive_nonlocal_Gmod(myInstance) / ( 2.0_pReal * pi * (1.0_pReal-constitutive_nonlocal_nu(myInstance)) ) &
|
* constitutive_nonlocal_Gmod(myInstance) / ( 2.0_pReal * pi * (1.0_pReal-constitutive_nonlocal_nu(myInstance)) ) &
|
||||||
* 2.0_pReal / ( dDipMax(:,1) + dDipMin(:,1) )
|
* 2.0_pReal / ( dUpper(:,1) + dLower(:,1) )
|
||||||
|
|
||||||
thisRhoDipDot(:,1) = - 4.0_pReal * rho(:,1) * vClimb / ( dDipMax(:,1) - dDipMin(:,1) )
|
thisRhoDipDot(:,1) = - 4.0_pReal * rhoDip(:,1) * vClimb / ( dUpper(:,1) - dLower(:,1) ) ! edge climb
|
||||||
|
thisRhoDipDot(:,2) = 0.0_pReal !!! cross slipping still has to be implemented !!!
|
||||||
|
thisRhoDot = 0.0_pReal
|
||||||
|
|
||||||
totalRhoDot = totalRhoDot + thisRhoDot
|
totalRhoDot = totalRhoDot + thisRhoDot
|
||||||
totalRhoDipDot = totalRhoDipDot + thisRhoDipDot
|
totalRhoDipDot = totalRhoDipDot + thisRhoDipDot
|
||||||
|
@ -1352,30 +1444,46 @@ totalRhoDipDot = totalRhoDipDot + thisRhoDipDot
|
||||||
if (debugger) then
|
if (debugger) then
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,'(a,/,6(12(e12.5,x),/))') 'thermally activated dipole annihilation', thisRhoDot * subdt, thisRhoDipDot * subdt
|
write(6,'(a,/,6(12(e12.5,x),/))') 'thermally activated dipole annihilation', thisRhoDot * subdt, thisRhoDipDot * subdt
|
||||||
|
call flush(6)
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
!*** formation by stress decrease = increase in dDipMax
|
|
||||||
|
|
||||||
! !!! MISSING !!!
|
!*** formation by stress change = alteration in dUpper
|
||||||
|
|
||||||
|
thisRhoDipDot = 0.0_pReal
|
||||||
|
|
||||||
!*** dipole dissociation by increased stress = decrease in dDipMax
|
forall (c=1:2, s=1:ns, dUpperDot(s,c) > 0) & ! stress decrease
|
||||||
|
thisRhoDipDot(s,c) = 8.0_pReal * rho(s,2*c-1) * rho(s,2*c) * dUpper(s,c) * dUpperDot(s,c)
|
||||||
|
forall (c=1:2, s=1:ns, dUpperDot(s,c) < 0) & ! increased stress
|
||||||
|
thisRhoDipDot(s,c) = rhoDip(s,c) * dUpperDot(s,c) / (dUpper(s,c) - dLower(s,c))
|
||||||
|
|
||||||
! !!! MISSING !!!
|
forall (t=1:4) &
|
||||||
|
thisRhoDot(:,t) = -0.5_pReal * thisRhoDipDot(:,(t-1)/2+1)
|
||||||
|
|
||||||
|
totalRhoDot = totalRhoDot + thisRhoDot
|
||||||
|
totalRhoDipDot = totalRhoDipDot + thisRhoDipDot
|
||||||
|
|
||||||
|
if (debugger) then
|
||||||
|
!$OMP CRITICAL (write2out)
|
||||||
|
write(6,'(a,/,6(12(e12.5,x),/))') 'dipole stability by stress change', thisRhoDot * subdt, thisRhoDipDot * subdt
|
||||||
|
call flush(6)
|
||||||
|
!$OMP CRITICAL (write2out)
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
!****************************************************************************
|
!****************************************************************************
|
||||||
!*** assign the rates of dislocation densities to my dotState
|
!*** assign the rates of dislocation densities to my dotState
|
||||||
|
|
||||||
dotState(1,ip,el)%p(1:4*ns) = reshape(totalRhoDot,(/4*ns/))
|
dotState(1,ip,el)%p(1:4*ns) = reshape(totalRhoDot,(/4*ns/)) ! one-dimension only (linear list)
|
||||||
dotState(1,ip,el)%p(4*ns+1:6*ns) = reshape(totalRhoDipDot,(/2*ns/))
|
dotState(1,ip,el)%p(4*ns+1:6*ns) = reshape(totalRhoDipDot,(/2*ns/))
|
||||||
|
|
||||||
if (debugger) then
|
if (debugger) then
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,'(a,/,4(12(e12.5,x),/))') 'deltaRho:', totalRhoDot * subdt
|
write(6,'(a,/,4(12(e12.5,x),/))') 'deltaRho:', totalRhoDot * subdt
|
||||||
write(6,'(a,/,2(12(e12.5,x),/))') 'deltaRhoDip:', totalRhoDipDot * subdt
|
write(6,'(a,/,2(12(e12.5,x),/))') 'deltaRhoDip:', totalRhoDipDot * subdt
|
||||||
|
call flush(6)
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -1419,12 +1527,13 @@ endfunction
|
||||||
!*********************************************************************
|
!*********************************************************************
|
||||||
!* return array of constitutive results *
|
!* return array of constitutive results *
|
||||||
!*********************************************************************
|
!*********************************************************************
|
||||||
pure function constitutive_nonlocal_postResults(Tstar_v, Temperature, dt, state, g, ip, el)
|
pure function constitutive_nonlocal_postResults(Tstar_v, subTstar0_v, Temperature, dt, subdt, state, subState0, dotState, g, ip, el)
|
||||||
|
|
||||||
use prec, only: pReal, &
|
use prec, only: pReal, &
|
||||||
pInt, &
|
pInt, &
|
||||||
p_vec
|
p_vec
|
||||||
use math, only: math_mul6x6
|
use math, only: math_mul6x6, &
|
||||||
|
pi
|
||||||
use mesh, only: mesh_NcpElems, &
|
use mesh, only: mesh_NcpElems, &
|
||||||
mesh_maxNips
|
mesh_maxNips
|
||||||
use material, only: homogenization_maxNgrains, &
|
use material, only: homogenization_maxNgrains, &
|
||||||
|
@ -1440,10 +1549,14 @@ integer(pInt), intent(in) :: g, & ! current grain nu
|
||||||
ip, & ! current integration point
|
ip, & ! current integration point
|
||||||
el ! current element number
|
el ! current element number
|
||||||
real(pReal), intent(in) :: dt, & ! time increment
|
real(pReal), intent(in) :: dt, & ! time increment
|
||||||
|
subdt, & ! time increment of crystallite substep
|
||||||
Temperature ! temperature
|
Temperature ! temperature
|
||||||
real(pReal), dimension(6), intent(in) :: Tstar_v ! 2nd Piola-Kirchhoff stress in Mandel notation
|
real(pReal), dimension(6), intent(in) :: Tstar_v, & ! 2nd Piola-Kirchhoff stress in Mandel notation
|
||||||
|
subTstar0_v ! 2nd Piola-Kirchhoff stress in Mandel notation at start of crystallite inc
|
||||||
type(p_vec), dimension(homogenization_maxNgrains, mesh_maxNips, mesh_NcpElems), intent(in) :: &
|
type(p_vec), dimension(homogenization_maxNgrains, mesh_maxNips, mesh_NcpElems), intent(in) :: &
|
||||||
state ! microstructural state
|
state, & ! microstructural state
|
||||||
|
subState0, & ! microstructural state at start of crystallite inc
|
||||||
|
dotState ! evolution rate of microstructural state
|
||||||
|
|
||||||
!*** output variables
|
!*** output variables
|
||||||
real(pReal), dimension(constitutive_nonlocal_sizePostResults(phase_constitutionInstance(material_phase(g,ip,el)))) :: &
|
real(pReal), dimension(constitutive_nonlocal_sizePostResults(phase_constitutionInstance(material_phase(g,ip,el)))) :: &
|
||||||
|
@ -1455,95 +1568,227 @@ integer(pInt) myInstance, & ! current instance
|
||||||
ns, & ! short notation for the total number of active slip systems
|
ns, & ! short notation for the total number of active slip systems
|
||||||
o, & ! index of current output
|
o, & ! index of current output
|
||||||
s, & ! index of current slip system
|
s, & ! index of current slip system
|
||||||
sLattice, & ! index of current slip system as specified by lattice
|
sLattice, & ! index of my current slip system according to lattice order
|
||||||
c
|
cs, & ! constitutive result index
|
||||||
real(pReal) tau, & ! resolved shear stress on current slip system
|
c, & ! character of dislocation
|
||||||
v ! dislocation velocity on current slip system
|
t ! type of dislocation
|
||||||
|
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_constitutionInstance(material_phase(g,ip,el))),4) :: &
|
||||||
|
rho, & ! dislocation densities (positive/negative screw and edge without dipoles)
|
||||||
|
rhoDot, & ! evolution rate of dislocation densities (positive/negative screw and edge without dipoles)
|
||||||
|
gdot ! shear rates
|
||||||
|
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_constitutionInstance(material_phase(g,ip,el)))) :: &
|
||||||
|
rhoForest, & ! forest dislocation density
|
||||||
|
tauSlipThreshold, & ! threshold shear stress
|
||||||
|
tauSlip, & ! current resolved shear stress
|
||||||
|
subTauSlip0, & ! resolved shear stress at start of crystallite increment
|
||||||
|
v, & ! dislocation velocity
|
||||||
|
invLambda, & ! inverse of mean free path for dislocations
|
||||||
|
vClimb ! climb velocity of edge dipoles
|
||||||
|
real(pReal), dimension(constitutive_nonlocal_totalNslip(phase_constitutionInstance(material_phase(g,ip,el))),2) :: &
|
||||||
|
rhoDip, & ! dipole dislocation densities (screw and edge dipoles)
|
||||||
|
rhoDipDot, & ! evolution rate of dipole dislocation densities (screw and edge dipoles)
|
||||||
|
dLower, & ! minimum stable dipole distance for edges and screws
|
||||||
|
dUpper, & ! current maximum stable dipole distance for edges and screws
|
||||||
|
dUpper0, & ! maximum stable dipole distance for edges and screws at start of crystallite increment
|
||||||
|
dUpperDot ! rate of change of the maximum stable dipole distance for edges and screws
|
||||||
|
real(pReal), dimension(6) :: Tdislocation_v, & ! current dislocation stress (resulting from the neighboring excess dislocation densities) as 2nd Piola-Kirchhoff stress
|
||||||
|
subTdislocation0_v ! dislocation stress (resulting from the neighboring excess dislocation densities) as 2nd Piola-Kirchhoff stress at start of crystallite increment
|
||||||
|
real(pReal) D ! self diffusion
|
||||||
|
|
||||||
|
|
||||||
myInstance = phase_constitutionInstance(material_phase(g,ip,el))
|
myInstance = phase_constitutionInstance(material_phase(g,ip,el))
|
||||||
myStructure = constitutive_nonlocal_structure(myInstance)
|
myStructure = constitutive_nonlocal_structure(myInstance)
|
||||||
ns = constitutive_nonlocal_totalNslip(myInstance)
|
ns = constitutive_nonlocal_totalNslip(myInstance)
|
||||||
|
|
||||||
|
cs = 0_pInt
|
||||||
c = 0_pInt
|
|
||||||
constitutive_nonlocal_postResults = 0.0_pReal
|
constitutive_nonlocal_postResults = 0.0_pReal
|
||||||
|
|
||||||
|
|
||||||
|
! short hand notations for state variables
|
||||||
|
forall (t = 1:4) rho(:,t) = state(g,ip,el)%p((t-1)*ns+1:t*ns)
|
||||||
|
forall (c = 1:2) rhoDip(:,c) = state(g,ip,el)%p((3+c)*ns+1:(4+c)*ns)
|
||||||
|
rhoForest = state(g,ip,el)%p(6*ns+1:7*ns)
|
||||||
|
tauSlipThreshold = state(g,ip,el)%p(7*ns+1:8*ns)
|
||||||
|
Tdislocation_v = state(g,ip,el)%p(8*ns+1:8*ns+6)
|
||||||
|
subTdislocation0_v = subState0(g,ip,el)%p(8*ns+1:8*ns+6)
|
||||||
|
forall (t = 1:4) rhoDot(:,t) = dotState(g,ip,el)%p((t-1)*ns+1:t*ns)
|
||||||
|
forall (c = 1:2) rhoDipDot(:,c) = dotState(g,ip,el)%p((3+c)*ns+1:(4+c)*ns)
|
||||||
|
|
||||||
|
|
||||||
|
! Calculate shear rate
|
||||||
|
do s = 1,ns
|
||||||
|
sLattice = constitutive_nonlocal_slipSystemLattice(s,myInstance)
|
||||||
|
tauSlip(s) = math_mul6x6( Tstar_v + Tdislocation_v, lattice_Sslip_v(:,sLattice,myStructure) )
|
||||||
|
subTauSlip0(s) = math_mul6x6( subTstar0_v + subTdislocation0_v, lattice_Sslip_v(:,sLattice,myStructure) )
|
||||||
|
enddo
|
||||||
|
|
||||||
|
v = constitutive_nonlocal_v0PerSlipSystem(:,myInstance) &
|
||||||
|
* exp( - constitutive_nonlocal_Q0(myInstance) / ( kB * Temperature) * (1.0_pReal - (abs(tauSlip)/tauSlipThreshold) ) ) &
|
||||||
|
* sign(1.0_pReal,tauSlip)
|
||||||
|
|
||||||
|
forall (t = 1:4) &
|
||||||
|
gdot(:,t) = rho(:,t) * constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) * v
|
||||||
|
|
||||||
|
|
||||||
|
! calculate limits for stable dipole height and its rate of change
|
||||||
|
dLower(:,1) = constitutive_nonlocal_dLowerEdgePerSlipSystem(:,myInstance)
|
||||||
|
dLower(:,2) = constitutive_nonlocal_dLowerScrewPerSlipSystem(:,myInstance)
|
||||||
|
dUpper(:,2) = min( constitutive_nonlocal_Gmod(myInstance) * constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) &
|
||||||
|
/ ( 8.0_pReal * pi * abs(tauSlip) ), &
|
||||||
|
1.0_pReal / sqrt( sum(rho,2)+sum(rhoDip,2) ) )
|
||||||
|
dUpper(:,1) = dUpper(:,2) / ( 1.0_pReal - constitutive_nonlocal_nu(myInstance) )
|
||||||
|
dUpper0(:,2) = min( constitutive_nonlocal_Gmod(myInstance) * constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) &
|
||||||
|
/ ( 8.0_pReal * pi * abs(subTauSlip0) ), &
|
||||||
|
1.0_pReal / sqrt( sum(rho,2)+sum(rhoDip,2) ) )
|
||||||
|
dUpper0(:,1) = dUpper0(:,2) / ( 1.0_pReal - constitutive_nonlocal_nu(myInstance) )
|
||||||
|
|
||||||
|
if (subdt > 0) then
|
||||||
|
dUpperDot = (dUpper - dUpper0) / subdt
|
||||||
|
else
|
||||||
|
dUpperDot = 0.0_pReal
|
||||||
|
endif
|
||||||
|
|
||||||
do o = 1,phase_Noutput(material_phase(g,ip,el))
|
do o = 1,phase_Noutput(material_phase(g,ip,el))
|
||||||
select case(constitutive_nonlocal_output(o,myInstance))
|
select case(constitutive_nonlocal_output(o,myInstance))
|
||||||
|
|
||||||
case ('rho')
|
case ('rho')
|
||||||
constitutive_nonlocal_postResults(c+1:c+ns) = state(g,ip,el)%p(1:ns) + state(g,ip,el)%p(ns+1:2*ns) &
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = sum(rho,2)
|
||||||
+ state(g,ip,el)%p(2*ns+1:3*ns) + state(g,ip,el)%p(3*ns+1:4*ns)
|
cs = cs + ns
|
||||||
c = c + ns
|
|
||||||
|
case ('delta')
|
||||||
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = 1.0_pReal / sqrt( sum(rho,2) )
|
||||||
|
cs = cs + ns
|
||||||
|
|
||||||
case ('rho_edge')
|
case ('rho_edge')
|
||||||
constitutive_nonlocal_postResults(c+1:c+ns) = state(g,ip,el)%p(1:ns) + state(g,ip,el)%p(ns+1:2*ns)
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = rho(:,1) + rho(:,2)
|
||||||
c = c + ns
|
cs = cs + ns
|
||||||
|
|
||||||
case ('rho_screw')
|
case ('rho_screw')
|
||||||
constitutive_nonlocal_postResults(c+1:c+ns) = state(g,ip,el)%p(2*ns+1:3*ns) + state(g,ip,el)%p(3*ns+1:4*ns)
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = rho(:,3) + rho(:,4)
|
||||||
c = c + ns
|
cs = cs + ns
|
||||||
|
|
||||||
case ('excess_rho')
|
case ('excess_rho')
|
||||||
constitutive_nonlocal_postResults(c+1:c+ns) = state(g,ip,el)%p(1:ns) - state(g,ip,el)%p(ns+1:2*ns) &
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = rho(:,1) - rho(:,2) + rho(:,3) - rho(:,4)
|
||||||
+ state(g,ip,el)%p(2*ns+1:3*ns) - state(g,ip,el)%p(3*ns+1:4*ns)
|
cs = cs + ns
|
||||||
c = c + ns
|
|
||||||
|
|
||||||
case ('excess_rho_edge')
|
case ('excess_rho_edge')
|
||||||
constitutive_nonlocal_postResults(c+1:c+ns) = state(g,ip,el)%p(1:ns) - state(g,ip,el)%p(ns+1:2*ns)
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = rho(:,1) - rho(:,2)
|
||||||
c = c + ns
|
cs = cs + ns
|
||||||
|
|
||||||
case ('excess_rho_screw')
|
case ('excess_rho_screw')
|
||||||
constitutive_nonlocal_postResults(c+1:c+ns) = state(g,ip,el)%p(2*ns+1:3*ns) - state(g,ip,el)%p(3*ns+1:4*ns)
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = rho(:,3) - rho(:,4)
|
||||||
c = c + ns
|
cs = cs + ns
|
||||||
|
|
||||||
case ('rho_forest')
|
case ('rho_forest')
|
||||||
constitutive_nonlocal_postResults(c+1:c+ns) = state(g,ip,el)%p(6*ns+1:7*ns)
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = rhoForest
|
||||||
c = c + ns
|
cs = cs + ns
|
||||||
|
|
||||||
case ('rho_dip')
|
case ('rho_dip')
|
||||||
constitutive_nonlocal_postResults(c+1:c+ns) = state(g,ip,el)%p(4*ns+1:5*ns) + state(g,ip,el)%p(5*ns+1:6*ns)
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = sum(rhoDip,2)
|
||||||
c = c + ns
|
cs = cs + ns
|
||||||
|
|
||||||
|
case ('delta_dip')
|
||||||
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = 1.0_pReal / sqrt( sum(rhoDip,2) )
|
||||||
|
cs = cs + ns
|
||||||
|
|
||||||
case ('rho_edge_dip')
|
case ('rho_edge_dip')
|
||||||
constitutive_nonlocal_postResults(c+1:c+ns) = state(g,ip,el)%p(4*ns+1:5*ns)
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = rhoDip(:,1)
|
||||||
c = c + ns
|
cs = cs + ns
|
||||||
|
|
||||||
case ('rho_screw_dip')
|
case ('rho_screw_dip')
|
||||||
constitutive_nonlocal_postResults(c+1:c+ns) = state(g,ip,el)%p(5*ns+1:6*ns)
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = rhoDip(:,2)
|
||||||
c = c + ns
|
cs = cs + ns
|
||||||
|
|
||||||
case ('shearrate')
|
case ('shearrate')
|
||||||
do s = 1,ns
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = sum(abs(gdot),2)
|
||||||
sLattice = constitutive_nonlocal_slipSystemLattice(s,myInstance)
|
cs = cs + ns
|
||||||
tau = math_mul6x6( Tstar_v + state(g,ip,el)%p(8*ns+1:8*ns+6), lattice_Sslip_v(:,sLattice,myStructure) )
|
|
||||||
|
|
||||||
if (state(g,ip,el)%p(7*ns+s) > 0.0_pReal) then
|
|
||||||
v = constitutive_nonlocal_v0PerSlipSystem(s,myInstance) &
|
|
||||||
* exp( - constitutive_nonlocal_G / ( kB * Temperature) * (1.0_pReal - (abs(tau)/state(g,ip,el)%p(7*ns+s)) ) ) &
|
|
||||||
* sign(1.0_pReal,tau)
|
|
||||||
else
|
|
||||||
v = 0.0_pReal
|
|
||||||
endif
|
|
||||||
|
|
||||||
constitutive_nonlocal_postResults(c+s) = ( state(g,ip,el)%p(s) + state(g,ip,el)%p(ns+s) &
|
|
||||||
+ state(g,ip,el)%p(2*ns+s) + state(g,ip,el)%p(3*ns+s) ) &
|
|
||||||
* constitutive_nonlocal_burgersPerSlipSystem(s,myInstance) * v
|
|
||||||
enddo
|
|
||||||
c = c + ns
|
|
||||||
|
|
||||||
case ('resolvedstress')
|
case ('resolvedstress')
|
||||||
do s = 1,ns
|
do s = 1,ns
|
||||||
sLattice = constitutive_nonlocal_slipSystemLattice(s,myInstance)
|
sLattice = constitutive_nonlocal_slipSystemLattice(s,myInstance)
|
||||||
constitutive_nonlocal_postResults(c+s) = math_mul6x6( Tstar_v + state(g,ip,el)%p(8*ns+1:8*ns+6), &
|
constitutive_nonlocal_postResults(cs+s) = math_mul6x6( Tstar_v + Tdislocation_v, lattice_Sslip_v(:,sLattice,myStructure) )
|
||||||
lattice_Sslip_v(:,sLattice,myStructure) )
|
|
||||||
enddo
|
enddo
|
||||||
c = c + ns
|
cs = cs + ns
|
||||||
|
|
||||||
case ('resistance')
|
case ('resistance')
|
||||||
constitutive_nonlocal_postResults(c+1:c+ns) = state(g,ip,el)%p(7*ns+1:8*ns)
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = tauSlipThreshold
|
||||||
c = c + ns
|
cs = cs + ns
|
||||||
|
|
||||||
|
case ('rho_dot')
|
||||||
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = sum(rhoDot,2)
|
||||||
|
cs = cs + ns
|
||||||
|
|
||||||
|
case ('rho_dot_dip')
|
||||||
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = sum(rhoDipDot,2)
|
||||||
|
cs = cs + ns
|
||||||
|
|
||||||
|
case ('rho_dot_gen')
|
||||||
|
invLambda = sqrt(rhoForest) / constitutive_nonlocal_lambda0PerSlipSystem(:,myInstance)
|
||||||
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = &
|
||||||
|
sum(abs(gdot),2) * invLambda / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance)
|
||||||
|
cs = cs + ns
|
||||||
|
|
||||||
|
case ('rho_dot_sgl2dip')
|
||||||
|
do c=1,2 ! dipole formation by glide
|
||||||
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = constitutive_nonlocal_postResults(cs+1:cs+ns) + &
|
||||||
|
4.0_pReal * dUpper(:,c) / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) &
|
||||||
|
* ( rho(:,2*c-1)*abs(gdot(:,2*c)) + rho(:,2*c)*abs(gdot(:,2*c-1)) )
|
||||||
|
enddo
|
||||||
|
do c=1,2
|
||||||
|
forall (s=1:ns, dUpperDot(s,c) > 0) & ! dipole formation by stress decrease
|
||||||
|
constitutive_nonlocal_postResults(cs+s) = constitutive_nonlocal_postResults(cs+s) + &
|
||||||
|
8.0_pReal * rho(s,2*c-1) * rho(s,2*c) * dUpper(s,c) * dUpperDot(s,c)
|
||||||
|
enddo
|
||||||
|
cs = cs + ns
|
||||||
|
|
||||||
|
case ('rho_dot_dip2sgl')
|
||||||
|
do c=1,2
|
||||||
|
forall (s=1:ns, dUpperDot(s,c) < 0) &
|
||||||
|
constitutive_nonlocal_postResults(cs+s) = constitutive_nonlocal_postResults(cs+s) - &
|
||||||
|
rhoDip(s,c) * dUpperDot(s,c) / (dUpper(s,c) - dLower(s,c))
|
||||||
|
enddo
|
||||||
|
cs = cs + ns
|
||||||
|
|
||||||
|
case ('rho_dot_ann_ath')
|
||||||
|
do c=1,2
|
||||||
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = constitutive_nonlocal_postResults(cs+1:cs+ns) + &
|
||||||
|
4.0_pReal * dLower(:,c) / constitutive_nonlocal_burgersPerSlipSystem(:,myInstance) &
|
||||||
|
* ( rho(:,2*c-1)*abs(gdot(:,2*c)) + rho(:,2*c)*abs(gdot(:,2*c-1)) &
|
||||||
|
+ 0.5_pReal * rhoDip(:,c) * (abs(gdot(:,2*c-1))+abs(gdot(:,2*c))) )
|
||||||
|
enddo
|
||||||
|
cs = cs + ns
|
||||||
|
|
||||||
|
case ('rho_dot_ann_the')
|
||||||
|
D = constitutive_nonlocal_D0(myInstance) * exp(-constitutive_nonlocal_Qsd(myInstance) / (kB * Temperature))
|
||||||
|
|
||||||
|
vClimb = constitutive_nonlocal_atomicVolume(myInstance) * D / ( kB * Temperature ) &
|
||||||
|
* constitutive_nonlocal_Gmod(myInstance) / ( 2.0_pReal * pi * (1.0_pReal-constitutive_nonlocal_nu(myInstance)) ) &
|
||||||
|
* 2.0_pReal / ( dUpper(:,1) + dLower(:,1) )
|
||||||
|
|
||||||
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = 4.0_pReal * rhoDip(:,1) * vClimb / ( dUpper(:,1) - dLower(:,1) )
|
||||||
|
! !!! cross-slip of screws missing !!!
|
||||||
|
cs = cs + ns
|
||||||
|
|
||||||
|
case ('rho_dot_flux')
|
||||||
|
! !!! still has to be implemented !!!
|
||||||
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = 0.0_pReal
|
||||||
|
cs = cs + ns
|
||||||
|
|
||||||
|
case ('d_upper_edge')
|
||||||
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = dUpper(:,1)
|
||||||
|
cs = cs + ns
|
||||||
|
|
||||||
|
case ('d_upper_screw')
|
||||||
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = dUpper(:,2)
|
||||||
|
cs = cs + ns
|
||||||
|
|
||||||
|
case ('d_upper_dot_edge')
|
||||||
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = dUpperDot(:,1)
|
||||||
|
cs = cs + ns
|
||||||
|
|
||||||
|
case ('d_upper_dot_screw')
|
||||||
|
constitutive_nonlocal_postResults(cs+1:cs+ns) = dUpperDot(:,2)
|
||||||
|
cs = cs + ns
|
||||||
|
|
||||||
end select
|
end select
|
||||||
enddo
|
enddo
|
||||||
|
|
|
@ -350,7 +350,7 @@ subroutine crystallite_stressAndItsTangent(updateJaco)
|
||||||
myNgrains = homogenization_Ngrains(mesh_element(3,e))
|
myNgrains = homogenization_Ngrains(mesh_element(3,e))
|
||||||
do i = FEsolving_execIP(1,e),FEsolving_execIP(2,e) ! iterate over IPs of this element to be processed
|
do i = FEsolving_execIP(1,e),FEsolving_execIP(2,e) ! iterate over IPs of this element to be processed
|
||||||
do g = 1,myNgrains
|
do g = 1,myNgrains
|
||||||
debugger = (e == 1 .and. i == 1 .and. g == 1)
|
! debugger = (e == 1 .and. i == 1 .and. g == 1)
|
||||||
if (crystallite_converged(g,i,e)) then
|
if (crystallite_converged(g,i,e)) then
|
||||||
if (debugger) then
|
if (debugger) then
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
|
@ -358,6 +358,7 @@ subroutine crystallite_stressAndItsTangent(updateJaco)
|
||||||
crystallite_subFrac(g,i,e),' to current crystallite_subfrac ', &
|
crystallite_subFrac(g,i,e),' to current crystallite_subfrac ', &
|
||||||
crystallite_subFrac(g,i,e)+crystallite_subStep(g,i,e),' in crystallite_stressAndItsTangent'
|
crystallite_subFrac(g,i,e)+crystallite_subStep(g,i,e),' in crystallite_stressAndItsTangent'
|
||||||
write(6,*)
|
write(6,*)
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
crystallite_subFrac(g,i,e) = crystallite_subFrac(g,i,e) + crystallite_subStep(g,i,e)
|
crystallite_subFrac(g,i,e) = crystallite_subFrac(g,i,e) + crystallite_subStep(g,i,e)
|
||||||
|
@ -388,6 +389,7 @@ subroutine crystallite_stressAndItsTangent(updateJaco)
|
||||||
write(6,'(a78,f10.8)') 'cutback step in crystallite_stressAndItsTangent with new crystallite_subStep: ',&
|
write(6,'(a78,f10.8)') 'cutback step in crystallite_stressAndItsTangent with new crystallite_subStep: ',&
|
||||||
crystallite_subStep(g,i,e)
|
crystallite_subStep(g,i,e)
|
||||||
write(6,*)
|
write(6,*)
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
@ -452,7 +454,12 @@ subroutine crystallite_stressAndItsTangent(updateJaco)
|
||||||
endif
|
endif
|
||||||
enddo; enddo; enddo
|
enddo; enddo; enddo
|
||||||
!$OMPEND PARALLEL DO
|
!$OMPEND PARALLEL DO
|
||||||
write(6,*) count(crystallite_onTrack(1,:,:)),'IPs onTrack after preguess for state'
|
if (debugger) then
|
||||||
|
!$OMP CRITICAL (write2out)
|
||||||
|
write(6,*) count(crystallite_onTrack(1,:,:)),'IPs onTrack after preguess for state'
|
||||||
|
call flush(6)
|
||||||
|
!$OMPEND CRITICAL (write2out)
|
||||||
|
endif
|
||||||
|
|
||||||
! --+>> state loop <<+--
|
! --+>> state loop <<+--
|
||||||
|
|
||||||
|
@ -482,8 +489,12 @@ subroutine crystallite_stressAndItsTangent(updateJaco)
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
!$OMPEND PARALLEL DO
|
!$OMPEND PARALLEL DO
|
||||||
|
if (debugger) then
|
||||||
write(6,*) count(crystallite_onTrack(1,:,:)),'IPs onTrack after stress integration'
|
!$OMP CRITICAL (write2out)
|
||||||
|
write(6,*) count(crystallite_onTrack(1,:,:)),'IPs onTrack after stress integration'
|
||||||
|
call flush(6)
|
||||||
|
!$OMPEND CRITICAL (write2out)
|
||||||
|
endif
|
||||||
|
|
||||||
crystallite_todo = crystallite_todo .and. crystallite_onTrack
|
crystallite_todo = crystallite_todo .and. crystallite_onTrack
|
||||||
if (any(.not. crystallite_onTrack .and. .not. crystallite_localConstitution)) &
|
if (any(.not. crystallite_onTrack .and. .not. crystallite_localConstitution)) &
|
||||||
|
@ -544,10 +555,15 @@ subroutine crystallite_stressAndItsTangent(updateJaco)
|
||||||
if (any(.not. crystallite_onTrack .and. .not. crystallite_localConstitution)) &
|
if (any(.not. crystallite_onTrack .and. .not. crystallite_localConstitution)) &
|
||||||
crystallite_todo = crystallite_todo .and. crystallite_localConstitution ! all nonlocal crystallites can be skipped
|
crystallite_todo = crystallite_todo .and. crystallite_localConstitution ! all nonlocal crystallites can be skipped
|
||||||
|
|
||||||
write(6,*) count(crystallite_onTrack(1,:,:)),'IPs onTrack after state update'
|
if (debugger) then
|
||||||
write(6,*) count(crystallite_converged(1,:,:)),'IPs converged'
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,*) count(crystallite_todo(1,:,:)),'IPs todo'
|
write(6,*) count(crystallite_onTrack(1,:,:)),'IPs onTrack after state update'
|
||||||
write(6,*)
|
write(6,*) count(crystallite_converged(1,:,:)),'IPs converged'
|
||||||
|
write(6,*) count(crystallite_todo(1,:,:)),'IPs todo'
|
||||||
|
write(6,*)
|
||||||
|
call flush(6)
|
||||||
|
!$OMPEND CRITICAL (write2out)
|
||||||
|
endif
|
||||||
|
|
||||||
enddo ! crystallite convergence loop
|
enddo ! crystallite convergence loop
|
||||||
|
|
||||||
|
@ -612,6 +628,7 @@ subroutine crystallite_stressAndItsTangent(updateJaco)
|
||||||
write (6,'(a,/,3(3(f12.8,x)/))') ' Fp of 1 1 1',myFp(1:3,:)
|
write (6,'(a,/,3(3(f12.8,x)/))') ' Fp of 1 1 1',myFp(1:3,:)
|
||||||
write (6,'(a,/,3(3(f12.8,x)/))') ' Lp of 1 1 1',myLp(1:3,:)
|
write (6,'(a,/,3(3(f12.8,x)/))') ' Lp of 1 1 1',myLp(1:3,:)
|
||||||
write (6,'(a,/,16(6(e12.4,x)/),2(f12.4,x))') 'state of 1 1 1',myState/1e6
|
write (6,'(a,/,16(6(e12.4,x)/),2(f12.4,x))') 'state of 1 1 1',myState/1e6
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
do k = 1,3 ! perturbation...
|
do k = 1,3 ! perturbation...
|
||||||
|
@ -624,6 +641,7 @@ subroutine crystallite_stressAndItsTangent(updateJaco)
|
||||||
write (6,'(i1,x,i1)') k,l
|
write (6,'(i1,x,i1)') k,l
|
||||||
write (6,*) '============='
|
write (6,*) '============='
|
||||||
write (6,'(a,/,3(3(f12.6,x)/))') 'pertF of 1 1 1',crystallite_subF(1:3,:,g,i,e)
|
write (6,'(a,/,3(3(f12.6,x)/))') 'pertF of 1 1 1',crystallite_subF(1:3,:,g,i,e)
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
onTrack = .true.
|
onTrack = .true.
|
||||||
|
@ -634,8 +652,8 @@ subroutine crystallite_stressAndItsTangent(updateJaco)
|
||||||
onTrack = crystallite_integrateStress(g,i,e) ! stress of perturbed situation (overwrites _P,_Tstar_v,_Fp,_Lp,_Fe)
|
onTrack = crystallite_integrateStress(g,i,e) ! stress of perturbed situation (overwrites _P,_Tstar_v,_Fp,_Lp,_Fe)
|
||||||
if (onTrack) then
|
if (onTrack) then
|
||||||
call constitutive_collectDotState(crystallite_Tstar_v(:,g,i,e), crystallite_subTstar0_v(:,g,i,e), &
|
call constitutive_collectDotState(crystallite_Tstar_v(:,g,i,e), crystallite_subTstar0_v(:,g,i,e), &
|
||||||
crystallite_Fp(:,:,g,i,e), crystallite_invFp(:,:,g,i,e), &
|
crystallite_Fe, crystallite_Fp, crystallite_Temperature(g,i,e), &
|
||||||
crystallite_Temperature(g,i,e), crystallite_subdt(g,i,e), g, i, e)
|
crystallite_subdt(g,i,e), g, i, e)
|
||||||
|
|
||||||
stateConverged = crystallite_updateState(g,i,e) ! update state
|
stateConverged = crystallite_updateState(g,i,e) ! update state
|
||||||
temperatureConverged = crystallite_updateTemperature(g,i,e) ! update temperature
|
temperatureConverged = crystallite_updateTemperature(g,i,e) ! update temperature
|
||||||
|
@ -649,6 +667,7 @@ subroutine crystallite_stressAndItsTangent(updateJaco)
|
||||||
write (6,'(a,/,3(3(f12.4,x)/))') 'DP of 1 1 1',(crystallite_P(1:3,:,g,i,e)-myP(1:3,:))/1e6
|
write (6,'(a,/,3(3(f12.4,x)/))') 'DP of 1 1 1',(crystallite_P(1:3,:,g,i,e)-myP(1:3,:))/1e6
|
||||||
write (6,'(a,/,16(6(e12.4,x)/),/,2(f12.4,x))') 'state of 1 1 1',constitutive_state(g,i,e)%p/1e6
|
write (6,'(a,/,16(6(e12.4,x)/),/,2(f12.4,x))') 'state of 1 1 1',constitutive_state(g,i,e)%p/1e6
|
||||||
write (6,'(a,/,16(6(e12.4,x)/),/,2(f12.4,x))') 'Dstate of 1 1 1',(constitutive_state(g,i,e)%p-myState)/1e6
|
write (6,'(a,/,16(6(e12.4,x)/),/,2(f12.4,x))') 'Dstate of 1 1 1',(constitutive_state(g,i,e)%p-myState)/1e6
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
enddo
|
enddo
|
||||||
|
@ -743,6 +762,7 @@ endsubroutine
|
||||||
if (debugger) then
|
if (debugger) then
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,*) '::: updateState encountered NaN',g,i,e
|
write(6,*) '::: updateState encountered NaN',g,i,e
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
return
|
return
|
||||||
|
@ -768,6 +788,7 @@ endsubroutine
|
||||||
write(6,*)
|
write(6,*)
|
||||||
write(6,'(a,/,12(f12.5,x))') 'resid tolerance',abs(residuum/rTol_crystalliteState/constitutive_state(g,i,e)%p(1:mySize))
|
write(6,'(a,/,12(f12.5,x))') 'resid tolerance',abs(residuum/rTol_crystalliteState/constitutive_state(g,i,e)%p(1:mySize))
|
||||||
write(6,*)
|
write(6,*)
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
return
|
return
|
||||||
|
@ -825,6 +846,7 @@ endsubroutine
|
||||||
crystallite_updateTemperature = .false. ! indicate update failed
|
crystallite_updateTemperature = .false. ! indicate update failed
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,*) '::: updateTemperature encountered NaN',g,i,e
|
write(6,*) '::: updateTemperature encountered NaN',g,i,e
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
@ -952,6 +974,7 @@ endsubroutine
|
||||||
write(6,*) '::: integrateStress failed on invFp_current inversion',g,i,e
|
write(6,*) '::: integrateStress failed on invFp_current inversion',g,i,e
|
||||||
write(6,*)
|
write(6,*)
|
||||||
write(6,'(a11,3(i3,x),/,3(3(f12.7,x)/))') 'invFp_new at ',g,i,e,invFp_new
|
write(6,'(a11,3(i3,x),/,3(3(f12.7,x)/))') 'invFp_new at ',g,i,e,invFp_new
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
return
|
return
|
||||||
|
@ -981,6 +1004,7 @@ LpLoop: do
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,*) '::: integrateStress reached loop limit',g,i,e
|
write(6,*) '::: integrateStress reached loop limit',g,i,e
|
||||||
write(6,*)
|
write(6,*)
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
return
|
return
|
||||||
|
@ -1009,6 +1033,7 @@ LpLoop: do
|
||||||
write(6,*)
|
write(6,*)
|
||||||
write(6,'(a19,3(i3,x),/,3(3(f20.7,x)/))') 'Lp_constitutive at ',g,i,e,Lp_constitutive
|
write(6,'(a19,3(i3,x),/,3(3(f20.7,x)/))') 'Lp_constitutive at ',g,i,e,Lp_constitutive
|
||||||
write(6,'(a11,3(i3,x),/,3(3(f20.7,x)/))') 'Lpguess at ',g,i,e,Lpguess
|
write(6,'(a11,3(i3,x),/,3(3(f20.7,x)/))') 'Lpguess at ',g,i,e,Lpguess
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -1030,6 +1055,7 @@ LpLoop: do
|
||||||
if (debugger) then
|
if (debugger) then
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,*) '::: integrateStress encountered NaN at iteration', NiterationStress,'at',g,i,e
|
write(6,*) '::: integrateStress encountered NaN at iteration', NiterationStress,'at',g,i,e
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
return
|
return
|
||||||
|
@ -1069,6 +1095,7 @@ LpLoop: do
|
||||||
write(6,'(a20,3(i3,x),/,9(9(f15.3,x)/))') 'dLpdT_constitutive at ',g,i,e,dLpdT_constitutive
|
write(6,'(a20,3(i3,x),/,9(9(f15.3,x)/))') 'dLpdT_constitutive at ',g,i,e,dLpdT_constitutive
|
||||||
write(6,'(a19,3(i3,x),/,3(3(f20.7,x)/))') 'Lp_constitutive at ',g,i,e,Lp_constitutive
|
write(6,'(a19,3(i3,x),/,3(3(f20.7,x)/))') 'Lp_constitutive at ',g,i,e,Lp_constitutive
|
||||||
write(6,'(a11,3(i3,x),/,3(3(f20.7,x)/))') 'Lpguess at ',g,i,e,Lpguess
|
write(6,'(a11,3(i3,x),/,3(3(f20.7,x)/))') 'Lpguess at ',g,i,e,Lpguess
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
return
|
return
|
||||||
|
@ -1099,6 +1126,7 @@ LpLoop: do
|
||||||
write(6,*) '::: integrateStress failed on invFp_new inversion at iteration', NiterationStress
|
write(6,*) '::: integrateStress failed on invFp_new inversion at iteration', NiterationStress
|
||||||
write(6,*)
|
write(6,*)
|
||||||
write(6,'(a11,3(i3,x),/,3(3(f12.7,x)/))') 'invFp_new at ',g,i,e,invFp_new
|
write(6,'(a11,3(i3,x),/,3(3(f12.7,x)/))') 'invFp_new at ',g,i,e,invFp_new
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
return
|
return
|
||||||
|
@ -1127,6 +1155,7 @@ LpLoop: do
|
||||||
write(6,'(a,/,3(3(f12.7,x)/))') 'P / MPa',crystallite_P(:,:,g,i,e)/1e6
|
write(6,'(a,/,3(3(f12.7,x)/))') 'P / MPa',crystallite_P(:,:,g,i,e)/1e6
|
||||||
write(6,'(a,/,3(3(f12.7,x)/))') 'Lp',crystallite_Lp(:,:,g,i,e)
|
write(6,'(a,/,3(3(f12.7,x)/))') 'Lp',crystallite_Lp(:,:,g,i,e)
|
||||||
write(6,'(a,/,3(3(f12.7,x)/))') 'Fp',crystallite_Fp(:,:,g,i,e)
|
write(6,'(a,/,3(3(f12.7,x)/))') 'Fp',crystallite_Fp(:,:,g,i,e)
|
||||||
|
call flush(6)
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -1145,8 +1174,6 @@ LpLoop: do
|
||||||
! return results of particular grain
|
! return results of particular grain
|
||||||
!********************************************************************
|
!********************************************************************
|
||||||
function crystallite_postResults(&
|
function crystallite_postResults(&
|
||||||
Tstar_v,& ! stress
|
|
||||||
Temperature, & ! temperature
|
|
||||||
dt,& ! time increment
|
dt,& ! time increment
|
||||||
g,& ! grain number
|
g,& ! grain number
|
||||||
i,& ! integration point number
|
i,& ! integration point number
|
||||||
|
@ -1171,16 +1198,13 @@ function crystallite_postResults(&
|
||||||
integer(pInt), intent(in):: e, & ! element index
|
integer(pInt), intent(in):: e, & ! element index
|
||||||
i, & ! integration point index
|
i, & ! integration point index
|
||||||
g ! grain index
|
g ! grain index
|
||||||
real(pReal), intent(in):: Temperature, & ! temperature
|
real(pReal), intent(in):: dt ! time increment
|
||||||
dt ! time increment
|
|
||||||
real(pReal), dimension(6), intent(in):: Tstar_v ! 2nd Piola-Kirchhoff stress in Mandel notation
|
|
||||||
|
|
||||||
!*** output variables ***!
|
!*** output variables ***!
|
||||||
real(pReal), dimension(crystallite_Nresults + constitutive_sizePostResults(g,i,e)) :: crystallite_postResults
|
real(pReal), dimension(crystallite_Nresults + constitutive_sizePostResults(g,i,e)) :: crystallite_postResults
|
||||||
|
|
||||||
!*** local variables ***!
|
!*** local variables ***!
|
||||||
real(pReal), dimension(3,3) :: U, &
|
real(pReal), dimension(3,3) :: U, R
|
||||||
R
|
|
||||||
logical error
|
logical error
|
||||||
|
|
||||||
if (crystallite_Nresults >= 2) then
|
if (crystallite_Nresults >= 2) then
|
||||||
|
@ -1198,7 +1222,9 @@ function crystallite_postResults(&
|
||||||
endif
|
endif
|
||||||
|
|
||||||
crystallite_postResults(crystallite_Nresults+1:crystallite_Nresults+constitutive_sizePostResults(g,i,e)) = &
|
crystallite_postResults(crystallite_Nresults+1:crystallite_Nresults+constitutive_sizePostResults(g,i,e)) = &
|
||||||
constitutive_postResults(Tstar_v,Temperature,dt,g,i,e)
|
constitutive_postResults(crystallite_Tstar_v(:,g,i,e), crystallite_subTstar0_v(:,g,i,e), crystallite_Temperature(g,i,e), &
|
||||||
|
dt, crystallite_subdt(g,i,e), g, i, e)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
|
@ -188,6 +188,7 @@ endsubroutine
|
||||||
enddo
|
enddo
|
||||||
write(6,'(a15,i10,x,i10)') ' total',integral,sum(debug_MaterialpointLoopDistribution)
|
write(6,'(a15,i10,x,i10)') ' total',integral,sum(debug_MaterialpointLoopDistribution)
|
||||||
write(6,*)
|
write(6,*)
|
||||||
|
call flush(6)
|
||||||
|
|
||||||
|
|
||||||
endsubroutine
|
endsubroutine
|
||||||
|
|
|
@ -236,6 +236,7 @@ subroutine materialpoint_stressAndItsTangent(&
|
||||||
write (6,'(a,/,3(3(f12.7,x)/))') 'F of 1 1',materialpoint_F(1:3,:,1,1)
|
write (6,'(a,/,3(3(f12.7,x)/))') 'F of 1 1',materialpoint_F(1:3,:,1,1)
|
||||||
write (6,'(a,/,3(3(f12.7,x)/))') 'Fp0 of 1 1 1',crystallite_Fp0(1:3,:,1,1,1)
|
write (6,'(a,/,3(3(f12.7,x)/))') 'Fp0 of 1 1 1',crystallite_Fp0(1:3,:,1,1,1)
|
||||||
write (6,'(a,/,3(3(f12.7,x)/))') 'Lp0 of 1 1 1',crystallite_Lp0(1:3,:,1,1,1)
|
write (6,'(a,/,3(3(f12.7,x)/))') 'Lp0 of 1 1 1',crystallite_Lp0(1:3,:,1,1,1)
|
||||||
|
call flush(6)
|
||||||
|
|
||||||
!$OMP PARALLEL DO
|
!$OMP PARALLEL DO
|
||||||
do e = FEsolving_execElem(1),FEsolving_execElem(2) ! iterate over elements to be processed
|
do e = FEsolving_execElem(1),FEsolving_execElem(2) ! iterate over elements to be processed
|
||||||
|
@ -284,6 +285,7 @@ subroutine materialpoint_stressAndItsTangent(&
|
||||||
write(6,'(a21,f10.8,a34,f10.8,a37,/)') 'winding forward from ', &
|
write(6,'(a21,f10.8,a34,f10.8,a37,/)') 'winding forward from ', &
|
||||||
materialpoint_subFrac(i,e), ' to current materialpoint_subFrac ', &
|
materialpoint_subFrac(i,e), ' to current materialpoint_subFrac ', &
|
||||||
materialpoint_subFrac(i,e)+materialpoint_subStep(i,e),' in materialpoint_stressAndItsTangent'
|
materialpoint_subFrac(i,e)+materialpoint_subStep(i,e),' in materialpoint_stressAndItsTangent'
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -320,6 +322,7 @@ subroutine materialpoint_stressAndItsTangent(&
|
||||||
!$OMP CRITICAL (write2out)
|
!$OMP CRITICAL (write2out)
|
||||||
write(6,'(a82,f10.8,/)') 'cutback step in materialpoint_stressAndItsTangent with new materialpoint_subStep: ',&
|
write(6,'(a82,f10.8,/)') 'cutback step in materialpoint_stressAndItsTangent with new materialpoint_subStep: ',&
|
||||||
materialpoint_subStep(i,e)
|
materialpoint_subStep(i,e)
|
||||||
|
call flush(6)
|
||||||
!$OMPEND CRITICAL (write2out)
|
!$OMPEND CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -460,7 +463,7 @@ subroutine materialpoint_postResults(dt)
|
||||||
use mesh, only: mesh_element
|
use mesh, only: mesh_element
|
||||||
use material, only: homogenization_Ngrains
|
use material, only: homogenization_Ngrains
|
||||||
use constitutive, only: constitutive_sizePostResults, constitutive_postResults
|
use constitutive, only: constitutive_sizePostResults, constitutive_postResults
|
||||||
use crystallite
|
use crystallite, only: crystallite_Nresults, crystallite_postResults
|
||||||
implicit none
|
implicit none
|
||||||
|
|
||||||
real(pReal), intent(in) :: dt
|
real(pReal), intent(in) :: dt
|
||||||
|
@ -476,13 +479,13 @@ subroutine materialpoint_postResults(dt)
|
||||||
materialpoint_results(c+1,i,e) = d; c = c+1_pInt ! tell size of homogenization results
|
materialpoint_results(c+1,i,e) = d; c = c+1_pInt ! tell size of homogenization results
|
||||||
if (d > 0_pInt) then ! any homogenization results to mention?
|
if (d > 0_pInt) then ! any homogenization results to mention?
|
||||||
materialpoint_results(c+1:c+d,i,e) = & ! tell homogenization results
|
materialpoint_results(c+1:c+d,i,e) = & ! tell homogenization results
|
||||||
homogenization_postResults(i,e); c = c+d
|
homogenization_postResults(i,e); c = c+d
|
||||||
endif
|
endif
|
||||||
do g = 1,myNgrains !
|
do g = 1,myNgrains !
|
||||||
d = crystallite_Nresults+constitutive_sizePostResults(g,i,e)
|
d = crystallite_Nresults + constitutive_sizePostResults(g,i,e)
|
||||||
materialpoint_results(c+1,i,e) = d; c = c+1_pInt ! tell size of crystallite results
|
materialpoint_results(c+1,i,e) = d; c = c+1_pInt ! tell size of crystallite results
|
||||||
materialpoint_results(c+1:c+d,i,e) = & ! tell crystallite results
|
materialpoint_results(c+1:c+d,i,e) = & ! tell crystallite results
|
||||||
crystallite_postResults(crystallite_Tstar_v(:,g,i,e),crystallite_Temperature(g,i,e),dt,g,i,e); c = c+d
|
crystallite_postResults(dt,g,i,e); c = c+d
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
|
|
@ -111,17 +111,32 @@ constitution nonlocal
|
||||||
/nonlocal/
|
/nonlocal/
|
||||||
|
|
||||||
(output) rho
|
(output) rho
|
||||||
|
(output) delta
|
||||||
(output) rho_edge
|
(output) rho_edge
|
||||||
(output) rho_screw
|
(output) rho_screw
|
||||||
(output) excess_rho_edge
|
(output) excess_rho_edge
|
||||||
(output) excess_rho_screw
|
(output) excess_rho_screw
|
||||||
(output) rho_forest
|
(output) rho_forest
|
||||||
(output) rho_dip
|
(output) rho_dip
|
||||||
|
(output) delta_dip
|
||||||
(output) rho_edge_dip
|
(output) rho_edge_dip
|
||||||
(output) rho_screw_dip
|
(output) rho_screw_dip
|
||||||
(output) shearrate
|
(output) shearrate
|
||||||
(output) resolvedstress
|
(output) resolvedstress
|
||||||
(output) resistance
|
(output) resistance
|
||||||
|
(output) rho_dot
|
||||||
|
(output) rho_dot_dip
|
||||||
|
(output) rho_dot_gen
|
||||||
|
(output) rho_dot_sgl2dip
|
||||||
|
(output) rho_dot_dip2sgl
|
||||||
|
(output) rho_dot_ann_ath
|
||||||
|
(output) rho_dot_ann_the
|
||||||
|
(output) rho_dot_flux
|
||||||
|
(output) d_upper_edge
|
||||||
|
(output) d_upper_screw
|
||||||
|
(output) d_upper_dot_screw
|
||||||
|
(output) d_upper_dot_edge
|
||||||
|
|
||||||
|
|
||||||
lattice_structure fcc
|
lattice_structure fcc
|
||||||
Nslip 12 0 0 0 # number of slip systems per family
|
Nslip 12 0 0 0 # number of slip systems per family
|
||||||
|
@ -138,12 +153,13 @@ rhoScrewNeg0 1e10 0 0 0 # Initial negative screw disloc
|
||||||
rhoEdgeDip0 1 0 0 0 # Initial edge dipole dislocation density in m/m**3
|
rhoEdgeDip0 1 0 0 0 # Initial edge dipole dislocation density in m/m**3
|
||||||
rhoScrewDip0 1 0 0 0 # Initial screw dipole dislocation density in m/m**3
|
rhoScrewDip0 1 0 0 0 # Initial screw dipole dislocation density in m/m**3
|
||||||
v0 1e-4 0 0 0 # prefactor for dislocation velocity
|
v0 1e-4 0 0 0 # prefactor for dislocation velocity
|
||||||
|
Q0 3e-19 # activation energy for dislocation glide
|
||||||
dDipMinEdge 1e-9 0 0 0 # minimum distance for stable edge dipoles in m
|
dDipMinEdge 1e-9 0 0 0 # minimum distance for stable edge dipoles in m
|
||||||
dDipMinScrew 1e-9 0 0 0 # minimum distance for stable screw dipoles in m
|
dDipMinScrew 1e-9 0 0 0 # minimum distance for stable screw dipoles in m
|
||||||
lambda0 100 0 0 0 # prefactor for mean free path
|
lambda0 100 0 0 0 # prefactor for mean free path
|
||||||
atomicVolume 1.7e-29
|
atomicVolume 1.7e-29
|
||||||
D0 1e-4 # prefactor for self-diffusion coefficient
|
D0 1e-4 # prefactor for self-diffusion coefficient
|
||||||
Qsd 2.3e-19 # activation energy for dislocation climb
|
Qsd 2.3e-19 # activation enthalpy for seld-diffusion
|
||||||
relevantRho 1e3 # dislocation density considered relevant
|
relevantRho 1e3 # dislocation density considered relevant
|
||||||
interaction_SlipSlip 1.0 2.2 3.0 1.6 3.8 4.5 # Dislocation interaction coefficient
|
interaction_SlipSlip 1.0 2.2 3.0 1.6 3.8 4.5 # Dislocation interaction coefficient
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue