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