LCOV - code coverage report
Current view: top level - src/FEM/Quadrature - GaussJacobiQuadrature.h (source / functions) Coverage Total Hit
Test: final_report.info Lines: 62.5 % 8 5
Test Date: 2025-07-18 17:15:09 Functions: 100.0 % 44 44

            Line data    Source code
       1              : // Class GaussJacobiQuadrature
       2              : //   The GaussJacobiQuadrature class. This is a class representing a Gauss-Jacobi quadrature
       3              : //   The algoirthm in computeNodesAndWeights is based on the LehrFEM++ library.
       4              : //   https://craffael.github.io/lehrfempp/gauss__quadrature_8cc_source.html
       5              : 
       6              : #ifndef IPPL_GAUSSJACOBIQUADRATURE_H
       7              : #define IPPL_GAUSSJACOBIQUADRATURE_H
       8              : 
       9              : #include "FEM/Quadrature/Quadrature.h"
      10              : 
      11              : namespace ippl {
      12              : 
      13              :     enum InitialGuessType {
      14              :         Chebyshev,
      15              :         LehrFEM,
      16              :     };
      17              : 
      18              :     /**
      19              :      * @brief This is class represents the Gauss-Jacobi quadrature rule
      20              :      * on a reference element.
      21              :      *
      22              :      * @tparam T floating point number type of the quadrature nodes and weights
      23              :      * @tparam NumNodes1D number of quadrature nodes for one dimension
      24              :      * @tparam ElementType element type for which the quadrature rule is defined
      25              :      */
      26              :     template <typename T, unsigned NumNodes1D, typename ElementType>
      27              :     class GaussJacobiQuadrature : public Quadrature<T, NumNodes1D, ElementType> {
      28              :     public:
      29              :         // a higher precision floating point number type used for the computation
      30              :         // of the quadrature nodes and weights
      31              :         using scalar_t = long double;  // might be equivalant to double, depending on compiler
      32              : 
      33              :         /**
      34              :          * @brief Construct a new Gauss Jacobi Quadrature rule object
      35              :          *
      36              :          * @param ref_element reference element to compute the quadrature nodes on
      37              :          * @param alpha first Jacobi parameter alpha
      38              :          * @param beta second Jacobi parameter beta
      39              :          * @param max_newton_itersations maximum number of Newton iterations (default 10)
      40              :          * @param min_newton_iterations minimum number of Newton iterations (default 1)
      41              :          */
      42              :         GaussJacobiQuadrature(const ElementType& ref_element, const T& alpha, const T& beta,
      43            0 :                               const size_t& max_newton_itersations = 10,
      44            0 :                               const size_t& min_newton_iterations  = 1);
      45              : 
      46              :         /**
      47              :          * Computes the quadrature nodes and weights and stores them in the
      48              :          * quadrature nodes and weights arrays.
      49              :          */
      50              :         void computeNodesAndWeights() override;
      51              : 
      52              :         /**
      53              :          * @brief Returns the i-th Chebyshev node, used as initial guess for the Newton iterations.
      54              :          *
      55              :          * @param i index of the Chebyshev node
      56              :          *
      57              :          * @return scalar_t - i-th Chebyshev node
      58              :          */
      59              :         scalar_t getChebyshevNodes(const size_t& i) const;  // FIXME maybe move somewhere else?
      60              : 
      61              :     private:
      62              :         /**
      63              :          * @brief Computes the initial guess for the Newton iterations, the way they are computed in
      64              :          * the implementation from LehrFEM++.
      65              :          *
      66              :          * @param i index of the initial guess (corresponding to the i-th quadrature node)
      67              :          * @param integration_nodes the integration nodes
      68              :          *
      69              :          * @return scalar_t - initial guess
      70              :          */
      71              :         scalar_t getLehrFEMInitialGuess(
      72              :             const size_t& i, const Vector<scalar_t, NumNodes1D>& integration_nodes) const;
      73              : 
      74              :         const T alpha_m;
      75              :         const T beta_m;
      76              : 
      77              :         const size_t max_newton_iterations_m;
      78              :         const size_t min_newton_iterations_m;
      79              :     };
      80              : 
      81              :     /**
      82              :      * @brief This is class represents the Gauss-Legendre quadrature rule.
      83              :      * It is a special case of the Gauss-Jacobi quadrature rule with alpha = beta = 0.0.
      84              :      *
      85              :      * @tparam T floating point number type of the quadrature nodes and weights
      86              :      * @tparam NumNodes1D number of quadrature nodes for one dimension
      87              :      * @tparam ElementType element type for which the quadrature rule is defined
      88              :      */
      89              :     template <typename T, unsigned NumNodes1D, typename ElementType>
      90              :     class GaussLegendreQuadrature : public GaussJacobiQuadrature<T, NumNodes1D, ElementType> {
      91              :     public:
      92              :         /**
      93              :          * @brief Construct a new Gauss Legendre Quadrature rule object
      94              :          *
      95              :          * @param ref_element reference element to compute the quadrature nodes on
      96              :          * @param max_newton_itersations maximum number of Newton iterations (default 10)
      97              :          * @param min_newton_iterations minimum number of Newton iterations (default 1)
      98              :          */
      99          236 :         GaussLegendreQuadrature(const ElementType& ref_element,
     100            0 :                                 const size_t& max_newton_itersations = 10,
     101          180 :                                 const size_t& min_newton_iterations  = 1)
     102              :             : GaussJacobiQuadrature<T, NumNodes1D, ElementType>(
     103          236 :                 ref_element, 0.0, 0.0, max_newton_itersations, min_newton_iterations) {}
     104              :     };
     105              : 
     106              :     /**
     107              :      * @brief This is class represents the Chebyshev-Gauss quadrature rule.
     108              :      * It is a special case of the Gauss-Jacobi quadrature rule with alpha = beta = -0.5.
     109              :      *
     110              :      * @tparam T floating point number type of the quadrature nodes and weights
     111              :      * @tparam NumNodes1D number of quadrature nodes for one dimension
     112              :      * @tparam ElementType element type for which the quadrature rule is defined
     113              :      */
     114              :     template <typename T, unsigned NumNodes1D, typename ElementType>
     115              :     class ChebyshevGaussQuadrature : public GaussJacobiQuadrature<T, NumNodes1D, ElementType> {
     116              :     public:
     117              :         /**
     118              :          * @brief Construct a new Chebyshev Gauss Quadrature rule object
     119              :          *
     120              :          * @param ref_element reference element to compute the quadrature nodes on
     121              :          * @param max_newton_itersations maximum number of Newton iterations (default 10)
     122              :          * @param min_newton_iterations minimum number of Newton iterations (default 1)
     123              :          */
     124           56 :         ChebyshevGaussQuadrature(const ElementType& ref_element,
     125              :                                  const size_t& max_newton_itersations = 10,
     126              :                                  const size_t& min_newton_iterations  = 1)
     127              :             : GaussJacobiQuadrature<T, NumNodes1D, ElementType>(
     128           56 :                 ref_element, -0.5, -0.5, max_newton_itersations, min_newton_iterations) {}
     129              :     };
     130              : 
     131              : }  // namespace ippl
     132              : 
     133              : #include "FEM/Quadrature/GaussJacobiQuadrature.hpp"
     134              : 
     135              : #endif
        

Generated by: LCOV version 2.0-1