Merge branch 'plastic-name-behavior-fix' into 'development'
adjusted names and behavior of dislo(tungsten + twin) + kinehardening See merge request damask/DAMASK!419
This commit is contained in:
commit
012f09caa7
2
PRIVATE
2
PRIVATE
|
@ -1 +1 @@
|
|||
Subproject commit f2e2d6c71ea798bfc63230a756b7cf9748599bec
|
||||
Subproject commit 72c58103860e127d37ccf3a06827331de29406ca
|
|
@ -1,42 +0,0 @@
|
|||
[Tungsten]
|
||||
elasticity hooke
|
||||
plasticity disloucla
|
||||
|
||||
(output) edge_density
|
||||
(output) dipole_density
|
||||
(output) shear_rate_slip
|
||||
(output) accumulated_shear_slip
|
||||
(output) resolved_stress_slip
|
||||
(output) threshold_stress_slip
|
||||
|
||||
grainsize 2.7e-5 # Average grain size [m] 2.0e-5
|
||||
SolidSolutionStrength 0.0 # Strength due to elements in solid solution
|
||||
|
||||
### Dislocation glide parameters ###
|
||||
#per family
|
||||
Nslip 12
|
||||
slipburgers 2.72e-10 # Burgers vector of slip system [m]
|
||||
rhoedge0 1.0e12 # Initial edge dislocation density [m/m**3]
|
||||
rhoedgedip0 1.0 # Initial edged dipole dislocation density [m/m**3]
|
||||
Qedge 2.61154e-19 # Activation energy for dislocation glide [J], 1.63 eV
|
||||
v0 1 # Initial glide velocity [m/s]
|
||||
p_slip 0.86 # p-exponent in glide velocity
|
||||
q_slip 1.69 # q-exponent in glide velocity
|
||||
tau_peierls 2.03e9 # peierls stress [Pa]
|
||||
|
||||
#mobility law
|
||||
kink_height 2.567e-10 # kink height sqrt(6)/3*lattice_parameter [m]
|
||||
omega 9.1e11 # attemp frequency (from kMC paper) [s^(-1)]
|
||||
kink_width 29.95e-10 # kink pair width ~ 11 b (kMC paper) [m]
|
||||
dislolength 78e-10 # dislocation length (ideally lambda) [m] initial value 11b
|
||||
friction_coeff 8.3e-5 # friction coeff. B [Pa*s]
|
||||
|
||||
#hardening
|
||||
dipoleformationfactor 0 # to have hardening due to dipole formation off
|
||||
CLambdaSlip 10.0 # Adj. parameter controlling dislocation mean free path
|
||||
D0 4.0e-5 # Vacancy diffusion prefactor [m**2/s]
|
||||
Qsd 4.5e-19 # Activation energy for climb [J]
|
||||
Catomicvolume 1.0 # Adj. parameter controlling the atomic volume [in b]
|
||||
Cedgedipmindistance 1.0 # Adj. parameter controlling the minimum dipole distance [in b]
|
||||
interaction_slipslip 0.009 0.72 0.009 0.05 0.05 0.06 0.09
|
||||
nonschmid_coefficients 0.938 0.71 4.43 0.0 0.0 0.0
|
|
@ -0,0 +1,26 @@
|
|||
type: dislotungsten
|
||||
|
||||
N_sl: [12]
|
||||
|
||||
rho_mob_0: [1.0e+9]
|
||||
rho_dip_0: [1.0]
|
||||
|
||||
nu_a: [9.1e+11]
|
||||
b_sl: [2.72e-10]
|
||||
Delta_H_kp,0: [2.61154e-19] # 1.63 eV, Delta_H0
|
||||
|
||||
tau_Peierls: [2.03e+9]
|
||||
p_sl: [0.86]
|
||||
q_sl: [1.69]
|
||||
h: [2.566e-10]
|
||||
w: [2.992e-09]
|
||||
B: [8.3e-5]
|
||||
D_a: 1.0 # d_edge
|
||||
|
||||
# climb (disabled)
|
||||
D_0: 0.0
|
||||
Q_cl: 0.0
|
||||
V_cl: [0.0]
|
||||
|
||||
h_sl-sl: [0.009, 0.72, 0.009, 0.05, 0.05, 0.06, 0.09]
|
||||
a_nonSchmid: [0.938, 0.71, 4.43]
|
|
@ -6,7 +6,7 @@ b_sl: [2.56e-10]
|
|||
rho_mob_0: [1.0e+12]
|
||||
rho_dip_0: [1.0]
|
||||
v_0: [1.0e+4]
|
||||
Q_s: [3.7e-19]
|
||||
Q_sl: [3.7e-19]
|
||||
p_sl: [1.0]
|
||||
q_sl: [1.0]
|
||||
tau_0: [1.5e+8]
|
||||
|
|
|
@ -11,7 +11,7 @@ b_sl: [2.49e-10, 2.49e-10]
|
|||
rho_mob_0: [2.81e12, 2.8e+12]
|
||||
rho_dip_0: [1.0, 1.0] # not given
|
||||
v_0: [1.4e+3, 1.4e+3]
|
||||
Q_s: [1.57e-19, 1.57e-19] # Delta_F
|
||||
Q_sl: [1.57e-19, 1.57e-19] # Delta_F
|
||||
tau_0: [454.e+6, 454.e+6]
|
||||
p_sl: [0.325, 0.325]
|
||||
q_sl: [1.55, 1.55]
|
||||
|
@ -19,6 +19,5 @@ i_sl: [23.3, 23.3]
|
|||
D_a: 7.4 # C_anni
|
||||
B: [0.001, 0.001]
|
||||
h_sl-sl: [0.1, 0.72, 0.1, 0.053, 0.053, 0.073, 0.137, 0.72, 0.72, 0.053, 0.053, 0.053, 0.053, 0.073, 0.073, 0.073, 0.073, 0.073, 0.073, 0.137, 0.073, 0.073, 0.137, 0.073]
|
||||
D_0: 4.0e-05
|
||||
Q_cl: 5.4e-19 # no recovery!
|
||||
D: 40.e-6 # estimated
|
||||
|
|
|
@ -1,20 +1,29 @@
|
|||
N_sl: [3, 3, 0, 6, 0, 6]
|
||||
N_tw: [6, 0, 0, 6]
|
||||
h_0_tw-tw: 50.0e+6
|
||||
h_0_sl-sl: 500.0e+6
|
||||
h_0_tw-sl: 150.0e+6
|
||||
h_sl-sl: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
|
||||
h_tw-tw: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
|
||||
h_sl-tw: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
|
||||
h_tw-sl: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
|
||||
output: [xi_sl, xi_tw]
|
||||
type: phenopowerlaw
|
||||
xi_0_sl: [10.e+6, 55.e+6, 0., 60.e+6, 0., 60.e+6]
|
||||
references:
|
||||
- F. Wang et al.,
|
||||
Acta Materialia 80:77-93, 2014,
|
||||
https://doi.org/10.1016/j.actamat.2014.07.048
|
||||
|
||||
output: [xi_sl, xi_tw]
|
||||
|
||||
N_sl: [3, 3, 0, 6, 0, 6] # basal, 1. prism, -, 1. pyr<a>, -, 2. pyr<c+a>
|
||||
N_tw: [6, 0, 6] # tension, -, compression
|
||||
|
||||
xi_0_sl: [10.e+6, 55.e+6, 0., 60.e+6, 0., 60.e+6]
|
||||
xi_inf_sl: [40.e+6, 135.e+6, 0., 150.e+6, 0., 150.e+6]
|
||||
xi_0_tw: [40.e+6, 0., 0., 60.e+6]
|
||||
xi_0_tw: [40.e+6, 0., 60.e+6]
|
||||
|
||||
a_sl: 2.25
|
||||
dot_gamma_0_sl: 0.001
|
||||
dot_gamma_0_tw: 0.001
|
||||
n_sl: 20
|
||||
n_tw: 20
|
||||
f_sat_sl-tw: 10.0
|
||||
|
||||
h_0_sl-sl: 500.0e+6
|
||||
h_0_tw-tw: 50.0e+6
|
||||
h_0_tw-sl: 150.0e+6
|
||||
h_sl-sl: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
|
||||
h_tw-tw: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
|
||||
h_tw-sl: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
|
||||
h_sl-tw: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
|
|
@ -7,14 +7,17 @@ references:
|
|||
Acta Materialia 132:598-610, 2017,
|
||||
https://doi.org/10.1016/j.actamat.2017.05.015
|
||||
output: [gamma_sl]
|
||||
N_sl: [3, 3, 0, 0, 12]
|
||||
|
||||
N_sl: [3, 3, 0, 0, 12] # basal, 1. prism, -, -, 2. pyr<c+a>
|
||||
n_sl: 20
|
||||
a_sl: 2.0
|
||||
dot_gamma_0_sl: 0.001
|
||||
h_0_sl-sl: 200.e+6
|
||||
|
||||
# C. Zambaldi et al.:
|
||||
xi_0_sl: [349.e+6, 150.e+6, 0.0, 0.0, 1107.e+6]
|
||||
xi_inf_sl: [568.e+6, 150.e+7, 0.0, 0.0, 3420.e+6]
|
||||
# L. Wang et al. :
|
||||
# xi_0_sl: [127.e+6, 96.e+6, 0.0, 0.0, 240.e+6]
|
||||
|
||||
h_sl-sl: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
|
||||
|
|
|
@ -18,7 +18,7 @@ submodule(phase:plastic) dislotungsten
|
|||
Q_cl = 1.0_pReal !< activation energy for dislocation climb
|
||||
real(pReal), allocatable, dimension(:) :: &
|
||||
b_sl, & !< magnitude of Burgers vector [m]
|
||||
D_a, &
|
||||
d_caron, & !< distance of spontaneous annhihilation
|
||||
i_sl, & !< Adj. parameter for distance between 2 forest dislocations
|
||||
f_at, & !< factor to calculate atomic volume
|
||||
tau_Peierls, & !< Peierls stress
|
||||
|
@ -56,7 +56,7 @@ submodule(phase:plastic) dislotungsten
|
|||
type :: tDisloTungstendependentState
|
||||
real(pReal), dimension(:,:), allocatable :: &
|
||||
Lambda_sl, &
|
||||
threshold_stress
|
||||
tau_pass
|
||||
end type tDisloTungstendependentState
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
|
@ -172,7 +172,6 @@ module function plastic_dislotungsten_init() result(myPlasticity)
|
|||
prm%D_0 = pl%get_asFloat('D_0')
|
||||
prm%Q_cl = pl%get_asFloat('Q_cl')
|
||||
prm%f_at = pl%get_asFloat('f_at') * prm%b_sl**3.0_pReal
|
||||
prm%D_a = pl%get_asFloat('D_a') * prm%b_sl
|
||||
|
||||
prm%dipoleformation = .not. pl%get_asBool('no_dipole_formation', defaultVal = .false.)
|
||||
|
||||
|
@ -191,7 +190,7 @@ module function plastic_dislotungsten_init() result(myPlasticity)
|
|||
prm%B = math_expand(prm%B, N_sl)
|
||||
prm%i_sl = math_expand(prm%i_sl, N_sl)
|
||||
prm%f_at = math_expand(prm%f_at, N_sl)
|
||||
prm%D_a = math_expand(prm%D_a, N_sl)
|
||||
prm%d_caron = pl%get_asFloat('D_a') * prm%b_sl
|
||||
|
||||
! sanity checks
|
||||
if ( prm%D_0 <= 0.0_pReal) extmsg = trim(extmsg)//' D_0'
|
||||
|
@ -202,12 +201,13 @@ module function plastic_dislotungsten_init() result(myPlasticity)
|
|||
if (any(prm%b_sl <= 0.0_pReal)) extmsg = trim(extmsg)//' b_sl'
|
||||
if (any(prm%Q_s <= 0.0_pReal)) extmsg = trim(extmsg)//' Q_s'
|
||||
if (any(prm%tau_Peierls < 0.0_pReal)) extmsg = trim(extmsg)//' tau_Peierls'
|
||||
if (any(prm%D_a <= 0.0_pReal)) extmsg = trim(extmsg)//' D_a or b_sl'
|
||||
if (any(prm%B < 0.0_pReal)) extmsg = trim(extmsg)//' B'
|
||||
if (any(prm%d_caron < 0.0_pReal)) extmsg = trim(extmsg)//' d_caron(D_a,b_sl)'
|
||||
if (any(prm%f_at <= 0.0_pReal)) extmsg = trim(extmsg)//' f_at or b_sl'
|
||||
|
||||
else slipActive
|
||||
rho_mob_0= emptyRealArray; rho_dip_0 = emptyRealArray
|
||||
allocate(prm%b_sl,prm%D_a,prm%i_sl,prm%f_at,prm%tau_Peierls, &
|
||||
allocate(prm%b_sl,prm%d_caron,prm%i_sl,prm%f_at,prm%tau_Peierls, &
|
||||
prm%Q_s,prm%v_0,prm%p,prm%q,prm%B,prm%h,prm%w,prm%omega, &
|
||||
source = emptyRealArray)
|
||||
allocate(prm%forestProjection(0,0))
|
||||
|
@ -246,8 +246,8 @@ module function plastic_dislotungsten_init() result(myPlasticity)
|
|||
plasticState(ph)%atol(startIndex:endIndex) = pl%get_asFloat('atol_gamma',defaultVal=1.0e-6_pReal)
|
||||
if(any(plasticState(ph)%atol(startIndex:endIndex) < 0.0_pReal)) extmsg = trim(extmsg)//' atol_gamma'
|
||||
|
||||
allocate(dst%Lambda_sl(prm%sum_N_sl,Nmembers), source=0.0_pReal)
|
||||
allocate(dst%threshold_stress(prm%sum_N_sl,Nmembers), source=0.0_pReal)
|
||||
allocate(dst%Lambda_sl(prm%sum_N_sl,Nmembers), source=0.0_pReal)
|
||||
allocate(dst%tau_pass(prm%sum_N_sl,Nmembers), source=0.0_pReal)
|
||||
|
||||
end associate
|
||||
|
||||
|
@ -316,8 +316,6 @@ module subroutine dislotungsten_dotState(Mp,T,ph,en)
|
|||
ph, &
|
||||
en
|
||||
|
||||
real(pReal) :: &
|
||||
VacancyDiffusion
|
||||
real(pReal), dimension(param(ph)%sum_N_sl) :: &
|
||||
dot_gamma_pos, dot_gamma_neg,&
|
||||
tau_pos,&
|
||||
|
@ -325,38 +323,36 @@ module subroutine dislotungsten_dotState(Mp,T,ph,en)
|
|||
v_cl, &
|
||||
dot_rho_dip_formation, &
|
||||
dot_rho_dip_climb, &
|
||||
dip_distance
|
||||
d_hat
|
||||
|
||||
associate(prm => param(ph), stt => state(ph),&
|
||||
dot => dotState(ph), dst => dependentState(ph))
|
||||
associate(prm => param(ph), stt => state(ph), dot => dotState(ph), dst => dependentState(ph))
|
||||
|
||||
call kinetics(Mp,T,ph,en,&
|
||||
dot_gamma_pos,dot_gamma_neg, &
|
||||
tau_pos_out = tau_pos,tau_neg_out = tau_neg)
|
||||
|
||||
dot%gamma_sl(:,en) = (dot_gamma_pos+dot_gamma_neg) ! ToDo: needs to be abs
|
||||
VacancyDiffusion = prm%D_0*exp(-prm%Q_cl/(kB*T))
|
||||
dot%gamma_sl(:,en) = abs(dot_gamma_pos+dot_gamma_neg)
|
||||
|
||||
where(dEq0(tau_pos)) ! ToDo: use avg of pos and neg
|
||||
where(dEq0(tau_pos)) ! ToDo: use avg of +/-
|
||||
dot_rho_dip_formation = 0.0_pReal
|
||||
dot_rho_dip_climb = 0.0_pReal
|
||||
else where
|
||||
dip_distance = math_clip(3.0_pReal*prm%mu*prm%b_sl/(16.0_pReal*PI*abs(tau_pos)), &
|
||||
prm%D_a, & ! lower limit
|
||||
dst%Lambda_sl(:,en)) ! upper limit
|
||||
dot_rho_dip_formation = merge(2.0_pReal*dip_distance* stt%rho_mob(:,en)*abs(dot%gamma_sl(:,en))/prm%b_sl, & ! ToDo: ignore region of spontaneous annihilation
|
||||
d_hat = math_clip(3.0_pReal*prm%mu*prm%b_sl/(16.0_pReal*PI*abs(tau_pos)), & ! ToDo: use avg of +/-
|
||||
prm%d_caron, & ! lower limit
|
||||
dst%Lambda_sl(:,en)) ! upper limit
|
||||
dot_rho_dip_formation = merge(2.0_pReal*(d_hat-prm%d_caron)*stt%rho_mob(:,en)*dot%gamma_sl(:,en)/prm%b_sl, &
|
||||
0.0_pReal, &
|
||||
prm%dipoleformation)
|
||||
v_cl = (3.0_pReal*prm%mu*VacancyDiffusion*prm%f_at/(2.0_pReal*pi*kB*T)) &
|
||||
* (1.0_pReal/(dip_distance+prm%D_a))
|
||||
dot_rho_dip_climb = (4.0_pReal*v_cl*stt%rho_dip(:,en))/(dip_distance-prm%D_a) ! ToDo: Discuss with Franz: Stress dependency?
|
||||
v_cl = (3.0_pReal*prm%mu*prm%D_0*exp(-prm%Q_cl/(kB*T))*prm%f_at/(2.0_pReal*PI*kB*T)) &
|
||||
* (1.0_pReal/(d_hat+prm%d_caron))
|
||||
dot_rho_dip_climb = (4.0_pReal*v_cl*stt%rho_dip(:,en))/(d_hat-prm%d_caron) ! ToDo: Discuss with Franz: Stress dependency?
|
||||
end where
|
||||
|
||||
dot%rho_mob(:,en) = abs(dot%gamma_sl(:,en))/(prm%b_sl*dst%Lambda_sl(:,en)) & ! multiplication
|
||||
dot%rho_mob(:,en) = dot%gamma_sl(:,en)/(prm%b_sl*dst%Lambda_sl(:,en)) & ! multiplication
|
||||
- dot_rho_dip_formation &
|
||||
- (2.0_pReal*prm%D_a)/prm%b_sl*stt%rho_mob(:,en)*abs(dot%gamma_sl(:,en)) ! Spontaneous annihilation of 2 single edge dislocations
|
||||
- (2.0_pReal*prm%d_caron)/prm%b_sl*stt%rho_mob(:,en)*dot%gamma_sl(:,en) ! Spontaneous annihilation of 2 edges
|
||||
dot%rho_dip(:,en) = dot_rho_dip_formation &
|
||||
- (2.0_pReal*prm%D_a)/prm%b_sl*stt%rho_dip(:,en)*abs(dot%gamma_sl(:,en)) & ! Spontaneous annihilation of a single edge dislocation with a dipole constituent
|
||||
- (2.0_pReal*prm%d_caron)/prm%b_sl*stt%rho_dip(:,en)*dot%gamma_sl(:,en) & ! Spontaneous annihilation of an edge with a dipole
|
||||
- dot_rho_dip_climb
|
||||
|
||||
end associate
|
||||
|
@ -377,11 +373,11 @@ module subroutine dislotungsten_dependentState(ph,en)
|
|||
dislocationSpacing
|
||||
|
||||
|
||||
associate(prm => param(ph), stt => state(ph),dst => dependentState(ph))
|
||||
associate(prm => param(ph), stt => state(ph), dst => dependentState(ph))
|
||||
|
||||
dislocationSpacing = sqrt(matmul(prm%forestProjection,stt%rho_mob(:,en)+stt%rho_dip(:,en)))
|
||||
dst%threshold_stress(:,en) = prm%mu*prm%b_sl &
|
||||
* sqrt(matmul(prm%h_sl_sl,stt%rho_mob(:,en)+stt%rho_dip(:,en)))
|
||||
dst%tau_pass(:,en) = prm%mu*prm%b_sl &
|
||||
* sqrt(matmul(prm%h_sl_sl,stt%rho_mob(:,en)+stt%rho_dip(:,en)))
|
||||
|
||||
dst%Lambda_sl(:,en) = prm%D/(1.0_pReal+prm%D*dislocationSpacing/prm%i_sl)
|
||||
|
||||
|
@ -416,7 +412,7 @@ module subroutine plastic_dislotungsten_results(ph,group)
|
|||
if(prm%sum_N_sl>0) call results_writeDataset(dst%Lambda_sl,group,trim(prm%output(o)), &
|
||||
'mean free path for slip','m')
|
||||
case('tau_pass')
|
||||
if(prm%sum_N_sl>0) call results_writeDataset(dst%threshold_stress,group,trim(prm%output(o)), &
|
||||
if(prm%sum_N_sl>0) call results_writeDataset(dst%tau_pass,group,trim(prm%output(o)), &
|
||||
'threshold stress for slip','Pa')
|
||||
end select
|
||||
enddo outputsLoop
|
||||
|
@ -456,8 +452,7 @@ pure subroutine kinetics(Mp,T,ph,en, &
|
|||
StressRatio_p,StressRatio_pminus1, &
|
||||
dvel, vel, &
|
||||
tau_pos,tau_neg, &
|
||||
t_n, t_k, dtk,dtn, &
|
||||
needsGoodName ! ToDo: @Karo: any idea?
|
||||
t_n, t_k, dtk,dtn
|
||||
integer :: j
|
||||
|
||||
associate(prm => param(ph), stt => state(ph), dst => dependentState(ph))
|
||||
|
@ -475,13 +470,12 @@ pure subroutine kinetics(Mp,T,ph,en, &
|
|||
dot_gamma_0 => stt%rho_mob(:,en)*prm%b_sl*prm%v_0, &
|
||||
effectiveLength => dst%Lambda_sl(:,en) - prm%w)
|
||||
|
||||
significantPositiveTau: where(abs(tau_pos)-dst%threshold_stress(:,en) > tol_math_check)
|
||||
StressRatio = (abs(tau_pos)-dst%threshold_stress(:,en))/prm%tau_Peierls
|
||||
significantPositiveTau: where(abs(tau_pos)-dst%tau_pass(:,en) > tol_math_check)
|
||||
StressRatio = (abs(tau_pos)-dst%tau_pass(:,en))/prm%tau_Peierls
|
||||
StressRatio_p = StressRatio** prm%p
|
||||
StressRatio_pminus1 = StressRatio**(prm%p-1.0_pReal)
|
||||
needsGoodName = exp(-BoltzmannRatio*(1-StressRatio_p) ** prm%q)
|
||||
|
||||
t_n = prm%b_sl/(needsGoodName*prm%omega*effectiveLength)
|
||||
t_n = prm%b_sl/(exp(-BoltzmannRatio*(1-StressRatio_p) ** prm%q)*prm%omega*effectiveLength)
|
||||
t_k = effectiveLength * prm%B /(2.0_pReal*prm%b_sl*tau_pos)
|
||||
|
||||
vel = prm%h/(t_n + t_k)
|
||||
|
@ -492,7 +486,7 @@ pure subroutine kinetics(Mp,T,ph,en, &
|
|||
end where significantPositiveTau
|
||||
|
||||
if (present(ddot_gamma_dtau_pos)) then
|
||||
significantPositiveTau2: where(abs(tau_pos)-dst%threshold_stress(:,en) > tol_math_check)
|
||||
significantPositiveTau2: where(abs(tau_pos)-dst%tau_pass(:,en) > tol_math_check)
|
||||
dtn = -1.0_pReal * t_n * BoltzmannRatio * prm%p * prm%q * (1.0_pReal-StressRatio_p)**(prm%q - 1.0_pReal) &
|
||||
* (StressRatio)**(prm%p - 1.0_pReal) / prm%tau_Peierls
|
||||
dtk = -1.0_pReal * t_k / tau_pos
|
||||
|
@ -505,13 +499,12 @@ pure subroutine kinetics(Mp,T,ph,en, &
|
|||
end where significantPositiveTau2
|
||||
endif
|
||||
|
||||
significantNegativeTau: where(abs(tau_neg)-dst%threshold_stress(:,en) > tol_math_check)
|
||||
StressRatio = (abs(tau_neg)-dst%threshold_stress(:,en))/prm%tau_Peierls
|
||||
significantNegativeTau: where(abs(tau_neg)-dst%tau_pass(:,en) > tol_math_check)
|
||||
StressRatio = (abs(tau_neg)-dst%tau_pass(:,en))/prm%tau_Peierls
|
||||
StressRatio_p = StressRatio** prm%p
|
||||
StressRatio_pminus1 = StressRatio**(prm%p-1.0_pReal)
|
||||
needsGoodName = exp(-BoltzmannRatio*(1-StressRatio_p) ** prm%q)
|
||||
|
||||
t_n = prm%b_sl/(needsGoodName*prm%omega*effectiveLength)
|
||||
t_n = prm%b_sl/(exp(-BoltzmannRatio*(1-StressRatio_p) ** prm%q)*prm%omega*effectiveLength)
|
||||
t_k = effectiveLength * prm%B /(2.0_pReal*prm%b_sl*tau_pos)
|
||||
|
||||
vel = prm%h/(t_n + t_k)
|
||||
|
@ -522,7 +515,7 @@ pure subroutine kinetics(Mp,T,ph,en, &
|
|||
end where significantNegativeTau
|
||||
|
||||
if (present(ddot_gamma_dtau_neg)) then
|
||||
significantNegativeTau2: where(abs(tau_neg)-dst%threshold_stress(:,en) > tol_math_check)
|
||||
significantNegativeTau2: where(abs(tau_neg)-dst%tau_pass(:,en) > tol_math_check)
|
||||
dtn = -1.0_pReal * t_n * BoltzmannRatio * prm%p * prm%q * (1.0_pReal-StressRatio_p)**(prm%q - 1.0_pReal) &
|
||||
* (StressRatio)**(prm%p - 1.0_pReal) / prm%tau_Peierls
|
||||
dtk = -1.0_pReal * t_k / tau_neg
|
||||
|
|
|
@ -16,13 +16,11 @@ submodule(phase:plastic) dislotwin
|
|||
real(pReal) :: &
|
||||
mu = 1.0_pReal, & !< equivalent shear modulus
|
||||
nu = 1.0_pReal, & !< equivalent shear Poisson's ratio
|
||||
D_0 = 1.0_pReal, & !< prefactor for self-diffusion coefficient
|
||||
Q_cl = 1.0_pReal, & !< activation energy for dislocation climb
|
||||
omega = 1.0_pReal, & !< frequency factor for dislocation climb
|
||||
D = 1.0_pReal, & !< grain size
|
||||
p_sb = 1.0_pReal, & !< p-exponent in shear band velocity
|
||||
q_sb = 1.0_pReal, & !< q-exponent in shear band velocity
|
||||
D_a = 1.0_pReal, & !< adjustment parameter to calculate minimum dipole distance
|
||||
i_tw = 1.0_pReal, & !< adjustment parameter to calculate MFP for twinning
|
||||
L_tw = 1.0_pReal, & !< Length of twin nuclei in Burgers vectors
|
||||
L_tr = 1.0_pReal, & !< Length of trans nuclei in Burgers vectors
|
||||
|
@ -42,7 +40,7 @@ submodule(phase:plastic) dislotwin
|
|||
b_sl, & !< absolute length of Burgers vector [m] for each slip system
|
||||
b_tw, & !< absolute length of Burgers vector [m] for each twin system
|
||||
b_tr, & !< absolute length of Burgers vector [m] for each transformation system
|
||||
Q_s,& !< activation energy for glide [J] for each slip system
|
||||
Q_sl,& !< activation energy for glide [J] for each slip system
|
||||
v_0, & !< dislocation velocity prefactor [m/s] for each slip system
|
||||
dot_N_0_tw, & !< twin nucleation rate [1/m³s] for each twin system
|
||||
dot_N_0_tr, & !< trans nucleation rate [1/m³s] for each trans system
|
||||
|
@ -55,7 +53,8 @@ submodule(phase:plastic) dislotwin
|
|||
s, & !< s-exponent in trans nucleation rate
|
||||
tau_0, & !< strength due to elements in solid solution
|
||||
gamma_char, & !< characteristic shear for twins
|
||||
B !< drag coefficient
|
||||
B, & !< drag coefficient
|
||||
d_caron !< distance of spontaneous annhihilation
|
||||
real(pReal), allocatable, dimension(:,:) :: &
|
||||
h_sl_sl, & !< components of slip-slip interaction matrix
|
||||
h_sl_tw, & !< components of slip-twin interaction matrix
|
||||
|
@ -206,7 +205,7 @@ module function plastic_dislotwin_init() result(myPlasticity)
|
|||
rho_dip_0 = pl%get_as1dFloat('rho_dip_0', requiredSize=size(N_sl))
|
||||
prm%v_0 = pl%get_as1dFloat('v_0', requiredSize=size(N_sl))
|
||||
prm%b_sl = pl%get_as1dFloat('b_sl', requiredSize=size(N_sl))
|
||||
prm%Q_s = pl%get_as1dFloat('Q_s', requiredSize=size(N_sl))
|
||||
prm%Q_sl = pl%get_as1dFloat('Q_sl', requiredSize=size(N_sl))
|
||||
prm%i_sl = pl%get_as1dFloat('i_sl', requiredSize=size(N_sl))
|
||||
prm%p = pl%get_as1dFloat('p_sl', requiredSize=size(N_sl))
|
||||
prm%q = pl%get_as1dFloat('q_sl', requiredSize=size(N_sl))
|
||||
|
@ -214,9 +213,7 @@ module function plastic_dislotwin_init() result(myPlasticity)
|
|||
prm%B = pl%get_as1dFloat('B', requiredSize=size(N_sl), &
|
||||
defaultVal=[(0.0_pReal, i=1,size(N_sl))])
|
||||
|
||||
prm%D_a = pl%get_asFloat('D_a')
|
||||
prm%D_0 = pl%get_asFloat('D_0')
|
||||
prm%Q_cl = pl%get_asFloat('Q_cl')
|
||||
prm%Q_cl = pl%get_asFloat('Q_cl')
|
||||
|
||||
prm%ExtendedDislocations = pl%get_asBool('extend_dislocations',defaultVal = .false.)
|
||||
prm%omitDipoles = pl%get_asBool('omit_dipoles',defaultVal = .false.)
|
||||
|
@ -231,28 +228,29 @@ module function plastic_dislotwin_init() result(myPlasticity)
|
|||
rho_dip_0 = math_expand(rho_dip_0, N_sl)
|
||||
prm%v_0 = math_expand(prm%v_0, N_sl)
|
||||
prm%b_sl = math_expand(prm%b_sl, N_sl)
|
||||
prm%Q_s = math_expand(prm%Q_s, N_sl)
|
||||
prm%Q_sl = math_expand(prm%Q_sl, N_sl)
|
||||
prm%i_sl = math_expand(prm%i_sl, N_sl)
|
||||
prm%p = math_expand(prm%p, N_sl)
|
||||
prm%q = math_expand(prm%q, N_sl)
|
||||
prm%tau_0 = math_expand(prm%tau_0, N_sl)
|
||||
prm%B = math_expand(prm%B, N_sl)
|
||||
prm%d_caron = pl%get_asFloat('D_a') * prm%b_sl
|
||||
|
||||
! sanity checks
|
||||
if ( prm%D_0 <= 0.0_pReal) extmsg = trim(extmsg)//' D_0'
|
||||
if ( prm%Q_cl <= 0.0_pReal) extmsg = trim(extmsg)//' Q_cl'
|
||||
if (any(rho_mob_0 < 0.0_pReal)) extmsg = trim(extmsg)//' rho_mob_0'
|
||||
if (any(rho_dip_0 < 0.0_pReal)) extmsg = trim(extmsg)//' rho_dip_0'
|
||||
if (any(prm%v_0 < 0.0_pReal)) extmsg = trim(extmsg)//' v_0'
|
||||
if (any(prm%b_sl <= 0.0_pReal)) extmsg = trim(extmsg)//' b_sl'
|
||||
if (any(prm%Q_s <= 0.0_pReal)) extmsg = trim(extmsg)//' Q_s'
|
||||
if (any(prm%Q_sl <= 0.0_pReal)) extmsg = trim(extmsg)//' Q_sl'
|
||||
if (any(prm%i_sl <= 0.0_pReal)) extmsg = trim(extmsg)//' i_sl'
|
||||
if (any(prm%B < 0.0_pReal)) extmsg = trim(extmsg)//' B'
|
||||
if (any(prm%d_caron < 0.0_pReal)) extmsg = trim(extmsg)//' d_caron(D_a,b_sl)'
|
||||
if (any(prm%p<=0.0_pReal .or. prm%p>1.0_pReal)) extmsg = trim(extmsg)//' p_sl'
|
||||
if (any(prm%q< 1.0_pReal .or. prm%q>2.0_pReal)) extmsg = trim(extmsg)//' q_sl'
|
||||
else slipActive
|
||||
rho_mob_0 = emptyRealArray; rho_dip_0 = emptyRealArray
|
||||
allocate(prm%b_sl,prm%Q_s,prm%v_0,prm%i_sl,prm%p,prm%q,prm%B,source=emptyRealArray)
|
||||
allocate(prm%b_sl,prm%Q_sl,prm%v_0,prm%i_sl,prm%p,prm%q,prm%B,source=emptyRealArray)
|
||||
allocate(prm%forestProjection(0,0),prm%h_sl_sl(0,0))
|
||||
endif slipActive
|
||||
|
||||
|
@ -516,7 +514,7 @@ module subroutine dislotwin_LpAndItsTangent(Lp,dLp_dMp,Mp,T,ph,en)
|
|||
integer :: i,k,l,m,n
|
||||
real(pReal) :: &
|
||||
f_unrotated,StressRatio_p,&
|
||||
BoltzmannRatio, &
|
||||
E_kB_T, &
|
||||
ddot_gamma_dtau, &
|
||||
tau
|
||||
real(pReal), dimension(param(ph)%sum_N_sl) :: &
|
||||
|
@ -586,7 +584,7 @@ module subroutine dislotwin_LpAndItsTangent(Lp,dLp_dMp,Mp,T,ph,en)
|
|||
|
||||
shearBandingContribution: if(dNeq0(prm%v_sb)) then
|
||||
|
||||
BoltzmannRatio = prm%E_sb/(kB*T)
|
||||
E_kB_T = prm%E_sb/(kB*T)
|
||||
call math_eigh33(eigValues,eigVectors,Mp) ! is Mp symmetric by design?
|
||||
|
||||
do i = 1,6
|
||||
|
@ -596,8 +594,8 @@ module subroutine dislotwin_LpAndItsTangent(Lp,dLp_dMp,Mp,T,ph,en)
|
|||
|
||||
significantShearBandStress: if (abs(tau) > tol_math_check) then
|
||||
StressRatio_p = (abs(tau)/prm%xi_sb)**prm%p_sb
|
||||
dot_gamma_sb = sign(prm%v_sb*exp(-BoltzmannRatio*(1-StressRatio_p)**prm%q_sb), tau)
|
||||
ddot_gamma_dtau = abs(dot_gamma_sb)*BoltzmannRatio* prm%p_sb*prm%q_sb/ prm%xi_sb &
|
||||
dot_gamma_sb = sign(prm%v_sb*exp(-E_kB_T*(1-StressRatio_p)**prm%q_sb), tau)
|
||||
ddot_gamma_dtau = abs(dot_gamma_sb)*E_kB_T*prm%p_sb*prm%q_sb/prm%xi_sb &
|
||||
* (abs(tau)/prm%xi_sb)**(prm%p_sb-1.0_pReal) &
|
||||
* (1.0_pReal-StressRatio_p)**(prm%q_sb-1.0_pReal)
|
||||
|
||||
|
@ -631,7 +629,7 @@ module subroutine dislotwin_dotState(Mp,T,ph,en)
|
|||
integer :: i
|
||||
real(pReal) :: &
|
||||
f_unrotated, &
|
||||
rho_dip_distance, &
|
||||
d_hat, &
|
||||
v_cl, & !< climb velocity
|
||||
tau, &
|
||||
sigma_cl, & !< climb stress
|
||||
|
@ -639,70 +637,67 @@ module subroutine dislotwin_dotState(Mp,T,ph,en)
|
|||
real(pReal), dimension(param(ph)%sum_N_sl) :: &
|
||||
dot_rho_dip_formation, &
|
||||
dot_rho_dip_climb, &
|
||||
rho_dip_distance_min, &
|
||||
dot_gamma_sl
|
||||
real(pReal), dimension(param(ph)%sum_N_tw) :: &
|
||||
dot_gamma_tw
|
||||
real(pReal), dimension(param(ph)%sum_N_tr) :: &
|
||||
dot_gamma_tr
|
||||
|
||||
associate(prm => param(ph), stt => state(ph), &
|
||||
dot => dotState(ph), dst => dependentState(ph))
|
||||
|
||||
f_unrotated = 1.0_pReal &
|
||||
- sum(stt%f_tw(1:prm%sum_N_tw,en)) &
|
||||
- sum(stt%f_tr(1:prm%sum_N_tr,en))
|
||||
associate(prm => param(ph), stt => state(ph), dot => dotState(ph), dst => dependentState(ph))
|
||||
|
||||
call kinetics_sl(Mp,T,ph,en,dot_gamma_sl)
|
||||
dot%gamma_sl(:,en) = abs(dot_gamma_sl)
|
||||
f_unrotated = 1.0_pReal &
|
||||
- sum(stt%f_tw(1:prm%sum_N_tw,en)) &
|
||||
- sum(stt%f_tr(1:prm%sum_N_tr,en))
|
||||
|
||||
rho_dip_distance_min = prm%D_a*prm%b_sl
|
||||
call kinetics_sl(Mp,T,ph,en,dot_gamma_sl)
|
||||
dot%gamma_sl(:,en) = abs(dot_gamma_sl)
|
||||
|
||||
slipState: do i = 1, prm%sum_N_sl
|
||||
tau = math_tensordot(Mp,prm%P_sl(1:3,1:3,i))
|
||||
slipState: do i = 1, prm%sum_N_sl
|
||||
tau = math_tensordot(Mp,prm%P_sl(1:3,1:3,i))
|
||||
|
||||
significantSlipStress: if (dEq0(tau) .or. prm%omitDipoles) then
|
||||
dot_rho_dip_formation(i) = 0.0_pReal
|
||||
dot_rho_dip_climb(i) = 0.0_pReal
|
||||
else significantSlipStress
|
||||
rho_dip_distance = 3.0_pReal*prm%mu*prm%b_sl(i)/(16.0_pReal*PI*abs(tau))
|
||||
rho_dip_distance = math_clip(rho_dip_distance, right = dst%Lambda_sl(i,en))
|
||||
rho_dip_distance = math_clip(rho_dip_distance, left = rho_dip_distance_min(i))
|
||||
|
||||
dot_rho_dip_formation(i) = 2.0_pReal*(rho_dip_distance-rho_dip_distance_min(i))/prm%b_sl(i) &
|
||||
* stt%rho_mob(i,en)*abs(dot_gamma_sl(i))
|
||||
|
||||
if (dEq(rho_dip_distance,rho_dip_distance_min(i))) then
|
||||
significantSlipStress: if (dEq0(tau) .or. prm%omitDipoles) then
|
||||
dot_rho_dip_formation(i) = 0.0_pReal
|
||||
dot_rho_dip_climb(i) = 0.0_pReal
|
||||
else
|
||||
! Argon & Moffat, Acta Metallurgica, Vol. 29, pg 293 to 299, 1981
|
||||
sigma_cl = dot_product(prm%n0_sl(1:3,i),matmul(Mp,prm%n0_sl(1:3,i)))
|
||||
b_d = merge(24.0_pReal*PI*(1.0_pReal - prm%nu)/(2.0_pReal + prm%nu) &
|
||||
* (prm%Gamma_sf(1) + prm%Gamma_sf(2) * T) / (prm%mu*prm%b_sl(i)), &
|
||||
1.0_pReal, &
|
||||
prm%ExtendedDislocations)
|
||||
v_cl = 2.0_pReal*prm%omega*b_d**2.0_pReal*exp(-prm%Q_cl/(kB*T)) &
|
||||
* (exp(abs(sigma_cl)*prm%b_sl(i)**3.0_pReal/(kB*T)) - 1.0_pReal)
|
||||
else significantSlipStress
|
||||
d_hat = 3.0_pReal*prm%mu*prm%b_sl(i)/(16.0_pReal*PI*abs(tau))
|
||||
d_hat = math_clip(d_hat, right = dst%Lambda_sl(i,en))
|
||||
d_hat = math_clip(d_hat, left = prm%d_caron(i))
|
||||
|
||||
dot_rho_dip_climb(i) = 4.0_pReal*v_cl*stt%rho_dip(i,en) &
|
||||
/ (rho_dip_distance-rho_dip_distance_min(i))
|
||||
endif
|
||||
endif significantSlipStress
|
||||
enddo slipState
|
||||
dot_rho_dip_formation(i) = 2.0_pReal*(d_hat-prm%d_caron(i))/prm%b_sl(i) &
|
||||
* stt%rho_mob(i,en)*abs(dot_gamma_sl(i))
|
||||
|
||||
dot%rho_mob(:,en) = abs(dot_gamma_sl)/(prm%b_sl*dst%Lambda_sl(:,en)) &
|
||||
- dot_rho_dip_formation &
|
||||
- 2.0_pReal*rho_dip_distance_min/prm%b_sl * stt%rho_mob(:,en)*abs(dot_gamma_sl)
|
||||
if (dEq(d_hat,prm%d_caron(i))) then
|
||||
dot_rho_dip_climb(i) = 0.0_pReal
|
||||
else
|
||||
! Argon & Moffat, Acta Metallurgica, Vol. 29, pg 293 to 299, 1981
|
||||
sigma_cl = dot_product(prm%n0_sl(1:3,i),matmul(Mp,prm%n0_sl(1:3,i)))
|
||||
b_d = merge(24.0_pReal*PI*(1.0_pReal - prm%nu)/(2.0_pReal + prm%nu) &
|
||||
* (prm%Gamma_sf(1) + prm%Gamma_sf(2) * T) / (prm%mu*prm%b_sl(i)), &
|
||||
1.0_pReal, &
|
||||
prm%ExtendedDislocations)
|
||||
v_cl = 2.0_pReal*prm%omega*b_d**2.0_pReal*exp(-prm%Q_cl/(kB*T)) &
|
||||
* (exp(abs(sigma_cl)*prm%b_sl(i)**3.0_pReal/(kB*T)) - 1.0_pReal)
|
||||
|
||||
dot%rho_dip(:,en) = dot_rho_dip_formation &
|
||||
- 2.0_pReal*rho_dip_distance_min/prm%b_sl * stt%rho_dip(:,en)*abs(dot_gamma_sl) &
|
||||
- dot_rho_dip_climb
|
||||
dot_rho_dip_climb(i) = 4.0_pReal*v_cl*stt%rho_dip(i,en) &
|
||||
/ (d_hat-prm%d_caron(i))
|
||||
endif
|
||||
endif significantSlipStress
|
||||
enddo slipState
|
||||
|
||||
call kinetics_tw(Mp,T,dot_gamma_sl,ph,en,dot_gamma_tw)
|
||||
dot%f_tw(:,en) = f_unrotated*dot_gamma_tw/prm%gamma_char
|
||||
dot%rho_mob(:,en) = abs(dot_gamma_sl)/(prm%b_sl*dst%Lambda_sl(:,en)) &
|
||||
- dot_rho_dip_formation &
|
||||
- 2.0_pReal*prm%d_caron/prm%b_sl * stt%rho_mob(:,en)*abs(dot_gamma_sl)
|
||||
|
||||
call kinetics_tr(Mp,T,dot_gamma_sl,ph,en,dot_gamma_tr)
|
||||
dot%f_tr(:,en) = f_unrotated*dot_gamma_tr
|
||||
dot%rho_dip(:,en) = dot_rho_dip_formation &
|
||||
- 2.0_pReal*prm%d_caron/prm%b_sl * stt%rho_dip(:,en)*abs(dot_gamma_sl) &
|
||||
- dot_rho_dip_climb
|
||||
|
||||
call kinetics_tw(Mp,T,dot_gamma_sl,ph,en,dot_gamma_tw)
|
||||
dot%f_tw(:,en) = f_unrotated*dot_gamma_tw/prm%gamma_char
|
||||
|
||||
call kinetics_tr(Mp,T,dot_gamma_sl,ph,en,dot_gamma_tr)
|
||||
dot%f_tr(:,en) = f_unrotated*dot_gamma_tr
|
||||
|
||||
end associate
|
||||
|
||||
|
@ -763,19 +758,17 @@ module subroutine dislotwin_dependentState(T,ph,en)
|
|||
dst%tau_pass(:,en) = prm%mu*prm%b_sl* sqrt(matmul(prm%h_sl_sl,stt%rho_mob(:,en)+stt%rho_dip(:,en)))
|
||||
|
||||
!* threshold stress for growing twin/martensite
|
||||
if(prm%sum_N_tw == prm%sum_N_sl) &
|
||||
dst%tau_hat_tw(:,en) = Gamma/(3.0_pReal*prm%b_tw) &
|
||||
+ 3.0_pReal*prm%b_tw*prm%mu/(prm%L_tw*prm%b_sl) ! slip Burgers here correct?
|
||||
if(prm%sum_N_tr == prm%sum_N_sl) &
|
||||
dst%tau_hat_tr(:,en) = Gamma/(3.0_pReal*prm%b_tr) &
|
||||
+ 3.0_pReal*prm%b_tr*prm%mu/(prm%L_tr*prm%b_sl) & ! slip Burgers here correct?
|
||||
+ prm%h*prm%delta_G/ (3.0_pReal*prm%b_tr)
|
||||
dst%tau_hat_tw(:,en) = Gamma/(3.0_pReal*prm%b_tw) &
|
||||
+ 3.0_pReal*prm%b_tw*prm%mu/(prm%L_tw*prm%b_tw)
|
||||
dst%tau_hat_tr(:,en) = Gamma/(3.0_pReal*prm%b_tr) &
|
||||
+ 3.0_pReal*prm%b_tr*prm%mu/(prm%L_tr*prm%b_tr) &
|
||||
+ prm%h*prm%delta_G/(3.0_pReal*prm%b_tr)
|
||||
|
||||
dst%V_tw(:,en) = (PI/4.0_pReal)*prm%t_tw*dst%Lambda_tw(:,en)**2.0_pReal
|
||||
dst%V_tr(:,en) = (PI/4.0_pReal)*prm%t_tr*dst%Lambda_tr(:,en)**2.0_pReal
|
||||
|
||||
|
||||
x0 = prm%mu*prm%b_tw**2.0_pReal/(Gamma*8.0_pReal*PI)*(2.0_pReal+prm%nu)/(1.0_pReal-prm%nu) ! ToDo: In the paper, this is the Burgers vector for slip and is the same for twin and trans
|
||||
x0 = prm%mu*prm%b_tw**2.0_pReal/(Gamma*8.0_pReal*PI)*(2.0_pReal+prm%nu)/(1.0_pReal-prm%nu) ! ToDo: In the paper, this is the Burgers vector for slip
|
||||
dst%tau_r_tw(:,en) = prm%mu*prm%b_tw/(2.0_pReal*PI)*(1.0_pReal/(x0+prm%x_c_tw)+cos(pi/3.0_pReal)/x0)
|
||||
|
||||
x0 = prm%mu*prm%b_tr**2.0_pReal/(Gamma*8.0_pReal*PI)*(2.0_pReal+prm%nu)/(1.0_pReal-prm%nu) ! ToDo: In the paper, this is the Burgers vector for slip
|
||||
|
@ -867,7 +860,7 @@ pure subroutine kinetics_sl(Mp,T,ph,en, &
|
|||
tau, &
|
||||
stressRatio, &
|
||||
StressRatio_p, &
|
||||
BoltzmannRatio, &
|
||||
Q_kB_T, &
|
||||
v_wait_inverse, & !< inverse of the effective velocity of a dislocation waiting at obstacles (unsigned)
|
||||
v_run_inverse, & !< inverse of the velocity of a free moving dislocation (unsigned)
|
||||
dV_wait_inverse_dTau, &
|
||||
|
@ -876,33 +869,34 @@ pure subroutine kinetics_sl(Mp,T,ph,en, &
|
|||
tau_eff !< effective resolved stress
|
||||
integer :: i
|
||||
|
||||
|
||||
associate(prm => param(ph), stt => state(ph), dst => dependentState(ph))
|
||||
|
||||
tau = [(math_tensordot(Mp,prm%P_sl(1:3,1:3,i)),i = 1, prm%sum_N_sl)]
|
||||
tau = [(math_tensordot(Mp,prm%P_sl(1:3,1:3,i)),i = 1, prm%sum_N_sl)]
|
||||
|
||||
tau_eff = abs(tau)-dst%tau_pass(:,en)
|
||||
tau_eff = abs(tau)-dst%tau_pass(:,en)
|
||||
|
||||
significantStress: where(tau_eff > tol_math_check)
|
||||
stressRatio = tau_eff/prm%tau_0
|
||||
StressRatio_p = stressRatio** prm%p
|
||||
BoltzmannRatio = prm%Q_s/(kB*T)
|
||||
v_wait_inverse = prm%v_0**(-1.0_pReal) * exp(BoltzmannRatio*(1.0_pReal-StressRatio_p)** prm%q)
|
||||
v_run_inverse = prm%B/(tau_eff*prm%b_sl)
|
||||
significantStress: where(tau_eff > tol_math_check)
|
||||
stressRatio = tau_eff/prm%tau_0
|
||||
StressRatio_p = stressRatio** prm%p
|
||||
Q_kB_T = prm%Q_sl/(kB*T)
|
||||
v_wait_inverse = prm%v_0**(-1.0_pReal) * exp(Q_kB_T*(1.0_pReal-StressRatio_p)** prm%q)
|
||||
v_run_inverse = prm%B/(tau_eff*prm%b_sl)
|
||||
|
||||
dot_gamma_sl = sign(stt%rho_mob(:,en)*prm%b_sl/(v_wait_inverse+v_run_inverse),tau)
|
||||
dot_gamma_sl = sign(stt%rho_mob(:,en)*prm%b_sl/(v_wait_inverse+v_run_inverse),tau)
|
||||
|
||||
dV_wait_inverse_dTau = -1.0_pReal * v_wait_inverse * prm%p * prm%q * BoltzmannRatio &
|
||||
* (stressRatio**(prm%p-1.0_pReal)) &
|
||||
* (1.0_pReal-StressRatio_p)**(prm%q-1.0_pReal) &
|
||||
/ prm%tau_0
|
||||
dV_run_inverse_dTau = -1.0_pReal * v_run_inverse/tau_eff
|
||||
dV_dTau = -1.0_pReal * (dV_wait_inverse_dTau+dV_run_inverse_dTau) &
|
||||
/ (v_wait_inverse+v_run_inverse)**2.0_pReal
|
||||
ddot_gamma_dtau = dV_dTau*stt%rho_mob(:,en)*prm%b_sl
|
||||
else where significantStress
|
||||
dot_gamma_sl = 0.0_pReal
|
||||
ddot_gamma_dtau = 0.0_pReal
|
||||
end where significantStress
|
||||
dV_wait_inverse_dTau = -1.0_pReal * v_wait_inverse * prm%p * prm%q * Q_kB_T &
|
||||
* (stressRatio**(prm%p-1.0_pReal)) &
|
||||
* (1.0_pReal-StressRatio_p)**(prm%q-1.0_pReal) &
|
||||
/ prm%tau_0
|
||||
dV_run_inverse_dTau = -1.0_pReal * v_run_inverse/tau_eff
|
||||
dV_dTau = -1.0_pReal * (dV_wait_inverse_dTau+dV_run_inverse_dTau) &
|
||||
/ (v_wait_inverse+v_run_inverse)**2.0_pReal
|
||||
ddot_gamma_dtau = dV_dTau*stt%rho_mob(:,en)*prm%b_sl
|
||||
else where significantStress
|
||||
dot_gamma_sl = 0.0_pReal
|
||||
ddot_gamma_dtau = 0.0_pReal
|
||||
end where significantStress
|
||||
|
||||
end associate
|
||||
|
||||
|
@ -945,34 +939,35 @@ pure subroutine kinetics_tw(Mp,T,dot_gamma_sl,ph,en,&
|
|||
|
||||
integer :: i,s1,s2
|
||||
|
||||
|
||||
associate(prm => param(ph), stt => state(ph), dst => dependentState(ph))
|
||||
|
||||
do i = 1, prm%sum_N_tw
|
||||
tau(i) = math_tensordot(Mp,prm%P_tw(1:3,1:3,i))
|
||||
isFCC: if (prm%fccTwinTransNucleation) then
|
||||
s1=prm%fcc_twinNucleationSlipPair(1,i)
|
||||
s2=prm%fcc_twinNucleationSlipPair(2,i)
|
||||
if (tau(i) < dst%tau_r_tw(i,en)) then ! ToDo: correct?
|
||||
Ndot0=(abs(dot_gamma_sl(s1))*(stt%rho_mob(s2,en)+stt%rho_dip(s2,en))+&
|
||||
abs(dot_gamma_sl(s2))*(stt%rho_mob(s1,en)+stt%rho_dip(s1,en)))/& ! ToDo: MD: it would be more consistent to use shearrates from state
|
||||
(prm%L_tw*prm%b_sl(i))*&
|
||||
(1.0_pReal-exp(-prm%V_cs/(kB*T)*(dst%tau_r_tw(i,en)-tau(i)))) ! P_ncs
|
||||
else
|
||||
Ndot0=0.0_pReal
|
||||
end if
|
||||
else isFCC
|
||||
Ndot0=prm%dot_N_0_tw(i)
|
||||
endif isFCC
|
||||
enddo
|
||||
do i = 1, prm%sum_N_tw
|
||||
tau(i) = math_tensordot(Mp,prm%P_tw(1:3,1:3,i))
|
||||
isFCC: if (prm%fccTwinTransNucleation) then
|
||||
s1=prm%fcc_twinNucleationSlipPair(1,i)
|
||||
s2=prm%fcc_twinNucleationSlipPair(2,i)
|
||||
if (tau(i) < dst%tau_r_tw(i,en)) then ! ToDo: correct?
|
||||
Ndot0=(abs(dot_gamma_sl(s1))*(stt%rho_mob(s2,en)+stt%rho_dip(s2,en))+&
|
||||
abs(dot_gamma_sl(s2))*(stt%rho_mob(s1,en)+stt%rho_dip(s1,en)))/&
|
||||
(prm%L_tw*prm%b_sl(i))*&
|
||||
(1.0_pReal-exp(-prm%V_cs/(kB*T)*(dst%tau_r_tw(i,en)-tau(i))))
|
||||
else
|
||||
Ndot0=0.0_pReal
|
||||
end if
|
||||
else isFCC
|
||||
Ndot0=prm%dot_N_0_tw(i)
|
||||
endif isFCC
|
||||
enddo
|
||||
|
||||
significantStress: where(tau > tol_math_check)
|
||||
StressRatio_r = (dst%tau_hat_tw(:,en)/tau)**prm%r
|
||||
dot_gamma_tw = prm%gamma_char * dst%V_tw(:,en) * Ndot0*exp(-StressRatio_r)
|
||||
ddot_gamma_dtau = (dot_gamma_tw*prm%r/tau)*StressRatio_r
|
||||
else where significantStress
|
||||
dot_gamma_tw = 0.0_pReal
|
||||
ddot_gamma_dtau = 0.0_pReal
|
||||
end where significantStress
|
||||
significantStress: where(tau > tol_math_check)
|
||||
StressRatio_r = (dst%tau_hat_tw(:,en)/tau)**prm%r
|
||||
dot_gamma_tw = prm%gamma_char * dst%V_tw(:,en) * Ndot0*exp(-StressRatio_r)
|
||||
ddot_gamma_dtau = (dot_gamma_tw*prm%r/tau)*StressRatio_r
|
||||
else where significantStress
|
||||
dot_gamma_tw = 0.0_pReal
|
||||
ddot_gamma_dtau = 0.0_pReal
|
||||
end where significantStress
|
||||
|
||||
end associate
|
||||
|
||||
|
@ -1011,36 +1006,37 @@ pure subroutine kinetics_tr(Mp,T,dot_gamma_sl,ph,en,&
|
|||
Ndot0, &
|
||||
stressRatio_s, &
|
||||
ddot_gamma_dtau
|
||||
|
||||
integer :: i,s1,s2
|
||||
|
||||
|
||||
associate(prm => param(ph), stt => state(ph), dst => dependentState(ph))
|
||||
|
||||
do i = 1, prm%sum_N_tr
|
||||
tau(i) = math_tensordot(Mp,prm%P_tr(1:3,1:3,i))
|
||||
isFCC: if (prm%fccTwinTransNucleation) then
|
||||
s1=prm%fcc_twinNucleationSlipPair(1,i)
|
||||
s2=prm%fcc_twinNucleationSlipPair(2,i)
|
||||
if (tau(i) < dst%tau_r_tr(i,en)) then ! ToDo: correct?
|
||||
Ndot0=(abs(dot_gamma_sl(s1))*(stt%rho_mob(s2,en)+stt%rho_dip(s2,en))+&
|
||||
abs(dot_gamma_sl(s2))*(stt%rho_mob(s1,en)+stt%rho_dip(s1,en)))/& ! ToDo: MD: it would be more consistent to use shearrates from state
|
||||
(prm%L_tr*prm%b_sl(i))*&
|
||||
(1.0_pReal-exp(-prm%V_cs/(kB*T)*(dst%tau_r_tr(i,en)-tau(i)))) ! P_ncs
|
||||
else
|
||||
Ndot0=0.0_pReal
|
||||
end if
|
||||
else isFCC
|
||||
Ndot0=prm%dot_N_0_tr(i)
|
||||
endif isFCC
|
||||
enddo
|
||||
do i = 1, prm%sum_N_tr
|
||||
tau(i) = math_tensordot(Mp,prm%P_tr(1:3,1:3,i))
|
||||
isFCC: if (prm%fccTwinTransNucleation) then
|
||||
s1=prm%fcc_twinNucleationSlipPair(1,i)
|
||||
s2=prm%fcc_twinNucleationSlipPair(2,i)
|
||||
if (tau(i) < dst%tau_r_tr(i,en)) then ! ToDo: correct?
|
||||
Ndot0=(abs(dot_gamma_sl(s1))*(stt%rho_mob(s2,en)+stt%rho_dip(s2,en))+&
|
||||
abs(dot_gamma_sl(s2))*(stt%rho_mob(s1,en)+stt%rho_dip(s1,en)))/&
|
||||
(prm%L_tr*prm%b_sl(i))*&
|
||||
(1.0_pReal-exp(-prm%V_cs/(kB*T)*(dst%tau_r_tr(i,en)-tau(i))))
|
||||
else
|
||||
Ndot0=0.0_pReal
|
||||
end if
|
||||
else isFCC
|
||||
Ndot0=prm%dot_N_0_tr(i)
|
||||
endif isFCC
|
||||
enddo
|
||||
|
||||
significantStress: where(tau > tol_math_check)
|
||||
StressRatio_s = (dst%tau_hat_tr(:,en)/tau)**prm%s
|
||||
dot_gamma_tr = dst%V_tr(:,en) * Ndot0*exp(-StressRatio_s)
|
||||
ddot_gamma_dtau = (dot_gamma_tr*prm%s/tau)*StressRatio_s
|
||||
else where significantStress
|
||||
dot_gamma_tr = 0.0_pReal
|
||||
ddot_gamma_dtau = 0.0_pReal
|
||||
end where significantStress
|
||||
significantStress: where(tau > tol_math_check)
|
||||
StressRatio_s = (dst%tau_hat_tr(:,en)/tau)**prm%s
|
||||
dot_gamma_tr = dst%V_tr(:,en) * Ndot0*exp(-StressRatio_s)
|
||||
ddot_gamma_dtau = (dot_gamma_tr*prm%s/tau)*StressRatio_s
|
||||
else where significantStress
|
||||
dot_gamma_tr = 0.0_pReal
|
||||
ddot_gamma_dtau = 0.0_pReal
|
||||
end where significantStress
|
||||
|
||||
end associate
|
||||
|
||||
|
|
|
@ -359,11 +359,11 @@ module subroutine plastic_kinehardening_results(ph,group)
|
|||
case ('xi')
|
||||
if(prm%sum_N_sl>0) call results_writeDataset(stt%xi,group,trim(prm%output(o)), &
|
||||
'resistance against plastic slip','Pa')
|
||||
case ('tau_b') !ToDo: chi
|
||||
case ('chi')
|
||||
if(prm%sum_N_sl>0) call results_writeDataset(stt%chi,group,trim(prm%output(o)), &
|
||||
'back stress','Pa')
|
||||
case ('sgn(gamma)')
|
||||
if(prm%sum_N_sl>0) call results_writeDataset(stt%sgn_gamma,group,trim(prm%output(o)), & ! ToDo: could be int
|
||||
if(prm%sum_N_sl>0) call results_writeDataset(int(stt%sgn_gamma),group,trim(prm%output(o)), &
|
||||
'sense of shear','1')
|
||||
case ('chi_0')
|
||||
if(prm%sum_N_sl>0) call results_writeDataset(stt%chi_0,group,trim(prm%output(o)), &
|
||||
|
|
Loading…
Reference in New Issue