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