Flow123d  JS_before_hm-1602-g5680f2c
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)
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
186  */
187  template<typename T>
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  friend class ReaderCache;
260 };
261 
262 #endif /* MSH_BASE_READER_HH */
HeaderQuery(std::string name, double t, OutputTime::DiscreteSpace disc, std::size_t hash=0)
Constructor.
std::shared_ptr< std::vector< T > > ComponentDataPtr
DataType type
Type of data (used only for VTK reader)
std::string interpolation_scheme
Currently d&#39;ont used.
std::map< string, ElementDataPtr > ElementDataFieldMap
TYPEDEF_ERR_INFO(EI_FieldName, std::string)
std::shared_ptr< ElementDataFieldMap > element_data_values_
Cache with last read element data.
BaseMeshReader(const FilePath &file_name)
Constructor.
std::shared_ptr< ElementDataCacheBase > ElementDataPtr
std::string field_name
Name of field.
Definition: mesh.h:77
std::string data_section_name_
Store name of field data section specify for type of mesh file.
unsigned int partition_index
Currently d&#39;ont used.
virtual MeshDataHeader & find_header(HeaderQuery &header_query)=0
unsigned int time_index
Currently d&#39;ont used.
std::size_t dof_handler_hash
Hash of DOF handler object.
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())
unsigned int n_entities
Number of rows.
virtual void read_nodes(Mesh *mesh)=0
static Mesh * mesh_factory(const Input::Record &input_mesh_rec)
Accessor to the data with type Type::Record.
Definition: accessors.hh:291
void read_raw_mesh(Mesh *mesh)
virtual void read_elements(Mesh *mesh)=0
OutputTime::DiscreteSpace discretization
Flag marks input discretization of data of VTK file.
virtual void read_element_data(ElementDataCacheBase &data_cache, MeshDataHeader actual_header, unsigned int n_components, bool boundary_domain)=0
CheckResult
Return type of method that checked data stored in ElementDataCache (NaN values, limits) ...
void reset()
Set field_name value to empty string, that signs invalid header (using after reading data) ...
std::string field_name
Name of field.
Dedicated class for storing path to input and output files.
Definition: file_path.hh:54
virtual void read_physical_names(Mesh *mesh)=0
Tokenizer::Position position
Position of data in mesh file.
OutputTime::DiscreteSpace discretization
Flag determinate type of discrete of Field (typically is used for native data of VTK) ...
double time
Time of field data (used only for GMSH reader)
unsigned int n_components
Number of values on one row.
double time
Time of field data (used only for GMSH and PVD reader)
MeshDataHeader actual_header_
Header of actual loaded data.
DECLARE_INPUT_EXCEPTION(ExcFieldNameNotFound,<< "No data for field: "<< EI_FieldName::qval<< " and time: "<< EI_Time::val<< " in the input file: "<< EI_MeshFile::qval)
DECLARE_EXCEPTION(ExcWrongFormat,<< "Wrong format of "<< EI_Type::val<< ", "<< EI_TokenizerMsg::val<< "\n"<< "in the input file: "<< EI_MeshFile::qval)
ElementDataCache< T >::ComponentDataPtr get_element_data(unsigned int n_entities, unsigned int n_components, bool boundary_domain, unsigned int component_idx)
DataType
Types of VTK data (value &#39;undefined&#39; for empty value)
static std::shared_ptr< BaseMeshReader > reader_factory(const FilePath &file_name)
Tokenizer tok_
Tokenizer used for reading ASCII file format.
virtual void make_header_table()=0
std::size_t dof_handler_hash
Hash of DOF handler object (only for native data of VTK file)
std::vector< int > const & get_element_vector(bool boundary_domain)
vector< LongIdx > boundary_elements_id_
vector< LongIdx > bulk_elements_id_