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_FACE_INF_QUAD6_H 21 : #define LIBMESH_FACE_INF_QUAD6_H 22 : 23 : 24 : #include "libmesh/libmesh_config.h" 25 : 26 : #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 27 : 28 : // Local includes 29 : #include "libmesh/face_inf_quad.h" 30 : 31 : namespace libMesh 32 : { 33 : 34 : /** 35 : * The \p INFQUAD6 is an infinite element in 2D composed of 6 nodes. 36 : * It is numbered like this: 37 : * \verbatim 38 : * 2 5 3 39 : * INFQUAD6: o o o closer to infinity 40 : * | | 41 : * | | 42 : * | | 43 : * | | 44 : * | | 45 : * o-----o-----o base side 46 : * 0 4 1 47 : * \endverbatim 48 : * 49 : * \author Daniel Dreyer 50 : * \date 2002 51 : * \brief A 2D infinite quadrilateral element with 6 nodes. 52 : */ 53 : class InfQuad6 : public InfQuad 54 : { 55 : public: 56 : 57 : /** 58 : * Constructor. By default this element has no parent. 59 : */ 60 : explicit 61 929 : InfQuad6 (Elem * p=nullptr): 62 929 : InfQuad(num_nodes, p, _nodelinks_data) {} 63 : 64 : InfQuad6 (InfQuad6 &&) = delete; 65 : InfQuad6 (const InfQuad6 &) = delete; 66 : InfQuad6 & operator= (const InfQuad6 &) = delete; 67 : InfQuad6 & operator= (InfQuad6 &&) = delete; 68 985 : virtual ~InfQuad6() = default; 69 : 70 : /** 71 : * \returns 6. 72 : */ 73 14420 : virtual unsigned int n_nodes() const override { return num_nodes; } 74 : 75 : /** 76 : * \returns \p INFQUAD6. 77 : */ 78 939 : virtual ElemType type () const override { return INFQUAD6; } 79 : 80 : /** 81 : * \returns 2. 82 : */ 83 0 : virtual unsigned int n_sub_elem() const override { return 2; } 84 : 85 : /** 86 : * \returns \p true if the specified (local) node number is on the 87 : * specified side. 88 : */ 89 : virtual bool is_node_on_side(const unsigned int n, 90 : const unsigned int s) const override; 91 : 92 : virtual std::vector<unsigned int> nodes_on_side(const unsigned int s) const override; 93 : 94 : virtual std::vector<unsigned int> nodes_on_edge(const unsigned int e) const override; 95 : 96 : /** 97 : * \returns \p true if the specified (local) node number is on the 98 : * specified edge (== is_node_on_side in 2D). 99 : */ 100 14 : virtual bool is_node_on_edge(const unsigned int n, 101 : const unsigned int e) const override 102 14 : { return this->is_node_on_side(n,e); } 103 : 104 : /** 105 : * \returns \p SECOND. 106 : */ 107 : virtual Order default_order() const override; 108 : 109 : /** 110 : * Don't hide Elem::key() defined in the base class. 111 : */ 112 : using Elem::key; 113 : 114 : /** 115 : * \returns An id associated with the \p s side of this element. 116 : * The id is not necessarily unique, but should be close. 117 : * 118 : * We override this function to return a key for the Edge3 side 119 : * which is consistent which Edge3::key(). 120 : */ 121 : virtual dof_id_type key (const unsigned int s) const override; 122 : 123 : /** 124 : * \returns \p InfQuad6::side_nodes_map[side][side_node] after doing some range checking. 125 : */ 126 : virtual unsigned int local_side_node(unsigned int side, 127 : unsigned int side_node) const override; 128 : 129 : /** 130 : * \returns An \p Edge3 for the base (0) side, and an \p InfEdge2 for 131 : * the sides 1, 2. 132 : */ 133 : virtual std::unique_ptr<Elem> build_side_ptr (const unsigned int i) override; 134 : 135 : /** 136 : * Rebuilds an EDGE3 or INFEDGE2 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 : virtual void connectivity(const unsigned int sf, 145 : const IOPackage iop, 146 : std::vector<dof_id_type> & conn) const override; 147 : 148 : /** 149 : * \returns 2 for all \p n. 150 : */ 151 0 : virtual unsigned int n_second_order_adjacent_vertices (const unsigned int) const override 152 0 : { return 2; } 153 : 154 : /** 155 : * \returns The element-local number of the \f$ v^{th} \f$ vertex 156 : * that defines the \f$ n^{th} \f$ second-order node. 157 : * 158 : * \note \p n is counted as depicted above, \f$ 4 \le n < 6 \f$. 159 : */ 160 : virtual unsigned short int second_order_adjacent_vertex (const unsigned int n, 161 : const unsigned int v) const override; 162 : 163 : /** 164 : * \returns The child number \p c and element-local index \p v of 165 : * the \f$ n^{th} \f$ second-order node on the parent element. See 166 : * elem.h for further details. 167 : */ 168 : virtual std::pair<unsigned short int, unsigned short int> 169 : second_order_child_vertex (const unsigned int n) const override; 170 : 171 : /** 172 : * Geometric constants for InfQuad6. 173 : */ 174 : static const int num_nodes = 6; 175 : static const int nodes_per_side = 3; 176 : 177 : /** 178 : * This maps the \f$ j^{th} \f$ node of the \f$ i^{th} \f$ side to 179 : * element node numbers. 180 : */ 181 : static const unsigned int side_nodes_map[num_sides][nodes_per_side]; 182 : 183 : ElemType side_type (const unsigned int s) const override final; 184 : 185 : virtual void flip(BoundaryInfo *) override final; 186 : 187 : protected: 188 : 189 : /** 190 : * Data for links to nodes. 191 : */ 192 : Node * _nodelinks_data[num_nodes]; 193 : 194 : 195 : 196 : #ifdef LIBMESH_ENABLE_AMR 197 : 198 : /** 199 : * Matrix used to create the elements children. 200 : */ 201 800 : virtual Real embedding_matrix (const unsigned int i, 202 : const unsigned int j, 203 : const unsigned int k) const override 204 800 : { return _embedding_matrix[i][j][k]; } 205 : 206 : /** 207 : * Matrix that computes new nodal locations/solution values 208 : * from current nodes/solution. 209 : */ 210 : static const Real _embedding_matrix[num_children][num_nodes][num_nodes]; 211 : 212 860 : LIBMESH_ENABLE_TOPOLOGY_CACHES; 213 : 214 : #endif // LIBMESH_ENABLE_AMR 215 : 216 : private: 217 : 218 : /** 219 : * Matrix that tells which vertices define the location 220 : * of mid-side (or second-order) nodes 221 : */ 222 : static const unsigned short int _second_order_adjacent_vertices[2][2]; 223 : }; 224 : 225 : 226 : } // namespace libMesh 227 : 228 : #endif // ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 229 : 230 : #endif // LIBMESH_FACE_INF_QUAD6_H