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