12 #include "Conversion.h"
13 #include "FEProblem.h"
15 #include "MooseObjectAction.h"
16 #include "MooseMesh.h"
17 #include "AddVariableAction.h"
19 #include "libmesh/string_to_enum.h"
29 InputParameters params = validParams<Action>();
30 params.addClassDescription(
31 "Set up the variable(s) and the kernels needed for a conserved phase field variable."
32 " Note that for a direct solve, the element family and order are overwritten with hermite "
34 MooseEnum solves(
"DIRECT REVERSE_SPLIT FORWARD_SPLIT");
35 params.addRequiredParam<MooseEnum>(
"solve_type", solves,
"Split or direct solve?");
37 MooseEnum families(AddVariableAction::getNonlinearVariableFamilies());
38 MooseEnum orders(AddVariableAction::getNonlinearVariableOrders());
39 params.addParam<MooseEnum>(
"family",
41 "Specifies the family of FE "
42 "shape functions to use for this variable");
43 params.addParam<MooseEnum>(
"order",
45 "Specifies the order of the FE "
46 "shape function to use for this variable");
47 params.addParam<Real>(
"scaling", 1.0,
"Specifies a scaling factor to apply to this variable");
48 params.addParam<
bool>(
"implicit",
true,
"Whether kernels are implicit or not");
49 params.addParam<
bool>(
50 "use_displaced_mesh",
false,
"Whether to use displaced mesh in the kernels");
51 params.addParamNamesToGroup(
"scaling implicit use_displaced_mesh",
"Advanced");
52 params.addRequiredParam<MaterialPropertyName>(
"mobility",
"The mobility used with the kernel");
53 params.addParam<std::vector<VariableName>>(
"args",
54 "Vector of variable arguments this kernel depends on");
55 params.addRequiredParam<MaterialPropertyName>(
56 "free_energy",
"Base name of the free energy function F defined in a free energy material");
57 params.addRequiredParam<MaterialPropertyName>(
"kappa",
"The kappa used with the kernel");
64 _solve_type(getParam<MooseEnum>(
"solve_type").getEnum<
SolveType>()),
66 _scaling(getParam<Real>(
"scaling"))
71 _fe_type = FEType(Utility::string_to_enum<Order>(
"THIRD"),
72 Utility::string_to_enum<FEFamily>(
"HERMITE"));
73 if (!parameters().isParamSetByAddParam(
"order") &&
74 !parameters().isParamSetByAddParam(
"family"))
75 mooseWarning(
"Order and family autoset to third and hermite in ConservedAction");
79 _fe_type = FEType(Utility::string_to_enum<Order>(getParam<MooseEnum>(
"order")),
80 Utility::string_to_enum<FEFamily>(getParam<MooseEnum>(
"family")));
85 paramError(
"solve_type",
"Incorrect solve_type in ConservedAction");
95 if (_current_task ==
"add_variable")
97 auto type = AddVariableAction::determineType(
_fe_type, 1);
98 auto var_params = _factory.getValidParams(type);
99 var_params.set<MooseEnum>(
"family") = Moose::stringify(
_fe_type.family);
100 var_params.set<MooseEnum>(
"order") =
_fe_type.order.get_order();
101 var_params.set<std::vector<Real>>(
"scaling") = {
_scaling};
104 _problem->addVariable(type,
_var_name, var_params);
120 else if (_current_task ==
"add_kernel")
127 std::string kernel_type =
"TimeDerivative";
129 std::string kernel_name =
_var_name +
"_" + kernel_type;
130 InputParameters params = _factory.getValidParams(kernel_type);
131 params.set<NonlinearVariableName>(
"variable") =
_var_name;
132 params.applyParameters(parameters());
134 _problem->addKernel(kernel_type, kernel_name, params);
139 std::string kernel_type =
"CahnHilliard";
141 std::string kernel_name =
_var_name +
"_" + kernel_type;
142 InputParameters params = _factory.getValidParams(kernel_type);
143 params.set<NonlinearVariableName>(
"variable") =
_var_name;
144 params.set<MaterialPropertyName>(
"mob_name") = getParam<MaterialPropertyName>(
"mobility");
145 params.set<MaterialPropertyName>(
"f_name") =
146 getParam<MaterialPropertyName>(
"free_energy");
147 params.applyParameters(parameters());
149 _problem->addKernel(kernel_type, kernel_name, params);
154 std::string kernel_type =
"CHInterface";
156 std::string kernel_name =
_var_name +
"_" + kernel_type;
157 InputParameters params = _factory.getValidParams(kernel_type);
158 params.set<NonlinearVariableName>(
"variable") =
_var_name;
159 params.set<MaterialPropertyName>(
"mob_name") = getParam<MaterialPropertyName>(
"mobility");
160 params.set<MaterialPropertyName>(
"kappa_name") = getParam<MaterialPropertyName>(
"kappa");
161 params.applyParameters(parameters());
163 _problem->addKernel(kernel_type, kernel_name, params);
170 std::string kernel_type =
"CoupledTimeDerivative";
172 std::string kernel_name =
_var_name +
"_" + kernel_type;
173 InputParameters params = _factory.getValidParams(kernel_type);
174 params.set<NonlinearVariableName>(
"variable") =
_chempot_name;
175 params.set<std::vector<VariableName>>(
"v") = {
_var_name};
176 params.applyParameters(parameters());
178 _problem->addKernel(kernel_type, kernel_name, params);
183 std::string kernel_type =
"SplitCHWRes";
185 std::string kernel_name =
_var_name +
"_" + kernel_type;
186 InputParameters params = _factory.getValidParams(kernel_type);
187 params.set<NonlinearVariableName>(
"variable") =
_chempot_name;
188 params.set<MaterialPropertyName>(
"mob_name") = getParam<MaterialPropertyName>(
"mobility");
189 params.applyParameters(parameters());
191 _problem->addKernel(kernel_type, kernel_name, params);
196 std::string kernel_type =
"SplitCHParsed";
198 std::string kernel_name =
_var_name +
"_" + kernel_type;
199 InputParameters params = _factory.getValidParams(kernel_type);
200 params.set<NonlinearVariableName>(
"variable") =
_var_name;
201 params.set<std::vector<VariableName>>(
"w") = {
_chempot_name};
202 params.set<MaterialPropertyName>(
"f_name") =
203 getParam<MaterialPropertyName>(
"free_energy");
204 params.set<MaterialPropertyName>(
"kappa_name") = getParam<MaterialPropertyName>(
"kappa");
205 params.applyParameters(parameters());
207 _problem->addKernel(kernel_type, kernel_name, params);
214 std::string kernel_type =
"TimeDerivative";
216 std::string kernel_name =
_var_name +
"_" + kernel_type;
217 InputParameters params = _factory.getValidParams(kernel_type);
218 params.set<NonlinearVariableName>(
"variable") =
_var_name;
219 params.applyParameters(parameters());
221 _problem->addKernel(kernel_type, kernel_name, params);
226 std::string kernel_type =
"MatDiffusion";
228 std::string kernel_name =
_var_name +
"_" + kernel_type;
229 InputParameters params = _factory.getValidParams(kernel_type);
230 params.set<NonlinearVariableName>(
"variable") =
_var_name;
231 params.set<std::vector<VariableName>>(
"v") = {
_chempot_name};
232 params.set<MaterialPropertyName>(
"diffusivity") =
233 getParam<MaterialPropertyName>(
"mobility");
234 params.applyParameters(parameters());
236 _problem->addKernel(kernel_type, kernel_name, params);
240 std::string kernel_type =
"MatDiffusion";
243 InputParameters params = _factory.getValidParams(kernel_type);
244 params.set<NonlinearVariableName>(
"variable") =
_chempot_name;
245 params.set<std::vector<VariableName>>(
"v") = {
_var_name};
246 params.set<MaterialPropertyName>(
"diffusivity") = getParam<MaterialPropertyName>(
"kappa");
247 params.applyParameters(parameters());
249 _problem->addKernel(kernel_type, kernel_name, params);
254 std::string kernel_type =
"CoupledMaterialDerivative";
257 InputParameters params = _factory.getValidParams(kernel_type);
258 params.set<NonlinearVariableName>(
"variable") =
_chempot_name;
259 params.set<std::vector<VariableName>>(
"v") = {
_var_name};
260 params.set<MaterialPropertyName>(
"f_name") =
261 getParam<MaterialPropertyName>(
"free_energy");
262 params.applyParameters(parameters());
264 _problem->addKernel(kernel_type, kernel_name, params);
269 std::string kernel_type =
"CoefReaction";
272 InputParameters params = _factory.getValidParams(kernel_type);
273 params.set<NonlinearVariableName>(
"variable") =
_chempot_name;
274 params.set<Real>(
"coefficient") = -1.0;
275 params.applyParameters(parameters());
277 _problem->addKernel(kernel_type, kernel_name, params);