-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdislocation_evolution.cpp
129 lines (124 loc) · 6.54 KB
/
dislocation_evolution.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "singleX.h"
#include <vector>
void Slip::update_ssd_old(Matrix3d strain_rate, Matrix3d orientation){
/*
* [velocity parameters]
* 1. MFP control coeffient, 2. reference frequency, 3. activation energy, 4. slip resistance, 5. energy exponent
* 6. saturated speed, 7. drag coefficient
* [hardening parameters]
* 8. forest hardening coefficient
* [DD evolution parameters]
* 0. SSD_density, 9. nucleation coefficient, 10. nucleation threshold stress, 11. multiplication coefficient
* 12. drag stress D, 13. reference strain rate, 14. c/g
*
* update parameters:
* 0: burgers, 1: mean_free_path, 2: disl_density_resist, 3: forest_stress
*/
if (flag_harden == 0) acc_strain += abs(shear_rate) * dtime;
if (flag_harden == 1){
double c_forest = harden_params[8], c_nuc = harden_params[9], tau_nuc = harden_params[10],\
c_multi = harden_params[11], c_annih = 0.,\
D = harden_params[12] * 1e6, ref_srate = harden_params[13], gg = c_forest/harden_params[14],\
burgers = update_params[0], mfp = update_params[1], forest_stress = update_params[3];
/* c_multi = (custom_var > 1) ? 1/log(exp(1) * custom_var)*c_multi : c_multi; */
/* double equi_strain_rate = calc_equivalent_value(strain_rate); */
/* double equi_strain_rate = calc_first_principal(strain_rate); */
/* double equi_strain_rate = strain_rate(2,2); */
double equi_strain_rate = abs(shear_rate);
rho_sat = c_forest * burgers / gg * (1-k_boltzmann * temperature/D/pow(burgers,3) * log(abs(equi_strain_rate)/ref_srate));
rho_sat = max(pow(1/rho_sat,2), 0.5*SSD_density);
double term_nuc = c_nuc * max(abs(rss)-tau_nuc,0.) / (shear_modulus * burgers * burgers);
double term_multi = c_multi / mfp;
c_annih = (term_multi + term_nuc) / rho_sat;
SSD_density += (term_multi + term_nuc - c_annih * SSD_density) * abs(shear_rate) * dtime;
rho_mov = SSD_density;
if(SSD_density < rho_init) rho_init = SSD_density;
}
}
/* Update acc_strain or SSD_density */
void Slip::update_rho_hard_old(vector<PMode*> mode_sys){
rho_H = SSD_density;
double coplanar = 0; int active_num = 0;
bool open = true;
for (auto &isys : mode_sys) {
if (isys->type != slip) {open = false; continue;}
active_num += isys->SSD_density > isys->rho_init ? 1 : 0;
if (isys->num == num) continue;
int inter_mode = get_interaction_mode(burgers_vec, plane_norm, isys->burgers_vec, isys->plane_norm);
if (inter_mode != 2) continue;
if (coplanar == 0.) coplanar += isys->SSD_density;
else coplanar = min(coplanar, isys->SSD_density);
}
open = open && (active_num > 0);
if (open) rho_H += coplanar;
}
void Slip::update_ssd(Matrix3d strain_rate, Matrix3d orientation){
/*
* [velocity parameters]
* 1. MFP control coeffient, 2. reference frequency, 3. activation energy, 4. slip resistance, 5. energy exponent
* 6. saturated speed, 7. drag coefficient
* [hardening parameters]
* 8. forest hardening coefficient
* [DD evolution parameters]
* 0. SSD_density, 9. nucleation coefficient, 10. nucleation threshold stress, 11. multiplication coefficient
* 12. drag stress D, 13. reference strain rate, 14. c/g
*
* update parameters:
* 0: burgers, 1: mean_free_path, 2: disl_density_resist, 3: forest_stress
*/
if (flag_harden == 0) acc_strain += abs(shear_rate) * dtime;
if (flag_harden == 1){
double c_forest = harden_params[8], c_nuc = harden_params[9], tau_nuc = harden_params[10],\
c_multi = harden_params[11], c_annih = 0.,\
D = harden_params[12] * 1e6, ref_srate = harden_params[13], gg = c_forest/harden_params[14],\
burgers = update_params[0], mfp = update_params[1], forest_stress = update_params[3];
SSD_density = rho_H;
/* double equi_strain_rate = strain_rate(2,2); */
/* double equi_strain_rate = calc_first_principal(strain_rate); */
double equi_strain_rate = calc_equivalent_value(strain_rate);
/* double equi_strain_rate = abs(shear_rate); */
rho_sat = c_forest * burgers / gg * (1-k_boltzmann * temperature/D/pow(burgers,3) * log(abs(equi_strain_rate)/ref_srate));
rho_sat = max(pow(1/rho_sat,2), 0.5*SSD_density);
custom_var = rho_sat;
/* double eff_nuc_stress = max(abs(rss) - forest_stress, 0.) - tau_nuc; */
double eff_nuc_stress = abs(rss) - tau_nuc;
double term_nuc = c_nuc * max(eff_nuc_stress,0.) / (shear_modulus * burgers * burgers);
double term_multi = c_multi / mfp;
c_annih = (term_multi + term_nuc) / rho_sat;
double disloc_incre = (term_multi + term_nuc - c_annih * SSD_density) * abs(shear_rate) * dtime;
if (disloc_incre > 2 * rho_sat) {
disloc_incre = 2 * rho_sat - SSD_density;
}
else if (disloc_incre + SSD_density < 0) disloc_incre = -0.1 * SSD_density;
SSD_density += disloc_incre;
rho_mov = SSD_density;
if(SSD_density < rho_init) rho_init = SSD_density;
}
}
void Slip::update_rho_hard(vector<PMode*> mode_sys){
double d_term_coplanar = 0, coeff_coplanar = harden_params[15];
vector<double> coplanar_indices;
for (auto &isys : mode_sys) {
if (isys->type != slip) continue;
if (isys->num == num) continue;
int inter_mode = get_interaction_mode(burgers_vec, plane_norm, isys->burgers_vec, isys->plane_norm);
if (inter_mode != 2) continue;
coplanar_indices.push_back(isys->num);
}
for (auto &index_1 : coplanar_indices) {
for (auto &index_2 : coplanar_indices) {
if (index_1 >= index_2) continue;
double plus_term = mode_sys[index_1]->SSD_density * mode_sys[index_1]->disl_vel * sqrt(mode_sys[index_2]->SSD_density) + \
mode_sys[index_2]->SSD_density * mode_sys[index_2]->disl_vel * sqrt(mode_sys[index_1]->SSD_density);
d_term_coplanar += plus_term;
}
double minus_term = mode_sys[index_1]->SSD_density * mode_sys[index_1]->disl_vel * sqrt(SSD_density) + \
SSD_density * disl_vel * sqrt(mode_sys[index_1]->SSD_density);
d_term_coplanar -= minus_term;
}
d_term_coplanar = d_term_coplanar * coeff_coplanar * dtime;
if (d_term_coplanar + SSD_density < 0) d_term_coplanar = -SSD_density * 0.5;
/* custom_var = d_term_coplanar; */
rho_H = SSD_density + d_term_coplanar;
rho_init = min(rho_H, rho_init);
}