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