www.mooseframework.org
SolutionTimeAdaptiveDT.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 "SolutionTimeAdaptiveDT.h"
11 #include "FEProblem.h"
12 #include "Transient.h"
13 
14 #include <chrono>
15 
17 
19 
22 {
24  params.addParam<Real>(
25  "percent_change", 0.1, "Percentage to change the timestep by. Should be between 0 and 1");
26  params.addParam<int>(
27  "initial_direction", 1, "Direction for the first step. 1 for up... -1 for down. ");
28  params.addParam<bool>("adapt_log", false, "Output adaptive time step log");
29  params.addRequiredParam<Real>("dt", "The timestep size between solves");
30 
31  return params;
32 }
33 
35  : TimeStepper(parameters),
36  _direction(getParam<int>("initial_direction")),
37  _percent_change(getParam<Real>("percent_change")),
38  _older_sol_time_vs_dt(std::numeric_limits<Real>::max()),
39  _old_sol_time_vs_dt(std::numeric_limits<Real>::max()),
40  _sol_time_vs_dt(std::numeric_limits<Real>::max()),
41  _adapt_log(getParam<bool>("adapt_log"))
42 
43 {
44  if ((_adapt_log) && (processor_id() == 0))
45  {
46  static const std::string log("adaptive_log");
47  _adaptive_log.open(log);
48  if (_adaptive_log.fail())
49  mooseError("Unable to open file ", log);
50  _adaptive_log << "Adaptive Times Step Log" << std::endl;
51  }
52 }
53 
55 
56 void
58 {
59  auto solve_start = std::chrono::system_clock::now();
60 
62 
63  if (converged())
64  {
65  auto solve_end = std::chrono::system_clock::now();
66  auto elapsed_time =
67  std::chrono::duration_cast<std::chrono::milliseconds>(solve_end - solve_start).count();
68 
71  _sol_time_vs_dt = elapsed_time / _dt;
72  }
73 }
74 
75 Real
77 {
78  return getParam<Real>("dt");
79 }
80 
81 Real
83 {
84  // Ratio grew so switch direction
86  {
87  _direction *= -1;
88 
89  // Make sure we take at least two steps in this new direction
90  _old_sol_time_vs_dt = std::numeric_limits<Real>::max();
91  _older_sol_time_vs_dt = std::numeric_limits<Real>::max();
92  }
93 
94  Real local_dt = _dt + _dt * _percent_change * _direction;
95 
96  if ((_adapt_log) && (processor_id() == 0))
97  {
98  Real out_dt = getCurrentDT();
99  if (out_dt > _dt_max)
100  out_dt = _dt_max;
101 
102  _adaptive_log << "***Time step: " << _t_step << ", time = " << _time + out_dt
103  << "\nCur DT: " << out_dt << "\nOlder Ratio: " << _older_sol_time_vs_dt
104  << "\nOld Ratio: " << _old_sol_time_vs_dt << "\nNew Ratio: " << _sol_time_vs_dt
105  << std::endl;
106  }
107 
108  return local_dt;
109 }
110 
111 void
113 {
114  _console << "Solve failed... cutting timestep" << std::endl;
115  if (_adapt_log)
116  _adaptive_log << "Solve failed... cutting timestep" << std::endl;
117 
119 }
TimeStepper::_dt_max
Real & _dt_max
Definition: TimeStepper.h:131
FEProblem.h
SolutionTimeAdaptiveDT::_percent_change
Real _percent_change
Percentage to change the timestep by either way.
Definition: SolutionTimeAdaptiveDT.h:47
TimeStepper::_dt
Real & _dt
Definition: TimeStepper.h:129
TimeStepper::getCurrentDT
Real getCurrentDT()
Get the current_dt.
Definition: TimeStepper.h:86
MooseObject::mooseError
void mooseError(Args &&... args) const
Definition: MooseObject.h:141
SolutionTimeAdaptiveDT::SolutionTimeAdaptiveDT
SolutionTimeAdaptiveDT(const InputParameters &parameters)
Definition: SolutionTimeAdaptiveDT.C:34
TimeStepper::_time
Real & _time
Values from executioner.
Definition: TimeStepper.h:126
SolutionTimeAdaptiveDT
Definition: SolutionTimeAdaptiveDT.h:24
SolutionTimeAdaptiveDT::_old_sol_time_vs_dt
Real _old_sol_time_vs_dt
Definition: SolutionTimeAdaptiveDT.h:50
SolutionTimeAdaptiveDT::_older_sol_time_vs_dt
Real _older_sol_time_vs_dt
Ratios to control whether to increase or decrease the current timestep.
Definition: SolutionTimeAdaptiveDT.h:50
InputParameters::addParam
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an option parameter and a documentation string to the InputParameters object.
Definition: InputParameters.h:1198
TimeStepper::converged
virtual bool converged() const
If the time step converged.
Definition: TimeStepper.C:183
SolutionTimeAdaptiveDT::_adaptive_log
std::ofstream _adaptive_log
The filehandle to hold the log.
Definition: SolutionTimeAdaptiveDT.h:56
ConsoleStreamInterface::_console
const ConsoleStream _console
An instance of helper class to write streams to the Console objects.
Definition: ConsoleStreamInterface.h:31
InputParameters
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
Definition: InputParameters.h:53
SolutionTimeAdaptiveDT::_direction
short _direction
Multiplier specifying the direction the timestep is currently going.
Definition: SolutionTimeAdaptiveDT.h:44
SolutionTimeAdaptiveDT::~SolutionTimeAdaptiveDT
virtual ~SolutionTimeAdaptiveDT()
Definition: SolutionTimeAdaptiveDT.C:54
TimeStepper
Base class for time stepping.
Definition: TimeStepper.h:26
SolutionTimeAdaptiveDT::computeDT
virtual Real computeDT() override
Called to compute _current_dt for a normal step.
Definition: SolutionTimeAdaptiveDT.C:82
SolutionTimeAdaptiveDT::_sol_time_vs_dt
Real _sol_time_vs_dt
Definition: SolutionTimeAdaptiveDT.h:50
SolutionTimeAdaptiveDT::step
virtual void step() override
Take a time step.
Definition: SolutionTimeAdaptiveDT.C:57
SolutionTimeAdaptiveDT.h
TimeStepper::step
virtual void step()
Take a time step.
Definition: TimeStepper.C:161
registerMooseObject
registerMooseObject("MooseApp", SolutionTimeAdaptiveDT)
Transient.h
std
Definition: TheWarehouse.h:80
TimeStepper::_t_step
int & _t_step
Definition: TimeStepper.h:128
TimeStepper::rejectStep
virtual void rejectStep()
This gets called when time step is rejected.
Definition: TimeStepper.C:177
SolutionTimeAdaptiveDT::computeInitialDT
virtual Real computeInitialDT() override
Called to compute _current_dt for the first timestep.
Definition: SolutionTimeAdaptiveDT.C:76
SolutionTimeAdaptiveDT::rejectStep
virtual void rejectStep() override
This gets called when time step is rejected.
Definition: SolutionTimeAdaptiveDT.C:112
TimeStepper::validParams
static InputParameters validParams()
Definition: TimeStepper.C:18
defineLegacyParams
defineLegacyParams(SolutionTimeAdaptiveDT)
SolutionTimeAdaptiveDT::validParams
static InputParameters validParams()
Definition: SolutionTimeAdaptiveDT.C:21
InputParameters::addRequiredParam
void addRequiredParam(const std::string &name, const std::string &doc_string)
This method adds a parameter and documentation string to the InputParameters object that will be extr...
Definition: InputParameters.h:1176
SolutionTimeAdaptiveDT::_adapt_log
bool _adapt_log
Boolean to control whether a separate adapt log is written to a file.
Definition: SolutionTimeAdaptiveDT.h:53