Flow123d  JS_before_hm-2198-g122e1f2e2
msh_basereader.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 msh_basereader.hh
15  * @brief
16  * @author dalibor
17  */
18 
19 #ifndef MSH_BASE_READER_HH
20 #define MSH_BASE_READER_HH
21 
22 
23 
24 #include <map> // for map, map<>::value_compare
25 #include <memory> // for shared_ptr
26 #include <string> // for string
27 #include <vector> // for vector
28 #include "input/accessors.hh" // for Record
29 #include "input/input_exception.hh" // for DECLARE_INPUT_EXCEPTION, Exception
30 #include "io/element_data_cache.hh" // for ElementDataCache
31 #include "io/output_time.hh"
32 #include "mesh/partitioning.hh"
33 #include "system/index_types.hh"
34 #include "system/exceptions.hh" // for ExcStream, operator<<, EI, TYPED...
35 #include "system/file_path.hh" // for FilePath
36 #include "system/tokenizer.hh" // for Tokenizer, Tokenizer::Position
37 
39 class Mesh;
40 class ReaderCache;
41 
42 
43 
44 /// Types of VTK data (value 'undefined' for empty value)
45 enum DataType {
47 };
48 
49 
50 
51 /**
52  * Abstract parent of mesh readers.
53  *
54  * Supported are:
55  * - GMSH reader (class GmshMeshReader)
56  * - VTK reader (class VtkMeshReader)
57  */
59 public:
60  TYPEDEF_ERR_INFO(EI_FieldName, std::string);
61  TYPEDEF_ERR_INFO(EI_Time, double);
62  TYPEDEF_ERR_INFO(EI_MeshFile, std::string);
63  TYPEDEF_ERR_INFO(EI_Type, std::string);
64  TYPEDEF_ERR_INFO(EI_TokenizerMsg, std::string);
65  TYPEDEF_ERR_INFO(EI_FileExtension, std::string);
66  DECLARE_INPUT_EXCEPTION(ExcFieldNameNotFound,
67  << "No data for field: "<< EI_FieldName::qval
68  << " and time: "<< EI_Time::val
69  << " in the input file: "<< EI_MeshFile::qval);
70  DECLARE_INPUT_EXCEPTION(ExcMissingFieldDiscretization,
71  << "Missing data type specification for field: "<< EI_FieldName::qval
72  << " and time: "<< EI_Time::val
73  << " in the input file: "<< EI_MeshFile::qval
74  << "\nPlease, add value of key 'input_discretization'.");
75  DECLARE_EXCEPTION(ExcWrongFormat,
76  << "Wrong format of " << EI_Type::val << ", " << EI_TokenizerMsg::val << "\n"
77  << "in the input file: " << EI_MeshFile::qval);
78  DECLARE_EXCEPTION(ExcWrongExtension,
79  << "Unsupported extension " << EI_FileExtension::qval << " of the input file: " << EI_MeshFile::qval);
80 
81 
82  /***********************************
83  * Structure to store the information from a header of \\$ElementData (GMSH file) or DataArray (VTK file) section.
84  *
85  * Format of GMSH ASCII data sections
86  *
87  number-of-string-tags (== 2)
88  field_name
89  interpolation_scheme_name
90  number-of-real-tags (==1)
91  time_of_dataset
92  number-of-integer-tags
93  time_step_index (starting from zero)
94  number_of_field_components (1, 3, or 9 - i.e. 3d scalar, vector or tensor data)
95  number_of entities (nodes or elements)
96  partition_index (0 == no partition, not clear if GMSH support reading different partition from different files)
97  elm-number value ...
98  *
99  */
100  struct MeshDataHeader {
101  /// Set field_name value to empty string, that signs invalid header (using after reading data)
102  void reset() { field_name = ""; }
103  /// Name of field
104  std::string field_name;
105  /// Currently d'ont used
106  std::string interpolation_scheme;
107  /// Time of field data (used only for GMSH reader)
108  double time;
109  /// Currently d'ont used
110  unsigned int time_index;
111  /// Number of values on one row
112  unsigned int n_components;
113  /// Number of rows
114  unsigned int n_entities;
115  /// Currently d'ont used
116  unsigned int partition_index;
117  /// Position of data in mesh file
118  Tokenizer::Position position;
119  /// Type of data (used only for VTK reader)
120  DataType type;
121  /// Flag marks input discretization of data of VTK file
123  /// Hash of DOF handler object (only for native data of VTK file)
124  std::size_t dof_handler_hash;
125  };
126 
127  /**
128  * Store base data that allows search mesh data header.
129  *
130  * Data members discretization and dof_handler_hash are specific for VTK files.
131  */
132  struct HeaderQuery {
133  /// Constructor
134  HeaderQuery(std::string name, double t, OutputTime::DiscreteSpace disc, std::size_t hash=0)
135  : field_name(name), time(t), discretization(disc), dof_handler_hash(hash) {};
136 
137  std::string field_name; ///< Name of field
138  double time; ///< Time of field data (used only for GMSH and PVD reader)
139  OutputTime::DiscreteSpace discretization; ///< Flag determinate type of discrete of Field (typically is used for native data of VTK)
140  std::size_t dof_handler_hash; ///< Hash of DOF handler object
141  };
142 
143  /// Constructor
144  BaseMeshReader(const FilePath &file_name);
145 
146  /**
147  * This static method gets file path object of reader,
148  * dispatch to correct constructor and initialize appropriate function object from the input.
149  * Returns shared pointer to BaseMeshReader.
150  */
151  static std::shared_ptr< BaseMeshReader > reader_factory(const FilePath &file_name);
152 
153  /**
154  * This static method gets accessor to record with function input,
155  * dispatch to correct constructor and initialize appropriate function object from the input.
156  * Allow to make optimization of elements and nodes order if flag optimize_mesh is set
157  * Returns pointer to Mesh.
158  */
159  static Mesh * mesh_factory(const Input::Record &input_mesh_rec);
160 
161  /**
162  * Reads @p raw data of mesh (only nodes and elements) from the GMSH or VTKfile.
163  * Input of the mesh allows changing regions within the input file.
164  *
165  */
166  void read_raw_mesh(Mesh * mesh);
167 
168  /**
169  * Read regions from the mesh file and save the physical sections as regions in the RegionDB.
170  */
171  virtual void read_physical_names(Mesh * mesh)=0;
172 
173  /**
174  * Reads ElementData sections of opened mesh file. Method must be call after \p set_data_header method. If such section
175  * has not been yet read, we read the data section into raw buffer @p data. The buffer must have size at least
176  * @p n_components * @p n_entities. Indexes in the map must be smaller then @p n_entities.
177  *
178  * Possible optimizations:
179  * If the map ID lookup seem slow, we may assume that IDs are in increasing order, use simple array of IDs instead of map
180  * and just check that they comes in in correct order.
181  *
182  * @param n_entities count of entities (elements)
183  * @param n_components count of components (size of returned data is given by n_entities*n_components)
184  * @param boundary_domain flag determines that data is read for boundary or bulk elements
185  * @param component_idx component index of MultiField; 0 for single component fields.
186  */
187  template<typename T>
188  typename ElementDataCache<T>::ComponentDataPtr get_element_data( unsigned int n_entities, unsigned int n_components,
189  bool boundary_domain, unsigned int component_idx);
190 
191  /**
192  * Returns vector of boundary or bulk element ids by parameter boundary_domain
193  */
194  std::vector<int> const & get_element_vector(bool boundary_domain);
195 
196  /**
197  * Find data header for time and field given by header_query.
198  */
199  virtual MeshDataHeader & find_header(HeaderQuery &header_query)=0;
200 
201  /**
202  * Scale and check data stored in ElementDataCache of given field.
203  */
204  CheckResult scale_and_check_limits(string field_name, double coef, double default_val,
205  double lower_bound = -std::numeric_limits<double>::max(), double upper_bound = std::numeric_limits<double>::max());
206 
207 
208 protected:
209  typedef std::shared_ptr<ElementDataCacheBase> ElementDataPtr;
211 
212  /// Constructor
213  BaseMeshReader(const FilePath &file_name, std::shared_ptr<ElementDataFieldMap> element_data_values);
214 
215  /**
216  * private method for reading of nodes
217  */
218  virtual void read_nodes(Mesh * mesh)=0;
219 
220  /**
221  * Method for reading of elements.
222  */
223  virtual void read_elements(Mesh * mesh)=0;
224 
225  /**
226  * Reads table of data headers specific for each descendants.
227  */
228  virtual void make_header_table()=0;
229 
230  /**
231  * Read element data to data cache
232  */
233  virtual void read_element_data(ElementDataCacheBase &data_cache, MeshDataHeader actual_header, unsigned int n_components,
234  bool boundary_domain)=0;
235 
236  /**
237  * Flag stores that check of compatible mesh was performed.
238  *
239  * This flag has effect only for VTK reader.
240  */
242 
243  /// Store name of field data section specify for type of mesh file.
244  std::string data_section_name_;
245 
246  /// Cache with last read element data
247  std::shared_ptr<ElementDataFieldMap> element_data_values_;
248 
249  /// Tokenizer used for reading ASCII file format.
250  Tokenizer tok_;
251 
252  /// Vector of both bulk and boundary IDs. Bulk elements come first, then boundary elements, but only the portion that appears
253  /// in input mesh file and has ID assigned.
255 
256  /// Header of actual loaded data.
258 
259  /** True if the reader can create cache with multiple components (multifield-wise).
260  * GMSH reader - true
261  * VTK reader - false
262  * TODO: find better solution to determine correct component_idx in get_element_data() - GMSH x VTK
263  */
265 
266  friend class ReaderCache;
267 };
268 
269 #endif /* MSH_BASE_READER_HH */
BaseMeshReader::TYPEDEF_ERR_INFO
TYPEDEF_ERR_INFO(EI_FieldName, std::string)
BaseMeshReader::actual_header_
MeshDataHeader actual_header_
Header of actual loaded data.
Definition: msh_basereader.hh:257
BaseMeshReader::tok_
Tokenizer tok_
Tokenizer used for reading ASCII file format.
Definition: msh_basereader.hh:250
element_data_cache.hh
BaseMeshReader::scale_and_check_limits
CheckResult scale_and_check_limits(string field_name, double coef, double default_val, double lower_bound=-std::numeric_limits< double >::max(), double upper_bound=std::numeric_limits< double >::max())
Definition: msh_basereader.cc:142
BaseMeshReader::read_element_data
virtual void read_element_data(ElementDataCacheBase &data_cache, MeshDataHeader actual_header, unsigned int n_components, bool boundary_domain)=0
BaseMeshReader::boundary_elements_id_
vector< LongIdx > boundary_elements_id_
Definition: msh_basereader.hh:254
BaseMeshReader::MeshDataHeader::reset
void reset()
Set field_name value to empty string, that signs invalid header (using after reading data)
Definition: msh_basereader.hh:119
uint8
@ uint8
Definition: msh_basereader.hh:46
BaseMeshReader::reader_factory
static std::shared_ptr< BaseMeshReader > reader_factory(const FilePath &file_name)
Definition: msh_basereader.cc:38
BaseMeshReader::find_header
virtual MeshDataHeader & find_header(HeaderQuery &header_query)=0
undefined
@ undefined
Definition: msh_basereader.hh:46
uint64
@ uint64
Definition: msh_basereader.hh:46
file_path.hh
FilePath
Dedicated class for storing path to input and output files.
Definition: file_path.hh:54
BaseMeshReader::read_nodes
virtual void read_nodes(Mesh *mesh)=0
BaseMeshReader::MeshDataHeader::type
DataType type
Type of data (used only for VTK reader)
Definition: msh_basereader.hh:137
std::vector< int >
BaseMeshReader::HeaderQuery::dof_handler_hash
std::size_t dof_handler_hash
Hash of DOF handler object.
Definition: msh_basereader.hh:140
BaseMeshReader::MeshDataHeader::interpolation_scheme
std::string interpolation_scheme
Currently d'ont used.
Definition: msh_basereader.hh:123
BaseMeshReader::ElementDataPtr
std::shared_ptr< ElementDataCacheBase > ElementDataPtr
Definition: msh_basereader.hh:209
BaseMeshReader::MeshDataHeader::n_components
unsigned int n_components
Number of values on one row.
Definition: msh_basereader.hh:129
index_types.hh
BaseMeshReader::get_element_vector
const std::vector< int > & get_element_vector(bool boundary_domain)
Definition: msh_basereader.cc:82
BaseMeshReader::element_data_values_
std::shared_ptr< ElementDataFieldMap > element_data_values_
Cache with last read element data.
Definition: msh_basereader.hh:247
exceptions.hh
int8
@ int8
Definition: msh_basereader.hh:46
BaseMeshReader::MeshDataHeader::discretization
OutputTime::DiscreteSpace discretization
Flag marks input discretization of data of VTK file.
Definition: msh_basereader.hh:139
BaseMeshReader::mesh_factory
static Mesh * mesh_factory(const Input::Record &input_mesh_rec)
Definition: msh_basereader.cc:52
BaseMeshReader::HeaderQuery::field_name
std::string field_name
Name of field.
Definition: msh_basereader.hh:135
BaseMeshReader
Definition: msh_basereader.hh:58
BaseMeshReader::DECLARE_INPUT_EXCEPTION
DECLARE_INPUT_EXCEPTION(ExcFieldNameNotFound,<< "No data for field: "<< EI_FieldName::qval<< " and time: "<< EI_Time::val<< " in the input file: "<< EI_MeshFile::qval)
BaseMeshReader::make_header_table
virtual void make_header_table()=0
Input::Record
Accessor to the data with type Type::Record.
Definition: accessors.hh:291
int32
@ int32
Definition: msh_basereader.hh:46
BaseMeshReader::MeshDataHeader::field_name
std::string field_name
Name of field.
Definition: msh_basereader.hh:121
uint16
@ uint16
Definition: msh_basereader.hh:46
accessors.hh
CheckResult
CheckResult
Return type of method that checked data stored in ElementDataCache (NaN values, limits)
Definition: element_data_cache.hh:36
output_time.hh
BaseMeshReader::can_have_components_
bool can_have_components_
Definition: msh_basereader.hh:264
BaseMeshReader::read_physical_names
virtual void read_physical_names(Mesh *mesh)=0
BaseMeshReader::BaseMeshReader
BaseMeshReader(const FilePath &file_name)
Constructor.
Definition: msh_basereader.cc:28
int16
@ int16
Definition: msh_basereader.hh:46
ElementDataCacheBase
Definition: element_data_cache_base.hh:33
input_exception.hh
BaseMeshReader::get_element_data
ElementDataCache< T >::ComponentDataPtr get_element_data(unsigned int n_entities, unsigned int n_components, bool boundary_domain, unsigned int component_idx)
Definition: msh_basereader.cc:89
std::map
Definition: doxy_dummy_defs.hh:11
BaseMeshReader::HeaderQuery::HeaderQuery
HeaderQuery(std::string name, double t, OutputTime::DiscreteSpace disc, std::size_t hash=0)
Constructor.
Definition: msh_basereader.hh:134
BaseMeshReader::ElementDataFieldMap
std::map< string, ElementDataPtr > ElementDataFieldMap
Definition: msh_basereader.hh:210
BaseMeshReader::MeshDataHeader::dof_handler_hash
std::size_t dof_handler_hash
Hash of DOF handler object (only for native data of VTK file)
Definition: msh_basereader.hh:141
partitioning.hh
BaseMeshReader::MeshDataHeader
Definition: msh_basereader.hh:100
int64
@ int64
Definition: msh_basereader.hh:46
uint32
@ uint32
Definition: msh_basereader.hh:46
Mesh
Definition: mesh.h:355
ElementDataCache::ComponentDataPtr
std::shared_ptr< std::vector< T > > ComponentDataPtr
Definition: element_data_cache.hh:52
BaseMeshReader::read_elements
virtual void read_elements(Mesh *mesh)=0
BaseMeshReader::HeaderQuery::discretization
OutputTime::DiscreteSpace discretization
Flag determinate type of discrete of Field (typically is used for native data of VTK)
Definition: msh_basereader.hh:139
BaseMeshReader::MeshDataHeader::partition_index
unsigned int partition_index
Currently d'ont used.
Definition: msh_basereader.hh:133
BaseMeshReader::MeshDataHeader::position
Tokenizer::Position position
Position of data in mesh file.
Definition: msh_basereader.hh:135
float64
@ float64
Definition: msh_basereader.hh:46
BaseMeshReader::read_raw_mesh
void read_raw_mesh(Mesh *mesh)
Definition: msh_basereader.cc:74
OutputTime::DiscreteSpace
DiscreteSpace
Definition: output_time.hh:108
BaseMeshReader::MeshDataHeader::n_entities
unsigned int n_entities
Number of rows.
Definition: msh_basereader.hh:131
BaseMeshReader::MeshDataHeader::time_index
unsigned int time_index
Currently d'ont used.
Definition: msh_basereader.hh:127
BaseMeshReader::data_section_name_
std::string data_section_name_
Store name of field data section specify for type of mesh file.
Definition: msh_basereader.hh:244
BaseMeshReader::MeshDataHeader::time
double time
Time of field data (used only for GMSH reader)
Definition: msh_basereader.hh:125
BaseMeshReader::DECLARE_EXCEPTION
DECLARE_EXCEPTION(ExcWrongFormat,<< "Wrong format of "<< EI_Type::val<< ", "<< EI_TokenizerMsg::val<< "\n"<< "in the input file: "<< EI_MeshFile::qval)
BaseMeshReader::HeaderQuery::time
double time
Time of field data (used only for GMSH and PVD reader)
Definition: msh_basereader.hh:138
BaseMeshReader::has_compatible_mesh_
bool has_compatible_mesh_
Definition: msh_basereader.hh:241
float32
@ float32
Definition: msh_basereader.hh:46
BaseMeshReader::HeaderQuery
Definition: msh_basereader.hh:132
ReaderCache
Definition: reader_cache.hh:37
BaseMeshReader::bulk_elements_id_
vector< LongIdx > bulk_elements_id_
Definition: msh_basereader.hh:254
DataType
DataType
Types of VTK data (value 'undefined' for empty value)
Definition: msh_basereader.hh:45
tokenizer.hh