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 : #ifndef LIBMESH_FACE_INF_QUAD4_H 20 : #define LIBMESH_FACE_INF_QUAD4_H 21 : 22 : 23 : #include "libmesh/libmesh_config.h" 24 : 25 : #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 26 : 27 : // Local includes 28 : #include "libmesh/face_inf_quad.h" 29 : 30 : namespace libMesh 31 : { 32 : 33 : /** 34 : * The \p INFQUAD4 is an infinite element in 2D composed of 4 nodes. 35 : * It is numbered like this: 36 : * \verbatim 37 : * 2 3 38 : * INFQUAD4: o o closer to infinity 39 : * | | 40 : * | | 41 : * | | 42 : * | | 43 : * | | 44 : * o-----------o base side 45 : * 0 1 46 : * \endverbatim 47 : * 48 : * \author Daniel Dreyer 49 : * \date 2002 50 : * \brief A 2D infinite quadrilateral element with 4 nodes. 51 : */ 52 : class InfQuad4 : public InfQuad 53 : { 54 : public: 55 : 56 : /** 57 : * Constructor. By default this element has no parent. 58 : */ 59 : explicit 60 16419 : InfQuad4 (Elem * p=nullptr) : 61 16419 : InfQuad(num_nodes, p, _nodelinks_data) {} 62 : 63 : InfQuad4 (InfQuad4 &&) = delete; 64 : InfQuad4 (const InfQuad4 &) = delete; 65 : InfQuad4 & operator= (const InfQuad4 &) = delete; 66 : InfQuad4 & operator= (InfQuad4 &&) = delete; 67 21691 : virtual ~InfQuad4() = default; 68 : 69 : /** 70 : * \returns 4. 71 : */ 72 171805 : virtual unsigned int n_nodes() const override { return num_nodes; } 73 : 74 : /** 75 : * \returns \p INFQUAD4. 76 : */ 77 67563 : virtual ElemType type () const override { return INFQUAD4; } 78 : 79 : /** 80 : * \returns 1. 81 : */ 82 0 : virtual unsigned int n_sub_elem() const override { return 1; } 83 : 84 : /** 85 : * \returns \p true if the specified (local) node number is on the 86 : * specified side. 87 : */ 88 : virtual bool is_node_on_side(const unsigned int n, 89 : const unsigned int s) const override; 90 : 91 : virtual std::vector<unsigned int> nodes_on_side(const unsigned int s) const override; 92 : 93 : virtual std::vector<unsigned int> nodes_on_edge(const unsigned int e) const override; 94 : 95 : /** 96 : * \returns \p true if the specified (local) node number is on the 97 : * specified edge (== is_node_on_side in 2D). 98 : */ 99 12 : virtual bool is_node_on_edge(const unsigned int n, 100 : const unsigned int e) const override 101 12 : { return this->is_node_on_side(n,e); } 102 : 103 : /** 104 : * \returns \p FIRST. 105 : */ 106 : virtual Order default_order() const override; 107 : 108 : /** 109 : * \returns An \p Edge2 for the base side, or an \p InfEdge2 for 110 : * the sides 1, 2. 111 : */ 112 : virtual std::unique_ptr<Elem> build_side_ptr (const unsigned int i) override; 113 : 114 : /** 115 : * Rebuilds an EDGE2 or INFEDGE2 coincident with face i. 116 : */ 117 : virtual void build_side_ptr (std::unique_ptr<Elem> & elem, 118 : const unsigned int i) override; 119 : 120 : // Avoid hiding deprecated version with different signature 121 : using Elem::build_side_ptr; 122 : 123 : virtual void connectivity(const unsigned int sf, 124 : const IOPackage iop, 125 : std::vector<dof_id_type> & conn) const override; 126 : 127 : /** 128 : * \returns \p true when this element contains the point 129 : * \p p. Customized for this \p InfQuad4, since knowledge 130 : * about the envelope can help avoiding slightly more 131 : * expensive computations. 132 : */ 133 : virtual bool contains_point (const Point & p, Real tol=TOLERANCE) const override; 134 : 135 : /** 136 : * Geometric constants for InfQuad4. 137 : */ 138 : static const int num_nodes = 4; 139 : static const int nodes_per_side = 2; 140 : 141 : /** 142 : * This maps the \f$ j^{th} \f$ node of the \f$ i^{th} \f$ side to 143 : * element node numbers. 144 : */ 145 : static const unsigned int side_nodes_map[num_sides][nodes_per_side]; 146 : 147 : ElemType side_type (const unsigned int s) const override final; 148 : 149 : virtual void flip(BoundaryInfo *) override final; 150 : 151 : protected: 152 : 153 : /** 154 : * Data for links to nodes. 155 : */ 156 : Node * _nodelinks_data[num_nodes]; 157 : 158 : 159 : 160 : #ifdef LIBMESH_ENABLE_AMR 161 : 162 : /** 163 : * Matrix used to create the elements children. 164 : */ 165 330 : virtual Real embedding_matrix (const unsigned int i, 166 : const unsigned int j, 167 : const unsigned int k) const override 168 330 : { return _embedding_matrix[i][j][k]; } 169 : 170 : /** 171 : * Matrix that computes new nodal locations/solution values 172 : * from current nodes/solution. 173 : */ 174 : static const Real _embedding_matrix[num_children][num_nodes][num_nodes]; 175 : 176 440 : LIBMESH_ENABLE_TOPOLOGY_CACHES; 177 : 178 : #endif // LIBMESH_ENABLE_AMR 179 : 180 : }; 181 : 182 : 183 : } // namespace libMesh 184 : 185 : #endif // ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 186 : 187 : #endif // LIBMESH_FACE_INF_QUAD4_H