1 // The libMesh Finite Element Library. 2 // Copyright (C) 2002-2020 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 InfQuad4 (Elem * p=nullptr) : InfQuad(InfQuad4::n_nodes (),p,_nodelinks_data)61 InfQuad(InfQuad4::n_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 virtual ~InfQuad4() = default; 68 69 /** 70 * \returns 4. 71 */ n_nodes()72 virtual unsigned int n_nodes() const override { return num_nodes; } 73 74 /** 75 * \returns \p INFQUAD4. 76 */ type()77 virtual ElemType type () const override { return INFQUAD4; } 78 79 /** 80 * \returns 1. 81 */ n_sub_elem()82 virtual unsigned int n_sub_elem() const override { return 1; } 83 84 /** 85 * \returns \p true if the specified (local) node number is a vertex. 86 */ 87 virtual bool is_vertex(const unsigned int i) const override; 88 89 /** 90 * \returns \p true if the specified (local) node number is an edge. 91 */ 92 virtual bool is_edge(const unsigned int i) const override; 93 94 /** 95 * \returns \p true if the specified (local) node number is a face. 96 */ 97 virtual bool is_face(const unsigned int i) const override; 98 99 /** 100 * \returns \p true if the specified (local) node number is on the 101 * specified side. 102 */ 103 virtual bool is_node_on_side(const unsigned int n, 104 const unsigned int s) const override; 105 106 virtual std::vector<unsigned int> nodes_on_side(const unsigned int s) const override; 107 108 virtual std::vector<unsigned int> nodes_on_edge(const unsigned int e) const override; 109 110 /** 111 * \returns \p true if the specified (local) node number is on the 112 * specified edge (== is_node_on_side in 2D). 113 */ is_node_on_edge(const unsigned int n,const unsigned int e)114 virtual bool is_node_on_edge(const unsigned int n, 115 const unsigned int e) const override 116 { return this->is_node_on_side(n,e); } 117 118 /** 119 * \returns \p FIRST. 120 */ 121 virtual Order default_order() const override; 122 123 /** 124 * \returns An \p Edge2 for the base side, or an \p InfEdge2 for 125 * the sides 1, 2. 126 */ 127 virtual std::unique_ptr<Elem> build_side_ptr (const unsigned int i, 128 bool proxy=true) override; 129 130 /** 131 * Rebuilds an EDGE2 or INFEDGE2 coincident with face i. 132 */ 133 virtual void build_side_ptr (std::unique_ptr<Elem> & elem, 134 const unsigned int i) override; 135 136 137 virtual void connectivity(const unsigned int sf, 138 const IOPackage iop, 139 std::vector<dof_id_type> & conn) const override; 140 141 /** 142 * \returns \p true when this element contains the point 143 * \p p. Customized for this \p InfQuad4, since knowledge 144 * about the envelope can help avoiding slightly more 145 * expensive computations. 146 */ 147 virtual bool contains_point (const Point & p, Real tol=TOLERANCE) const override; 148 149 /** 150 * Geometric constants for InfQuad4. 151 */ 152 static const int num_nodes = 4; 153 static const int num_sides = 3; 154 static const int num_children = 2; 155 static const int nodes_per_side = 2; 156 157 /** 158 * This maps the \f$ j^{th} \f$ node of the \f$ i^{th} \f$ side to 159 * element node numbers. 160 */ 161 static const unsigned int side_nodes_map[num_sides][nodes_per_side]; 162 163 164 protected: 165 166 /** 167 * Data for links to nodes. 168 */ 169 Node * _nodelinks_data[num_nodes]; 170 171 172 173 #ifdef LIBMESH_ENABLE_AMR 174 175 /** 176 * Matrix used to create the elements children. 177 */ embedding_matrix(const unsigned int i,const unsigned int j,const unsigned int k)178 virtual float embedding_matrix (const unsigned int i, 179 const unsigned int j, 180 const unsigned int k) const override 181 { return _embedding_matrix[i][j][k]; } 182 183 /** 184 * Matrix that computes new nodal locations/solution values 185 * from current nodes/solution. 186 */ 187 static const float _embedding_matrix[num_children][num_nodes][num_nodes]; 188 189 LIBMESH_ENABLE_TOPOLOGY_CACHES; 190 191 #endif // LIBMESH_ENABLE_AMR 192 193 }; 194 195 196 } // namespace libMesh 197 198 #endif // ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 199 200 #endif // LIBMESH_FACE_INF_QUAD4_H 201