https://mooseframework.inl.gov
Loading...
Searching...
No Matches
TestAction.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#include "TestAction.h"
11#include "MooseObjectAction.h"
12#include "ActionFactory.h"
13#include "ActionWarehouse.h"
14#include "FEProblemBase.h"
15
18{
20
21 params.addParam<bool>("use_transient_executioner", "Option to use a transient executioner");
22 params.addParam<bool>("generate_mesh", true, "Option to have the action generate the mesh");
23 params.addParam<std::vector<VariableName>>(
24 "scalar_variable_names", {}, "List of scalar variables");
25 params.addParam<std::vector<FunctionName>>(
26 "scalar_variable_values", {}, "List of values of the scalar variables");
27 params.addParam<std::vector<VariableName>>("aux_variable_names", {}, "List of aux variables");
28 params.addParam<std::vector<FunctionName>>(
29 "aux_variable_values", {}, "List of values of the aux variables");
30 params.addParam<std::vector<std::string>>(
31 "mat_property_names", {}, "List of material property names");
32 params.addParam<std::vector<FunctionName>>(
33 "mat_property_values", {}, "List of values of the material properties");
34 params.addParam<bool>("ad", false, "Setup for AD or non-AD testing");
35
36 params.addPrivateParam<std::string>("fe_family");
37 params.addPrivateParam<std::string>("fe_order");
38
39 params.addParam<bool>("abort_on_solve_fail",
40 false,
41 "Abort if the solve did not converge rather than cut the timestep");
42
43 return params;
44}
45
47 : Action(params),
48 // if a derived class should have a different default, then that class needs
49 // to set this parameter in its constructor
50 _default_use_transient_executioner(false),
51
52 _scalar_variables(getParam<std::vector<VariableName>>("scalar_variable_names")),
53 _scalar_variable_values(getParam<std::vector<FunctionName>>("scalar_variable_values")),
54 _aux_variables(getParam<std::vector<VariableName>>("aux_variable_names")),
55 _aux_variable_values(getParam<std::vector<FunctionName>>("aux_variable_values")),
56 _mat_property_names(getParam<std::vector<std::string>>("mat_property_names")),
57 _mat_property_values(getParam<std::vector<FunctionName>>("mat_property_values")),
58 _fe_family(getParam<std::string>("fe_family")),
59 _fe_order(getParam<std::string>("fe_order")),
60 _ad(getParam<bool>("ad"))
61{
62 if (_scalar_variables.size() != _scalar_variable_values.size())
64 ": The parameters 'scalar_variable_names' and ",
65 "'scalar_variable_values' must have the same numbers of entries.");
66 if (_aux_variables.size() != _aux_variable_values.size())
68 ": The parameters 'aux_variable_names' and ",
69 "'aux_variable_values' must have the same numbers of entries.");
70 if (_mat_property_names.size() != _mat_property_values.size())
72 ": The parameters 'mat_property_names' and ",
73 "'mat_property_values' must have the same numbers of entries.");
74}
75
76void
78{
79 if (_current_task == "meta_action")
80 {
81 if (getParam<bool>("generate_mesh"))
82 addMesh();
83
84 addObjects();
85
86 {
87 const std::string class_name = "CreateProblemAction";
88 auto action_params = _action_factory.getValidParams(class_name);
89 action_params.set<std::string>("type") = "FEProblem";
90
91 std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
92 _action_factory.create(class_name, "fe_problem", action_params));
93
94 action->getObjectParams().set<MooseEnum>("kernel_coverage_check") = "false";
95 _awh.addActionBlock(action);
96 }
97 }
98}
99
100void
105
106void
107TestAction::addMeshInternal(const unsigned int & nx)
108{
109 std::vector<std::string> setup_mesh_tasks{"setup_mesh", "set_mesh_base", "init_mesh"};
110 for (const std::string & task : setup_mesh_tasks)
111 {
112 const std::string class_name = "SetupMeshAction";
114 params.set<std::string>("type") = "GeneratedMesh";
115 params.set<std::string>("task") = task;
116
117 std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
118 _action_factory.create(class_name, task, params));
119
120 action->getObjectParams().set<MooseEnum>("dim") = 1;
121 action->getObjectParams().set<unsigned int>("nx") = nx;
122 action->getObjectParams().set<bool>("allow_renumbering") = false;
123
124 _awh.addActionBlock(action);
125 }
126
127 std::vector<std::string> setup_mesh_complete_tasks{"prepare_mesh", "setup_mesh_complete"};
128 for (const std::string & task : setup_mesh_complete_tasks)
129 {
130 const std::string class_name = "SetupMeshCompleteAction";
132 params.set<std::string>("task") = task;
133
134 std::shared_ptr<Action> action =
135 std::static_pointer_cast<Action>(_action_factory.create(class_name, task, params));
136
137 _awh.addActionBlock(action);
138 }
139}
140
141void
154
155void
156TestAction::addScalarVariables(const std::vector<VariableName> & names,
157 const std::vector<FunctionName> & values)
158{
159 for (unsigned int i = 0; i < names.size(); ++i)
160 {
161 // add the scalar variable
162 addSolutionVariable(names[i], "SCALAR", "FIRST");
163
164 // add its IC
165 {
166 const std::string class_name = "AddInitialConditionAction";
168 params.set<std::string>("type") = "FunctionScalarIC";
169
170 std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
171 _action_factory.create(class_name, names[i] + "_IC", params));
172
173 action->getObjectParams().set<VariableName>("variable") = names[i];
174 action->getObjectParams().set<std::vector<FunctionName>>("function") = {values[i]};
175
176 _awh.addActionBlock(action);
177 }
178 }
179}
180
181void
183{
184 const std::vector<VariableName> names = _aux_variables;
185 const std::vector<FunctionName> values = _aux_variable_values;
186 const std::string fe_family = _fe_family;
187 const std::string fe_order = _fe_order;
188
189 for (unsigned int i = 0; i < names.size(); ++i)
190 {
191 // add the aux variable
192 addAuxVariable(names[i], fe_family, fe_order);
193
194 // add its IC
195 addFunctionIC(names[i], values[i]);
196
197 // add its aux kernel
198 {
199 const std::string class_name = "AddKernelAction";
201 params.set<std::string>("type") = "FunctionAux";
202 params.set<std::string>("task") = "add_aux_kernel";
203
204 std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
205 _action_factory.create(class_name, names[i] + "_aux", params));
206
207 action->getObjectParams().set<AuxVariableName>("variable") = names[i];
208 action->getObjectParams().set<FunctionName>("function") = values[i];
209
210 _awh.addActionBlock(action);
211 }
212 }
213}
214
215void
217{
218 const std::string class_name = "AddMaterialAction";
220 params.set<std::string>("type") = "GenericFunctionMaterial";
221
222 std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
223 _action_factory.create(class_name, "material", params));
224
225 action->getObjectParams().set<std::vector<std::string>>("prop_names") = _mat_property_names;
226 action->getObjectParams().set<std::vector<FunctionName>>("prop_values") = _mat_property_values;
227
228 _awh.addActionBlock(action);
229}
230
231void
232TestAction::addSolutionVariable(const VariableName & var_name,
233 const std::string & family,
234 const std::string & order,
235 const Real & scaling)
236{
237 const std::string class_name = "AddVariableAction";
239 params.set<MooseEnum>("family") = family;
240 params.set<MooseEnum>("order") = order;
241 params.set<std::vector<Real>>("scaling") = {scaling};
242
243 std::shared_ptr<Action> action =
244 std::static_pointer_cast<Action>(_action_factory.create(class_name, var_name, params));
245
246 _awh.addActionBlock(action);
247}
248
249void
250TestAction::addAuxVariable(const VariableName & var_name,
251 const std::string & fe_family,
252 const std::string & fe_order)
253{
254 const std::string class_name = "AddAuxVariableAction";
256
257 params.set<MooseEnum>("family") = fe_family;
258 params.set<MooseEnum>("order") = fe_order;
259
260 std::shared_ptr<Action> action =
261 std::static_pointer_cast<Action>(_action_factory.create(class_name, var_name, params));
262
263 _awh.addActionBlock(action);
264}
265
266void
267TestAction::addConstantIC(const VariableName & var_name, const Real & value)
268{
269 const std::string class_name = "AddInitialConditionAction";
271 params.set<std::string>("type") = "ConstantIC";
272
273 std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
274 _action_factory.create(class_name, var_name + "_IC", params));
275
276 action->getObjectParams().set<VariableName>("variable") = var_name;
277 action->getObjectParams().set<Real>("value") = value;
278
279 _awh.addActionBlock(action);
280}
281
282void
283TestAction::addFunctionIC(const VariableName & var_name, const FunctionName & function_name)
284{
285 const std::string class_name = "AddInitialConditionAction";
287 params.set<std::string>("type") = "FunctionIC";
288
289 std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
290 _action_factory.create(class_name, var_name + "_IC", params));
291
292 action->getObjectParams().set<VariableName>("variable") = var_name;
293 action->getObjectParams().set<FunctionName>("function") = function_name;
294
295 _awh.addActionBlock(action);
296}
297
298void
302
303void
305{
306 const std::string class_name = "CreateExecutionerAction";
307
308 // determine whether to use a transient executioner - different derived
309 // classes have different defaults: the declared default is irrelevant
310 bool use_transient_executioner;
311 if (isParamValid("use_transient_executioner"))
312 use_transient_executioner = getParam<bool>("use_transient_executioner");
313 else
314 use_transient_executioner = _default_use_transient_executioner;
315
316 // Due to more consistent divergence status reporting in PETSc (as of 5f3c5e7a), users should have
317 // the option to abort on the first fail if desired. Otherwise Jacobian testing, for example,
318 // could fail in undesired ways, even if the Jacobian test achieves a passing result.
319 bool abort_on_solve_fail = getParam<bool>("abort_on_solve_fail");
320
321 // if a time kernel is being tested, then use a transient executioner instead of steady
322 if (use_transient_executioner)
323 {
325 params.set<std::string>("type") = "Transient";
326
327 std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
328 _action_factory.create(class_name, "executioner", params));
329
330 action->getObjectParams().set<unsigned int>("num_steps") = 1;
331
332 if (abort_on_solve_fail)
333 action->getObjectParams().set<bool>("abort_on_solve_fail") = abort_on_solve_fail;
334
335 _awh.addActionBlock(action);
336 }
337 else
338 {
340 params.set<std::string>("type") = "Steady";
341
342 std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
343 _action_factory.create(class_name, "executioner", params));
344
345 if (abort_on_solve_fail)
346 action->getObjectParams().set<bool>("abort_on_solve_fail") = abort_on_solve_fail;
347
348 _awh.addActionBlock(action);
349 }
350}
351
352void
std::array< Real, 2 > values
std::shared_ptr< Action > create(const std::string &action, const std::string &action_name, InputParameters &parameters)
InputParameters getValidParams(const std::string &name)
void addActionBlock(std::shared_ptr< Action > blk)
static InputParameters validParams()
const std::string & _current_task
ActionWarehouse & _awh
void addPrivateParam(const std::string &name, const T &value)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
const std::string & name() const
void mooseError(Args &&... args) const
bool isParamValid(const std::string &name) const
ActionFactory & _action_factory
const std::vector< std::string > _mat_property_names
List of material properties to add.
Definition TestAction.h:145
virtual void addMaterials()
Adds materials.
Definition TestAction.C:216
const std::vector< VariableName > _aux_variables
List of aux variables to add.
Definition TestAction.h:140
virtual void addExecutioner()
Adds the executioner.
Definition TestAction.C:304
const std::vector< FunctionName > _scalar_variable_values
List of values for the scalar variables to add.
Definition TestAction.h:137
virtual void addSolutionVariables()=0
Adds the solution variables.
bool _default_use_transient_executioner
Default for option to use a transient executioner.
Definition TestAction.h:132
virtual void addMesh()
Adds the mesh.
Definition TestAction.C:101
void addFunctionIC(const VariableName &var_name, const FunctionName &function_name)
Adds a function initial condition.
Definition TestAction.C:283
void addScalarVariables(const std::vector< VariableName > &names, const std::vector< FunctionName > &values)
Adds scalar variables.
Definition TestAction.C:156
virtual void addPreconditioner()
Adds the preconditioner.
Definition TestAction.C:299
const std::string _fe_family
Default FE family.
Definition TestAction.h:150
virtual void act()
Definition TestAction.C:77
virtual void addObjects()
Adds all non-mesh objects.
Definition TestAction.C:142
virtual void addOutput()
Add output.
Definition TestAction.C:353
virtual void addUserObjects()=0
Adds user objects.
const std::string _fe_order
Default FE order.
Definition TestAction.h:152
void addConstantIC(const VariableName &var_name, const Real &value)
Adds a constant initial condition.
Definition TestAction.C:267
const std::vector< FunctionName > _aux_variable_values
List of function names for aux variables to add.
Definition TestAction.h:142
TestAction(const InputParameters &params)
Definition TestAction.C:46
void addAuxVariable(const VariableName &var_name, const std::string &fe_family, const std::string &fe_order)
Adds an aux variable.
Definition TestAction.C:250
void addSolutionVariable(const VariableName &var_name, const std::string &family="LAGRANGE", const std::string &order="FIRST", const Real &scaling=1.0)
Adds a solution variable.
Definition TestAction.C:232
virtual void addInitialConditions()=0
Adds the initial conditions.
const std::vector< FunctionName > _mat_property_values
List of function names for material properties to add.
Definition TestAction.h:147
static InputParameters validParams()
Definition TestAction.C:17
const std::vector< VariableName > _scalar_variables
List of scalar variables to add.
Definition TestAction.h:135
virtual void addAuxVariables()
Adds aux variables.
Definition TestAction.C:182
void addMeshInternal(const unsigned int &nx)
Adds the mesh with a provided number of elements in x direction.
Definition TestAction.C:107