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_HEX8_H 21 : #define LIBMESH_CELL_INF_HEX8_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 InfHex8 is an infinite element in 3D composed of 8 nodes. 35 : * It is numbered like this: 36 : * \verbatim 37 : * INFHEX8: 7 6 z^ / y 38 : * o o closer to infinity | / 39 : * : | |/ 40 : * : | +----> x 41 : * 4 : 5 | 42 : * o : o | 43 : * | o....|...o 2 44 : * | .3 | / 45 : * | . | / 46 : * |. |/ base face 47 : * o--------o 48 : * 0 1 49 : * \endverbatim 50 : * 51 : * \author Daniel Dreyer 52 : * \date 2002 53 : * \brief A 3D infinite hexahedral element with 8 nodes. 54 : */ 55 : class InfHex8 final : public InfHex 56 : { 57 : public: 58 : 59 : /** 60 : * Constructor. By default this element has no parent. 61 : */ 62 : explicit 63 1562 : InfHex8 (Elem * p=nullptr) : 64 1562 : InfHex(num_nodes, p, _nodelinks_data) 65 1562 : {} 66 : 67 : InfHex8 (InfHex8 &&) = delete; 68 : InfHex8 (const InfHex8 &) = delete; 69 : InfHex8 & operator= (const InfHex8 &) = delete; 70 : InfHex8 & operator= (InfHex8 &&) = delete; 71 3714 : virtual ~InfHex8() = default; 72 : 73 : /** 74 : * \returns 8. The \p InfHex8 has 8 nodes. 75 : */ 76 751029 : virtual unsigned int n_nodes() const override { return num_nodes; } 77 : 78 : /** 79 : * \returns \p INFHEX8. 80 : */ 81 305937 : virtual ElemType type() const override { return INFHEX8; } 82 : 83 : /** 84 : * \returns 1. 85 : */ 86 0 : virtual unsigned int n_sub_elem() const override { return 1; } 87 : 88 : /** 89 : * \returns \p true if the specified (local) node number is on the 90 : * specified side. 91 : */ 92 : virtual bool is_node_on_side(const unsigned int n, 93 : const unsigned int s) const override; 94 : 95 : virtual std::vector<unsigned int> nodes_on_side(const unsigned int s) const override; 96 : 97 : virtual std::vector<unsigned int> nodes_on_edge(const unsigned int e) const override; 98 : 99 : /** 100 : * \returns \p true if the specified (local) node number is on the 101 : * specified edge. 102 : */ 103 : virtual bool is_node_on_edge(const unsigned int n, 104 : const unsigned int e) const override; 105 : 106 : /** 107 : * \returns FIRST. 108 : */ 109 : virtual Order default_order() const override; 110 : 111 : /** 112 : * \returns A \p QUAD4 built coincident with face 0, or an \p INFQUAD4 113 : * built coincident with faces 1 to 4. 114 : * 115 : * \note that the \p std::unique_ptr<Elem> takes care of freeing memory. 116 : */ 117 : virtual std::unique_ptr<Elem> build_side_ptr (const unsigned int i) override; 118 : 119 : /** 120 : * Rebuilds a \p QUAD4 built coincident with face 0, or an \p INFQUAD4 121 : * built coincident with faces 1 to 4. 122 : */ 123 : virtual void build_side_ptr (std::unique_ptr<Elem> & elem, 124 : const unsigned int i) override; 125 : 126 : // Avoid hiding deprecated version with different signature 127 : using Elem::build_side_ptr; 128 : 129 : /** 130 : * \returns An \p EDGE2 built coincident with edges 0 to 3, or an \p INFEDGE2 131 : * built coincident with edges 4 to 7. 132 : * 133 : * \note The \p std::unique_ptr<Elem> takes care of freeing memory. 134 : */ 135 : virtual std::unique_ptr<Elem> build_edge_ptr (const unsigned int i) override; 136 : 137 : /** 138 : * Rebuilds a \p EDGE2 built coincident with edges 0 to 3, or \p 139 : * INFEDGE2 built coincident with edges 4 to 11. 140 : */ 141 : virtual void build_edge_ptr (std::unique_ptr<Elem> & edge, const unsigned int i) override; 142 : 143 : virtual void connectivity(const unsigned int sc, 144 : const IOPackage iop, 145 : std::vector<dof_id_type> & conn) const override; 146 : 147 : unsigned int vtk_element_type (const unsigned int) const 148 : { return 12; } 149 : 150 : /** 151 : * Geometric constants for InfHex8. 152 : */ 153 : static const int num_nodes = 8; 154 : static const int nodes_per_side = 4; 155 : static const int nodes_per_edge = 2; 156 : 157 : /** 158 : * This maps the \f$ j^{th} \f$ node of the \f$ i^{th} \f$ side to 159 : * element node numbers. 160 : */ 161 : static const unsigned int side_nodes_map[num_sides][nodes_per_side]; 162 : 163 : /** 164 : * This maps the \f$ j^{th} \f$ node of the \f$ i^{th} \f$ side to 165 : * element node numbers. 166 : */ 167 : static const unsigned int edge_nodes_map[num_edges][nodes_per_edge]; 168 : 169 : virtual void permute(unsigned int perm_num) override final; 170 : 171 : virtual void flip(BoundaryInfo *) override final; 172 : 173 : ElemType side_type (const unsigned int s) const override final; 174 : 175 : protected: 176 : 177 : /** 178 : * Data for links to nodes. 179 : */ 180 : Node * _nodelinks_data[num_nodes]; 181 : 182 : 183 : 184 : #ifdef LIBMESH_ENABLE_AMR 185 : 186 : /** 187 : * Matrix used to create the elements children. 188 : */ 189 16720 : virtual Real embedding_matrix (const unsigned int i, 190 : const unsigned int j, 191 : const unsigned int k) const override 192 16720 : { return _embedding_matrix[i][j][k]; } 193 : 194 : /** 195 : * Matrix that computes new nodal locations/solution values 196 : * from current nodes/solution. 197 : */ 198 : static const Real _embedding_matrix[num_children][num_nodes][num_nodes]; 199 : 200 45200 : LIBMESH_ENABLE_TOPOLOGY_CACHES; 201 : 202 : #endif // LIBMESH_ENABLE_AMR 203 : 204 : }; 205 : 206 : } // namespace libMesh 207 : 208 : #endif // ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 209 : 210 : #endif // LIBMESH_CELL_INF_HEX8_H