Flow123d  last_with_con_2.0.0-4-g42e6930
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 <limits>
24 #include "tools/time_governor.hh"
25 #include "tools/time_marks.hh"
26 #include "input/accessors.hh"
27 
28 #include <petscvec.h>
29 
30 class Mesh;
31 class Region;
32 class FieldSet;
33 //typedef std::vector<Region> RegionSet;
34 class Balance;
35 
36 
37 namespace Input {
38  class Record;
39 }
40 
41 /**
42  * Class EquationBase is abstract base class for a general time dependent model. This class should provide general interface
43  * that can be used for general coupling of various particular models. By a model we mean a discrete solver of
44  * an partial or ordinary differential equation. Result of the model at one discrete time level should be a discrete field class (not yet implemented).
45  * Until we have field classes we only provide method get_solution_vector(), which returns pointer to sequential C array with linear combination of
46  * base functions that represents the solution.
47  *
48  * Computation of one time step (method compute_one_step() ) is split into update_solution() and choose_next_time().
49  *
50  * This class does not implement any constructor. In particular it does not initialize mesh and time. This has to be done in the constructor
51  * of particular child class.
52  *
53  * 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
54  * one calls method chose_next_time() which setup time frame of the first time step.
55  *
56  * TODO: clarify initialization of data members
57  *
58  */
59 class EquationBase {
60 public:
61 
62  /**
63  * Default constructor. Sets all virtual methods empty. Necessary to make tests fixtures for equations.
64  * TODO:
65  * Replace setting all in constructor with appropriate getters and setters.
66  * Make appropriate checks if key ingredients are initialized.
67  */
68  EquationBase();
69 
70  /**
71  * Common initialization constructor.
72  * Implementation of particular equation should set just basic things in the constructor and postpone
73  * its initialization including initialization of its fields to the initialize method. The reason is
74  * that when the equation is part of a coupling the coupling may set some setting of the equation from
75  * the coupling level so that initialization use correct parameters.
76  * TODO: Which mechanism we use to pass setting form the coupling to its equations. Either use dedicated setters
77  * this however prevent generic coupling or use input storage to set data from upper level.
78  */
79  EquationBase(Mesh &mesh, const Input::Record in_rec);
80 
81 
82  /**
83  * This method should initialize fields of the equation.
84  * All members (e.g. number of components) that are necessary for the field initialization must be set
85  * between construction and call of initialize.
86  * After this method the upper level coupling may set sharing of some fields between equations.
87  */
88  virtual void initialize() {
89  if (equation_empty_) DebugOut().fmt("Calling 'initialize' of empty equation '{}'.\n", typeid(*this).name());
90  else DebugOut().fmt("Method 'initialize' of '{}' is not implemented.\n", typeid(*this).name());
91  }
92 
93  /**
94  * Initialization of the solution in the zero time.
95  *
96  * There may be fields that can not be initialized in the initialize method
97  * as they are provided by the coupling. Fields coming from coupling
98  * has to be set after the initialize method and before zero_time_step.
99  */
100  virtual void zero_time_step() {
101  if (equation_empty_) DebugOut().fmt("Calling 'zero_time_step' of empty equation '{}'.\n", typeid(*this).name());
102  else DebugOut().fmt("Method 'zero_time_step' of '{}' is not implemented.\n", typeid(*this).name());
103  }
104 
105 
106  /**
107  * Require virtual destructor also for child classes.
108  */
109  virtual ~EquationBase() {};
110 
111 
112  /**
113  * Calculation of the next time step and its output.
114  */
115  virtual void update_solution() {
116  if (equation_empty_) DebugOut().fmt("Calling 'update_solution' of empty equation '{}'.\n", typeid(*this).name());
117  else DebugOut().fmt("Method 'update_solution' of '{}' is not implemented.\n", typeid(*this).name());
118  }
119 
120 
121 
122  /**
123  * Fix the next discrete time for computation.
124  * Can be rewritten in child class to set possible constrains
125  * according to possible equation coefficients or other data which can be result of another model.
126  *
127  */
128  virtual void choose_next_time()
129  {time_->fix_dt_until_mark();}
130 
131  /**
132  * Set external upper time step constrain for time governor of the equation.
133  */
134  virtual void set_time_upper_constraint(double dt, std::string message)
135  {time_->set_upper_constraint(dt, message);}
136 
137  /**
138  * Set external lower time step constrain for time governor of the equation.
139  */
140  virtual void set_time_lower_constraint(double dt, std::string message)
141  {time_->set_lower_constraint(dt, message);}
142 
143  /**
144  * Basic getter method returns TimeGovernor reference which provides full access to the time information.
145  */
146  inline TimeGovernor &time()
147  {
148  OLD_ASSERT( time_,"Time governor was not created.\n");
149  return *time_;
150  }
151 
152  /**
153  * Set time governor.
154  *
155  * Used to set pointer to common time governor (e.g. in Transport Operator Splitting, Reaction).
156  */
157  virtual void set_time_governor(TimeGovernor &time);
158 
159  /**
160  * Most actual planned time for solution.
161  */
162  inline double planned_time()
163  { return time_->estimate_time(); }
164 
165  /**
166  * Time of actual solution returned by get_solution_vector().
167  */
168  inline double solved_time()
169  { return time_->t(); }
170 
171  /**
172  * This getter method provides the computational mesh currently used by the model.
173  */
174  inline Mesh &mesh()
175  {
176  return *mesh_;
177  }
178 
179  /**
180  * Getter for equation time mark type.
181  */
183  {
184  return time().equation_mark_type();
185  }
186 
187  /**
188  * Return reference to the equation data object containing all fields
189  * that the equation needs or produce.
190  */
192  {
193  OLD_ASSERT(eq_data_, "The equation %s did not set eq_data_ pointer.\n", input_record_.address_string().c_str());
194  return *eq_data_;
195  }
196 
197  /**
198  * Child class have to implement getter for sequential solution vector.
199  * DEPRECATED
200  */
201  virtual void get_solution_vector(double * &vector, unsigned int &size)
202  { OLD_ASSERT(0, "If using, needs to be implemented in ancestors!"); };
203 
204  /**
205  * Child class have to implement getter for parallel solution vector.
206  * DEPRECATED
207  */
209  { OLD_ASSERT(0, "If using, needs to be implemented in ancestors!"); };
210 
211  /**
212  * @brief Write computed fields.
213  */
214  virtual void output_data() {
215  if (equation_empty_) DebugOut().fmt("Calling 'output_data' of empty equation '{}'.\n", typeid(*this).name());
216  else DebugOut().fmt("Method 'output_data' of '{}' is not implemented.\n", typeid(*this).name());
217  }
218 
219 protected:
220  bool equation_empty_; ///< flag is true if only default constructor was called
224 
225  /**
226  * Pointer to the equation data object. Every particular equation is responsible
227  * to set the pointer in its constructor. This is used by the general method
228  * EqData::data(). This approach is simpler than making EqData::data() a virtual method.
229  */
231 
232  /// object for calculation and writing the mass balance to file.
233  std::shared_ptr<Balance> balance_;
234 
235 };
236 
237 
238 #endif /* EQUATION_HH_ */
TimeGovernor & time()
Definition: equation.hh:146
FieldSet & data()
Definition: equation.hh:191
virtual void zero_time_step()
Definition: equation.hh:100
virtual void set_time_lower_constraint(double dt, std::string message)
Definition: equation.hh:140
FieldSet * eq_data_
Definition: equation.hh:230
Container for various descendants of FieldCommonBase.
Definition: field_set.hh:61
unsigned long int Type
Definition: time_marks.hh:51
virtual void initialize()
Definition: equation.hh:88
Definition: mesh.h:95
virtual void set_time_upper_constraint(double dt, std::string message)
Definition: equation.hh:134
Basic time management functionality for unsteady (and steady) solvers (class Equation).
virtual void choose_next_time()
Definition: equation.hh:128
virtual void output_data()
Write computed fields.
Definition: equation.hh:214
Basic time management class.
#define OLD_ASSERT(...)
Definition: global_defs.h:131
Mesh & mesh()
Definition: equation.hh:174
Accessor to the data with type Type::Record.
Definition: accessors.hh:277
TimeMark::Type equation_mark_type() const
Mesh * mesh_
Definition: equation.hh:221
std::shared_ptr< Balance > balance_
object for calculation and writing the mass balance to file.
Definition: equation.hh:233
virtual void get_parallel_solution_vector(Vec &vector)
Definition: equation.hh:208
virtual void get_solution_vector(double *&vector, unsigned int &size)
Definition: equation.hh:201
bool equation_empty_
flag is true if only default constructor was called
Definition: equation.hh:220
virtual void update_solution()
Definition: equation.hh:115
Input::Record input_record_
Definition: equation.hh:223
double solved_time()
Definition: equation.hh:168
TimeMark::Type mark_type()
Definition: equation.hh:182
virtual ~EquationBase()
Definition: equation.hh:109
#define DebugOut()
Macro defining &#39;debug&#39; record of log.
Definition: logger.hh:240
TimeGovernor * time_
Definition: equation.hh:222
double planned_time()
Definition: equation.hh:162