Flow123d  JS_before_hm-62-ge56f9d5
mesh.h
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 mesh.h
15  * @brief
16  */
17 
18 #ifndef MAKE_MESH_H
19 #define MAKE_MESH_H
20 
21 #include <mpi.h> // for MPI_Comm, MPI_COMM_WORLD
22 #include <boost/exception/info.hpp> // for error_info::~error_info<...
23 //#include <boost/range.hpp>
24 #include <memory> // for shared_ptr
25 #include <string> // for string
26 #include <vector> // for vector, vector<>::iterator
27 #include "input/accessors.hh" // for Record, Array (ptr only)
28 #include "input/accessors_impl.hh" // for Record::val
29 #include "input/storage.hh" // for ExcStorageTypeMismatch
30 #include "input/type_record.hh" // for Record (ptr only), Recor...
31 #include "mesh/long_idx.hh" // for LongIdx
32 #include "mesh/region.hh" // for RegionDB, RegionDB::MapE...
33 #include "mesh/nodes.hh"
34 #include "mesh/elements.h"
35 #include "mesh/bounding_box.hh" // for BoundingBox
36 #include "mesh/range_wrapper.hh"
37 #include "mesh/mesh_data.hh"
40 #include "system/exceptions.hh" // for operator<<, ExcStream, EI
41 #include "system/file_path.hh" // for FilePath
42 #include "system/sys_vector.hh" // for FullIterator, VectorId<>...
43 
44 class BIHTree;
45 class Distribution;
46 class Partitioning;
48 class Neighbour;
49 class SideIter;
50 class Boundary;
51 class Edge;
52 class BCMesh;
53 class DuplicateNodes;
54 template <int spacedim> class ElementAccessor;
55 template <int spacedim> class NodeAccessor;
56 
57 
58 #define ELM 0
59 #define BC 1
60 #define NODE 2
61 
62 /**
63  * This parameter limits volume of elements from below.
64  */
65 #define MESH_CRITICAL_VOLUME 1.0E-12
66 
68 public:
70 };
71 
72 //=============================================================================
73 // STRUCTURE OF THE MESH
74 //=============================================================================
75 
76 class Mesh {
77 public:
78  TYPEDEF_ERR_INFO( EI_ElemLast, int);
79  TYPEDEF_ERR_INFO( EI_ElemNew, int);
80  TYPEDEF_ERR_INFO( EI_RegLast, std::string);
81  TYPEDEF_ERR_INFO( EI_RegNew, std::string);
82  DECLARE_EXCEPTION(ExcDuplicateBoundary,
83  << "Duplicate boundary elements! \n"
84  << "Element id: " << EI_ElemLast::val << " on region name: " << EI_RegLast::val << "\n"
85  << "Element id: " << EI_ElemNew::val << " on region name: " << EI_RegNew::val << "\n");
86 
87 
88  /**
89  * \brief Types of search algorithm for finding intersection candidates.
90  */
91  typedef enum IntersectionSearch {
92  BIHsearch = 1,
93  BIHonly = 2,
94  BBsearch = 3
96 
97  /**
98  * \brief The definition of input record for selection of variant of file format
99  */
100  static const Input::Type::Selection & get_input_intersection_variant();
101 
102  static const unsigned int undef_idx=-1;
103  static const Input::Type::Record & get_input_type();
104 
105 
106  /** Labels for coordinate indexes in arma::vec3 representing vectors and points.*/
107  enum {x_coord=0, y_coord=1, z_coord=2};
108 
109  /**
110  * Empty constructor.
111  *
112  * Use only for unit tests!!!
113  */
114  Mesh();
115  /**
116  * Constructor from an input record.
117  * Do not process input record. That is done in init_from_input.
118  */
119  Mesh(Input::Record in_record, MPI_Comm com = MPI_COMM_WORLD);
120 
121  /// Destructor.
122  virtual ~Mesh();
123 
124  virtual inline unsigned int n_nodes() const {
125  return node_vec_.size();
126  }
127 
128  inline unsigned int n_boundaries() const {
129  return boundary_.size();
130  }
131 
132  inline unsigned int n_edges() const {
133  return edges.size();
134  }
135 
136  Edge edge(uint edge_idx) const;
137  Boundary boundary(uint edge_idx) const;
138 
139  unsigned int n_corners();
140 
141  inline const RegionDB &region_db() const {
142  return region_db_;
143  }
144 
145 // /// Reserve size of node vector
146 // inline void reserve_node_size(unsigned int n_nodes) {
147 // node_vector.reserve(n_nodes);
148 // }
149 //
150 // /// Reserve size of element vector
151 // inline void reserve_element_size(unsigned int n_elements) {
152 // element.reserve(n_elements);
153 // }
154 
155  /**
156  * Returns pointer to partitioning object. Partitioning is created during setup_topology.
157  */
158  virtual Partitioning *get_part();
159 
160  virtual const LongIdx *get_local_part();
161 
163  { return el_ds; }
164 
166  { return row_4_el; }
167 
169  { return el_4_loc; }
170 
172  { return node_ds_; }
173 
175  { return node_4_loc_; }
176 
177  unsigned int n_local_nodes() const
178  { return n_local_nodes_; }
179 
180  /**
181  * Returns MPI communicator of the mesh.
182  */
183  inline MPI_Comm get_comm() const { return comm_; }
184 
185 
186  MixedMeshIntersections &mixed_intersections();
187 
188  unsigned int n_sides() const;
189 
190  unsigned int n_vb_neighbours() const;
191 
192  /**
193  * Returns maximal number of sides of one edge, which connects elements of dimension @p dim.
194  * @param dim Dimension of elements sharing the edge.
195  */
196  unsigned int max_edge_sides(unsigned int dim) const { return max_edge_sides_[dim-1]; }
197 
198  /**
199  * Reads mesh from stream.
200  *
201  * Method is especially used in unit tests.
202  */
203  void read_gmsh_from_stream(istream &in);
204  /**
205  * Reads input record, creates regions, read the mesh, setup topology. creates region sets.
206  */
207  void init_from_input();
208 
209 
210  /**
211  * Initialize all mesh structures from raw information about nodes and elements (including boundary elements).
212  * Namely: create remaining boundary elements and Boundary objects, find edges and compatible neighborings.
213  */
214  void setup_topology();
215 
216  /**
217  * Returns vector of ID numbers of elements, either bulk or bc elemnts.
218  */
219  void elements_id_maps( vector<LongIdx> & bulk_elements_id, vector<LongIdx> & boundary_elements_id) const;
220 
221  /*
222  * Check if nodes and elements are compatible with \p mesh.
223  */
224  virtual bool check_compatible_mesh( Mesh & mesh, vector<LongIdx> & bulk_elements_id, vector<LongIdx> & boundary_elements_id );
225 
226  /// Create and return ElementAccessor to element of given idx
227  virtual ElementAccessor<3> element_accessor(unsigned int idx) const;
228 
229  /// Create and return NodeAccessor to node of given idx
230  NodeAccessor<3> node_accessor(unsigned int idx) const;
231 
232  /**
233  * Reads elements and their affiliation to regions and region sets defined by user in input file
234  * Format of input record is defined in method RegionSetBase::get_input_type()
235  *
236  * @param region_list Array input AbstractRecords which define regions, region sets and elements
237  */
238  void read_regions_from_input(Input::Array region_list);
239 
240  /**
241  * Returns nodes_elements vector, if doesn't exist creates its.
242  */
243  vector<vector<unsigned int> > const & node_elements();
244 
245  /// Vector of boundary sides where is prescribed boundary condition.
246  /// TODO: apply all boundary conditions in the main assembling cycle over elements and remove this Vector.
248 
249  //flow::VectorId<int> bcd_group_id; // gives a index of group for an id
250 
251  /**
252  * Vector of individual intersections of two elements.
253  * This is enough for local mortar.
254  */
255  std::shared_ptr<MixedMeshIntersections> intersections;
256 
257  /**
258  * For every element El we have vector of indices into @var intersections array for every intersection in which El is master element.
259  * This is necessary for true mortar.
260  */
262 
264 
265  /**
266  * Vector of compatible neighbourings.
267  */
269 
270  int n_insides; // # of internal sides
271  int n_exsides; // # of external sides
272  mutable int n_sides_; // total number of sides (should be easy to count when we have separated dimensions
273 
274  int n_lines; // Number of line elements
275  int n_triangles; // Number of triangle elements
276  int n_tetrahedras; // Number of tetrahedra elements
277 
278  // Temporary solution for numbering of nodes on sides.
279  // The data are defined in RefElement<dim>::side_nodes,
280  // Mesh::side_nodes can be removed as soon as Element
281  // is templated by dimension.
282  //
283  // for every side dimension D = 0 .. 2
284  // for every element side 0 .. D+1
285  // for every side node 0 .. D
286  // index into element node array
288 
289  /**
290  * Check usage of regions, set regions to elements defined by user, close RegionDB
291  */
292  void check_and_finish();
293 
294  /// Compute bounding boxes of elements contained in mesh.
295  std::vector<BoundingBox> get_element_boxes();
296 
297  /// Getter for BIH. Creates and compute BIH at first call.
298  const BIHTree &get_bih_tree();\
299 
300  /**
301  * Find intersection of element lists given by Mesh::node_elements_ for elements givne by @p nodes_list parameter.
302  * The result is placed into vector @p intersection_element_list. If the @p node_list is empty, and empty intersection is
303  * returned.
304  */
305  void intersect_element_lists(vector<unsigned int> const &nodes_list, vector<unsigned int> &intersection_element_list);
306 
307  /// Add new node of given id and coordinates to mesh
308  void add_node(unsigned int node_id, arma::vec3 coords);
309 
310  /// Add new element of given id to mesh
311  void add_element(unsigned int elm_id, unsigned int dim, unsigned int region_id, unsigned int partition_id,
312  std::vector<unsigned int> node_ids);
313 
314  /// Add new node of given id and coordinates to mesh
315  void add_physical_name(unsigned int dim, unsigned int id, std::string name);
316 
317  /// Return FilePath object representing "mesh_file" input key
318  inline FilePath mesh_file() {
319  return in_record_.val<FilePath>("mesh_file");
320  }
321 
322  /// Getter for input type selection for intersection search algorithm.
323  IntersectionSearch get_intersection_search();
324 
325  /// Maximal distance of observe point from Mesh relative to its size
326  double global_snap_radius() const;
327 
328  /// Initialize element_vec_, set size and reset counters of boundary and bulk elements.
329  void init_element_vector(unsigned int size);
330 
331  /// Initialize node_vec_, set size
332  void init_node_vector(unsigned int size);
333 
334  /// Returns range of bulk elements
335  virtual Range<ElementAccessor<3>> elements_range() const;
336 
337  /// Returns range of nodes
338  Range<NodeAccessor<3>> node_range() const;
339 
340  /// Returns range of edges
341  Range<Edge> edge_range() const;
342 
343  /// Returns count of boundary or bulk elements
344  virtual unsigned int n_elements(bool boundary=false) const {
345  if (boundary) return element_ids_.size()-bulk_size_;
346  else return bulk_size_;
347  }
348 
349  /// For each node the vector contains a list of elements that use this node
351 
352  /// For element of given elem_id returns index in element_vec_ or (-1) if element doesn't exist.
353  inline int elem_index(int elem_id) const
354  {
355  return element_ids_.get_position(elem_id);
356  }
357 
358  /// Return element id (in GMSH file) of element of given position in element vector.
359  inline int find_elem_id(unsigned int pos) const
360  {
361  return element_ids_[pos];
362  }
363 
364  /// For node of given node_id returns index in element_vec_ or (-1) if node doesn't exist.
365  inline int node_index(int node_id) const
366  {
367  return node_ids_.get_position(node_id);
368  }
369 
370  /// Return node id (in GMSH file) of node of given position in node vector.
371  inline int find_node_id(unsigned int pos) const
372  {
373  return node_ids_[pos];
374  }
375 
376  /// Check if given index is in element_vec_
377  void check_element_size(unsigned int elem_idx) const;
378 
379  /// Create boundary elements from data of temporary structure, this method MUST be call after read mesh from
380  void create_boundary_elements();
381 
382  /// Permute nodes of 3D elements of given elm_idx
383  void permute_tetrahedron(unsigned int elm_idx, std::vector<unsigned int> permutation_vec);
384 
385  /// Permute nodes of 2D elements of given elm_idx
386  void permute_triangle(unsigned int elm_idx, std::vector<unsigned int> permutation_vec);
387 
388  /// Create boundary mesh if doesn't exist and return it.
389  BCMesh *get_bc_mesh();
390 
391 protected:
392 
393  /**
394  * Part of the constructor whichdoes not depedn on input record.
395  * Initializes node-side numbering according to RefElement.
396  */
397  void init();
398 
399  /**
400  * Allow store boundary element data to temporary structure.
401  *
402  * We need this structure to preserve correct order of boundary elements.
403  */
404  struct ElementTmpData {
405  /// Constructor
406  ElementTmpData(unsigned int e_id, unsigned int dm, RegionIdx reg_idx, unsigned int part_id, std::vector<unsigned int> nodes)
407  : elm_id(e_id), dim(dm), region_idx(reg_idx), partition_id(part_id), node_ids(nodes) {}
408 
409  unsigned int elm_id;
410  unsigned int dim;
412  unsigned int partition_id;
414  };
415 
416  /**
417  * This replaces read_neighbours() in order to avoid using NGH preprocessor.
418  *
419  * TODO:
420  * - Avoid maps:
421  *
422  * 5) need not to have temporary array for Edges, only postpone setting pointers in elements and set them
423  * after edges are found; we can temporary save Edge index instead of pointer in Neigbours and elements
424  *
425  * 6) Try replace Edge * by indexes in Neigbours and elements (anyway we have mesh pointer in elements so it is accessible also from Neigbours)
426  *
427  */
428  void make_neighbours_and_edges();
429 
430  /**
431  * On edges sharing sides of many elements it may happen that each side has its nodes ordered in a different way.
432  * This method finds the permutation for each side so as to obtain the ordering of side 0.
433  */
434  void make_edge_permutations();
435  /**
436  * Create element lists for nodes in Mesh::nodes_elements.
437  */
438  void create_node_element_lists();
439  /**
440  * Remove elements with dimension not equal to @p dim from @p element_list. Index of the first element of dimension @p dim-1,
441  * is returned in @p element_idx. If no such element is found the method returns false, if one such element is found the method returns true,
442  * if more elements are found we report an user input error.
443  */
444  bool find_lower_dim_element(vector<unsigned int> &element_list, unsigned int dim, unsigned int &element_idx);
445 
446  /**
447  * Returns true if side @p si has same nodes as in the list @p side_nodes.
448  */
449  bool same_sides(const SideIter &si, vector<unsigned int> &side_nodes);
450 
451 
452  void element_to_neigh_vb();
453 
454  void count_element_types();
455  void count_side_types();
456 
457  /**
458  * Possibly modify region id of elements sets by user in "regions" part of input file.
459  *
460  * TODO: This method needs check in issue 'Review mesh setting'.
461  * Changes have been done during generalized region key and may be causing problems
462  * during the further development.
463  */
464  void modify_element_ids(const RegionDB::MapElementIDToRegionID &map);
465 
466  /// Adds element to mesh data structures (element_vec_, element_ids_), returns pointer to this element.
467  Element * add_element_to_vector(int id, bool boundary=false);
468 
469  /// Initialize element
470  void init_element(Element *ele, unsigned int elm_id, unsigned int dim, RegionIdx region_idx, unsigned int partition_id,
471  std::vector<unsigned int> node_ids);
472 
473  unsigned int n_bb_neigh, n_vb_neigh;
474 
475  /// Maximal number of sides per one edge in the actual mesh (set in make_neighbours_and_edges()).
476  unsigned int max_edge_sides_[3];
477 
478  /// Output of neighboring data into raw output.
479  void output_internal_ngh_data();
480 
481  /**
482  * Database of regions (both bulk and boundary) of the mesh. Regions are logical parts of the
483  * domain that allows setting of different data and boundary conditions on them.
484  */
486  /**
487  * Mesh partitioning. Created in setup_topology.
488  */
489  std::shared_ptr<Partitioning> part_;
490 
491  /**
492  * BIH Tree for intersection and observe points lookup.
493  */
494  std::shared_ptr<BIHTree> bih_tree_;
495 
496 
497  /**
498  * Accessor to the input record for the mesh.
499  */
501 
502  /**
503  * MPI communicator used for partitioning and ...
504  */
506 
507  /**
508  * Vector of elements of the mesh.
509  *
510  * Store all elements of the mesh in order bulk elements - boundary elements
511  */
513 
514  /// Hold data of boundary elements during reading mesh (allow to preserve correct order during reading of mix bulk-boundary element)
516 
517  /// Count of bulk elements
518  unsigned int bulk_size_;
519 
520  /// Count of boundary elements loaded from mesh file
521  unsigned int boundary_loaded_size_;
522 
523  /// Maps element ids to indexes into vector element_vec_
525 
526  /**
527  * Vector of nodes of the mesh.
528  */
530 
531  /// Maps node ids to indexes into vector node_vec_
533 
534  /// Vector of MH edges, this should not be part of the geometrical mesh
536 
537 
538  friend class Edge;
539  friend class Side;
540  friend class RegionSetBase;
541  friend class Element;
542  friend class BIHTree;
543  friend class Boundary;
544  friend class BCMesh;
545  template <int spacedim> friend class ElementAccessor;
546  template <int spacedim> friend class NodeAccessor;
547 
548 
549 
550 private:
551 
552  /// Fill array node_4_loc_ and create object node_ds_ according to element distribution.
553  void distribute_nodes();
554 
555  /// Index set assigning to global element index the local index used in parallel vectors.
557  /// Index set assigning to local element index its global index.
559  /// Parallel distribution of elements.
561  /// Index set assigning to local node index its global index.
563  /// Parallel distribution of nodes. Depends on elements distribution.
565  /// Hold number of local nodes (own + ghost), value is equal with size of node_4_loc array.
566  unsigned int n_local_nodes_;
567  /// Boundary mesh, object is created only if it's necessary
569 
571 };
572 
573 #endif
574 //-----------------------------------------------------------------------------
575 // vim: set cindent:
int n_triangles
Definition: mesh.h:275
Distribution * el_ds
Parallel distribution of elements.
Definition: mesh.h:560
int LongIdx
Define type that represents indices of large arrays (elements, nodes, dofs etc.)
Definition: long_idx.hh:22
Class for the mesh partitioning. This should provide:
Definition: partitioning.hh:52
vector< Element > element_vec_
Definition: mesh.h:512
ElementTmpData(unsigned int e_id, unsigned int dm, RegionIdx reg_idx, unsigned int part_id, std::vector< unsigned int > nodes)
Constructor.
Definition: mesh.h:406
BidirectionalMap< int > node_ids_
Maps node ids to indexes into vector node_vec_.
Definition: mesh.h:532
Accessor to input data conforming to declared Array.
Definition: accessors.hh:567
unsigned int n_local_nodes_
Hold number of local nodes (own + ghost), value is equal with size of node_4_loc array.
Definition: mesh.h:566
LongIdx * get_row_4_el() const
Definition: mesh.h:165
unsigned int uint
int MPI_Comm
Definition: mpi.h:141
unsigned int partition_id
Definition: mesh.h:412
BCMesh * bc_mesh_
Boundary mesh, object is created only if it&#39;s necessary.
Definition: mesh.h:568
Nodes of a mesh.
LongIdx * get_node_4_loc() const
Definition: mesh.h:174
BidirectionalMap< int > element_ids_
Maps element ids to indexes into vector element_vec_.
Definition: mesh.h:524
static Input::Type::Record input_type
Definition: mesh.h:69
LongIdx * node_4_loc_
Index set assigning to local node index its global index.
Definition: mesh.h:562
DuplicateNodes * tree
Definition: mesh.h:263
int n_lines
Definition: mesh.h:274
Implementation of bidirectional map.
#define DECLARE_EXCEPTION(ExcName, Format)
Macro for simple definition of exceptions.
Definition: exceptions.hh:158
ofstream raw_ngh_output_file
Definition: mesh.h:570
int elem_index(int elem_id) const
For element of given elem_id returns index in element_vec_ or (-1) if element doesn&#39;t exist...
Definition: mesh.h:353
std::shared_ptr< MixedMeshIntersections > intersections
Definition: mesh.h:255
Definition: mesh.h:76
Template Iter serves as general template for internal iterators.
unsigned int n_local_nodes() const
Definition: mesh.h:177
std::vector< EdgeData > edges
Vector of MH edges, this should not be part of the geometrical mesh.
Definition: mesh.h:535
std::vector< unsigned int > node_ids
Definition: mesh.h:413
Input::Record in_record_
Definition: mesh.h:500
vector< vector< vector< unsigned int > > > side_nodes
Definition: mesh.h:287
int n_tetrahedras
Definition: mesh.h:276
const RegionDB & region_db() const
Definition: mesh.h:141
virtual unsigned int n_nodes() const
Definition: mesh.h:124
vector< BoundaryData > boundary_
Definition: mesh.h:247
int node_index(int node_id) const
For node of given node_id returns index in element_vec_ or (-1) if node doesn&#39;t exist.
Definition: mesh.h:365
int n_exsides
Definition: mesh.h:271
unsigned int boundary_loaded_size_
Count of boundary elements loaded from mesh file.
Definition: mesh.h:521
int find_elem_id(unsigned int pos) const
Return element id (in GMSH file) of element of given position in element vector.
Definition: mesh.h:359
MPI_Comm get_comm() const
Definition: mesh.h:183
LongIdx * el_4_loc
Index set assigning to local element index its global index.
Definition: mesh.h:558
Range helper class.
unsigned int n_boundaries() const
Definition: mesh.h:128
Accessor to the data with type Type::Record.
Definition: accessors.hh:292
Class for O(log N) lookup for intersections with a set of bounding boxes.
Definition: bih_tree.hh:38
LongIdx * row_4_el
Index set assigning to global element index the local index used in parallel vectors.
Definition: mesh.h:556
vector< Node > node_vec_
Definition: mesh.h:529
#define TYPEDEF_ERR_INFO(EI_Type, Type)
Macro to simplify declaration of error_info types.
Definition: exceptions.hh:194
std::shared_ptr< BIHTree > bih_tree_
Definition: mesh.h:494
Distribution * get_el_ds() const
Definition: mesh.h:162
vector< vector< unsigned int > > node_elements_
For each node the vector contains a list of elements that use this node.
Definition: mesh.h:350
unsigned int dim
Definition: mesh.h:410
Dedicated class for storing path to input and output files.
Definition: file_path.hh:54
vector< vector< unsigned int > > master_elements
Definition: mesh.h:261
vector< Neighbour > vb_neighbours_
Definition: mesh.h:268
unsigned int n_vb_neigh
Definition: mesh.h:473
Distribution * node_ds_
Parallel distribution of nodes. Depends on elements distribution.
Definition: mesh.h:564
virtual unsigned int n_elements(bool boundary=false) const
Returns count of boundary or bulk elements.
Definition: mesh.h:344
int n_sides_
Definition: mesh.h:272
unsigned int max_edge_sides(unsigned int dim) const
Definition: mesh.h:196
FilePath mesh_file()
Return FilePath object representing "mesh_file" input key.
Definition: mesh.h:318
Class represents boundary part of mesh.
Definition: bc_mesh.hh:35
Vector classes to support both Iterator, index and Id access and creating co-located vectors...
RegionDB region_db_
Definition: mesh.h:485
MPI_Comm comm_
Definition: mesh.h:505
int n_insides
Definition: mesh.h:270
Internal mesh data classes.
#define MPI_COMM_WORLD
Definition: mpi.h:123
Record type proxy class.
Definition: type_record.hh:182
IntersectionSearch
Types of search algorithm for finding intersection candidates.
Definition: mesh.h:91
unsigned int n_edges() const
Definition: mesh.h:132
Distribution * get_node_ds() const
Definition: mesh.h:171
LongIdx * get_el_4_loc() const
Definition: mesh.h:168
Template for classes storing finite set of named values.
Implementation of range helper class.
unsigned int bulk_size_
Count of bulk elements.
Definition: mesh.h:518
std::shared_ptr< Partitioning > part_
Definition: mesh.h:489
vector< ElementTmpData > bc_element_tmp_
Hold data of boundary elements during reading mesh (allow to preserve correct order during reading of...
Definition: mesh.h:515
Main class for computation of intersection of meshes of combined dimensions.
int find_node_id(unsigned int pos) const
Return node id (in GMSH file) of node of given position in node vector.
Definition: mesh.h:371
RegionIdx region_idx
Definition: mesh.h:411
unsigned int elm_id
Definition: mesh.h:409