13 #include "AddVariableAction.h"
14 #include "Conversion.h"
15 #include "FEProblem.h"
17 #include "MooseObjectAction.h"
18 #include "MooseMesh.h"
19 #include "NonlinearSystemBase.h"
21 #include "libmesh/string_to_enum.h"
34 InputParameters params = validParams<Action>();
35 params.addClassDescription(
36 "Set up the variable and the kernels needed for a grain growth simulation");
37 params.addRequiredParam<
unsigned int>(
"op_num",
38 "specifies the number of order parameters to create");
39 params.addRequiredParam<std::string>(
"var_name_base",
"specifies the base name of the variables");
40 params.addParam<Real>(
41 "scaling", 1.0,
"Specifies a scaling factor to apply to the order parameters");
42 params.addParam<
bool>(
45 "Take the initial condition of all polycrystal variables from the mesh file");
48 MooseEnum families(AddVariableAction::getNonlinearVariableFamilies());
49 MooseEnum orders(AddVariableAction::getNonlinearVariableOrders());
50 params.addParam<MooseEnum>(
"family",
52 "Specifies the family of FE "
53 "shape function to use for the order parameters");
54 params.addParam<MooseEnum>(
"order",
56 "Specifies the order of the FE "
57 "shape function to use for the order parameters");
59 params.addParam<MaterialPropertyName>(
60 "mobility",
"L",
"The isotropic mobility used with the kernels");
61 params.addParam<MaterialPropertyName>(
"kappa",
"kappa_op",
"The kappa used with the kernels");
63 params.addParam<VariableName>(
"c",
"Name of coupled concentration variable");
65 params.addParam<Real>(
"en_ratio", 1.0,
"Ratio of surface to GB energy");
66 params.addParam<
unsigned int>(
"ndef", 0,
"Specifies the number of deformed grains to create");
67 params.addParam<
bool>(
"variable_mobility",
69 "The mobility is a function of any MOOSE variable (if "
70 "this is set to false, L must be constant over the "
72 params.addCoupledVar(
"args",
"Vector of nonlinear variable arguments that L depends on");
74 params.addParam<
bool>(
"implicit",
true,
"Whether kernels are implicit or not");
75 params.addParam<
bool>(
76 "use_displaced_mesh",
false,
"Whether to use displaced mesh in the kernels");
77 params.addParam<
bool>(
"use_automatic_differentiation",
79 "Flag to use automatic differentiation (AD) objects when possible");
81 params.addParamNamesToGroup(
"scaling implicit use_displaced_mesh",
"Advanced");
82 params.addParamNamesToGroup(
"c en_ratio ndef",
"Multiphysics");
89 _op_num(getParam<unsigned int>(
"op_num")),
90 _var_name_base(getParam<std::string>(
"var_name_base")),
91 _fe_type(Utility::string_to_enum<Order>(getParam<MooseEnum>(
"order")),
92 Utility::string_to_enum<FEFamily>(getParam<MooseEnum>(
"family"))),
93 _use_ad(getParam<bool>(
"use_automatic_differentiation"))
101 bool initial_from_file = getParam<bool>(
"initial_from_file");
104 for (
unsigned int op = 0; op <
_op_num; op++)
106 auto type = AddVariableAction::determineType(
_fe_type, 1);
107 auto var_params = _factory.getValidParams(type);
109 var_params.applySpecificParameters(_pars, {
"family",
"order"});
110 var_params.set<std::vector<Real>>(
"scaling") = {getParam<Real>(
"scaling")};
116 if (initial_from_file)
118 if (_current_task ==
"check_copy_nodal_vars")
119 _app.setFileRestart() =
true;
121 if (_current_task ==
"copy_nodal_vars")
123 auto * system = &_problem->getNonlinearSystemBase();
124 system->addVariableToCopy(var_name, var_name,
"LATEST");
129 if (_current_task ==
"add_variable")
130 _problem->addVariable(type, var_name, var_params);
133 else if (_current_task ==
"add_kernel")
140 std::string kernel_type =
_use_ad ?
"ADTimeDerivative" :
"TimeDerivative";
142 std::string kernel_name = var_name +
"_" + kernel_type;
143 InputParameters params =
144 _factory.getValidParams(kernel_type + (
_use_ad ?
"<RESIDUAL>" :
""));
145 params.set<NonlinearVariableName>(
"variable") = var_name;
146 params.applyParameters(parameters());
148 addKernel(kernel_type, kernel_name, params);
156 std::string kernel_type =
_use_ad ?
"ADGrainGrowth" :
"ACGrGrPoly";
159 std::vector<VariableName> v;
162 unsigned int ind = 0;
163 for (
unsigned int j = 0; j <
_op_num; ++j)
167 std::string kernel_name = var_name +
"_" + kernel_type;
168 InputParameters params =
169 _factory.getValidParams(kernel_type + (
_use_ad ?
"<RESIDUAL>" :
""));
170 params.set<NonlinearVariableName>(
"variable") = var_name;
171 params.set<std::vector<VariableName>>(
"v") = v;
172 params.set<MaterialPropertyName>(
"mob_name") = getParam<MaterialPropertyName>(
"mobility");
173 params.applyParameters(parameters());
175 addKernel(kernel_type, kernel_name, params);
183 std::string kernel_type =
_use_ad ?
"ADACInterface" :
"ACInterface";
185 std::string kernel_name = var_name +
"_" + kernel_type;
186 InputParameters params =
187 _factory.getValidParams(kernel_type + (
_use_ad ?
"<RESIDUAL>" :
""));
188 params.set<NonlinearVariableName>(
"variable") = var_name;
189 params.set<MaterialPropertyName>(
"mob_name") = getParam<MaterialPropertyName>(
"mobility");
190 params.set<MaterialPropertyName>(
"kappa_name") = getParam<MaterialPropertyName>(
"kappa");
191 params.set<
bool>(
"variable_L") = getParam<bool>(
"variable_mobility");
192 params.applyParameters(parameters());
194 addKernel(kernel_type, kernel_name, params);
201 if (isParamValid(
"c"))
204 mooseError(
"AD version of ACGBPoly is not implemented");
206 std::string kernel_type =
"ACGBPoly";
208 std::string kernel_name = var_name +
"_" + kernel_type;
209 InputParameters params = _factory.getValidParams(kernel_type);
210 params.set<NonlinearVariableName>(
"variable") = var_name;
211 params.set<std::vector<VariableName>>(
"c") = {getParam<VariableName>(
"c")};
212 params.applyParameters(parameters());
214 _problem->addKernel(kernel_type, kernel_name, params);
219 if (_current_task ==
"add_aux_variable")
221 auto var_params = _factory.getValidParams(
"MooseVariable");
222 var_params.set<MooseEnum>(
"family") =
"LAGRANGE";
223 var_params.set<MooseEnum>(
"order") =
"FIRST";
224 _problem->addAuxVariable(
"MooseVariable",
"bnds", var_params);
228 else if (_current_task ==
"add_aux_kernel")
231 std::vector<VariableName> v;
234 for (
unsigned int j = 0; j <
_op_num; ++j)
237 std::string aux_kernel_type =
"BndsCalcAux";
239 std::string aux_kernel_name =
"bnds_" + aux_kernel_type;
240 InputParameters params = _factory.getValidParams(aux_kernel_type);
241 params.set<AuxVariableName>(
"variable") =
"bnds";
242 params.set<std::vector<VariableName>>(
"v") = v;
243 params.applyParameters(parameters());
245 _problem->addAuxKernel(aux_kernel_type, aux_kernel_name, params);
251 const std::string & kernel_name,
252 InputParameters params)
256 _problem->addKernel(kernel_type +
"<RESIDUAL>", kernel_name +
"_residual", params);
257 _problem->addKernel(kernel_type +
"<JACOBIAN>", kernel_name +
"_jacobian", params);
258 _problem->haveADObjects(
true);
261 _problem->addKernel(kernel_type, kernel_name, params);