Flow123d  release_3.0.0-880-gc768b7a
duplicate_nodes.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 duplicate_nodes.h
15  * @brief
16  */
17 
18 #ifndef DUPLICATE_NODES_H
19 #define DUPLICATE_NODES_H
20 
21 
22 
23 
24 class Mesh;
25 
26 /**
27  * Class representing an n-face (node, line, triangle or tetrahedron) in the mesh.
28  * Currently, the object stores information about its 1-codimensional faces
29  * and nodes.
30  *
31  * In the future we should think about complete graph, where every n-dimensional object
32  * has information only about its (n-1)-dimensional faces.
33  */
34 class MeshObject {
35 public:
36 
37  MeshObject(unsigned int dim);
39 
40  /// (dim-1)-dimensional faces
42 
43  /// Indices of nodes.
44  unsigned int nodes[4];
45 
46  /// Dimension of n-face.
47  unsigned int dim_;
48 };
49 
50 
51 /**
52  * Class DuplicateNodes constructs the graph structure of elements, their faces and nodes
53  * without any other data such as coordinates or region numbers. The nodes are then
54  * duplicated where the elements are separated by fractures (elements of lower dim.).
55  * E.g.:
56  *
57  * Consider a domain containing fracture like this:
58  * +-----+-----+
59  * | | |
60  * | + |
61  * | |
62  * | |
63  * | |
64  * +-----------+
65  *
66  * with the mesh nodes numbered as follows:
67  * 0-----1-----2
68  * | | |
69  * | 3 |
70  * | |
71  * | |
72  * | |
73  * 4-----------5
74  *
75  * The class duplicates node 1 and node 3 because in these nodes FE functions can be discontinuous
76  * (schematic view):
77  * 0-6 1 7-2
78  * | \ | / |
79  * | \ 3 / |
80  * | \ / |
81  * | 8 |
82  * | |
83  * 4-----------5
84  *
85  * Now, nodes 1,6,7 have the same coordinates but belong to different groups of elements
86  * and analogously nodes 3 and 8.
87  *
88  *
89  * The structure is used in DOF handler to distribute dofs for FE spaces sharing dofs
90  * between elements.
91  *
92  * TODO: Currently we do not create faces of faces, i.e. 1d edges of tetrahedra are not
93  * available. This should be implemented if we need to distribute dofs on edges.
94  *
95  */
97 public:
98 
99  DuplicateNodes(Mesh *mesh);
100 
101  // Getters (see private section for explanation).
102  Mesh *mesh() const { return mesh_; }
103 
104  unsigned int n_nodes() const { return n_duplicated_nodes_; }
105  const std::vector<unsigned int> &node_dim() const { return node_dim_; }
106 
107  const std::vector<MeshObject> &objects(unsigned int dim) const
108  { return objects_[dim]; }
109 
110  const std::vector<unsigned int> &obj_4_el() const { return obj_4_el_; }
111  const std::vector<unsigned int> &obj_4_edg() const { return obj_4_edg_; }
112 
113 
114 private:
115 
116  /// Initialize the vector of nodes from mesh.
117  void init_nodes();
118 
119  /// Initialize objects from mesh edges.
120  void init_from_edges();
121 
122  /// Initialize objects from mesh elements.
123  void init_from_elements();
124 
125  /// Duplicate nodes that are lying on interfaces with fractures.
126  void duplicate_nodes();
127 
128 
129  /// The mesh object.
131 
132  /// Number of nodes (including duplicated ones).
133  unsigned int n_duplicated_nodes_;
134 
135  /// Vector of space dimensions of elements using the particular duplicated node.
137 
138  /// Array of n-faces by their dimension.
140 
141  /** Vector of object indices for each mesh element.
142  * For an element with index el_idx, obj_4_el_[el_idx] is the index of the corresponding object
143  * in the vector tetras_/triangles_/lines_/points_, depending on the element dimension.
144  */
146 
147  /// Vector of object indices for each mesh edge.
149 };
150 
151 
152 #endif // DUPLICATE_NODES_H
const std::vector< unsigned int > & node_dim() const
std::vector< unsigned int > node_dim_
Vector of space dimensions of elements using the particular duplicated node.
MeshObject * faces[4]
(dim-1)-dimensional faces
const std::vector< MeshObject > & objects(unsigned int dim) const
const std::vector< unsigned int > & obj_4_edg() const
unsigned int n_duplicated_nodes_
Number of nodes (including duplicated ones).
Mesh * mesh_
The mesh object.
Definition: mesh.h:80
MeshObject(unsigned int dim)
Mesh * mesh() const
std::vector< unsigned int > obj_4_el_
unsigned int n_nodes() const
unsigned int nodes[4]
Indices of nodes.
unsigned int dim_
Dimension of n-face.
std::vector< unsigned int > obj_4_edg_
Vector of object indices for each mesh edge.
const std::vector< unsigned int > & obj_4_el() const