Line data Source code
1 : // The libMesh Finite Element Library.
2 : // Copyright (C) 2002-2026 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 601754 : Pyramid5 (Elem * p=nullptr) :
66 601754 : Pyramid(num_nodes, p, _nodelinks_data)
67 601754 : {}
68 :
69 : Pyramid5 (Pyramid5 &&) = delete;
70 : Pyramid5 (const Pyramid5 &) = delete;
71 : Pyramid5 & operator= (const Pyramid5 &) = delete;
72 : Pyramid5 & operator= (Pyramid5 &&) = delete;
73 620619 : virtual ~Pyramid5() = default;
74 :
75 : /**
76 : * \returns \p PYRAMID.
77 : */
78 20033368 : 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 constexpr unsigned int side_nodes_map[num_sides][nodes_per_side] =
171 : {
172 : {0, 1, 4, 99}, // Side 0
173 : {1, 2, 4, 99}, // Side 1
174 : {2, 3, 4, 99}, // Side 2
175 : {3, 0, 4, 99}, // Side 3
176 : {0, 3, 2, 1} // Side 4
177 : };
178 :
179 : /**
180 : * This maps the \f$ j^{th} \f$ node of the \f$ i^{th} \f$ edge to
181 : * element node numbers.
182 : */
183 : static constexpr unsigned int edge_nodes_map[num_edges][nodes_per_edge] =
184 : {
185 : {0, 1}, // Edge 0
186 : {1, 2}, // Edge 1
187 : {2, 3}, // Edge 2
188 : {0, 3}, // Edge 3
189 : {0, 4}, // Edge 4
190 : {1, 4}, // Edge 5
191 : {2, 4}, // Edge 6
192 : {3, 4} // Edge 7
193 : };
194 :
195 : /**
196 : * We compute the centroid of the Pyramid by treating it as a
197 : * degenerate Hex8 element.
198 : */
199 : virtual Point true_centroid () const override;
200 :
201 : /**
202 : * Specialization for computing the volume of a pyramid.
203 : */
204 : virtual Real volume () const override;
205 :
206 : /**
207 : * Builds a bounding box out of the nodal positions
208 : */
209 : virtual BoundingBox loose_bounding_box () const override;
210 :
211 : virtual void permute(unsigned int perm_num) override final;
212 :
213 : virtual void flip(BoundaryInfo *) override final;
214 :
215 : ElemType side_type (const unsigned int s) const override final;
216 :
217 : virtual Point side_vertex_average_normal(const unsigned int s) const override final;
218 :
219 : protected:
220 :
221 : /**
222 : * Data for links to nodes.
223 : */
224 : Node * _nodelinks_data[num_nodes];
225 :
226 :
227 :
228 : #ifdef LIBMESH_ENABLE_AMR
229 :
230 : /**
231 : * Matrix used to create the elements children.
232 : */
233 0 : virtual Real embedding_matrix (const unsigned int,
234 : const unsigned int,
235 : const unsigned int) const override
236 0 : { libmesh_not_implemented(); return 0.; }
237 :
238 0 : LIBMESH_ENABLE_TOPOLOGY_CACHES;
239 :
240 : #endif // LIBMESH_ENABLE_AMR
241 :
242 : };
243 :
244 : } // namespace libMesh
245 :
246 :
247 : #endif // LIBMESH_CELL_PYRAMID5_H
|