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_GAUSS_H 21 : #define LIBMESH_QUADRATURE_GAUSS_H 22 : 23 : // Local includes 24 : #include "libmesh/quadrature.h" 25 : 26 : namespace libMesh 27 : { 28 : 29 : /** 30 : * This class implements specific orders of Gauss quadrature. The 31 : * rules of Order \p p are capable of integrating polynomials of 32 : * degree \p p exactly. 33 : * 34 : * \author Benjamin Kirk 35 : * \author John W. Peterson 36 : * \date 2003 37 : * \brief Implements 1, 2, and 3D "Gaussian" quadrature rules. 38 : */ 39 : class QGauss : public QBase 40 : { 41 : public: 42 : 43 : /** 44 : * Constructor. Declares the order of the quadrature rule. We 45 : * explicitly call the \p init function in 1D since the other 46 : * tensor-product rules require this one. 47 : * 48 : * \note The element type, EDGE2, will not be used internally, 49 : * however if we called the function with INVALID_ELEM it would try 50 : * to be smart and return, thinking it had already done the work. 51 : */ 52 10979895 : QGauss (unsigned int dim, 53 11017562 : Order order=INVALID_ORDER) : 54 11017562 : QBase(dim, order) 55 : { 56 10979895 : if (dim == 1) 57 5185366 : init(EDGE2); 58 10979895 : } 59 : 60 : /** 61 : * Copy/move ctor, copy/move assignment operator, and destructor are 62 : * all explicitly defaulted for this simple class. 63 : */ 64 0 : QGauss (const QGauss &) = default; 65 : QGauss (QGauss &&) = default; 66 : QGauss & operator= (const QGauss &) = default; 67 : QGauss & operator= (QGauss &&) = default; 68 5250891 : virtual ~QGauss() = default; 69 : 70 : /** 71 : * \returns \p QGAUSS. 72 : */ 73 : virtual QuadratureType type() const override; 74 : 75 : virtual std::unique_ptr<QBase> clone() const override; 76 : 77 : private: 78 : 79 : virtual void init_1D () override; 80 : virtual void init_2D () override; 81 : virtual void init_3D () override; 82 : 83 : /** 84 : * The Dunavant rules are for triangles. This function takes 85 : * permutation points and weights in a specific format as input and 86 : * fills the _points and _weights vectors. 87 : */ 88 : void dunavant_rule(const Real rule_data[][4], 89 : const unsigned int n_pts); 90 : 91 : void dunavant_rule2(const Real * wts, 92 : const Real * a, 93 : const Real * b, 94 : const unsigned int * permutation_ids, 95 : const unsigned int n_wts); 96 : 97 : /** 98 : * The Keast rules are for tets. This function takes permutation 99 : * points and weights in a specific format as input and fills the 100 : * _points and _weights vectors. 101 : */ 102 : void keast_rule(const Real rule_data[][4], 103 : const unsigned int n_pts); 104 : }; 105 : 106 : } // namespace libMesh 107 : 108 : #endif // LIBMESH_QUADRATURE_GAUSS_H