Line data Source code
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 "SetupTimeStepperAction.h" 11 : #include "TransientBase.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 : 21 : InputParameters 22 67684 : SetupTimeStepperAction::validParams() 23 : { 24 67684 : InputParameters params = Action::validParams(); 25 67684 : params.addClassDescription("Set up the final time stepper."); 26 67684 : return params; 27 0 : } 28 : 29 67684 : SetupTimeStepperAction::SetupTimeStepperAction(const InputParameters & parameters) 30 67684 : : Action(parameters) 31 : { 32 67684 : } 33 : 34 : void 35 62441 : SetupTimeStepperAction::act() 36 : { 37 62441 : if (TransientBase * transient = dynamic_cast<TransientBase *>(_app.getExecutioner())) 38 : { 39 31086 : std::vector<TimeStepper *> timesteppers; 40 31086 : _problem->theWarehouse().query().condition<AttribSystem>("TimeStepper").queryInto(timesteppers); 41 : 42 : // No timestepper(s) were added by the user, so add a default one 43 31086 : if (timesteppers.empty()) 44 : { 45 29989 : const auto ts_name = "ConstantDT"; 46 59978 : auto params = _factory.getValidParams(ts_name); 47 59978 : params.set<TransientBase *>("_executioner") = transient; 48 : 49 89967 : if (!transient->parameters().isParamSetByAddParam("end_time") && 50 99428 : !transient->parameters().isParamSetByAddParam("num_steps") && 51 31318 : transient->parameters().isParamSetByAddParam("dt")) 52 97 : params.set<Real>("dt") = 53 485 : (transient->getParam<Real>("end_time") - transient->getParam<Real>("start_time")) / 54 388 : static_cast<Real>(transient->getParam<unsigned int>("num_steps")); 55 : else 56 149460 : params.set<Real>("dt") = transient->getParam<Real>("dt"); 57 : 58 119956 : params.set<bool>("reset_dt") = transient->getParam<bool>("reset_dt"); 59 : 60 : auto ts = 61 179934 : _problem->addObject<TimeStepper>(ts_name, ts_name, params, /* threaded = */ false)[0]; 62 29989 : transient->setTimeStepper(*ts); 63 29989 : } 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 2194 : auto no_time_stepper = _awh.getActionListByName("add_time_stepper").empty(); 69 2194 : auto no_time_steppers = _awh.getActionListByName("add_time_steppers").empty(); 70 1097 : if (!no_time_stepper || !no_time_steppers) 71 : { 72 1097 : std::vector<TimeStepper *> timesteppers; 73 1097 : _problem->theWarehouse() 74 2194 : .query() 75 1097 : .condition<AttribSystem>("TimeStepper") 76 1097 : .queryInto(timesteppers); 77 : 78 : mooseAssert(timesteppers.size(), "Timesteppers not found"); 79 : 80 1097 : if (timesteppers.size() == 1) 81 955 : transient->setTimeStepper(*timesteppers[0]); 82 : else 83 737 : for (auto ts : timesteppers) 84 595 : if (dynamic_cast<CompositionDT *>(ts)) 85 142 : transient->setTimeStepper(*ts); 86 : 87 : mooseAssert(transient->getTimeStepper(), "Not set"); 88 1097 : } 89 : // The user used both [TimeStepper] and [TimeSteppers] for time stepper setup, use input in 90 : // [TimeSteppers] block and give an error message 91 1097 : if (!no_time_stepper && !no_time_steppers) 92 0 : 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 31086 : } 97 62441 : }