Line data Source code
1 : // The libMesh Finite Element Library. 2 : // Copyright (C) 2002-2025 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_CELL_INF_HEX18_H 21 : #define LIBMESH_CELL_INF_HEX18_H 22 : 23 : #include "libmesh/libmesh_config.h" 24 : 25 : #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 26 : 27 : // Local includes 28 : #include "libmesh/cell_inf_hex.h" 29 : 30 : namespace libMesh 31 : { 32 : 33 : /** 34 : * The \p InfHex18 is an infinite element in 3D composed of 18 nodes. 35 : * It is numbered like this: 36 : * \verbatim 37 : * INFHEX18: 7 14 6 38 : * o o o closer to infinity 39 : * : : | 40 : * : : | 41 : * : : | 42 : * 15 : 17 : 13 | 43 : * o : o : o | 44 : * : : : | | 45 : * : : : | | 46 : * : : : | | 47 : * 4 : : 12 : 5 | | 48 : * o : : o : o | | 49 : * | : : | : | | | 50 : * | : : | : | | | 51 : * | : : | 10: | | | 52 : * | : 3o....|.........o....|....|....o 53 : * | : . | | | / 2 54 : * | : . | | | / 55 : * | : . | | | / 56 : * | :. | | |/ 57 : * | 11o | 16o | o base face 58 : * | . | | / 9 59 : * | . | | / 60 : * | . | | / 61 : * |. | |/ 62 : * o--------------o--------------o 63 : * 0 8 1 64 : * \endverbatim 65 : * 66 : * \author Daniel Dreyer 67 : * \date 2002 68 : * \brief A 3D infinite hexahedral element with 18 nodes. 69 : */ 70 : class InfHex18 final : public InfHex 71 : { 72 : public: 73 : 74 : /** 75 : * Constructor. By default this element has no parent. 76 : */ 77 : explicit 78 471 : InfHex18 (Elem * p=nullptr) : 79 471 : InfHex(num_nodes, p, _nodelinks_data) 80 471 : {} 81 : 82 : InfHex18 (InfHex18 &&) = delete; 83 : InfHex18 (const InfHex18 &) = delete; 84 : InfHex18 & operator= (const InfHex18 &) = delete; 85 : InfHex18 & operator= (InfHex18 &&) = delete; 86 1249 : virtual ~InfHex18() = default; 87 : 88 : /** 89 : * \returns 18. The \p InfHex18 has 18 nodes. 90 : */ 91 1196937 : virtual unsigned int n_nodes() const override { return num_nodes; } 92 : 93 : /** 94 : * \returns \p INFHEX18. 95 : */ 96 290429 : virtual ElemType type () const override { return INFHEX18; } 97 : 98 : /** 99 : * \returns 4. 100 : */ 101 0 : virtual unsigned int n_sub_elem() const override { return 4; } 102 : 103 : /** 104 : * \returns SECOND. 105 : */ 106 : virtual Order default_order() const override; 107 : 108 : /** 109 : * \returns \p true if the specified (local) node number is on the 110 : * specified side. 111 : */ 112 : virtual bool is_node_on_side(const unsigned int n, 113 : const unsigned int s) const override; 114 : 115 : virtual std::vector<unsigned int> nodes_on_side(const unsigned int s) const override; 116 : 117 : virtual std::vector<unsigned int> nodes_on_edge(const unsigned int e) const override; 118 : 119 : /** 120 : * \returns \p true if the specified (local) node number is on the 121 : * specified edge. 122 : */ 123 : virtual bool is_node_on_edge(const unsigned int n, 124 : const unsigned int e) const override; 125 : 126 : /** 127 : * \returns A \p QUAD9 built coincident with face 0, or an \p INFQUAD6 128 : * built coincident with faces 1 to 4. 129 : * 130 : * \note The \p std::unique_ptr<Elem> takes care of freeing memory. 131 : */ 132 : virtual std::unique_ptr<Elem> build_side_ptr (const unsigned int i) override; 133 : 134 : /** 135 : * Rebuilds a \p QUAD9 built coincident with face 0, or an \p 136 : * INFQUAD6 built coincident with faces 1 to 4. 137 : */ 138 : virtual void build_side_ptr (std::unique_ptr<Elem> & elem, 139 : const unsigned int i) override; 140 : 141 : // Avoid hiding deprecated version with different signature 142 : using Elem::build_side_ptr; 143 : 144 : /** 145 : * \returns An \p EDGE3 built coincident with edges 0-3, or an \p INFEDGE2 146 : * built coincident with edges 4 to 11. 147 : * 148 : * \note that the \p std::unique_ptr<Elem> takes care of freeing memory. 149 : */ 150 : virtual std::unique_ptr<Elem> build_edge_ptr (const unsigned int i) override; 151 : 152 : /** 153 : * Rebuilds a \p EDGE3 built coincident with edges 0 to 3, or \p 154 : * INFEDGE2 built coincident with edges 4 to 11. 155 : */ 156 : virtual void build_edge_ptr (std::unique_ptr<Elem> & edge, const unsigned int i) override; 157 : 158 : /** 159 : * Don't hide Elem::key() defined in the base class. 160 : */ 161 : using Elem::key; 162 : 163 : /** 164 : * \returns An id associated with the \p s side of this element. 165 : * The id is not necessarily unique, but should be close. 166 : * 167 : * We reimplement this method here for the \p InfHex18 since we can 168 : * use the center node of the bottom face to provide a perfect (unique) 169 : * key. 170 : */ 171 : virtual dof_id_type key (const unsigned int s) const override; 172 : 173 : /** 174 : * \returns \p InfHex18::side_nodes_map[side][side_node] after doing some range checking. 175 : */ 176 : virtual unsigned int local_side_node(unsigned int side, 177 : unsigned int side_node) const override; 178 : 179 : /** 180 : * \returns \p InfHex18::edge_nodes_map[edge][edge_node] after doing some range checking. 181 : */ 182 : virtual unsigned int local_edge_node(unsigned int edge, 183 : unsigned int edge_node) const override; 184 : 185 : virtual void connectivity(const unsigned int sc, 186 : const IOPackage iop, 187 : std::vector<dof_id_type> & conn) const override; 188 : 189 : unsigned int vtk_element_type (const unsigned int) const 190 : { return 12; } 191 : 192 : /** 193 : * \returns 2 for all edge nodes, 4 for face nodes. 194 : */ 195 : virtual unsigned int n_second_order_adjacent_vertices (const unsigned int) const override; 196 : 197 : /** 198 : * \returns The element-local number of the \f$ v^{th} \f$ vertex 199 : * that defines the \f$ n^{th} \f$ second-order node. 200 : * 201 : * \note \p n is counted as depicted above, \f$ 8 \le n < 18 \f$. 202 : */ 203 : virtual unsigned short int second_order_adjacent_vertex (const unsigned int n, 204 : const unsigned int v) const override; 205 : 206 : /** 207 : * \returns The child number \p c and element-local index \p v of the 208 : * \f$ n^{th} \f$ second-order node on the parent element. See 209 : * elem.h for further details. 210 : */ 211 : virtual std::pair<unsigned short int, unsigned short int> 212 : second_order_child_vertex (const unsigned int n) const override; 213 : 214 : /** 215 : * Geometric constants for InfHex18. 216 : */ 217 : static const int num_nodes = 18; 218 : static const int nodes_per_side = 9; 219 : static const int nodes_per_edge = 3; 220 : 221 : /** 222 : * This maps the \f$ j^{th} \f$ node of the \f$ i^{th} \f$ side to 223 : * element node numbers. 224 : */ 225 : static const unsigned int side_nodes_map[num_sides][nodes_per_side]; 226 : 227 : /** 228 : * This maps the \f$ j^{th} \f$ node of the \f$ i^{th} \f$ edge to 229 : * element node numbers. 230 : */ 231 : static const unsigned int edge_nodes_map[num_edges][nodes_per_edge]; 232 : 233 : virtual void permute(unsigned int perm_num) override final; 234 : 235 : virtual void flip(BoundaryInfo *) override final; 236 : 237 : ElemType side_type (const unsigned int s) const override final; 238 : 239 : protected: 240 : 241 : /** 242 : * Data for links to nodes. 243 : */ 244 : Node * _nodelinks_data[num_nodes]; 245 : 246 : 247 : 248 : #ifdef LIBMESH_ENABLE_AMR 249 : 250 : /** 251 : * Matrix used to create the elements children. 252 : */ 253 24280 : virtual Real embedding_matrix (const unsigned int i, 254 : const unsigned int j, 255 : const unsigned int k) const override 256 24280 : { return _embedding_matrix[i][j][k]; } 257 : 258 : /** 259 : * Matrix that computes new nodal locations/solution values 260 : * from current nodes/solution. 261 : */ 262 : static const Real _embedding_matrix[num_children][num_nodes][num_nodes]; 263 : 264 66858 : LIBMESH_ENABLE_TOPOLOGY_CACHES; 265 : 266 : #endif // LIBMESH_ENABLE_AMR 267 : 268 : }; 269 : 270 : } // namespace libMesh 271 : 272 : #endif // ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 273 : 274 : 275 : #endif // LIBMESH_CELL_INF_HEX18_H