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_JACOBI_H 21 : #define LIBMESH_QUADRATURE_JACOBI_H 22 : 23 : // Local includes 24 : #include "libmesh/quadrature.h" 25 : 26 : namespace libMesh 27 : { 28 : 29 : /** 30 : * This class implements two (for now) Jacobi-Gauss quadrature 31 : * rules. These rules have the same order of accuracy as the 32 : * normal Gauss quadrature rules, but instead of integrating 33 : * a weight function w(x)=1, they integrate w(x)=(1-x)^alpha * (1+x)^beta. 34 : * The reason that they are useful is that they allow you to 35 : * implement conical product rules for triangles and tetrahedra. 36 : * Although these product rules are non-optimal (use more points 37 : * than necessary) they are automatically constructable for high 38 : * orders of accuracy where other formulae may not exist. 39 : * 40 : * There is not much sense in using this class directly, 41 : * since it only provides 1D rules, weighted, as described before. 42 : * Still, this class is particularly helpful: check \p QGauss 43 : * for triangles and tetrahedra, with orders beyond \p THIRTIETH. 44 : * 45 : * \author John W. Peterson 46 : * \date 2003 47 : * \brief Implements 1D Gauss-Jacobi quadrature rules of various orders. 48 : */ 49 : class QJacobi final : public QBase 50 : { 51 : public: 52 : 53 : /** 54 : * Constructor. Currently, only one-dimensional rules provided. 55 : */ 56 26913 : QJacobi (unsigned int dim, 57 : Order order=INVALID_ORDER, 58 : unsigned int a=1, 59 26913 : unsigned int b=0) : 60 : QBase(dim, order), 61 24421 : _alpha(a), 62 26913 : _beta(b) 63 : { 64 26913 : if (_dim == 1) 65 26913 : init(EDGE2); 66 26913 : } 67 : 68 : /** 69 : * Copy/move ctor, copy/move assignment operator, and destructor are 70 : * all explicitly defaulted for this simple class. 71 : */ 72 0 : QJacobi (const QJacobi &) = default; 73 : QJacobi (QJacobi &&) = default; 74 : QJacobi & operator= (const QJacobi &) = default; 75 : QJacobi & operator= (QJacobi &&) = default; 76 26464 : virtual ~QJacobi() = default; 77 : 78 : /** 79 : * \returns The \p QuadratureType, either \p QJACOBI_1_0 or \p 80 : * QJACOBI_2_0. 81 : */ 82 : virtual QuadratureType type() const override; 83 : 84 : virtual std::unique_ptr<QBase> clone() const override; 85 : 86 : private: 87 : unsigned int _alpha; 88 : unsigned int _beta; 89 : 90 : virtual void init_1D () override; 91 : }; 92 : 93 : } // namespace libMesh 94 : 95 : #endif // LIBMESH_QUADRATURE_JACOBI_H