2015-04-21 20:46:13 +05:30
!--------------------------------------------------------------------------------------------------
2014-11-06 00:41:09 +05:30
!> @author Franz Roters, Max-Planck-Institut für Eisenforschung GmbH
!> @author Philip Eisenlohr, Max-Planck-Institut für Eisenforschung GmbH
!> @author David Cereceda, Lawrence Livermore National Laboratory
!> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH
!> @brief material subroutine incoprorating dislocation and twinning physics
!> @details to be done
!--------------------------------------------------------------------------------------------------
2015-01-21 20:44:00 +05:30
module plastic_disloUCLA
2014-11-06 00:41:09 +05:30
use prec , only : &
pReal , &
pInt
implicit none
private
integer ( pInt ) , dimension ( : , : ) , allocatable , target , public :: &
2016-01-16 12:36:34 +05:30
plastic_disloUCLA_sizePostResult !< size of each post result output
2014-11-06 00:41:09 +05:30
character ( len = 64 ) , dimension ( : , : ) , allocatable , target , public :: &
2016-01-16 12:36:34 +05:30
plastic_disloUCLA_output !< name of each post result output
2014-11-06 00:41:09 +05:30
real ( pReal ) , parameter , private :: &
2016-04-25 02:06:35 +05:30
kB = 1.38e-23_pReal !< Boltzmann constant in J/Kelvin
2014-11-06 00:41:09 +05:30
2016-01-16 12:36:34 +05:30
integer ( pInt ) , dimension ( : ) , allocatable , private :: &
2016-04-25 02:06:35 +05:30
plastic_disloUCLA_totalNslip !< total number of active slip systems for each instance
2014-11-06 00:41:09 +05:30
2018-11-29 03:32:46 +05:30
2014-11-06 00:41:09 +05:30
real ( pReal ) , dimension ( : , : , : ) , allocatable , private :: &
2016-01-16 12:36:34 +05:30
plastic_disloUCLA_forestProjectionEdge !< matrix of forest projections of edge dislocations for each instance
2014-11-06 00:41:09 +05:30
2018-12-05 03:00:07 +05:30
enum , bind ( c )
2014-11-06 00:41:09 +05:30
enumerator :: undefined_ID , &
2018-11-28 10:29:03 +05:30
rho_ID , &
rhoDip_ID , &
shearrate_ID , &
accumulatedshear_ID , &
mfp_ID , &
resolvedstress_ID , &
thresholdstress_ID , &
dipoledistance_ID , &
stressexponent_ID
2014-11-06 00:41:09 +05:30
end enum
2018-11-28 00:30:45 +05:30
type , private :: tParameters
2018-11-29 03:32:46 +05:30
real ( pReal ) :: &
2018-11-29 13:14:31 +05:30
aTolRho , &
2018-11-29 15:01:02 +05:30
grainSize , &
2018-11-30 12:55:23 +05:30
SolidSolutionStrength , & !< Strength due to elements in solid solution
2018-12-03 15:55:29 +05:30
mu , &
2018-12-05 02:03:32 +05:30
D0 , & !< prefactor for self-diffusion coefficient
Qsd !< activation energy for dislocation climb
2018-11-28 00:30:45 +05:30
real ( pReal ) , allocatable , dimension ( : ) :: &
2018-11-29 15:07:06 +05:30
B , & !< friction coeff. B (kMC)
2018-11-28 10:29:03 +05:30
rho0 , & !< initial edge dislocation density per slip system for each family and instance
rhoDip0 , & !< initial edge dipole density per slip system for each family and instance
burgers , & !< absolute length of burgers vector [m] for each slip system and instance
H0kp , & !< activation energy for glide [J] for each slip system and instance
v0 , & !< dislocation velocity prefactor [m/s] for each family and instance
CLambda , & !< Adj. parameter for distance between 2 forest dislocations for each slip system and instance
p , & !< p-exponent in glide velocity
2018-12-05 03:00:07 +05:30
q , & !< q-exponent in glide velocity
!* mobility law parameters
kink_height , & !< height of the kink pair
kink_width , & !< width of the kink pair
omega , & !< attempt frequency for kink pair nucleation
2018-11-28 10:29:03 +05:30
viscosity , & !< friction coeff. B (kMC)
2018-12-05 03:00:07 +05:30
!*
2018-11-29 13:14:31 +05:30
tau_Peierls , &
2018-12-04 04:36:46 +05:30
nonSchmidCoeff , &
atomicVolume , &
minDipDistance
2018-11-28 00:30:45 +05:30
real ( pReal ) , allocatable , dimension ( : , : ) :: &
interaction_SlipSlip !< slip resistance from slip activity
real ( pReal ) , allocatable , dimension ( : , : , : ) :: &
Schmid_slip , &
Schmid_twin , &
nonSchmid_pos , &
nonSchmid_neg
integer ( pInt ) :: &
totalNslip !< total number of active slip system
integer ( pInt ) , allocatable , dimension ( : ) :: &
Nslip !< number of active slip systems for each family
integer ( kind ( undefined_ID ) ) , allocatable , dimension ( : ) :: &
outputID !< ID of each post result output
2018-12-04 04:36:46 +05:30
logical :: &
dipoleformation
2018-11-28 00:30:45 +05:30
end type !< container type for internal constitutive parameters
type ( tParameters ) , dimension ( : ) , allocatable , private :: param !< containers of constitutive parameters (len Ninstance)
2018-12-05 03:00:07 +05:30
type , private :: tDisloUCLAState
2016-01-15 20:56:24 +05:30
real ( pReal ) , pointer , dimension ( : , : ) :: &
rhoEdge , &
rhoEdgeDip , &
2018-11-30 14:34:41 +05:30
accshear_slip , &
whole
2018-12-05 03:00:07 +05:30
end type
2018-11-29 12:44:20 +05:30
2018-12-05 03:00:07 +05:30
type , private :: tDisloUCLAdependentState
2018-11-29 12:44:20 +05:30
real ( pReal ) , allocatable , dimension ( : , : ) :: &
mfp , &
threshold_stress
2018-12-05 03:00:07 +05:30
end type tDisloUCLAdependentState
2018-11-29 12:44:20 +05:30
2016-01-15 20:56:24 +05:30
type ( tDisloUCLAState ) , allocatable , dimension ( : ) , private :: &
state , &
dotState
2018-11-29 12:44:20 +05:30
2018-12-05 03:00:07 +05:30
type ( tDisloUCLAdependentState ) , allocatable , dimension ( : ) , private :: &
dependentState
2014-11-06 00:41:09 +05:30
public :: &
2015-01-21 20:44:00 +05:30
plastic_disloUCLA_init , &
2018-12-05 02:23:22 +05:30
plastic_disloUCLA_dependentState , &
2015-01-21 20:44:00 +05:30
plastic_disloUCLA_LpAndItsTangent , &
plastic_disloUCLA_dotState , &
plastic_disloUCLA_postResults
2014-11-06 00:41:09 +05:30
private :: &
2018-11-29 13:51:58 +05:30
kinetics
2018-11-28 21:42:06 +05:30
2014-11-06 00:41:09 +05:30
contains
!--------------------------------------------------------------------------------------------------
!> @brief module initialization
!> @details reads in material parameters, allocates arrays, and does sanity checks
!--------------------------------------------------------------------------------------------------
2018-12-05 02:03:32 +05:30
subroutine plastic_disloUCLA_init ( )
2018-02-02 17:06:09 +05:30
#if defined(__GFORTRAN__) || __INTEL_COMPILER >= 1800
2017-10-05 20:05:34 +05:30
use , intrinsic :: iso_fortran_env , only : &
compiler_version , &
compiler_options
#endif
2014-11-06 00:41:09 +05:30
use debug , only : &
debug_level , &
debug_constitutive , &
debug_levelBasic
use math , only : &
2018-11-29 03:32:46 +05:30
math_mul3x3 , &
math_expand
2014-11-06 00:41:09 +05:30
use IO , only : &
IO_error , &
2018-11-30 13:06:56 +05:30
IO_timeStamp
2014-11-06 00:41:09 +05:30
use material , only : &
phase_plasticity , &
phase_plasticityInstance , &
phase_Noutput , &
2015-01-15 16:26:15 +05:30
PLASTICITY_DISLOUCLA_label , &
PLASTICITY_DISLOUCLA_ID , &
2018-06-10 21:31:52 +05:30
material_phase , &
2018-11-27 23:58:00 +05:30
plasticState , &
2018-12-05 02:03:32 +05:30
material_allocatePlasticState
2018-06-14 10:09:49 +05:30
use config , only : &
2018-11-28 00:30:45 +05:30
MATERIAL_partPhase , &
config_phase
2014-11-06 00:41:09 +05:30
use lattice
2018-12-05 03:00:07 +05:30
2014-11-06 00:41:09 +05:30
implicit none
2018-12-05 02:03:32 +05:30
integer ( pInt ) :: maxNinstance , &
2018-12-05 03:00:07 +05:30
f , j , k , o , i , &
outputSize , &
2016-01-15 20:56:24 +05:30
offset_slip , index_myFamily , index_otherFamily , &
2018-12-05 03:00:07 +05:30
startIndex , endIndex , p , &
sizeState , sizeDotState , &
NofMyPhase
2014-11-06 00:41:09 +05:30
character ( len = 65536 ) :: &
2018-12-03 15:55:29 +05:30
structure = ''
2018-11-28 10:29:03 +05:30
character ( len = 65536 ) , dimension ( : ) , allocatable :: outputs
integer ( kind ( undefined_ID ) ) :: outputID
2018-11-28 00:30:45 +05:30
integer ( pInt ) , dimension ( 0 ) , parameter :: emptyIntArray = [ integer ( pInt ) :: ]
real ( pReal ) , dimension ( 0 ) , parameter :: emptyRealArray = [ real ( pReal ) :: ]
character ( len = 65536 ) , dimension ( 0 ) , parameter :: emptyStringArray = [ character ( len = 65536 ) :: ]
2018-12-05 03:00:07 +05:30
2016-07-25 23:42:00 +05:30
write ( 6 , '(/,a)' ) ' <<<+- constitutive_' / / PLASTICITY_DISLOUCLA_label / / ' init -+>>>'
2018-04-22 13:37:49 +05:30
write ( 6 , '(/,a)' ) ' Cereceda et al., International Journal of Plasticity 78, 2016, 242-256'
2018-04-09 18:34:37 +05:30
write ( 6 , '(/,a)' ) ' http://dx.doi.org/10.1016/j.ijplas.2015.09.002'
2016-07-25 23:42:00 +05:30
write ( 6 , '(a15,a)' ) ' Current time: ' , IO_timeStamp ( )
2014-11-06 00:41:09 +05:30
#include "compilation_info.f90"
2018-12-05 03:00:07 +05:30
2015-01-15 16:26:15 +05:30
maxNinstance = int ( count ( phase_plasticity == PLASTICITY_DISLOUCLA_ID ) , pInt )
2014-11-06 00:41:09 +05:30
if ( maxNinstance == 0_pInt ) return
2018-12-05 03:00:07 +05:30
2014-11-06 00:41:09 +05:30
if ( iand ( debug_level ( debug_constitutive ) , debug_levelBasic ) / = 0_pInt ) &
write ( 6 , '(a16,1x,i5,/)' ) '# instances:' , maxNinstance
2015-01-21 20:44:00 +05:30
allocate ( plastic_disloUCLA_sizePostResult ( maxval ( phase_Noutput ) , maxNinstance ) , source = 0_pInt )
allocate ( plastic_disloUCLA_output ( maxval ( phase_Noutput ) , maxNinstance ) )
plastic_disloUCLA_output = ''
2018-12-03 15:55:29 +05:30
2015-01-21 20:44:00 +05:30
allocate ( plastic_disloUCLA_totalNslip ( maxNinstance ) , source = 0_pInt )
2018-12-04 04:36:46 +05:30
2018-12-05 03:00:07 +05:30
2018-11-28 00:30:45 +05:30
allocate ( param ( maxNinstance ) )
allocate ( state ( maxNinstance ) )
allocate ( dotState ( maxNinstance ) )
2018-12-05 03:00:07 +05:30
allocate ( dependentState ( maxNinstance ) )
2018-11-28 00:30:45 +05:30
2018-12-05 03:00:07 +05:30
do p = 1_pInt , size ( phase_plasticityInstance )
2018-11-28 00:30:45 +05:30
if ( phase_plasticity ( p ) / = PLASTICITY_DISLOUCLA_ID ) cycle
associate ( prm = > param ( phase_plasticityInstance ( p ) ) , &
dot = > dotState ( phase_plasticityInstance ( p ) ) , &
2018-12-04 04:36:46 +05:30
stt = > state ( phase_plasticityInstance ( p ) ) , &
2018-12-05 03:00:07 +05:30
dst = > dependentState ( phase_plasticityInstance ( p ) ) )
2018-11-28 00:30:45 +05:30
structure = config_phase ( p ) % getString ( 'lattice_structure' )
2018-11-30 12:55:23 +05:30
prm % mu = lattice_mu ( p )
2018-11-28 00:30:45 +05:30
2018-11-29 03:32:46 +05:30
prm % aTolRho = config_phase ( p ) % getFloat ( 'atol_rho' )
2018-11-28 00:30:45 +05:30
!--------------------------------------------------------------------------------------------------
! slip related parameters
prm % Nslip = config_phase ( p ) % getInts ( 'nslip' , defaultVal = emptyIntArray )
prm % totalNslip = sum ( prm % Nslip )
slipActive : if ( prm % totalNslip > 0_pInt ) then
prm % Schmid_slip = lattice_SchmidMatrix_slip ( prm % Nslip , structure ( 1 : 3 ) , &
config_phase ( p ) % getFloat ( 'c/a' , defaultVal = 0.0_pReal ) )
if ( structure == 'bcc' ) then
prm % nonSchmidCoeff = config_phase ( p ) % getFloats ( 'nonschmid_coefficients' , &
defaultVal = emptyRealArray )
prm % nonSchmid_pos = lattice_nonSchmidMatrix ( prm % Nslip , prm % nonSchmidCoeff , + 1_pInt )
prm % nonSchmid_neg = lattice_nonSchmidMatrix ( prm % Nslip , prm % nonSchmidCoeff , - 1_pInt )
else
prm % nonSchmid_pos = prm % Schmid_slip
prm % nonSchmid_neg = prm % Schmid_slip
endif
prm % interaction_SlipSlip = lattice_interaction_SlipSlip ( prm % Nslip , &
config_phase ( p ) % getFloats ( 'interaction_slipslip' ) , &
structure ( 1 : 3 ) )
2018-11-29 12:44:20 +05:30
prm % rho0 = config_phase ( p ) % getFloats ( 'rhoedge0' )
prm % rhoDip0 = config_phase ( p ) % getFloats ( 'rhoedgedip0' )
2018-11-29 03:32:46 +05:30
prm % burgers = config_phase ( p ) % getFloats ( 'slipburgers' )
prm % H0kp = config_phase ( p ) % getFloats ( 'qedge' )
2018-11-29 15:01:02 +05:30
prm % v0 = config_phase ( p ) % getFloats ( 'v0' )
2018-11-30 11:57:23 +05:30
prm % clambda = config_phase ( p ) % getFloats ( 'clambdaslip' )
2018-11-29 13:14:31 +05:30
prm % tau_Peierls = config_phase ( p ) % getFloats ( 'tau_peierls' )
2018-11-29 03:32:46 +05:30
prm % p = config_phase ( p ) % getFloats ( 'p_slip' , defaultVal = [ ( 1.0_pReal , i = 1_pInt , size ( prm % Nslip ) ) ] )
prm % q = config_phase ( p ) % getFloats ( 'q_slip' , defaultVal = [ ( 1.0_pReal , i = 1_pInt , size ( prm % Nslip ) ) ] )
prm % kink_height = config_phase ( p ) % getFloats ( 'kink_height' )
prm % kink_width = config_phase ( p ) % getFloats ( 'kink_width' )
prm % omega = config_phase ( p ) % getFloats ( 'omega' )
2018-11-29 15:07:06 +05:30
prm % B = config_phase ( p ) % getFloats ( 'friction_coeff' )
2018-11-29 03:32:46 +05:30
2018-11-29 15:01:02 +05:30
prm % SolidSolutionStrength = config_phase ( p ) % getFloat ( 'solidsolutionstrength' )
2018-11-29 13:14:31 +05:30
prm % grainSize = config_phase ( p ) % getFloat ( 'grainsize' )
2018-12-03 15:55:29 +05:30
prm % D0 = config_phase ( p ) % getFloat ( 'd0' )
2018-12-05 02:03:32 +05:30
prm % Qsd = config_phase ( p ) % getFloat ( 'qsd' )
2018-12-05 00:05:29 +05:30
prm % dipoleformation = config_phase ( p ) % getFloat ( 'dipoleformationfactor' ) > 0.0_pReal !should be on by default
prm % atomicVolume = config_phase ( p ) % getFloat ( 'catomicvolume' ) * prm % burgers ** 3.0_pReal
prm % minDipDistance = config_phase ( p ) % getFloat ( 'cedgedipmindistance' ) * prm % burgers
2018-11-29 13:14:31 +05:30
2018-11-29 03:32:46 +05:30
! expand: family => system
2018-11-29 12:44:20 +05:30
prm % rho0 = math_expand ( prm % rho0 , prm % Nslip )
prm % rhoDip0 = math_expand ( prm % rhoDip0 , prm % Nslip )
2018-11-29 03:32:46 +05:30
prm % q = math_expand ( prm % q , prm % Nslip )
prm % p = math_expand ( prm % p , prm % Nslip )
prm % H0kp = math_expand ( prm % H0kp , prm % Nslip )
prm % burgers = math_expand ( prm % burgers , prm % Nslip )
prm % kink_height = math_expand ( prm % kink_height , prm % Nslip )
prm % kink_width = math_expand ( prm % kink_width , prm % Nslip )
prm % omega = math_expand ( prm % omega , prm % Nslip )
2018-11-29 13:14:31 +05:30
prm % tau_Peierls = math_expand ( prm % tau_Peierls , prm % Nslip )
2018-11-29 15:01:02 +05:30
prm % v0 = math_expand ( prm % v0 , prm % Nslip )
2018-11-29 15:07:06 +05:30
prm % B = math_expand ( prm % B , prm % Nslip )
2018-11-30 11:57:23 +05:30
prm % clambda = math_expand ( prm % clambda , prm % Nslip )
2018-12-05 00:05:29 +05:30
prm % atomicVolume = math_expand ( prm % atomicVolume , prm % Nslip )
prm % minDipDistance = math_expand ( prm % minDipDistance , prm % Nslip )
2018-12-05 03:00:07 +05:30
plastic_disloUCLA_totalNslip ( phase_plasticityInstance ( p ) ) = prm % totalNslip
2018-12-03 15:55:29 +05:30
!if (plastic_disloUCLA_CAtomicVolume(instance) <= 0.0_pReal) &
! call IO_error(211_pInt,el=instance,ext_msg='cAtomicVolume ('//PLASTICITY_DISLOUCLA_label//')')
2018-12-05 00:05:29 +05:30
! if (prm%D0 <= 0.0_pReal) &
! call IO_error(211_pInt,el=instance,ext_msg='D0 ('//PLASTICITY_DISLOUCLA_label//')')
! if (plastic_disloUCLA_Qsd(instance) <= 0.0_pReal) &
! call IO_error(211_pInt,el=instance,ext_msg='Qsd ('//PLASTICITY_DISLOUCLA_label//')')
2018-11-30 11:57:23 +05:30
! if (plastic_disloUCLA_aTolRho(instance) <= 0.0_pReal) &
2018-12-05 03:00:07 +05:30
! call IO_error(211_pInt,el=instance,ext_msg='aTolRho ('//PLASTICITY_DISLOUCLA_label//')')
!if (plastic_disloUCLA_rhoEdge0(f,instance) < 0.0_pReal) &
! call IO_error(211_pInt,el=instance,ext_msg='rhoEdge0 ('//PLASTICITY_DISLOUCLA_label//')')
!if (plastic_disloUCLA_rhoEdgeDip0(f,instance) < 0.0_pReal) &
! call IO_error(211_pInt,el=instance,ext_msg='rhoEdgeDip0 ('//PLASTICITY_DISLOUCLA_label//')')
!if (plastic_disloUCLA_burgersPerSlipFamily(f,instance) <= 0.0_pReal) &
! call IO_error(211_pInt,el=instance,ext_msg='slipBurgers ('//PLASTICITY_DISLOUCLA_label//')')
!if (plastic_disloUCLA_v0PerSlipFamily(f,instance) <= 0.0_pReal) &
! call IO_error(211_pInt,el=instance,ext_msg='v0 ('//PLASTICITY_DISLOUCLA_label//')')
!if (plastic_disloUCLA_tau_peierlsPerSlipFamily(f,instance) < 0.0_pReal) &
! call IO_error(211_pInt,el=instance,ext_msg='tau_peierls ('//PLASTICITY_DISLOUCLA_label//')')
2018-11-30 11:57:23 +05:30
else slipActive
allocate ( prm % rho0 ( 0 ) )
allocate ( prm % rhoDip0 ( 0 ) )
2018-11-28 00:30:45 +05:30
endif slipActive
2018-11-28 10:29:03 +05:30
#if defined(__GFORTRAN__)
2018-12-05 03:00:07 +05:30
outputs = [ 'GfortranBug86277' ]
outputs = config_phase ( p ) % getStrings ( '(output)' , defaultVal = outputs )
if ( outputs ( 1 ) == 'GfortranBug86277' ) outputs = emptyStringArray
2018-11-28 10:29:03 +05:30
#else
2018-12-05 03:00:07 +05:30
outputs = config_phase ( p ) % getStrings ( '(output)' , defaultVal = emptyStringArray )
2018-11-28 10:29:03 +05:30
#endif
allocate ( prm % outputID ( 0 ) )
2018-12-05 03:00:07 +05:30
2018-11-28 10:29:03 +05:30
do i = 1_pInt , size ( outputs )
outputID = undefined_ID
outputSize = prm % totalNslip
select case ( trim ( outputs ( i ) ) )
2018-12-05 03:00:07 +05:30
case ( 'edge_density' )
outputID = merge ( rho_ID , undefined_ID , prm % totalNslip > 0_pInt )
case ( 'dipole_density' )
outputID = merge ( rhoDip_ID , undefined_ID , prm % totalNslip > 0_pInt )
case ( 'shear_rate' , 'shearrate' , 'shear_rate_slip' , 'shearrate_slip' )
outputID = merge ( shearrate_ID , undefined_ID , prm % totalNslip > 0_pInt )
case ( 'accumulated_shear' , 'accumulatedshear' , 'accumulated_shear_slip' )
outputID = merge ( accumulatedshear_ID , undefined_ID , prm % totalNslip > 0_pInt )
case ( 'mfp' , 'mfp_slip' )
outputID = merge ( mfp_ID , undefined_ID , prm % totalNslip > 0_pInt )
case ( 'resolved_stress' , 'resolved_stress_slip' )
outputID = merge ( resolvedstress_ID , undefined_ID , prm % totalNslip > 0_pInt )
case ( 'threshold_stress' , 'threshold_stress_slip' )
outputID = merge ( thresholdstress_ID , undefined_ID , prm % totalNslip > 0_pInt )
case ( 'edge_dipole_distance' )
outputID = merge ( dipoleDistance_ID , undefined_ID , prm % totalNslip > 0_pInt )
case ( 'stress_exponent' )
outputID = merge ( stressexponent_ID , undefined_ID , prm % totalNslip > 0_pInt )
2018-11-28 10:29:03 +05:30
end select
2018-11-28 21:15:45 +05:30
2018-12-05 03:00:07 +05:30
if ( outputID / = undefined_ID ) then
2018-11-28 21:15:45 +05:30
plastic_disloUCLA_output ( i , phase_plasticityInstance ( p ) ) = outputs ( i )
2018-12-05 03:00:07 +05:30
plastic_disloUCLA_sizePostResult ( i , phase_plasticityInstance ( p ) ) = outputSize
2018-11-28 21:15:45 +05:30
prm % outputID = [ prm % outputID , outputID ]
endif
2018-12-05 03:00:07 +05:30
enddo
2018-11-28 21:42:06 +05:30
2018-12-05 03:00:07 +05:30
NofMyPhase = count ( material_phase == p )
2014-11-06 00:41:09 +05:30
!--------------------------------------------------------------------------------------------------
! allocate state arrays
2016-01-16 12:36:34 +05:30
2018-12-05 03:00:07 +05:30
sizeDotState = int ( size ( [ 'rhoEdge ' , 'rhoEdgeDip ' , 'accshearslip' ] ) , pInt ) * prm % totalNslip
sizeState = sizeDotState
2016-01-16 12:36:34 +05:30
2018-12-05 03:00:07 +05:30
call material_allocatePlasticState ( p , NofMyPhase , sizeState , sizeDotState , 0_pInt , &
2018-12-04 04:36:46 +05:30
prm % totalNslip , 0_pInt , 0_pInt )
2018-11-27 23:58:00 +05:30
2018-12-05 03:00:07 +05:30
plasticState ( p ) % sizePostResults = sum ( plastic_disloUCLA_sizePostResult ( : , phase_plasticityInstance ( p ) ) )
offset_slip = 2_pInt * plasticState ( p ) % nSlip
plasticState ( p ) % slipRate = > &
plasticState ( p ) % dotState ( offset_slip + 1 : offset_slip + plasticState ( p ) % nSlip , 1 : NofMyPhase )
plasticState ( p ) % accumulatedSlip = > &
plasticState ( p ) % state ( offset_slip + 1 : offset_slip + plasticState ( p ) % nSlip , 1 : NofMyPhase )
2014-11-06 00:41:09 +05:30
2018-12-05 03:00:07 +05:30
startIndex = 1_pInt
endIndex = prm % totalNslip
stt % rhoEdge = > plasticState ( p ) % state ( startIndex : endIndex , : )
stt % rhoEdge = spread ( prm % rho0 , 2 , NofMyPhase )
dot % rhoEdge = > plasticState ( p ) % dotState ( startIndex : endIndex , : )
plasticState ( p ) % aTolState ( startIndex : endIndex ) = prm % aTolRho
2016-04-25 02:06:35 +05:30
2018-12-05 03:00:07 +05:30
startIndex = endIndex + 1_pInt
endIndex = endIndex + prm % totalNslip
stt % rhoEdgeDip = > plasticState ( p ) % state ( startIndex : endIndex , : )
stt % rhoEdgeDip = spread ( prm % rhoDip0 , 2 , NofMyPhase )
dot % rhoEdgeDip = > plasticState ( p ) % dotState ( startIndex : endIndex , : )
plasticState ( p ) % aTolState ( startIndex : endIndex ) = prm % aTolRho
2016-04-25 02:06:35 +05:30
2018-12-05 03:00:07 +05:30
startIndex = endIndex + 1_pInt
endIndex = endIndex + prm % totalNslip
stt % accshear_slip = > plasticState ( p ) % state ( startIndex : endIndex , : )
dot % accshear_slip = > plasticState ( p ) % dotState ( startIndex : endIndex , : )
plasticState ( p ) % aTolState ( startIndex : endIndex ) = 1e6_pReal
2016-04-25 02:06:35 +05:30
2018-12-05 03:00:07 +05:30
dot % whole = > plasticState ( p ) % dotState
2018-11-30 14:34:41 +05:30
2014-11-06 00:41:09 +05:30
2018-12-05 03:00:07 +05:30
allocate ( dst % mfp ( prm % totalNslip , NofMyPhase ) , source = 0.0_pReal )
allocate ( dst % threshold_stress ( prm % totalNslip , NofMyPhase ) , source = 0.0_pReal )
2018-11-29 12:44:20 +05:30
2018-11-28 21:42:06 +05:30
2018-12-05 03:00:07 +05:30
plasticState ( p ) % state0 = plasticState ( p ) % state ! ToDo: this could be done centrally
2018-11-29 03:32:46 +05:30
end associate
2018-12-04 04:36:46 +05:30
enddo
allocate ( plastic_disloUCLA_forestProjectionEdge ( maxval ( plastic_disloUCLA_totalNslip ) , &
maxval ( plastic_disloUCLA_totalNslip ) , maxNinstance ) , &
source = 0.0_pReal )
2018-12-05 03:00:07 +05:30
do p = 1_pInt , size ( phase_plasticityInstance )
2018-12-04 04:36:46 +05:30
if ( phase_plasticity ( p ) / = PLASTICITY_DISLOUCLA_ID ) cycle
associate ( prm = > param ( phase_plasticityInstance ( p ) ) , &
dot = > dotState ( phase_plasticityInstance ( p ) ) , &
stt = > state ( phase_plasticityInstance ( p ) ) , &
2018-12-05 03:00:07 +05:30
dst = > dependentState ( phase_plasticityInstance ( p ) ) )
2018-12-04 04:36:46 +05:30
mySlipFamilies : do f = 1_pInt , size ( prm % Nslip , 1 )
index_myFamily = sum ( prm % Nslip ( 1 : f - 1_pInt ) ) ! index in truncated slip system list
mySlipSystems : do j = 1_pInt , prm % Nslip ( f )
2018-12-05 03:00:07 +05:30
2018-12-04 04:36:46 +05:30
!* Calculation of forest projections for edge dislocations
otherSlipFamilies : do o = 1_pInt , size ( prm % Nslip , 1 )
index_otherFamily = sum ( prm % Nslip ( 1 : o - 1_pInt ) )
otherSlipSystems : do k = 1_pInt , prm % Nslip ( o )
2018-12-05 03:00:07 +05:30
plastic_disloUCLA_forestProjectionEdge ( index_myFamily + j , index_otherFamily + k , phase_plasticityInstance ( p ) ) = &
2018-12-04 04:36:46 +05:30
abs ( math_mul3x3 ( lattice_sn ( : , sum ( lattice_NslipSystem ( 1 : f - 1 , p ) ) + j , p ) , &
lattice_st ( : , sum ( lattice_NslipSystem ( 1 : o - 1 , p ) ) + k , p ) ) )
enddo otherSlipSystems ; enddo otherSlipFamilies
2018-12-05 03:00:07 +05:30
2018-12-04 04:36:46 +05:30
enddo mySlipSystems
enddo mySlipFamilies
end associate
enddo
2018-12-05 03:00:07 +05:30
2015-01-21 20:44:00 +05:30
end subroutine plastic_disloUCLA_init
2014-11-06 00:41:09 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief calculates derived quantities from state
!--------------------------------------------------------------------------------------------------
2018-12-05 03:00:07 +05:30
subroutine plastic_disloUCLA_dependentState ( instance , of )
2014-11-06 00:41:09 +05:30
implicit none
2018-12-05 02:23:22 +05:30
integer ( pInt ) , intent ( in ) :: instance , of
2014-11-06 00:41:09 +05:30
integer ( pInt ) :: &
2018-12-05 03:00:07 +05:30
i
2018-12-05 02:23:22 +05:30
real ( pReal ) , dimension ( param ( instance ) % totalNslip ) :: &
2018-12-05 01:35:34 +05:30
invLambdaSlip ! 1/mean free distance between 2 forest dislocations seen by a moving dislocation
2018-12-05 03:00:07 +05:30
associate ( prm = > param ( instance ) , stt = > state ( instance ) , dst = > dependentState ( instance ) )
forall ( i = 1_pInt : prm % totalNslip )
invLambdaSlip ( i ) = sqrt ( dot_product ( stt % rhoEdge ( : , of ) + stt % rhoEdgeDip ( : , of ) , &
plastic_disloUCLA_forestProjectionEdge ( : , i , instance ) ) ) &
/ prm % Clambda ( i )
dst % threshold_stress ( i , of ) = prm % mu * prm % burgers ( i ) &
2018-12-05 01:35:34 +05:30
* sqrt ( dot_product ( stt % rhoEdge ( : , of ) + stt % rhoEdgeDip ( : , of ) , &
2018-12-05 03:00:07 +05:30
prm % interaction_SlipSlip ( i , : ) ) )
end forall
dst % mfp ( : , of ) = prm % grainSize / ( 1.0_pReal + prm % grainSize * invLambdaSlip )
2018-11-29 03:32:46 +05:30
end associate
2018-11-29 13:14:31 +05:30
2018-12-05 02:23:22 +05:30
end subroutine plastic_disloUCLA_dependentState
2014-11-06 00:41:09 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief calculates plastic velocity gradient and its tangent
!--------------------------------------------------------------------------------------------------
2018-12-05 02:03:32 +05:30
subroutine plastic_disloUCLA_LpAndItsTangent ( Lp , dLp_dMp , Mp , Temperature , instance , of )
2018-12-05 03:00:07 +05:30
2014-11-06 00:41:09 +05:30
implicit none
2018-12-05 02:03:32 +05:30
integer ( pInt ) , intent ( in ) :: instance , of
2014-11-06 00:41:09 +05:30
real ( pReal ) , intent ( in ) :: Temperature
2018-11-28 11:14:32 +05:30
real ( pReal ) , dimension ( 3 , 3 ) , intent ( in ) :: Mp
2014-11-06 00:41:09 +05:30
real ( pReal ) , dimension ( 3 , 3 ) , intent ( out ) :: Lp
2018-11-28 11:14:32 +05:30
real ( pReal ) , dimension ( 3 , 3 , 3 , 3 ) , intent ( out ) :: dLp_dMp
2014-11-06 00:41:09 +05:30
2018-12-05 02:03:32 +05:30
integer ( pInt ) :: i , k , l , m , n
2018-11-28 00:19:04 +05:30
2018-12-05 02:03:32 +05:30
real ( pReal ) , dimension ( param ( instance ) % totalNslip ) :: &
2018-11-27 23:31:55 +05:30
gdot_slip_pos , gdot_slip_neg , tau_slip_pos , tau_slip_neg , dgdot_dtauslip_pos , dgdot_dtauslip_neg
2018-12-05 03:00:07 +05:30
2018-11-29 11:57:35 +05:30
associate ( prm = > param ( instance ) )
2018-12-05 03:00:07 +05:30
2014-11-06 00:41:09 +05:30
Lp = 0.0_pReal
2018-11-28 11:14:32 +05:30
dLp_dMp = 0.0_pReal
2018-12-05 03:00:07 +05:30
call kinetics ( Mp , Temperature , instance , of , &
2018-11-27 23:49:36 +05:30
gdot_slip_pos , dgdot_dtauslip_pos , tau_slip_pos , gdot_slip_neg , dgdot_dtauslip_neg , tau_slip_neg )
2018-11-29 03:08:14 +05:30
slipSystems : do i = 1_pInt , prm % totalNslip
Lp = Lp + ( gdot_slip_pos ( i ) + gdot_slip_neg ( i ) ) * prm % Schmid_slip ( 1 : 3 , 1 : 3 , i )
forall ( k = 1_pInt : 3_pInt , l = 1_pInt : 3_pInt , m = 1_pInt : 3_pInt , n = 1_pInt : 3_pInt ) &
dLp_dMp ( k , l , m , n ) = dLp_dMp ( k , l , m , n ) &
+ dgdot_dtauslip_pos ( i ) * prm % Schmid_slip ( k , l , i ) * prm % nonSchmid_pos ( m , n , i ) &
+ dgdot_dtauslip_neg ( i ) * prm % Schmid_slip ( k , l , i ) * prm % nonSchmid_neg ( m , n , i )
enddo slipSystems
2018-12-05 02:03:32 +05:30
end associate
2018-11-29 03:08:14 +05:30
Lp = 0.5_pReal * Lp
dLp_dMp = 0.5_pReal * dLp_dMp
2015-01-21 20:44:00 +05:30
end subroutine plastic_disloUCLA_LpAndItsTangent
2014-11-06 00:41:09 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief calculates the rate of change of microstructure
!--------------------------------------------------------------------------------------------------
2018-11-30 14:34:41 +05:30
subroutine plastic_disloUCLA_dotState ( Mp , Temperature , instance , of )
2014-11-06 00:41:09 +05:30
use prec , only : &
2016-05-29 14:15:03 +05:30
tol_math_check , &
2016-10-29 13:09:08 +05:30
dEq0
2014-11-06 00:41:09 +05:30
use math , only : &
2018-12-05 01:20:02 +05:30
PI , &
math_clip
2014-11-06 00:41:09 +05:30
implicit none
2018-11-28 11:14:32 +05:30
real ( pReal ) , dimension ( 3 , 3 ) , intent ( in ) :: &
Mp !< 2nd Piola Kirchhoff stress tensor in Mandel notation
2014-11-06 00:41:09 +05:30
real ( pReal ) , intent ( in ) :: &
temperature !< temperature at integration point
integer ( pInt ) , intent ( in ) :: &
2018-12-05 01:20:02 +05:30
instance , of
2014-11-06 00:41:09 +05:30
real ( pReal ) :: &
2018-12-05 01:20:02 +05:30
VacancyDiffusion
2018-11-30 14:34:41 +05:30
real ( pReal ) , dimension ( plastic_disloUCLA_totalNslip ( instance ) ) :: &
2018-11-27 23:11:33 +05:30
gdot_slip_pos , gdot_slip_neg , &
tau_slip_pos , &
2018-11-27 23:23:01 +05:30
tau_slip_neg , &
2018-12-05 01:20:02 +05:30
dgdot_dtauslip_neg , dgdot_dtauslip_pos , DotRhoDipFormation , ClimbVelocity , EdgeDipDistance , &
DotRhoEdgeDipClimb
2016-04-25 02:06:35 +05:30
2018-12-05 03:00:07 +05:30
associate ( prm = > param ( instance ) , stt = > state ( instance ) , dot = > dotState ( instance ) , dst = > dependentState ( instance ) )
2018-12-05 00:05:29 +05:30
2018-12-05 03:00:07 +05:30
call kinetics ( Mp , Temperature , instance , of , &
2018-11-27 23:23:01 +05:30
gdot_slip_pos , dgdot_dtauslip_pos , tau_slip_pos , gdot_slip_neg , dgdot_dtauslip_neg , tau_slip_neg )
2018-12-05 03:00:07 +05:30
2018-12-05 00:05:29 +05:30
dot % whole ( : , of ) = 0.0_pReal
dot % accshear_slip ( : , of ) = ( gdot_slip_pos + gdot_slip_neg ) * 0.5_pReal
2018-11-29 03:08:14 +05:30
2018-12-05 02:03:32 +05:30
VacancyDiffusion = prm % D0 * exp ( - prm % Qsd / ( kB * Temperature ) )
2018-12-05 01:20:02 +05:30
2018-12-05 02:03:32 +05:30
where ( dEq0 ( tau_slip_pos ) )
2018-12-05 03:00:07 +05:30
EdgeDipDistance = dst % mfp ( : , of ) !ToDo MD@FR: correct? was not handled properly before
2018-12-05 01:20:02 +05:30
DotRhoDipFormation = 0.0_pReal
DotRhoEdgeDipClimb = 0.0_pReal
else where
EdgeDipDistance = math_clip ( ( 3.0_pReal * prm % mu * prm % burgers ) / ( 1 6.0_pReal * PI * abs ( tau_slip_pos ) ) , &
prm % minDipDistance , & ! lower limit
2018-12-05 03:00:07 +05:30
dst % mfp ( : , of ) ) ! upper limit
2018-12-05 01:20:02 +05:30
DotRhoDipFormation = merge ( ( ( 2.0_pReal * EdgeDipDistance ) / prm % burgers ) * stt % rhoEdge ( : , of ) * abs ( dot % accshear_slip ( : , of ) ) , &
0.0_pReal , &
prm % dipoleformation )
ClimbVelocity = ( ( 3.0_pReal * prm % mu * VacancyDiffusion * prm % atomicVolume ) / ( 2.0_pReal * pi * kB * Temperature ) ) &
* ( 1.0_pReal / ( EdgeDipDistance + prm % minDipDistance ) )
DotRhoEdgeDipClimb = ( 4.0_pReal * ClimbVelocity * stt % rhoEdgeDip ( : , of ) ) / ( EdgeDipDistance - prm % minDipDistance )
end where
2018-11-28 00:19:04 +05:30
2018-12-05 03:00:07 +05:30
dot % rhoEdge ( : , of ) = abs ( dot % accshear_slip ( : , of ) ) / ( prm % burgers * dst % mfp ( : , of ) ) & ! multiplication
2018-12-05 01:35:34 +05:30
- DotRhoDipFormation &
- ( ( 2.0_pReal * prm % minDipDistance ) / prm % burgers ) * stt % rhoEdge ( : , of ) * abs ( dot % accshear_slip ( : , of ) ) !* Spontaneous annihilation of 2 single edge dislocations
dot % rhoEdgeDip ( : , of ) = DotRhoDipFormation &
- ( ( 2.0_pReal * prm % minDipDistance ) / prm % burgers ) * stt % rhoEdgeDip ( : , of ) * abs ( dot % accshear_slip ( : , of ) ) & !* Spontaneous annihilation of a single edge dislocation with a dipole constituent
- DotRhoEdgeDipClimb
2018-11-28 00:19:04 +05:30
2018-11-29 03:32:46 +05:30
end associate
2018-12-05 03:00:07 +05:30
2015-01-21 20:44:00 +05:30
end subroutine plastic_disloUCLA_dotState
2014-11-06 00:41:09 +05:30
2018-12-05 03:00:07 +05:30
2014-11-06 00:41:09 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief return array of constitutive results
!--------------------------------------------------------------------------------------------------
2018-11-30 14:34:41 +05:30
function plastic_disloUCLA_postResults ( Mp , Temperature , instance , of ) result ( postResults )
2014-11-06 00:41:09 +05:30
use prec , only : &
2017-11-21 04:13:06 +05:30
dEq , dNeq0
2014-11-06 00:41:09 +05:30
use math , only : &
2018-11-28 11:14:32 +05:30
pi , &
2018-12-03 15:18:37 +05:30
math_mul33xx33
2014-11-06 00:41:09 +05:30
implicit none
2018-12-03 15:18:37 +05:30
real ( pReal ) , dimension ( 3 , 3 ) , intent ( in ) :: &
Mp !< Mandel stress
real ( pReal ) , intent ( in ) :: &
Temperature !< Mandel stress
integer ( pInt ) , intent ( in ) :: &
instance , &
of
2014-11-06 00:41:09 +05:30
2018-12-03 15:18:37 +05:30
real ( pReal ) , dimension ( sum ( plastic_disloUCLA_sizePostResult ( : , instance ) ) ) :: &
postResults
2014-11-06 00:41:09 +05:30
integer ( pInt ) :: &
2018-12-03 15:18:37 +05:30
o , c , i
real ( pReal ) , dimension ( param ( instance ) % totalNslip ) :: &
gdot_slip_pos , dgdot_dtauslip_pos , tau_slip_pos , &
gdot_slip_neg , dgdot_dtauslip_neg , tau_slip_neg
2018-11-30 14:34:41 +05:30
2018-12-05 03:00:07 +05:30
associate ( prm = > param ( instance ) , stt = > state ( instance ) , dst = > dependentState ( instance ) )
2018-11-30 14:34:41 +05:30
2018-11-29 03:32:46 +05:30
postResults = 0.0_pReal
2018-12-03 15:18:37 +05:30
c = 0_pInt
outputsLoop : do o = 1_pInt , size ( prm % outputID )
select case ( prm % outputID ( o ) )
case ( rho_ID )
postResults ( c + 1_pInt : c + prm % totalNslip ) = stt % rhoEdge ( 1_pInt : prm % totalNslip , of )
case ( rhoDip_ID )
postResults ( c + 1_pInt : c + prm % totalNslip ) = stt % rhoEdgeDip ( 1_pInt : prm % totalNslip , of )
case ( shearrate_ID , stressexponent_ID )
2018-12-05 03:00:07 +05:30
call kinetics ( Mp , Temperature , instance , of , &
2018-12-03 15:18:37 +05:30
gdot_slip_pos , dgdot_dtauslip_pos , tau_slip_pos , gdot_slip_neg , dgdot_dtauslip_neg , tau_slip_neg )
if ( prm % outputID ( o ) == shearrate_ID ) then
postResults ( c + 1 : c + prm % totalNslip ) = ( gdot_slip_pos + gdot_slip_neg ) * 0.5_pReal
elseif ( prm % outputID ( o ) == stressexponent_ID ) then
where ( dNeq0 ( gdot_slip_pos + gdot_slip_neg ) )
postResults ( c + 1_pInt : c + prm % totalNslip ) = ( tau_slip_pos + tau_slip_neg ) * 0.5_pReal &
/ ( gdot_slip_pos + gdot_slip_neg ) &
* ( dgdot_dtauslip_pos + dgdot_dtauslip_neg )
else where
postResults ( c + 1_pInt : c + prm % totalNslip ) = 0.0_pReal
end where
endif
case ( accumulatedshear_ID )
postResults ( c + 1_pInt : c + prm % totalNslip ) = stt % accshear_slip ( 1_pInt : prm % totalNslip , of )
case ( mfp_ID )
2018-12-05 03:00:07 +05:30
postResults ( c + 1_pInt : c + prm % totalNslip ) = dst % mfp ( 1_pInt : prm % totalNslip , of )
2018-12-03 15:18:37 +05:30
case ( resolvedstress_ID )
do i = 1_pInt , prm % totalNslip
postResults ( c + i ) = math_mul33xx33 ( Mp , prm % nonSchmid_pos ( 1 : 3 , 1 : 3 , i ) )
enddo
case ( thresholdstress_ID )
2018-12-05 03:00:07 +05:30
postResults ( c + 1_pInt : c + prm % totalNslip ) = dst % threshold_stress ( 1_pInt : prm % totalNslip , of )
2018-12-03 15:18:37 +05:30
case ( dipoleDistance_ID )
do i = 1_pInt , prm % totalNslip
if ( dNeq0 ( abs ( math_mul33xx33 ( Mp , prm % nonSchmid_pos ( 1 : 3 , 1 : 3 , i ) ) ) ) ) then
postResults ( c + i ) = ( 3.0_pReal * prm % mu * prm % burgers ( i ) ) &
/ ( 1 6.0_pReal * pi * abs ( math_mul33xx33 ( Mp , prm % nonSchmid_pos ( 1 : 3 , 1 : 3 , i ) ) ) )
else
postResults ( c + i ) = huge ( 1.0_pReal )
endif
2018-12-05 03:00:07 +05:30
postResults ( c + i ) = min ( postResults ( c + i ) , dst % mfp ( i , of ) )
2018-12-03 15:18:37 +05:30
enddo
end select
c = c + prm % totalNslip
enddo outputsLoop
end associate
2018-11-27 22:55:06 +05:30
end function plastic_disloUCLA_postResults
!--------------------------------------------------------------------------------------------------
!> @brief return array of constitutive results
!--------------------------------------------------------------------------------------------------
2018-11-30 12:16:26 +05:30
subroutine kinetics ( Mp , Temperature , instance , of , &
2018-11-27 22:55:06 +05:30
gdot_slip_pos , dgdot_dtauslip_pos , tau_slip_pos , gdot_slip_neg , dgdot_dtauslip_neg , tau_slip_neg )
use prec , only : &
tol_math_check , &
dEq , dNeq0
use math , only : &
2018-11-28 11:14:32 +05:30
pi , &
math_mul33xx33
2018-11-27 22:55:06 +05:30
implicit none
2018-11-28 11:14:32 +05:30
real ( pReal ) , dimension ( 3 , 3 ) , intent ( in ) :: &
Mp !< 2nd Piola Kirchhoff stress tensor in Mandel notation
2018-11-27 22:55:06 +05:30
real ( pReal ) , intent ( in ) :: &
temperature !< temperature at integration point
integer ( pInt ) , intent ( in ) :: &
2018-11-30 12:16:26 +05:30
instance , of
2018-11-27 22:55:06 +05:30
integer ( pInt ) :: &
2018-12-05 02:03:32 +05:30
j
2018-11-27 22:55:06 +05:30
real ( pReal ) :: StressRatio_p , StressRatio_pminus1 , &
BoltzmannRatio , DotGamma0 , stressRatio , &
dvel_slip , vel_slip
2018-11-28 11:48:50 +05:30
real ( pReal ) , intent ( out ) , dimension ( plastic_disloUCLA_totalNslip ( instance ) ) :: &
2018-11-27 22:55:06 +05:30
gdot_slip_pos , dgdot_dtauslip_pos , tau_slip_pos , gdot_slip_neg , dgdot_dtauslip_neg , tau_slip_neg
2018-12-05 02:03:32 +05:30
gdot_slip_pos = 0.0_pReal
gdot_slip_neg = 0.0_pReal
dgdot_dtauslip_pos = 0.0_pReal
dgdot_dtauslip_neg = 0.0_pReal
2018-12-05 03:00:07 +05:30
associate ( prm = > param ( instance ) , stt = > state ( instance ) , dst = > dependentState ( instance ) )
2018-12-05 02:03:32 +05:30
do j = 1_pInt , prm % totalNslip
2018-12-05 03:00:07 +05:30
2018-12-05 02:03:32 +05:30
BoltzmannRatio = prm % H0kp ( j ) / ( kB * Temperature )
DotGamma0 = stt % rhoEdge ( j , of ) * prm % burgers ( j ) * prm % v0 ( j )
2018-12-05 03:00:07 +05:30
2018-12-05 02:03:32 +05:30
tau_slip_pos ( j ) = math_mul33xx33 ( Mp , prm % nonSchmid_pos ( 1 : 3 , 1 : 3 , j ) )
tau_slip_neg ( j ) = math_mul33xx33 ( Mp , prm % nonSchmid_neg ( 1 : 3 , 1 : 3 , j ) )
2018-12-05 03:00:07 +05:30
significantPositiveTau : if ( ( abs ( tau_slip_pos ( j ) ) - dst % threshold_stress ( j , of ) ) > tol_math_check ) then
stressRatio = ( ( abs ( tau_slip_pos ( j ) ) - dst % threshold_stress ( j , of ) ) &
/ ( prm % solidSolutionStrength + prm % tau_Peierls ( j ) ) )
2018-12-05 02:03:32 +05:30
stressRatio_p = stressRatio ** prm % p ( j )
stressRatio_pminus1 = stressRatio ** ( prm % p ( j ) - 1.0_pReal )
2018-12-05 03:00:07 +05:30
vel_slip = 2.0_pReal * prm % burgers ( j ) * prm % kink_height ( j ) * prm % omega ( j ) &
* ( dst % mfp ( j , of ) - prm % kink_width ( j ) ) &
2018-12-05 02:03:32 +05:30
* ( tau_slip_pos ( j ) &
* exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) ) &
/ ( &
2.0_pReal * ( prm % burgers ( j ) ** 2.0_pReal ) * tau_slip_pos ( j ) &
+ prm % omega ( j ) * prm % B ( j ) &
2018-12-05 03:00:07 +05:30
* ( ( dst % mfp ( j , of ) - prm % kink_width ( j ) ) ** 2.0_pReal ) &
2018-12-05 02:03:32 +05:30
* exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) &
)
2018-12-05 03:00:07 +05:30
2018-12-05 02:03:32 +05:30
gdot_slip_pos ( j ) = DotGamma0 * sign ( vel_slip , tau_slip_pos ( j ) )
2018-12-05 03:00:07 +05:30
dvel_slip = 2.0_pReal * prm % burgers ( j ) * prm % kink_height ( j ) * prm % omega ( j ) &
* ( dst % mfp ( j , of ) - prm % kink_width ( j ) ) &
2018-12-05 02:03:32 +05:30
* ( &
( exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) &
+ tau_slip_pos ( j ) &
* ( abs ( exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) ) &
* BoltzmannRatio * prm % p ( j ) &
* prm % q ( j ) / &
( prm % solidSolutionStrength + prm % tau_Peierls ( j ) ) * &
StressRatio_pminus1 * ( 1 - StressRatio_p ) ** ( prm % q ( j ) - 1.0_pReal ) ) &
) &
* ( 2.0_pReal * ( prm % burgers ( j ) ** 2.0_pReal ) * tau_slip_pos ( j ) &
+ prm % omega ( j ) * prm % B ( j ) &
2018-12-05 03:00:07 +05:30
* ( ( dst % mfp ( j , of ) - prm % kink_width ( j ) ) ** 2.0_pReal ) &
2018-12-05 02:03:32 +05:30
* exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) &
) &
- ( tau_slip_pos ( j ) &
* exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) ) &
* ( 2.0_pReal * ( prm % burgers ( j ) ** 2.0_pReal ) &
+ prm % omega ( j ) * prm % B ( j ) &
2018-12-05 03:00:07 +05:30
* ( ( dst % mfp ( j , of ) - prm % kink_width ( j ) ) ** 2.0_pReal ) &
2018-12-05 02:03:32 +05:30
* ( abs ( exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) ) &
* BoltzmannRatio * prm % p ( j ) &
* prm % q ( j ) / &
( prm % solidSolutionStrength + prm % tau_Peierls ( j ) ) * &
StressRatio_pminus1 * ( 1 - StressRatio_p ) ** ( prm % q ( j ) - 1.0_pReal ) ) &
) &
) &
/ ( &
( &
2.0_pReal * ( prm % burgers ( j ) ** 2.0_pReal ) * tau_slip_pos ( j ) &
+ prm % omega ( j ) * prm % B ( j ) &
2018-12-05 03:00:07 +05:30
* ( ( dst % mfp ( j , of ) - prm % kink_width ( j ) ) ** 2.0_pReal ) &
2018-12-05 02:03:32 +05:30
* exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) &
) ** 2.0_pReal &
)
dgdot_dtauslip_pos ( j ) = DotGamma0 * dvel_slip
endif significantPositiveTau
2018-12-05 03:00:07 +05:30
significantNegativeTau : if ( ( abs ( tau_slip_neg ( j ) ) - dst % threshold_stress ( j , of ) ) > tol_math_check ) then
stressRatio = ( ( abs ( tau_slip_neg ( j ) ) - dst % threshold_stress ( j , of ) ) &
/ ( prm % solidSolutionStrength + prm % tau_Peierls ( j ) ) )
2018-12-05 02:03:32 +05:30
stressRatio_p = stressRatio ** prm % p ( j )
stressRatio_pminus1 = stressRatio ** ( prm % p ( j ) - 1.0_pReal )
2018-12-05 03:00:07 +05:30
vel_slip = 2.0_pReal * prm % burgers ( j ) * prm % kink_height ( j ) * prm % omega ( j ) &
* ( dst % mfp ( j , of ) - prm % kink_width ( j ) ) &
2018-12-05 02:03:32 +05:30
* ( tau_slip_neg ( j ) &
* exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) ) &
/ ( &
2.0_pReal * ( prm % burgers ( j ) ** 2.0_pReal ) * tau_slip_neg ( j ) &
+ prm % omega ( j ) * prm % B ( j ) &
2018-12-05 03:00:07 +05:30
* ( ( dst % mfp ( j , of ) - prm % kink_width ( j ) ) ** 2.0_pReal ) &
2018-12-05 02:03:32 +05:30
* exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) &
)
2018-12-05 03:00:07 +05:30
2018-12-05 02:03:32 +05:30
gdot_slip_neg ( j ) = DotGamma0 * sign ( vel_slip , tau_slip_neg ( j ) )
2018-12-05 03:00:07 +05:30
dvel_slip = 2.0_pReal * prm % burgers ( j ) * prm % kink_height ( j ) * prm % omega ( j ) &
* ( dst % mfp ( j , of ) - prm % kink_width ( j ) ) &
2018-12-05 02:03:32 +05:30
* ( &
( exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) &
+ tau_slip_neg ( j ) &
2018-12-05 03:00:07 +05:30
* ( abs ( exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) ) &
2018-12-05 02:03:32 +05:30
* BoltzmannRatio * prm % p ( j ) &
* prm % q ( j ) / &
( prm % solidSolutionStrength + prm % tau_Peierls ( j ) ) * &
2018-12-05 03:00:07 +05:30
StressRatio_pminus1 * ( 1 - StressRatio_p ) ** ( prm % q ( j ) - 1.0_pReal ) ) &
2018-12-05 02:03:32 +05:30
) &
* ( 2.0_pReal * ( prm % burgers ( j ) ** 2.0_pReal ) * tau_slip_neg ( j ) &
+ prm % omega ( j ) * prm % B ( j ) &
2018-12-05 03:00:07 +05:30
* ( ( dst % mfp ( j , of ) - prm % kink_width ( j ) ) ** 2.0_pReal ) &
2018-12-05 02:03:32 +05:30
* exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) &
) &
- ( tau_slip_neg ( j ) &
* exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) ) &
* ( 2.0_pReal * ( prm % burgers ( j ) ** 2.0_pReal ) &
+ prm % omega ( j ) * prm % B ( j ) &
2018-12-05 03:00:07 +05:30
* ( ( dst % mfp ( j , of ) - prm % kink_width ( j ) ) ** 2.0_pReal ) &
* ( abs ( exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) ) &
2018-12-05 02:03:32 +05:30
* BoltzmannRatio * prm % p ( j ) &
* prm % q ( j ) / &
( prm % solidSolutionStrength + prm % tau_Peierls ( j ) ) * &
2018-12-05 03:00:07 +05:30
StressRatio_pminus1 * ( 1 - StressRatio_p ) ** ( prm % q ( j ) - 1.0_pReal ) ) &
2018-12-05 02:03:32 +05:30
) &
) &
/ ( &
( &
2.0_pReal * ( prm % burgers ( j ) ** 2.0_pReal ) * tau_slip_neg ( j ) &
+ prm % omega ( j ) * prm % B ( j ) &
2018-12-05 03:00:07 +05:30
* ( ( dst % mfp ( j , of ) - prm % kink_width ( j ) ) ** 2.0_pReal ) &
2018-12-05 02:03:32 +05:30
* exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % q ( j ) ) &
) ** 2.0_pReal &
)
dgdot_dtauslip_neg ( j ) = DotGamma0 * dvel_slip
endif significantNegativeTau
enddo
2018-11-29 03:32:46 +05:30
end associate
2018-12-05 02:03:32 +05:30
2018-11-27 22:55:06 +05:30
end subroutine kinetics
2014-11-06 00:41:09 +05:30
2015-01-21 20:44:00 +05:30
end module plastic_disloUCLA