Flow123d  JB_transport-112d700
field_formula.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 field_formula.hh
15  * @brief
16  */
17 
18 #ifndef FIELD_FORMULA_HH_
19 #define FIELD_FORMULA_HH_
20 
21 
22 #define BOOST_MATH_DISABLE_FLOAT128
23 
24 
25 #include <stdio.h> // for sprintf
26 #include <string> // for operator==, string
27 #include <vector> // for vector
28 #include <memory>
29 #include <armadillo>
30 #include <map>
31 #include "fields/field_algo_base.hh" // for FieldAlgorithmBase
32 #include "fields/field_values.hh" // for FieldValue<>::Enum, FieldValu...
33 #include "fields/field_set.hh"
34 #include "input/accessors.hh" // for ExcAccessorForNullStorage
35 #include "input/accessors_impl.hh" // for Record::val
36 #include "input/storage.hh" // for ExcStorageTypeMismatch
37 #include "input/type_record.hh" // for Record::ExcRecordKeyNotFound
38 #include "input/input_exception.hh" // for ExcAssertMsg::~ExcAssertMsg
39 #include "system/exceptions.hh" // for ExcAssertMsg::~ExcAssertMsg
40 #include "tools/time_governor.hh" // for TimeStep
41 #include "include/assert.hh" // bparser
42 #include "include/parser.hh" // bparser
43 
44 class FunctionParser;
45 template <int spacedim> class ElementAccessor;
46 class SurfaceDepth;
47 
48 using namespace std;
49 
50 /**
51  * Class representing fields given by runtime parsed formulas.
52  *
53  * Using libraries:
54  * https://github.com/flow123d/bparser/
55  * http://warp.povusers.org/FunctionParser/ (gradually replaced by BParser)
56  *
57  * Allows parsing:
58  * - base variables: coordinates (x,y,z), time (t), surface depth (d); constants: e, pi
59  * - standard functions: trigonometric functions, min and max function, exponential function, ternary operator etc.
60  * - expressions dependendent on other fields
61  */
62 template <int spacedim, class Value>
63 class FieldFormula : public FieldAlgorithmBase<spacedim, Value>
64 {
65 public:
68 
69  TYPEDEF_ERR_INFO(EI_Field, std::string);
70  DECLARE_INPUT_EXCEPTION(ExcNotDoubleField,
71  << "Can not use integer valued field " << EI_Field::qval << " in the formula: \n");
72 
73  TYPEDEF_ERR_INFO(EI_BParserMsg, std::string);
74  TYPEDEF_ERR_INFO(EI_Formula, std::string);
75  DECLARE_INPUT_EXCEPTION(ExcParserError,
76  << "Parsing in " << EI_BParserMsg::val << " in the formula: " << EI_Formula::qval << "\n");
77 
78  // Temporary exception of FParser. TODO remove at the same time as FParser
79  TYPEDEF_ERR_INFO(EI_FParserMsg, std::string);
80  TYPEDEF_ERR_INFO(EI_Row, unsigned int);
81  TYPEDEF_ERR_INFO(EI_Col, unsigned int);
82  DECLARE_INPUT_EXCEPTION(ExcFParserError,
83  << "ParserError: " << EI_FParserMsg::val << "\n in the FieldFormula[" << EI_Row::val
84  << "][" << EI_Row::val << "] == " << EI_Formula::qval << " \n");
85 
86  FieldFormula(unsigned int n_comp=0);
87 
88 
89  static const Input::Type::Record & get_input_type();
90 
91  virtual void init_from_input(const Input::Record &rec, const struct FieldAlgoBaseInitData& init_data);
92 
93  /**
94  * For time dependent formulas returns always true. For time independent formulas returns true only for the first time.
95  */
96  bool set_time(const TimeStep &time) override;
97 
98  /**
99  * Create SurfaceDepth object if surface region is set.
100  *
101  * See also description of the FieldBase<...>::set_mesh.
102  */
103  void set_mesh(const Mesh *mesh, bool boundary_domain) override;
104 
105  /**
106  * Returns one value in one given point. ResultType can be used to avoid some costly calculation if the result is trivial.
107  */
108  virtual typename Value::return_type const &value(const Point &p, const ElementAccessor<spacedim> &elm);
109 
110  /**
111  * Returns std::vector of scalar values in several points at once.
112  */
113  virtual void value_list (const Armor::array &point_list, const ElementAccessor<spacedim> &elm,
115 
116  void cache_update(FieldValueCache<typename Value::element_type> &data_cache,
117  ElementCacheMap &cache_map, unsigned int region_patch_idx) override;
118 
119  /**
120  * Set reference of FieldSet.
121  */
122  std::vector<const FieldCommon *> set_dependency(FieldSet &field_set) override;
123 
124  /**
125  * Overload @p FieldAlgorithmBase::cache_reinit
126  *
127  * Reinit arena data member.
128  */
129  void cache_reinit(const ElementCacheMap &cache_map) override;
130 
131  virtual ~FieldFormula();
132 
133 private:
135 
136  /**
137  * Evaluate depth variable if it is contained in formula.
138  *
139  * Return arma vec of point coordinates extended by depth value (or zero if depth is not contained.
140  */
141  inline arma::vec eval_depth_var(const Point &p);
142 
143  // StringValue::return_type == StringTensor, which behaves like arma::mat<string>
145 
146  // Matrix of parsers corresponding to the formula matrix returned by formula_matrix_helper_
149 
150  /// Accessor to Input::Record
152 
153  /// Surface depth object calculate distance from surface.
154  std::shared_ptr<SurfaceDepth> surface_depth_;
155 
156  /// Flag indicates if depth variable 'd' is used in formula - obsolete parameter of FParser
158 
159  /// Flag indicates if time variable 't' is used in formula - parameter of BParser
160  bool has_time_;
161 
162  /// Helper variable for construct of arena, holds sum of sizes (over shape) of all dependent fields.
164 
165  /// Flag indicates first call of set_time method, when FunctionParsers in parser_matrix_ must be initialized
167 
168  /// Arena object providing data arrays
169  bparser::ArenaAlloc * arena_alloc_;
170 
171  // BParser data arrays and variables
172  double *x_; ///< Coordinates x, part of previous array
173  double *y_; ///< Coordinates y, part of previous array
174  double *z_; ///< Coordinates z, part of previous array
175  double *d_; ///< Surface depth variable, used optionally if 'd' variable is set
176  double *res_; ///< Result vector of BParser
177  uint *subsets_; ///< Subsets indices in range 0 ... n-1
179 
180  /**
181  * Data of fields evaluated in expressions.
182  *
183  * Temporary data member, we need to copy data from FieldValueCaches to arrays allocated in arena.
184  */
185  std::unordered_map<const FieldCommon *, double *> eval_field_data_;
186 
187  /// Registrar of class to factory
188  static const int registrar;
189 
190 
191 };
192 
193 
194 #endif /* FIELD_FORMULA_HH_ */
FieldFormula::x_
double * x_
Coordinates x, part of previous array.
Definition: field_formula.hh:172
FieldFormula::FactoryBaseType
FieldAlgorithmBase< spacedim, Value > FactoryBaseType
Definition: field_formula.hh:67
Armor::vec
ArmaVec< double, N > vec
Definition: armor.hh:885
time_governor.hh
Basic time management class.
FieldFormula::first_time_set_
bool first_time_set_
Flag indicates first call of set_time method, when FunctionParsers in parser_matrix_ must be initiali...
Definition: field_formula.hh:166
field_algo_base.hh
FieldFormula::sum_shape_sizes_
uint sum_shape_sizes_
Helper variable for construct of arena, holds sum of sizes (over shape) of all dependent fields.
Definition: field_formula.hh:163
FieldFormula::b_parser_
std::vector< bparser::Parser > b_parser_
Definition: field_formula.hh:148
FieldFormula::eval_field_data_
std::unordered_map< const FieldCommon *, double * > eval_field_data_
Definition: field_formula.hh:185
ElementCacheMap
Directing class of FieldValueCache.
Definition: field_value_cache.hh:152
value
static constexpr bool value
Definition: json.hpp:87
field_set.hh
FieldFormula::has_depth_var_
bool has_depth_var_
Flag indicates if depth variable 'd' is used in formula - obsolete parameter of FParser.
Definition: field_formula.hh:157
std::vector
Definition: doxy_dummy_defs.hh:7
ElementAccessor
Definition: dh_cell_accessor.hh:32
FieldFormula::res_
double * res_
Result vector of BParser.
Definition: field_formula.hh:176
StringTensorInput
Definition: field_values.hh:596
uint
unsigned int uint
Definition: mh_dofhandler.hh:101
FieldAlgorithmBase::Point
Space< spacedim >::Point Point
Definition: field_algo_base.hh:115
storage.hh
exceptions.hh
type_record.hh
FieldFormula::subsets_
uint * subsets_
Subsets indices in range 0 ... n-1.
Definition: field_formula.hh:177
Input::Record
Accessor to the data with type Type::Record.
Definition: accessors.hh:291
FieldFormula::Point
FieldAlgorithmBase< spacedim, Value >::Point Point
Definition: field_formula.hh:66
FieldFormula::d_
double * d_
Surface depth variable, used optionally if 'd' variable is set.
Definition: field_formula.hh:175
FieldFormula::surface_depth_
std::shared_ptr< SurfaceDepth > surface_depth_
Surface depth object calculate distance from surface.
Definition: field_formula.hh:154
FieldAlgoBaseInitData
Helper struct stores data for initizalize descentants of FieldAlgorithmBase.
Definition: field_algo_base.hh:81
accessors.hh
TimeStep
Representation of one time step..
Definition: time_governor.hh:123
FieldFormula::STI
StringTensorInput< Value::NRows_, Value::NCols_ > STI
Definition: field_formula.hh:134
field_values.hh
FieldFormula::formula_matrix_
StringTensor formula_matrix_
Definition: field_formula.hh:144
input_exception.hh
SurfaceDepth
Definition: surface_depth.hh:30
FieldSet
Container for various descendants of FieldCommonBase.
Definition: field_set.hh:159
FieldFormula::in_rec_
Input::Record in_rec_
Accessor to Input::Record.
Definition: field_formula.hh:151
FieldFormula::required_fields_
std::vector< const FieldCommon * > required_fields_
Definition: field_formula.hh:178
Input::Type::Record
Record type proxy class.
Definition: type_record.hh:182
TYPEDEF_ERR_INFO
#define TYPEDEF_ERR_INFO(EI_Type, Type)
Macro to simplify declaration of error_info types.
Definition: exceptions.hh:194
Mesh
Definition: mesh.h:362
FieldFormula::parser_matrix_
std::vector< std::vector< FunctionParser > > parser_matrix_
Definition: field_formula.hh:147
FieldAlgorithmBase
Definition: field_algo_base.hh:112
accessors_impl.hh
std
Definition: doxy_dummy_defs.hh:5
DECLARE_INPUT_EXCEPTION
#define DECLARE_INPUT_EXCEPTION(ExcName, Format)
Macro for simple definition of input exceptions.
Definition: input_exception.hh:69
Armor::Array< double >
FieldFormula::has_time_
bool has_time_
Flag indicates if time variable 't' is used in formula - parameter of BParser.
Definition: field_formula.hh:160
FieldFormula::z_
double * z_
Coordinates z, part of previous array.
Definition: field_formula.hh:174
FieldFormula::y_
double * y_
Coordinates y, part of previous array.
Definition: field_formula.hh:173
FieldFormula::registrar
static const int registrar
Registrar of class to factory.
Definition: field_formula.hh:188
FieldFormula::arena_alloc_
bparser::ArenaAlloc * arena_alloc_
Arena object providing data arrays.
Definition: field_formula.hh:169
StringTensor
Definition: field_values.hh:574
FieldFormula
Definition: field_formula.hh:63