9#include "make_quad_rule.h"
11#include <unsupported/Eigen/KroneckerProduct>
13#include "gauss_quadrature.h"
17template <base::RefElType REF_EL,
int Degree>
18QuadRule HardcodedQuadRule();
26 std::move(weights), 2 * n - 1);
31 Eigen::MatrixXd points2d(2, n * n);
32 points2d.row(0) = Eigen::kroneckerProduct(points1d.transpose(),
33 Eigen::MatrixXd::Ones(1, n));
34 points2d.row(1) = points1d.transpose().replicate(1, n);
36 Eigen::kroneckerProduct(weights1d, weights1d), 2 * n - 1);
41 return detail::HardcodedQuadRule<base::RefEl::kTria(), 1>();
43 return detail::HardcodedQuadRule<base::RefEl::kTria(), 2>();
46 return detail::HardcodedQuadRule<base::RefEl::kTria(), 4>();
48 return detail::HardcodedQuadRule<base::RefEl::kTria(), 5>();
50 return detail::HardcodedQuadRule<base::RefEl::kTria(), 6>();
52 return detail::HardcodedQuadRule<base::RefEl::kTria(), 7>();
54 return detail::HardcodedQuadRule<base::RefEl::kTria(), 8>();
56 return detail::HardcodedQuadRule<base::RefEl::kTria(), 9>();
58 return detail::HardcodedQuadRule<base::RefEl::kTria(), 10>();
60 return detail::HardcodedQuadRule<base::RefEl::kTria(), 11>();
62 return detail::HardcodedQuadRule<base::RefEl::kTria(), 12>();
64 return detail::HardcodedQuadRule<base::RefEl::kTria(), 13>();
66 return detail::HardcodedQuadRule<base::RefEl::kTria(), 14>();
68 return detail::HardcodedQuadRule<base::RefEl::kTria(), 15>();
70 return detail::HardcodedQuadRule<base::RefEl::kTria(), 16>();
72 return detail::HardcodedQuadRule<base::RefEl::kTria(), 17>();
74 return detail::HardcodedQuadRule<base::RefEl::kTria(), 18>();
76 return detail::HardcodedQuadRule<base::RefEl::kTria(), 19>();
78 return detail::HardcodedQuadRule<base::RefEl::kTria(), 20>();
80 return detail::HardcodedQuadRule<base::RefEl::kTria(), 21>();
82 return detail::HardcodedQuadRule<base::RefEl::kTria(), 22>();
84 return detail::HardcodedQuadRule<base::RefEl::kTria(), 23>();
86 return detail::HardcodedQuadRule<base::RefEl::kTria(), 24>();
88 return detail::HardcodedQuadRule<base::RefEl::kTria(), 25>();
90 return detail::HardcodedQuadRule<base::RefEl::kTria(), 26>();
92 return detail::HardcodedQuadRule<base::RefEl::kTria(), 27>();
94 return detail::HardcodedQuadRule<base::RefEl::kTria(), 28>();
96 return detail::HardcodedQuadRule<base::RefEl::kTria(), 29>();
98 return detail::HardcodedQuadRule<base::RefEl::kTria(), 30>();
100 return detail::HardcodedQuadRule<base::RefEl::kTria(), 31>();
102 return detail::HardcodedQuadRule<base::RefEl::kTria(), 32>();
104 return detail::HardcodedQuadRule<base::RefEl::kTria(), 33>();
106 return detail::HardcodedQuadRule<base::RefEl::kTria(), 34>();
108 return detail::HardcodedQuadRule<base::RefEl::kTria(), 35>();
110 return detail::HardcodedQuadRule<base::RefEl::kTria(), 36>();
112 return detail::HardcodedQuadRule<base::RefEl::kTria(), 37>();
114 return detail::HardcodedQuadRule<base::RefEl::kTria(), 38>();
116 return detail::HardcodedQuadRule<base::RefEl::kTria(), 39>();
118 return detail::HardcodedQuadRule<base::RefEl::kTria(), 40>();
120 return detail::HardcodedQuadRule<base::RefEl::kTria(), 41>();
122 return detail::HardcodedQuadRule<base::RefEl::kTria(), 42>();
124 return detail::HardcodedQuadRule<base::RefEl::kTria(), 43>();
126 return detail::HardcodedQuadRule<base::RefEl::kTria(), 44>();
128 return detail::HardcodedQuadRule<base::RefEl::kTria(), 45>();
130 return detail::HardcodedQuadRule<base::RefEl::kTria(), 46>();
132 return detail::HardcodedQuadRule<base::RefEl::kTria(), 47>();
134 return detail::HardcodedQuadRule<base::RefEl::kTria(), 48>();
136 return detail::HardcodedQuadRule<base::RefEl::kTria(), 49>();
138 return detail::HardcodedQuadRule<base::RefEl::kTria(), 50>();
145 jac_p.array() = (jac_p.array() + 1) / 2.;
146 jac_w.array() *= 0.25;
147 Eigen::MatrixXd points2d(2, n * n);
148 points2d.row(0) = Eigen::kroneckerProduct(
149 leg_p.transpose(), (1 - jac_p.transpose().array()).matrix());
150 points2d.row(1) = jac_p.transpose().replicate(1, n);
152 Eigen::kroneckerProduct(leg_w, jac_w), 2 * n - 1);
156 false,
"No Quadrature rules implemented for this reference element yet.");
160 Eigen::MatrixXd points(2, 1);
161 Eigen::VectorXd weights(1);
163 points(0, 0) = 1.0 / 3.0;
164 points(1, 0) = 1.0 / 3.0;
173 Eigen::MatrixXd points(2, 3);
174 Eigen::VectorXd weights(3);
183 weights(0) = 0.16666666666666665741;
184 weights(1) = 0.16666666666666665741;
185 weights(2) = 0.16666666666666665741;
192 Eigen::MatrixXd points(2, 4);
193 Eigen::VectorXd weights(4);
214 Eigen::MatrixXd points(2, 6);
215 Eigen::VectorXd weights(6);
223 points(0, 3) = 1.0 / 6.0;
224 points(1, 3) = 1.0 / 6.0;
225 points(0, 4) = 1.0 / 6.0;
226 points(1, 4) = 2.0 / 3.0;
227 points(0, 5) = 2.0 / 3.0;
228 points(1, 5) = 1.0 / 6.0;
230 weights << 1.0, 1.0, 1.0, 9.0, 9.0, 9.0;
238 return detail::HardcodedQuadRule<base::RefEl::kTria(), 5>();
Represents a reference element with all its properties.
static constexpr RefEl kSegment()
Returns the (1-dimensional) reference segment.
static constexpr RefEl kTria()
Returns the reference triangle.
static constexpr RefEl kQuad()
Returns the reference quadrilateral.
Represents a Quadrature Rule over one of the Reference Elements.
QuadRule make_TriaQR_MidpointRule()
midpoint quadrature rule for triangles
QuadRule make_TriaQR_P7O6()
Seven point triangular quadrature rule of order 6.
QuadRule make_QuadQR_EdgeMidpointRule()
edge midpoint quadrature rule for unit square (= reference quad)
QuadRule make_TriaQR_P6O4()
Six point triangular quadrature rule of order 4.
QuadRule make_TriaQR_EdgeMidpointRule()
edge midpoint quadrature rule for reference triangles
Rules for numerical quadrature on reference entity shapes.
std::tuple< Eigen::VectorXd, Eigen::VectorXd > GaussJacobi(quadDegree_t num_points, double alpha, double beta)
Computes the quadrature points and weights for the interval [-1,1] of a Gauss-Jacobi quadrature rule ...
std::tuple< Eigen::VectorXd, Eigen::VectorXd > GaussLegendre(unsigned num_points)
QuadRule make_QuadRule(base::RefEl ref_el, unsigned degree)
Returns a QuadRule object for the given Reference Element and Degree.
unsigned int quadDegree_t