Flow123d  release_3.0.0-955-g4db4b48
element_data_cache.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 element_data_cache.hh
15  * @brief
16  */
17 
18 #ifndef ELEMENT_DATA_CACHE_HH_
19 #define ELEMENT_DATA_CACHE_HH_
20 
21 #include <boost/exception/info.hpp> // for error_info::~error_info...
22 #include <memory> // for shared_ptr
23 #include <sstream> // for basic_ostream::write
24 #include <string> // for string, operator<<
25 #include <vector> // for vector
26 #include <armadillo>
27 #include "io/element_data_cache_base.hh" // for ElementDataCacheBase
28 #include "system/exceptions.hh" // for ExcStream, operator<<
29 #include "mesh/long_idx.hh"
30 class Tokenizer;
31 class Distribution;
32 struct MeshDataHeader;
33 
34 
35 /// Return type of method that checked data stored in ElementDataCache (NaN values, limits)
36 typedef enum {
37  ok, ///< All values are not NaN and are in limits.
38  out_of_limits, ///< Some value(s) is out of limits
39  not_a_number ///< Some value(s) is set to NaN
40 } CheckResult;
41 
42 
43 template <typename T>
45 public:
46  typedef std::shared_ptr< std::vector<T> > ComponentDataPtr;
48 
49  /// Default constructor
51 
52  /**
53  * \brief Constructor of input ElementDataCache (allow read data from GMSH or VTK file)
54  *
55  * Allows set variable size of cache.
56  *
57  * @param field_name Field name thas is read
58  * @param time Actual time of data
59  * @param size_of_cache Count of columns of data cache
60  * @param row_vec_size Count of rows of data cache
61  */
62  ElementDataCache(std::string field_name, double time, unsigned int size_of_cache, unsigned int row_vec_size);
63 
64  /**
65  * \brief Constructor of output ElementDataCache (allow write data)
66  *
67  * Has fix size of cache.
68  *
69  * @param field_name Field name is written as parameter to output stream
70  * @param n_comp Given from shape of field
71  * @param size Count of rows of data cache
72  */
73  ElementDataCache(std::string field_name, unsigned int n_comp, unsigned int size);
74 
75  /**
76  * \brief Destructor of ElementDataCache
77  */
78  virtual ~ElementDataCache() override;
79 
80  /// Return vector of element data for get component.
81  ComponentDataPtr get_component_data(unsigned int component_idx);
82 
83  /**
84  * Create data cache with given count of columns (\p size_of_cache) and rows (\p row_vec_size).
85  */
86  static CacheData create_data_cache(unsigned int size_of_cache, unsigned int row_vec_size);
87 
88  /// Implements @p ElementDataCacheBase::read_ascii_data.
89  void read_ascii_data(Tokenizer &tok, unsigned int n_components, unsigned int i_row) override;
90 
91  /// Implements @p ElementDataCacheBase::read_binary_data.
92  void read_binary_data(std::istream &data_stream, unsigned int n_components, unsigned int i_row) override;
93 
94  /**
95  * Output data element on given index @p idx. Method for writing data
96  * to output stream.
97  *
98  * \note This method is used only by MSH file format.
99  */
100  void print_ascii(ostream &out_stream, unsigned int idx) override;
101 
102  /**
103  * \brief Print all data stored in output data ro ascii format
104  *
105  * TODO: indicate if the tensor data are output in column-first or raw-first order
106  * and possibly implement transposition. Set such property for individual file formats.
107  * Class OutputData stores always in raw-first order.
108  */
109  void print_ascii_all(ostream &out_stream) override;
110 
111  /**
112  * \brief Print all data stored in output data to appended binary format
113  */
114  void print_binary_all(ostream &out_stream, bool print_data_size = true) override;
115 
116  void print_yaml_subarray(ostream &out_stream, unsigned int precision, unsigned int begin, unsigned int end) override;
117 
118  /**
119  * Store data element of given data value under given index.
120  */
121  void store_value(unsigned int idx, const T * value);
122 
123  /**
124  * Add value to given index
125  */
126  void add(unsigned int idx, const T * value);
127 
128  /**
129  * Reset values at given index
130  */
131  void zero(unsigned int idx);
132 
133  /**
134  * Normalize values at given index
135  */
136  void normalize(unsigned int idx, unsigned int divisor);
137 
138  /**
139  * Find minimal and maximal range of stored data
140  */
141  void get_min_max_range(double &min, double &max) override;
142 
143  /**
144  * Make full check of data stored in cache.
145  *
146  * Method iterates through data and
147  * - checks NaN data values, default_val replaces NaN
148  * - if default_val==NaN and some value(s) is not replaced with valid value return CheckResult::nan
149  * - if some value(s) is out of limits )lower_bound, upper_bound) return CheckResult::out_of_limits
150  * - in other cases return CheckResult::ok
151  *
152  * Method is executed only once.
153  */
154  CheckResult check_values(double default_val, double lower_bound, double upper_bound);
155 
156  /**
157  * Scale data vector of given 'component_idx' with scale 'coef'.
158  *
159  * Method is executed only once and should be called after check_values method.
160  * Method can be used e. g. for convert between units.
161  */
162  void scale_data(double coef);
163 
164  /// Implements ElementDataCacheBase::gather.
165  std::shared_ptr< ElementDataCacheBase > gather(Distribution *distr, LongIdx *local_to_global) override;
166 
167  /// Implements ElementDataCacheBase::element_node_cache_fixed_size.
168  std::shared_ptr< ElementDataCacheBase > element_node_cache_fixed_size(std::vector<unsigned int> &offset_vec) override;
169 
170  /// Implements ElementDataCacheBase::element_node_cache_optimize_size.
171  std::shared_ptr< ElementDataCacheBase > element_node_cache_optimize_size(std::vector<unsigned int> &offset_vec) override;
172 
173  /// Implements ElementDataCacheBase::compute_node_data.
174  std::shared_ptr< ElementDataCacheBase > compute_node_data(std::vector<unsigned int> &conn_vec, unsigned int data_size) override;
175 
176  /// Access i-th element in the data vector of 0th component.
177  T& operator[](unsigned int i);
178 
179 protected:
180  /// Allow to hold sign, if data in cache is checked and scale (both can be executed only once)
182  none, ///< Data is neither checked nor scaled.
183  check, ///< Data is only checked.
184  scale ///< Data is scaled.
185  };
186 
187 
188  /// Return MPI data type corresponding with template parameter of cache. Needs template specialization.
190 
191  /// Sign, if data in cache is checked and scale.
193 
194  /**
195  * Table of element data.
196  *
197  * For every components contains vector of element data.
198  */
199  CacheData data_;
200 
201 };
202 
203 
204 #endif /* ELEMENT_DATA_CACHE_HH_ */
int LongIdx
Define type that represents indices of large arrays (elements, nodes, dofs etc.)
Definition: long_idx.hh:22
void read_binary_data(std::istream &data_stream, unsigned int n_components, unsigned int i_row) override
Implements ElementDataCacheBase::read_binary_data.
Data is only checked.
std::shared_ptr< std::vector< T > > ComponentDataPtr
CheckScaleData
Allow to hold sign, if data in cache is checked and scale (both can be executed only once) ...
#define MPI_Datatype
Definition: mpi.h:154
void print_ascii(ostream &out_stream, unsigned int idx) override
CheckScaleData check_scale_data_
Sign, if data in cache is checked and scale.
Some value(s) is set to NaN.
std::shared_ptr< ElementDataCacheBase > compute_node_data(std::vector< unsigned int > &conn_vec, unsigned int data_size) override
Implements ElementDataCacheBase::compute_node_data.
std::vector< ComponentDataPtr > CacheData
void store_value(unsigned int idx, const T *value)
T & operator[](unsigned int i)
Access i-th element in the data vector of 0th component.
MPI_Datatype mpi_data_type()
Return MPI data type corresponding with template parameter of cache. Needs template specialization...
void read_ascii_data(Tokenizer &tok, unsigned int n_components, unsigned int i_row) override
Implements ElementDataCacheBase::read_ascii_data.
Some value(s) is out of limits.
static constexpr bool value
Definition: json.hpp:87
ElementDataCache()
Default constructor.
void get_min_max_range(double &min, double &max) override
void add(unsigned int idx, const T *value)
void print_yaml_subarray(ostream &out_stream, unsigned int precision, unsigned int begin, unsigned int end) override
std::shared_ptr< ElementDataCacheBase > gather(Distribution *distr, LongIdx *local_to_global) override
Implements ElementDataCacheBase::gather.
virtual ~ElementDataCache() override
Destructor of ElementDataCache.
static CacheData create_data_cache(unsigned int size_of_cache, unsigned int row_vec_size)
void zero(unsigned int idx)
void scale_data(double coef)
Data is neither checked nor scaled.
CheckResult
Return type of method that checked data stored in ElementDataCache (NaN values, limits) ...
CheckResult check_values(double default_val, double lower_bound, double upper_bound)
void normalize(unsigned int idx, unsigned int divisor)
void print_binary_all(ostream &out_stream, bool print_data_size=true) override
Print all data stored in output data to appended binary format.
std::shared_ptr< ElementDataCacheBase > element_node_cache_fixed_size(std::vector< unsigned int > &offset_vec) override
Implements ElementDataCacheBase::element_node_cache_fixed_size.
std::shared_ptr< ElementDataCacheBase > element_node_cache_optimize_size(std::vector< unsigned int > &offset_vec) override
Implements ElementDataCacheBase::element_node_cache_optimize_size.
ComponentDataPtr get_component_data(unsigned int component_idx)
Return vector of element data for get component.
void print_ascii_all(ostream &out_stream) override
Print all data stored in output data ro ascii format.
All values are not NaN and are in limits.
unsigned int n_comp() const