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