Reference documentation for deal.II version Git 0994510114 2020-11-30 18:32:56 -0700
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
discrete_time.cc
Go to the documentation of this file.
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2019 - 2020 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE.md at
12 // the top level directory of deal.II.
13 //
14 // ---------------------------------------------------------------------
15 
16 
19 
21 
22 namespace
23 {
24  // Helper function that computes the next discrete time, adjusting it if:
25  // - The next time exceeds the end time.
26  // - The next time is smaller but very close to the end time.
27  double
28  calculate_next_time(const double current_time,
29  const double step_size,
30  const double end_time)
31  {
32  Assert(step_size >= 0., ExcMessage("Time step size must be non-negative"));
33  Assert(end_time >= current_time, ExcInternalError());
34  double next_time = current_time + step_size;
35  constexpr double relative_tolerance = 0.05;
36  const double time_tolerance = relative_tolerance * step_size;
37  if (next_time > end_time - time_tolerance)
38  next_time = end_time;
39  return next_time;
40  }
41 } // namespace
42 
43 
44 
45 DiscreteTime::DiscreteTime(const double start_time,
46  const double end_time,
47  const double desired_start_step_size)
48  : start_time{start_time}
49  , end_time{end_time}
50  , current_time{start_time}
51  , next_time{calculate_next_time(start_time,
52  desired_start_step_size,
53  end_time)}
56  , step_number{0}
57 {}
58 
59 
60 
61 void
62 DiscreteTime::set_desired_next_step_size(const double next_step_size)
63 {
64  next_time = calculate_next_time(current_time, next_step_size, end_time);
65 }
66 
67 
68 
69 void
70 DiscreteTime::set_next_step_size(const double next_step_size)
71 {
72  Assert(next_step_size > 0,
73  ExcMessage("Only positive time step size is allowed."));
74  next_time = current_time + next_step_size;
75  Assert(
76  next_time <= end_time,
77  ExcMessage(
78  "Time step size is too large. The next time cannot exceed the end time."));
79 }
80 
81 
82 
83 void
85 {
86  Assert(next_time > current_time,
87  ExcMessage("You can't advance time further. "
88  "Either dt==0 or you are at the "
89  "end of the simulation time."));
90  const double step_size = get_next_step_size();
92  current_time = next_time;
93  ++step_number;
94  next_time = calculate_next_time(current_time, step_size, end_time);
95 }
96 
97 
98 
99 void
101 {
103  current_time = start_time;
104  next_time = calculate_next_time(current_time, start_step_size, end_time);
105  step_number = 0;
106 }
107 
double start_step_size
void set_desired_next_step_size(const double time_step_size)
double get_next_step_size() const
DiscreteTime(const double start_time, const double end_time, const double desired_start_step_size=0.)
void advance_time()
double previous_time
void set_next_step_size(const double time_step_size)
double start_time
unsigned int step_number
double current_time
static ::ExceptionBase & ExcMessage(std::string arg1)
#define Assert(cond, exc)
Definition: exceptions.h:1466
#define DEAL_II_NAMESPACE_CLOSE
Definition: config.h:372
double next_time
#define DEAL_II_NAMESPACE_OPEN
Definition: config.h:371
static ::ExceptionBase & ExcInternalError()