www.mooseframework.org
SetupTimeStepperAction.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 "SetupTimeStepperAction.h"
11 #include "Transient.h"
12 #include "MooseApp.h"
13 #include "Factory.h"
14 #include "TimeStepper.h"
15 #include "AddTimeStepperAction.h"
16 #include "FEProblemBase.h"
17 #include "CompositionDT.h"
18 
19 registerMooseAction("MooseApp", SetupTimeStepperAction, "setup_time_steppers");
20 
23 {
25  params.addClassDescription("Set up the final time stepper.");
26  return params;
27 }
28 
30  : Action(parameters)
31 {
32 }
33 
34 void
36 {
37  if (Transient * transient = dynamic_cast<Transient *>(_app.getExecutioner()))
38  {
39  std::vector<TimeStepper *> timesteppers;
40  _problem->theWarehouse().query().condition<AttribSystem>("TimeStepper").queryInto(timesteppers);
41 
42  // No timestepper(s) were added by the user, so add a default one
43  if (timesteppers.empty())
44  {
45  const auto ts_name = "ConstantDT";
46  auto params = _factory.getValidParams(ts_name);
47  params.set<Transient *>("_executioner") = transient;
48 
49  if (!transient->parameters().isParamSetByAddParam("end_time") &&
50  !transient->parameters().isParamSetByAddParam("num_steps") &&
51  transient->parameters().isParamSetByAddParam("dt"))
52  params.set<Real>("dt") =
53  (transient->getParam<Real>("end_time") - transient->getParam<Real>("start_time")) /
54  static_cast<Real>(transient->getParam<unsigned int>("num_steps"));
55  else
56  params.set<Real>("dt") = transient->getParam<Real>("dt");
57 
58  params.set<bool>("reset_dt") = transient->getParam<bool>("reset_dt");
59 
60  auto ts =
61  _problem->addObject<TimeStepper>(ts_name, ts_name, params, /* threaded = */ false)[0];
62  transient->setTimeStepper(*ts);
63  }
64  // TimeStepper(s) were added by the user
65  else
66  {
67  // The user add a time stepper with [TimeStepper] or [TimeSteppers], create one for them
68  auto no_time_stepper = _awh.getActionListByName("add_time_stepper").empty();
69  auto no_time_steppers = _awh.getActionListByName("add_time_steppers").empty();
70  if (!no_time_stepper || !no_time_steppers)
71  {
72  std::vector<TimeStepper *> timesteppers;
73  _problem->theWarehouse()
74  .query()
75  .condition<AttribSystem>("TimeStepper")
76  .queryInto(timesteppers);
77 
78  mooseAssert(timesteppers.size(), "Timesteppers not found");
79 
80  if (timesteppers.size() == 1)
81  transient->setTimeStepper(*timesteppers[0]);
82  else
83  for (auto ts : timesteppers)
84  if (dynamic_cast<CompositionDT *>(ts))
85  transient->setTimeStepper(*ts);
86 
87  mooseAssert(transient->getTimeStepper(), "Not set");
88  }
89  // The user used both [TimeStepper] and [TimeSteppers] for time stepper setup, use input in
90  // [TimeSteppers] block and give an error message
91  if (!no_time_stepper && !no_time_steppers)
92  mooseError("Both [TimeStepper] and [TimeSteppers] are used to setup the time stepper. The "
93  "[TimeStepper] block will be ignored. Note [TimeStepper] will be deprecated "
94  "soon. Please consider [TimeSteppers] for future use.");
95  }
96  }
97 }
Transient executioners usually loop through a number of timesteps...
Definition: Transient.h:26
static InputParameters validParams()
virtual void act() override
Method to add objects to the simulation or perform other setup tasks.
ActionWarehouse & _awh
Reference to ActionWarehouse where we store object build by actions.
Definition: Action.h:170
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
InputParameters getValidParams(const std::string &name) const
Get valid parameters for the object.
Definition: Factory.C:67
Base class for time stepping.
Definition: TimeStepper.h:22
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
const std::list< Action * > & getActionListByName(const std::string &task) const
Retrieve a constant list of Action pointers associated with the passed in task.
Base class for actions.
Definition: Action.h:38
Factory & _factory
The Factory associated with the MooseApp.
static InputParameters validParams()
Definition: Action.C:24
registerMooseAction("MooseApp", SetupTimeStepperAction, "setup_time_steppers")
MooseApp & _app
The MOOSE application this is associated with.
Definition: MooseBase.h:84
Executioner * getExecutioner() const
Retrieve the Executioner for this App.
Definition: MooseApp.C:1483
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
void addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump...
std::shared_ptr< FEProblemBase > & _problem
Convenience reference to a problem this action works on.
Definition: Action.h:179
SetupTimeStepperAction(const InputParameters &parameters)
Set up the final time stepper for the simulation.