Flow123d  JS_before_hm-1008-g3dab983
equation.hh
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2015 Technical University of Liberec. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 3 as published by the
7  * Free Software Foundation. (http://www.gnu.org/licenses/gpl-3.0.en.html)
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12  *
13  *
14  * @file equation.hh
15  * @brief Abstract base class for equation clasess.
16  * @author Jan Brezina
17  */
18 
19 #ifndef EQUATION_HH_
20 #define EQUATION_HH_
21 
22 
23 #include <petscvec.h> // for Vec
24 #include <memory> // for shared_ptr
25 #include <string> // for basic_string
26 #include <typeinfo> // for type_info
27 #include "input/accessors.hh" // for Record
28 #include "system/exc_common.hh" // for ExcAssertMsg
29 #include "system/exceptions.hh" // for ExcAssertMsg::...
30 #include "system/global_defs.h" // for OLD_ASSERT, msg
31 #include "system/logger.hh" // for Logger, DebugOut
32 #include "tools/time_governor.hh" // for TimeGovernor
33 #include "tools/time_marks.hh" // for TimeMark, Time...
34 class Balance;
35 class FieldSet;
36 class Mesh;
37 
38 
39 /**
40  * Class EquationBase is abstract base class for a general time dependent model. This class should provide general interface
41  * that can be used for general coupling of various particular models. By a model we mean a discrete solver of
42  * an partial or ordinary differential equation. Result of the model at one discrete time level should be a discrete field class (not yet implemented).
43  * Until we have field classes we only provide method get_solution_vector(), which returns pointer to sequential C array with linear combination of
44  * base functions that represents the solution.
45  *
46  * Computation of one time step (method compute_one_step() ) is split into update_solution() and choose_next_time().
47  *
48  * This class does not implement any constructor. In particular it does not initialize mesh and time. This has to be done in the constructor
49  * of particular child class.
50  *
51  * Any constructor of child class should set solved = true. We assume, that after initialization an equation object stay solve in init time. For the first time step
52  * one calls method chose_next_time() which setup time frame of the first time step.
53  *
54  * TODO: clarify initialization of data members
55  *
56  */
57 class EquationBase {
58 public:
59 
60  /// Template Record with common keys for derived equations.
62 
63  /**
64  * Default constructor. Sets all virtual methods empty. Necessary to make tests fixtures for equations.
65  * TODO:
66  * Replace setting all in constructor with appropriate getters and setters.
67  * Make appropriate checks if key ingredients are initialized.
68  */
69  EquationBase();
70 
71  /**
72  * Common initialization constructor.
73  * Implementation of particular equation should set just basic things in the constructor and postpone
74  * its initialization including initialization of its fields to the initialize method. The reason is
75  * that when the equation is part of a coupling the coupling may set some setting of the equation from
76  * the coupling level so that initialization use correct parameters.
77  * TODO: Which mechanism we use to pass setting form the coupling to its equations. Either use dedicated setters
78  * this however prevent generic coupling or use input storage to set data from upper level.
79  */
80  EquationBase(Mesh &mesh, const Input::Record in_rec);
81 
82 
83  /**
84  * This method should initialize fields of the equation.
85  * All members (e.g. number of components) that are necessary for the field initialization must be set
86  * between construction and call of initialize.
87  * After this method the upper level coupling may set sharing of some fields between equations.
88  */
89  virtual void initialize() {
90  if (equation_empty_) DebugOut().fmt("Calling 'initialize' of empty equation '{}'.\n", typeid(*this).name());
91  else DebugOut().fmt("Method 'initialize' of '{}' is not implemented.\n", typeid(*this).name());
92  }
93 
94  /**
95  * Initialization of the solution in the zero time.
96  *
97  * There may be fields that can not be initialized in the initialize method
98  * as they are provided by the coupling. Fields coming from coupling
99  * has to be set after the initialize method and before zero_time_step.
100  */
101  virtual void zero_time_step() {
102  if (equation_empty_) DebugOut().fmt("Calling 'zero_time_step' of empty equation '{}'.\n", typeid(*this).name());
103  else DebugOut().fmt("Method 'zero_time_step' of '{}' is not implemented.\n", typeid(*this).name());
104  }
105 
106 
107  /**
108  * Require virtual destructor also for child classes.
109  */
110  virtual ~EquationBase() {
111  balance_.reset();
112  };
113 
114 
115  /**
116  * Calculation of the next time step and its output.
117  */
118  virtual void update_solution() {
119  if (equation_empty_) DebugOut().fmt("Calling 'update_solution' of empty equation '{}'.\n", typeid(*this).name());
120  else DebugOut().fmt("Method 'update_solution' of '{}' is not implemented.\n", typeid(*this).name());
121  }
122 
123 
124 
125  /**
126  * Fix the next discrete time for computation.
127  * Can be rewritten in child class to set possible constrains
128  * according to possible equation coefficients or other data which can be result of another model.
129  *
130  */
131  virtual void choose_next_time()
133 
134  /**
135  * Set external upper time step constrain for time governor of the equation.
136  */
137  virtual void set_time_upper_constraint(double dt, std::string message)
138  {time_->set_upper_constraint(dt, message);}
139 
140  /**
141  * Set external lower time step constrain for time governor of the equation.
142  */
143  virtual void set_time_lower_constraint(double dt, std::string message)
144  {time_->set_lower_constraint(dt, message);}
145 
146  /**
147  * Basic getter method returns TimeGovernor reference which provides full access to the time information.
148  */
149  inline TimeGovernor &time()
150  {
151  OLD_ASSERT( time_,"Time governor was not created.\n");
152  return *time_;
153  }
154 
155  /**
156  * Set time governor.
157  *
158  * Used to set pointer to common time governor (e.g. in Transport Operator Splitting, Reaction).
159  */
160  virtual void set_time_governor(TimeGovernor &time);
161 
162  /**
163  * Most actual planned time for solution.
164  */
165  inline double planned_time()
166  { return time_->estimate_time(); }
167 
168  /**
169  * Time of actual solution returned by get_solution_vector().
170  */
171  inline double solved_time()
172  { return time_->t(); }
173 
174  /**
175  * This getter method provides the computational mesh currently used by the model.
176  */
177  inline Mesh &mesh()
178  {
179  return *mesh_;
180  }
181 
182  /**
183  * This getter method provides the balance object.
184  */
185  inline std::shared_ptr<Balance> balance() const
186  {
187  return balance_;
188  }
189 
190  /**
191  * Getter for equation time mark type.
192  */
194  {
195  return time().equation_mark_type();
196  }
197 
198  /**
199  * Return reference to the equation data object containing all fields
200  * that the equation needs or produce.
201  */
203  {
204  OLD_ASSERT(eq_data_, "The equation %s did not set eq_data_ pointer.\n", input_record_.address_string().c_str());
205  return *eq_data_;
206  }
207 
208  /**
209  * @brief Write computed fields.
210  */
211  virtual void output_data() {
212  if (equation_empty_) DebugOut().fmt("Calling 'output_data' of empty equation '{}'.\n", typeid(*this).name());
213  else DebugOut().fmt("Method 'output_data' of '{}' is not implemented.\n", typeid(*this).name());
214  }
215 
216 protected:
217  bool equation_empty_; ///< flag is true if only default constructor was called
221 
222  /**
223  * Pointer to the equation data object. Every particular equation is responsible
224  * to set the pointer in its constructor. This is used by the general method
225  * EqData::data(). This approach is simpler than making EqData::data() a virtual method.
226  */
228 
229  /// object for calculation and writing the mass balance to file.
230  std::shared_ptr<Balance> balance_;
231 
232 };
233 
234 
235 #endif /* EQUATION_HH_ */
TimeGovernor & time()
Definition: equation.hh:149
FieldSet & data()
Definition: equation.hh:202
virtual void zero_time_step()
Definition: equation.hh:101
virtual void set_time_lower_constraint(double dt, std::string message)
Definition: equation.hh:143
FieldSet * eq_data_
Definition: equation.hh:227
Container for various descendants of FieldCommonBase.
Definition: field_set.hh:74
double estimate_time() const
virtual void initialize()
Definition: equation.hh:89
double fix_dt_until_mark()
Fixing time step until fixed time mark.
int set_lower_constraint(double lower, std::string message)
Sets lower constraint for the next time step estimating.
Definition: mesh.h:78
virtual void set_time_upper_constraint(double dt, std::string message)
Definition: equation.hh:137
double t() const
Basic time management functionality for unsteady (and steady) solvers (class Equation).
virtual void choose_next_time()
Definition: equation.hh:131
virtual void output_data()
Write computed fields.
Definition: equation.hh:211
Basic time management class.
static Input::Type::Record & record_template()
Template Record with common keys for derived equations.
Definition: equation.cc:35
#define OLD_ASSERT(...)
Definition: global_defs.h:131
Global macros to enhance readability and debugging, general constants.
Mesh & mesh()
Definition: equation.hh:177
Accessor to the data with type Type::Record.
Definition: accessors.hh:291
TimeMark::Type equation_mark_type() const
Mesh * mesh_
Definition: equation.hh:218
std::shared_ptr< Balance > balance_
object for calculation and writing the mass balance to file.
Definition: equation.hh:230
std::shared_ptr< Balance > balance() const
Definition: equation.hh:185
virtual void set_time_governor(TimeGovernor &time)
Definition: equation.cc:61
int set_upper_constraint(double upper, std::string message)
Sets upper constraint for the next time step estimating.
bool equation_empty_
flag is true if only default constructor was called
Definition: equation.hh:217
virtual void update_solution()
Definition: equation.hh:118
Input::Record input_record_
Definition: equation.hh:220
double solved_time()
Definition: equation.hh:171
TimeMark::Type mark_type()
Definition: equation.hh:193
virtual ~EquationBase()
Definition: equation.hh:110
Record type proxy class.
Definition: type_record.hh:182
#define DebugOut()
Macro defining &#39;debug&#39; record of log.
Definition: logger.hh:276
TimeGovernor * time_
Definition: equation.hh:219
string address_string() const
Definition: accessors.cc:184
double planned_time()
Definition: equation.hh:165