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_PYRAMID5_H 21 : #define LIBMESH_CELL_PYRAMID5_H 22 : 23 : // Local includes 24 : #include "libmesh/cell_pyramid.h" 25 : 26 : namespace libMesh 27 : { 28 : 29 : /** 30 : * The \p Pyramid5 is an element in 3D composed of 5 nodes. It is 31 : * numbered with a counter-clockwise base like this: 32 : * 33 : * \verbatim 34 : * PYRAMID5: 35 : * o 4 36 : * //|\ 37 : * // | \ zeta 38 : * // | \ ^ eta (into page) 39 : * 3 o/...|...o 2 | / 40 : * ./ | / |/ 41 : * ./ | / o---> xi 42 : * ./ |/ 43 : * o--------o 44 : * 0 1 45 : * \endverbatim 46 : * 47 : * (xi, eta, zeta): { zeta-1 <= xi <= 1-zeta 48 : * { zeta-1 <= eta <= 1-zeta 49 : * { 0 <= zeta <= 1 50 : * are the reference element coordinates associated with the given 51 : * numbering. 52 : * 53 : * \author Benjamin S. Kirk 54 : * \date 2002 55 : * \brief A 3D pyramid element with 5 nodes. 56 : */ 57 : class Pyramid5 final : public Pyramid 58 : { 59 : public: 60 : 61 : /** 62 : * Constructor. By default this element has no parent. 63 : */ 64 : explicit 65 351463 : Pyramid5 (Elem * p=nullptr) : 66 351463 : Pyramid(num_nodes, p, _nodelinks_data) 67 351463 : {} 68 : 69 : Pyramid5 (Pyramid5 &&) = delete; 70 : Pyramid5 (const Pyramid5 &) = delete; 71 : Pyramid5 & operator= (const Pyramid5 &) = delete; 72 : Pyramid5 & operator= (Pyramid5 &&) = delete; 73 362658 : virtual ~Pyramid5() = default; 74 : 75 : /** 76 : * \returns \p PYRAMID. 77 : */ 78 12461102 : virtual ElemType type () const override { return PYRAMID5; } 79 : 80 : /** 81 : * \returns 1. 82 : */ 83 0 : virtual unsigned int n_sub_elem() const override { return 1; } 84 : 85 : /** 86 : * \returns \p true if the specified (local) node number is a vertex. 87 : */ 88 : virtual bool is_vertex(const unsigned int i) const override; 89 : 90 : /** 91 : * \returns \p true if the specified (local) node number is an edge. 92 : */ 93 : virtual bool is_edge(const unsigned int i) const override; 94 : 95 : /** 96 : * \returns \p true if the specified (local) node number is a face. 97 : */ 98 : virtual bool is_face(const unsigned int i) const override; 99 : 100 : /** 101 : * \returns \p true if the specified (local) node number is on the 102 : * specified side. 103 : */ 104 : virtual bool is_node_on_side(const unsigned int n, 105 : const unsigned int s) const override; 106 : 107 : virtual std::vector<unsigned int> nodes_on_side(const unsigned int s) const override; 108 : 109 : virtual std::vector<unsigned int> nodes_on_edge(const unsigned int e) const override; 110 : 111 : /** 112 : * \returns \p true if the specified (local) node number is on the 113 : * specified edge. 114 : */ 115 : virtual bool is_node_on_edge(const unsigned int n, 116 : const unsigned int e) const override; 117 : 118 : /** 119 : * \returns \p true if the element map is definitely affine within 120 : * numerical tolerances. 121 : */ 122 : virtual bool has_affine_map () const override; 123 : 124 : /** 125 : * \returns FIRST. 126 : */ 127 : virtual Order default_order() const override; 128 : 129 : /** 130 : * Builds a \p QUAD4 or \p TRI3 built coincident with face i. 131 : * The \p std::unique_ptr<Elem> handles the memory aspect. 132 : */ 133 : virtual std::unique_ptr<Elem> build_side_ptr (const unsigned int i) override; 134 : 135 : /** 136 : * Rebuilds a \p QUAD4 or \p TRI3 built coincident with face i. 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 : * Builds a \p EDGE2 built coincident with edge i. 146 : * The \p std::unique_ptr<Elem> handles the memory aspect. 147 : */ 148 : virtual std::unique_ptr<Elem> build_edge_ptr (const unsigned int i) override; 149 : 150 : /** 151 : * Rebuilds a \p EDGE2 coincident with edge i. 152 : */ 153 : virtual void build_edge_ptr (std::unique_ptr<Elem> & edge, const unsigned int i) override; 154 : 155 : virtual void connectivity(const unsigned int sc, 156 : const IOPackage iop, 157 : std::vector<dof_id_type> & conn) const override; 158 : 159 : /** 160 : * Geometric constants for Pyramid5. 161 : */ 162 : static const int num_nodes = 5; 163 : static const int nodes_per_side = 4; 164 : static const int nodes_per_edge = 2; 165 : 166 : /** 167 : * This maps the \f$ j^{th} \f$ node of the \f$ i^{th} \f$ side to 168 : * element node numbers. 169 : */ 170 : static const unsigned int side_nodes_map[num_sides][nodes_per_side]; 171 : 172 : /** 173 : * This maps the \f$ j^{th} \f$ node of the \f$ i^{th} \f$ edge to 174 : * element node numbers. 175 : */ 176 : static const unsigned int edge_nodes_map[num_edges][nodes_per_edge]; 177 : 178 : /** 179 : * We compute the centroid of the Pyramid by treating it as a 180 : * degenerate Hex8 element. 181 : */ 182 : virtual Point true_centroid () const override; 183 : 184 : /** 185 : * Specialization for computing the volume of a pyramid. 186 : */ 187 : virtual Real volume () const override; 188 : 189 : /** 190 : * Builds a bounding box out of the nodal positions 191 : */ 192 : virtual BoundingBox loose_bounding_box () const override; 193 : 194 : virtual void permute(unsigned int perm_num) override final; 195 : 196 : virtual void flip(BoundaryInfo *) override final; 197 : 198 : ElemType side_type (const unsigned int s) const override final; 199 : 200 : protected: 201 : 202 : /** 203 : * Data for links to nodes. 204 : */ 205 : Node * _nodelinks_data[num_nodes]; 206 : 207 : 208 : 209 : #ifdef LIBMESH_ENABLE_AMR 210 : 211 : /** 212 : * Matrix used to create the elements children. 213 : */ 214 0 : virtual Real embedding_matrix (const unsigned int, 215 : const unsigned int, 216 : const unsigned int) const override 217 0 : { libmesh_not_implemented(); return 0.; } 218 : 219 0 : LIBMESH_ENABLE_TOPOLOGY_CACHES; 220 : 221 : #endif // LIBMESH_ENABLE_AMR 222 : 223 : }; 224 : 225 : } // namespace libMesh 226 : 227 : 228 : #endif // LIBMESH_CELL_PYRAMID5_H