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