1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2020 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License, or (at your option) any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 // Lesser General Public License for more details.
13 
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 
18 
19 
20 #ifndef LIBMESH_MESH_SUBDIVISION_SUPPORT_H
21 #define LIBMESH_MESH_SUBDIVISION_SUPPORT_H
22 
23 // Local Includes
24 #include "libmesh/libmesh.h"
25 #include "libmesh/face_tri3_subdivision.h"
26 
27 namespace libMesh
28 {
29 
30 // Forward declarations
31 class MeshBase;
32 
33 // MeshTools::Subdivision namespace
34 namespace MeshTools
35 {
36 /**
37  * Utility functions for subdivision surface operations on a \p Mesh.
38  *
39  * \author Roman Vetter
40  * \author Norbert Stoop
41  * \date 2014
42  * \brief Support functions for subdivision surface elements.
43  */
44 namespace Subdivision
45 {
46 /**
47  * Determines the 1-ring of element \p elem, and writes it to the
48  * \p nodes vector. This is necessary because subdivision
49  * elements have a larger local support than conventionally
50  * interpolated elements. The 1-ring may, for instance, look like
51  * this:
52  * \verbatim
53  *    N+4 - N+1 - N+2
54  *    / \   / \   / \
55  *   /   \ /   \ /   \
56  * N+5 -- N --- 1 -- N+3
57  *   \   / \ e / \   /
58  *    \ /   \ /   \ /
59  *    N-1--- 0 --- 2
60  *      \   /|\   /
61  *       \ / | \ /
62  *        5--4--3
63  * \endverbatim
64  */
65 void find_one_ring(const Tri3Subdivision * elem,
66                    std::vector<const Node *> & nodes);
67 
68 /**
69  * Turns a triangulated \p mesh into a subdivision mesh. This
70  * function normally needn't be called by the user, because it is
71  * invoked by \p prepare_subdivision_mesh.
72  */
73 void all_subdivision(MeshBase & mesh);
74 
75 /**
76  * Prepares the \p mesh for use with subdivision elements. The
77  * \p ghosted flag determines how boundaries are treated. If \p false,
78  * a new layer of "ghost" elements is appended along the domain
79  * boundaries. If \p true, the outermost element layer is taken as
80  * ghosts, i.e. no new elements are added.
81  */
82 void prepare_subdivision_mesh(MeshBase & mesh, bool ghosted = false);
83 
84 /**
85  * Adds a new layer of "ghost" elements along the domain boundaries.
86  * This function normally needn't be called by the user, because it
87  * is invoked by \p prepare_subdivision_mesh.
88  */
89 void add_boundary_ghosts(MeshBase & mesh);
90 
91 /**
92  * Flags the outermost element layer along the domain boundaries as
93  * "ghost" elements. This function normally needn't be called by the
94  * user, because it is invoked by \p prepare_subdivision_mesh.
95  */
96 void tag_boundary_ghosts(MeshBase & mesh);
97 
98 /**
99  * A lookup table for the increment modulo 3 operation, for iterating
100  * through the three nodes per element in positive direction.
101  */
102 static const unsigned int next[3] = {1,2,0};
103 
104 /**
105  * A lookup table for the decrement modulo 3 operation, for iterating
106  * through the three nodes per element in negative direction.
107  */
108 static const unsigned int prev[3] = {2,0,1};
109 
110 } // end namespace MeshTools::Subdivision
111 } // end namespace MeshTools
112 
113 } // namespace libMesh
114 
115 
116 #endif // LIBMESH_MESH_SUBDIVISION_SUPPORT_H
117