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