98 const auto w_names = getParam<std::vector<NonlinearVariableName>>(
"chemical_potentials");
99 const auto chis = getParam<std::vector<MaterialPropertyName>>(
"susceptibilities");
100 const auto Fj_gr = getParam<std::vector<MaterialPropertyName>>(
"free_energies_gr");
101 const auto Fj_w = getParam<std::vector<MaterialPropertyName>>(
"free_energies_w");
102 const auto hj = getParam<std::vector<MaterialPropertyName>>(
"switching_function_names");
103 const auto M = getParam<std::vector<MaterialPropertyName>>(
"mobilities");
104 auto n_grs = getParam<unsigned int>(
"op_num");
105 const auto var_name_base = getParam<std::string>(
"var_name_base");
106 const auto Fj_op = getParam<std::vector<MaterialPropertyName>>(
"free_energies_op");
107 const auto kappa_gr = getParam<MaterialPropertyName>(
"kappa_gr");
108 const auto kappa_op = getParam<MaterialPropertyName>(
"kappa_op");
109 const auto gamma_gr = getParam<MaterialPropertyName>(
"gamma_gr");
110 const auto gamma_op = getParam<MaterialPropertyName>(
"gamma_op");
111 const auto gamma_xx = getParam<MaterialPropertyName>(
"gamma_grxop");
112 const auto gr_mob = getParam<MaterialPropertyName>(
"mobility_name_gr");
113 const auto op_mob = getParam<MaterialPropertyName>(
"mobility_name_op");
114 auto implicity = getParam<bool>(
"implicit");
115 auto displaced_mesh = getParam<bool>(
"use_displaced_mesh");
116 auto aniso = getParam<MultiMooseEnum>(
"anisotropic");
117 const auto hj_over_kVa = getParam<std::vector<MaterialPropertyName>>(
"hj_over_kVa");
118 const auto hj_c_min = getParam<std::vector<MaterialPropertyName>>(
"hj_c_min");
119 auto mass_conservation = getParam<bool>(
"mass_conservation");
122 unsigned int n_w = w_names.size();
123 unsigned int n_hj = hj.size();
124 std::vector<NonlinearVariableName> etas;
125 std::vector<NonlinearVariableName> c_names;
126 unsigned int n_etas = 0;
127 std::string kernel_name;
130 etas = getParam<std::vector<NonlinearVariableName>>(
"additional_ops");
131 n_etas = etas.size();
134 if (chis.size() != n_w)
135 mooseError(
"susceptibilities and chemical_potentials should be vectors of the same length.");
136 if (Fj_w.size() != n_w * n_hj)
137 mooseError(
"free_energies_w should be length of chemcial_potentials * length of " 138 "switching_function_names");
140 mooseError(
"M and chemical_potentials should be vectors of the same length.");
141 if (aniso.size() != n_w)
142 paramError(
"anisotropic",
"Provide as many values as entries in 'chemical_potentials'.");
145 std::vector<std::string> grs;
147 for (
unsigned int i = 0; i < n_grs; ++i)
150 std::vector<NonlinearVariableName> all_etas;
151 all_etas.reserve(n_etas + n_grs);
152 all_etas.insert(all_etas.end(), etas.begin(), etas.end());
153 all_etas.insert(all_etas.end(), grs.begin(), grs.end());
155 std::vector<std::string> all_vars;
156 all_vars.reserve(n_etas + n_grs + n_w);
157 all_vars.insert(all_vars.end(), all_etas.begin(), all_etas.end());
158 all_vars.insert(all_vars.end(), w_names.begin(), w_names.end());
160 std::vector<MaterialPropertyName> fj_temp;
161 fj_temp.resize(n_hj);
162 std::vector<VariableName> notarealvector;
163 notarealvector.resize(1);
164 std::vector<VariableName> v0;
165 v0.resize(n_etas + n_grs + n_w);
166 for (
unsigned int i = 0; i < n_etas + n_grs + n_w; ++i)
168 std::vector<VariableName> v1;
169 v1.resize(n_etas + n_grs);
170 for (
unsigned int i = 0; i < n_etas + n_grs; ++i)
172 std::vector<VariableName> v2;
173 v2.resize(n_etas + n_grs - 1);
176 NonlinearVariableName var_name;
177 MaterialPropertyName
kappa;
178 MaterialPropertyName mob_name;
179 std::vector<MaterialPropertyName> Fj_names;
181 for (
unsigned int i = 0; i < n_etas + n_grs; ++i)
183 var_name = all_etas[i];
189 Fj_names.resize(Fj_op.size());
196 Fj_names.resize(Fj_gr.size());
201 std::vector<MaterialPropertyName> gam;
202 gam.resize(n_etas + n_grs - 1);
204 for (
unsigned int j = 0;
j < n_etas + n_grs; ++
j)
208 v2[op] = all_etas[
j];
213 if (i < n_etas &&
j < n_etas)
215 else if (i >= n_etas &&
j >= n_etas)
225 params.
set<NonlinearVariableName>(
"variable") = var_name;
226 params.
set<
bool>(
"implicit") = implicity;
227 params.
set<
bool>(
"use_displaced_mesh") = displaced_mesh;
228 kernel_name =
"DT_" + var_name;
229 _problem->addKernel(
"TimeDerivative", kernel_name, params);
233 params.
set<NonlinearVariableName>(
"variable") = var_name;
234 params.
set<
bool>(
"implicit") = implicity;
235 params.
set<
bool>(
"use_displaced_mesh") = displaced_mesh;
236 params.
set<MaterialPropertyName>(
"kappa_name") =
kappa;
237 params.
set<MaterialPropertyName>(
"mob_name") = mob_name;
238 params.
set<std::vector<VariableName>>(
"coupled_variables") = v2;
239 kernel_name =
"ACInt_" + var_name;
240 _problem->addKernel(
"ACInterface", kernel_name, params);
244 params.
set<NonlinearVariableName>(
"variable") = var_name;
245 params.
set<
bool>(
"implicit") = implicity;
246 params.
set<
bool>(
"use_displaced_mesh") = displaced_mesh;
247 params.
set<std::vector<MaterialPropertyName>>(
"Fj_names") = Fj_names;
248 params.
set<std::vector<MaterialPropertyName>>(
"hj_names") = hj;
249 params.
set<MaterialPropertyName>(
"mob_name") = mob_name;
250 params.
set<std::vector<VariableName>>(
"coupled_variables") = v0;
251 kernel_name =
"ACSwitch_" + var_name;
252 _problem->addKernel(
"ACSwitching", kernel_name, params);
256 params.
set<NonlinearVariableName>(
"variable") = var_name;
257 params.
set<
bool>(
"implicit") = implicity;
258 params.
set<
bool>(
"use_displaced_mesh") = displaced_mesh;
259 params.
set<MaterialPropertyName>(
"mob_name") = mob_name;
260 params.
set<std::vector<VariableName>>(
"v") = v2;
261 params.
set<std::vector<MaterialPropertyName>>(
"gamma_names") = gam;
262 kernel_name =
"AcGrGr_" + var_name;
263 _problem->addKernel(
"ACGrGrMulti", kernel_name, params);
266 if (mass_conservation)
268 c_names = getParam<std::vector<NonlinearVariableName>>(
"concentrations");
269 std::vector<VariableName> v3;
271 for (
unsigned int i = 0; i < n_w; ++i)
274 std::vector<VariableName> v4;
275 unsigned int n_c = c_names.size();
277 for (
unsigned int i = 0; i < n_c; ++i)
280 for (
unsigned int i = 0; i < n_c; ++i)
284 params.
set<NonlinearVariableName>(
"variable") = c_names[i];
285 params.
set<
bool>(
"implicit") = implicity;
286 params.
set<
bool>(
"use_displaced_mesh") = displaced_mesh;
287 kernel_name =
"DT_" + c_names[i];
288 _problem->addKernel(
"TimeDerivative", kernel_name, params);
292 params.
set<NonlinearVariableName>(
"variable") = c_names[i];
293 params.
set<std::vector<VariableName>>(
"v") = v3;
294 params.
set<
bool>(
"implicit") = implicity;
295 params.
set<
bool>(
"use_displaced_mesh") = displaced_mesh;
296 params.
set<MaterialPropertyName>(
"diffusivity") = M[i];
297 kernel_name =
"MatDif_" + w_names[i];
300 params.
set<std::vector<VariableName>>(
"args") = v1;
301 _problem->addKernel(
"MatAnisoDiffusion", kernel_name, params);
305 params.
set<std::vector<VariableName>>(
"args") = v0;
306 _problem->addKernel(
"MatDiffusion", kernel_name, params);
311 for (
unsigned int i = 0; i < n_w; ++i)
315 params.
set<NonlinearVariableName>(
"variable") = w_names[i];
316 params.
set<std::vector<VariableName>>(
"v") = v4;
317 params.
set<MaterialPropertyName>(
"mob_name") =
"-1";
318 kernel_name =
"MR_c" + w_names[i];
319 _problem->addKernel(
"MatReaction", kernel_name, params);
324 for (
unsigned int j = 0;
j < n_hj; ++
j)
328 params.
set<NonlinearVariableName>(
"variable") = w_names[i];
329 params.
set<std::vector<VariableName>>(
"args") = v1;
330 params.
set<MaterialPropertyName>(
"mob_name") = hj_over_kVa[
j];
331 params.
set<
bool>(
"implicit") = implicity;
332 params.
set<
bool>(
"use_displaced_mesh") = displaced_mesh;
333 kernel_name =
"MR_" + w_names[i] +
"_" + all_etas[
j];
334 _problem->addKernel(
"MatReaction", kernel_name, params);
338 params.
set<NonlinearVariableName>(
"variable") = w_names[i];
339 params.
set<std::vector<VariableName>>(
"coupled_variables") = v1;
340 params.
set<MaterialPropertyName>(
"mask") = hj_c_min[
j];
341 params.
set<
bool>(
"implicit") = implicity;
342 params.
set<
bool>(
"use_displaced_mesh") = displaced_mesh;
343 kernel_name =
"MBD_" + w_names[i] +
"_" + all_etas[
j];
344 _problem->addKernel(
"MaskedBodyForce", kernel_name, params);
351 for (
unsigned int i = 0; i < n_w; ++i)
355 params.
set<NonlinearVariableName>(
"variable") = w_names[i];
356 params.
set<MaterialPropertyName>(
"f_name") = chis[i];
357 params.
set<std::vector<VariableName>>(
"coupled_variables") = v0;
358 params.
set<
bool>(
"implicit") = implicity;
359 params.
set<
bool>(
"use_displaced_mesh") = displaced_mesh;
360 kernel_name =
"ChiDt_" + w_names[i];
361 _problem->addKernel(
"SusceptibilityTimeDerivative", kernel_name, params);
365 params.
set<NonlinearVariableName>(
"variable") = w_names[i];
366 params.
set<
bool>(
"implicit") = implicity;
367 params.
set<
bool>(
"use_displaced_mesh") = displaced_mesh;
368 params.
set<MaterialPropertyName>(
"diffusivity") = M[i];
369 kernel_name =
"MatDif_" + w_names[i];
371 _problem->addKernel(
"MatAnisoDiffusion", kernel_name, params);
374 params.
set<std::vector<VariableName>>(
"args") = v0;
375 _problem->addKernel(
"MatDiffusion", kernel_name, params);
379 for (
unsigned int j = 0;
j < n_hj; ++
j)
380 fj_temp[
j] = Fj_w[i * n_hj +
j];
381 for (
unsigned int j = 0;
j < n_etas + n_grs; ++
j)
383 notarealvector[0] = all_etas[
j];
385 params.
set<NonlinearVariableName>(
"variable") = w_names[i];
386 params.
set<std::vector<VariableName>>(
"v") = notarealvector;
387 params.
set<std::vector<VariableName>>(
"coupled_variables") = v0;
388 params.
set<std::vector<MaterialPropertyName>>(
"Fj_names") = fj_temp;
389 params.
set<std::vector<MaterialPropertyName>>(
"hj_names") = hj;
390 params.
set<
bool>(
"implicit") = implicity;
391 params.
set<
bool>(
"use_displaced_mesh") = displaced_mesh;
392 kernel_name =
"Coupled_" + w_names[i] +
"_" + all_etas[
j];
393 _problem->addKernel(
"CoupledSwitchingTimeDerivative", kernel_name, params);
InputParameters getValidParams(const std::string &name) const
bool isParamValid(const std::string &name) const
void paramError(const std::string ¶m, Args... args) const
std::string stringify(const T &t)
static const std::string kappa
void mooseError(Args &&... args) const
std::shared_ptr< FEProblemBase > & _problem
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")