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