13 #include "Conversion.h"
14 #include "FEProblem.h"
16 #include "MooseObjectAction.h"
17 #include "MooseMesh.h"
19 #include "libmesh/string_to_enum.h"
29 InputParameters params = validParams<Action>();
30 params.addClassDescription(
31 "Set up the variable and the kernels needed for a non-conserved phase field variable");
33 MooseEnum families(AddVariableAction::getNonlinearVariableFamilies());
34 MooseEnum orders(AddVariableAction::getNonlinearVariableOrders());
35 params.addParam<MooseEnum>(
"family",
37 "Specifies the family of FE "
38 "shape functions to use for this variable");
39 params.addParam<MooseEnum>(
"order",
41 "Specifies the order of the FE "
42 "shape function to use for this variable");
43 params.addParam<Real>(
"scaling", 1.0,
"Specifies a scaling factor to apply to this variable");
44 params.addParam<
bool>(
"implicit",
true,
"Whether kernels are implicit or not");
45 params.addParam<
bool>(
46 "use_displaced_mesh",
false,
"Whether to use displaced mesh in the kernels");
47 params.addParamNamesToGroup(
"scaling implicit use_displaced_mesh",
"Advanced");
48 params.addParam<MaterialPropertyName>(
"mobility",
"L",
"The mobility used with the kernel");
49 params.addParam<std::vector<VariableName>>(
"args",
50 "Vector of variable arguments this kernel depends on");
51 params.addRequiredParam<MaterialPropertyName>(
52 "free_energy",
"Base name of the free energy function F defined in a free energy material");
53 params.addParam<MaterialPropertyName>(
"kappa",
"kappa_op",
"The kappa used with the kernel");
54 params.addParam<
bool>(
"variable_mobility",
56 "The mobility is a function of any MOOSE variable (if "
57 "this is set to false, L must be constant over the "
66 _fe_type(Utility::string_to_enum<Order>(getParam<MooseEnum>(
"order")),
67 Utility::string_to_enum<FEFamily>(getParam<MooseEnum>(
"family")))
77 if (_current_task ==
"add_variable")
79 auto type = AddVariableAction::determineType(
_fe_type, 1);
80 auto var_params = _factory.getValidParams(type);
82 var_params.applySpecificParameters(_pars, {
"family",
"order"});
83 var_params.set<std::vector<Real>>(
"scaling") = {getParam<Real>(
"scaling")};
86 _problem->addVariable(type,
_var_name, var_params);
92 else if (_current_task ==
"add_kernel")
95 std::string kernel_type =
"TimeDerivative";
97 std::string kernel_name =
_var_name +
"_" + kernel_type;
98 InputParameters params1 = _factory.getValidParams(kernel_type);
99 params1.set<NonlinearVariableName>(
"variable") =
_var_name;
100 params1.applyParameters(parameters());
102 _problem->addKernel(kernel_type, kernel_name, params1);
105 kernel_type =
"AllenCahn";
107 kernel_name =
_var_name +
"_" + kernel_type;
108 InputParameters params2 = _factory.getValidParams(kernel_type);
109 params2.set<NonlinearVariableName>(
"variable") =
_var_name;
110 params2.set<MaterialPropertyName>(
"mob_name") = getParam<MaterialPropertyName>(
"mobility");
111 params2.set<MaterialPropertyName>(
"f_name") = getParam<MaterialPropertyName>(
"free_energy");
112 params2.applyParameters(parameters());
114 _problem->addKernel(kernel_type, kernel_name, params2);
117 kernel_type =
"ACInterface";
119 kernel_name =
_var_name +
"_" + kernel_type;
120 InputParameters params3 = _factory.getValidParams(kernel_type);
121 params3.set<NonlinearVariableName>(
"variable") =
_var_name;
122 params3.set<MaterialPropertyName>(
"mob_name") = getParam<MaterialPropertyName>(
"mobility");
123 params3.set<MaterialPropertyName>(
"kappa_name") = getParam<MaterialPropertyName>(
"kappa");
124 params3.set<
bool>(
"variable_L") = getParam<bool>(
"variable_mobility");
125 params3.applyParameters(parameters());
127 _problem->addKernel(kernel_type, kernel_name, params3);