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_QUADRATURE_NODAL_H 21 : #define LIBMESH_QUADRATURE_NODAL_H 22 : 23 : // Local includes 24 : #include "libmesh/quadrature.h" 25 : 26 : namespace libMesh 27 : { 28 : 29 : /** 30 : * This class implements nodal quadrature rules for various element 31 : * types. For some element types, this corresponds to well-known 32 : * quadratures such as the trapezoidal rule and Simpson's rule. For 33 : * other element types (e.g. the serendipity QUAD8/HEX20/PRISM15) it 34 : * implements a lower-order-accurate nodal quadrature which still 35 : * generates a strictly positive definite (diagonal) mass matrix. 36 : * Since the main purpose of this class is provide appropriate nodal 37 : * quadrature rules, "order" arguments passed during initialization 38 : * are ignored. 39 : * 40 : * \author John W. Peterson 41 : * \date 2019 42 : * \brief Implements nodal quadrature for various element types. 43 : */ 44 : class QNodal : public QBase 45 : { 46 : public: 47 : 48 : /** 49 : * Constructor. Declares the order of the quadrature rule. We 50 : * explicitly call the \p init function in 1D since the other 51 : * tensor-product rules require this one. 52 : * 53 : * \note The element type, EDGE2, will not be used internally, 54 : * however if we called the function with INVALID_ELEM it would try 55 : * to be smart and return, thinking it had already done the work. 56 : */ 57 : explicit 58 81014 : QNodal (unsigned int dim, 59 81014 : Order order=FIRST) : 60 81014 : QBase(dim,order) 61 : { 62 81014 : if (dim == 1) 63 355 : init(EDGE2); 64 81014 : } 65 : 66 : /** 67 : * Copy/move ctor, copy/move assignment operator, and destructor are 68 : * all explicitly defaulted for this simple class. 69 : */ 70 0 : QNodal (const QNodal &) = default; 71 : QNodal (QNodal &&) = default; 72 : QNodal & operator= (const QNodal &) = default; 73 : QNodal & operator= (QNodal &&) = default; 74 81082 : virtual ~QNodal() = default; 75 : 76 : /** 77 : * \returns \p QNODAL. 78 : */ 79 : virtual QuadratureType type() const override; 80 : 81 : virtual std::unique_ptr<QBase> clone() const override; 82 : 83 : private: 84 : 85 : virtual void init_1D () override; 86 : virtual void init_2D () override; 87 : virtual void init_3D () override; 88 : }; 89 : 90 : } // namespace libMesh 91 : 92 : #endif // LIBMESH_QUADRATURE_NODAL_H