68 std::vector<long double> points =
69 Polynomials::jacobi_polynomial_roots<long double>(n, 0, 0);
71 for (
unsigned int i = 0; i < (points.size() + 1) / 2; ++i)
77 const long double pp =
80 const long double x = -1. + 2. * points[i];
81 const double w = 1. / ((1. - x * x) * pp * pp);
98 long double result = n - 1;
99 for (
int i = n - 2; i > 1; --i)
113 std::vector<long double>
118 const unsigned int q = x.size();
119 std::vector<long double>
w(q);
121 const long double factor =
123 ((q - 1) *
gamma(q) *
gamma(alpha + beta + q + 1));
124 for (
unsigned int i = 0; i < q; ++i)
126 const long double s =
128 w[i] = factor / (s * s);
131 w[q - 1] *= (alpha + 1);
146 std::vector<long double> points =
147 Polynomials::jacobi_polynomial_roots<long double>(n - 2, 1, 1);
148 points.insert(points.begin(), 0);
149 points.push_back(1.);
150 std::vector<long double>
w =
154 for (
unsigned int i = 0; i < points.size(); ++i)
157 this->weights[i] = 0.5 *
w[i];
177 static const double xpts[] = {0.0, 1.0};
178 static const double wts[] = {0.5, 0.5};
180 for (
unsigned int i = 0; i < this->
size(); ++i)
193 static const double xpts[] = {0.0, 0.5, 1.0};
194 static const double wts[] = {1. / 6., 2. / 3., 1. / 6.};
196 for (
unsigned int i = 0; i < this->
size(); ++i)
209 static const double xpts[] = {0.0, .25, .5, .75, 1.0};
210 static const double wts[] = {
211 7. / 90., 32. / 90., 12. / 90., 32. / 90., 7. / 90.};
213 for (
unsigned int i = 0; i < this->
size(); ++i)
226 static const double xpts[] = {
227 0.0, 1. / 6., 1. / 3., .5, 2. / 3., 5. / 6., 1.0};
228 static const double wts[] = {41. / 840.,
236 for (
unsigned int i = 0; i < this->
size(); ++i)
251 for (
unsigned int i = 0; i < this->
size(); ++i)
258 this->
weights[i] = revert ?
w[n - 1 - i] :
w[i];
266 std::vector<double> q_points(n);
271 q_points[0] = 0.3333333333333333;
275 q_points[0] = 0.1120088061669761;
276 q_points[1] = 0.6022769081187381;
280 q_points[0] = 0.06389079308732544;
281 q_points[1] = 0.3689970637156184;
282 q_points[2] = 0.766880303938942;
286 q_points[0] = 0.04144848019938324;
287 q_points[1] = 0.2452749143206022;
288 q_points[2] = 0.5561654535602751;
289 q_points[3] = 0.848982394532986;
293 q_points[0] = 0.02913447215197205;
294 q_points[1] = 0.1739772133208974;
295 q_points[2] = 0.4117025202849029;
296 q_points[3] = 0.6773141745828183;
297 q_points[4] = 0.89477136103101;
301 q_points[0] = 0.02163400584411693;
302 q_points[1] = 0.1295833911549506;
303 q_points[2] = 0.3140204499147661;
304 q_points[3] = 0.5386572173517997;
305 q_points[4] = 0.7569153373774084;
306 q_points[5] = 0.922668851372116;
311 q_points[0] = 0.0167193554082585;
312 q_points[1] = 0.100185677915675;
313 q_points[2] = 0.2462942462079286;
314 q_points[3] = 0.4334634932570557;
315 q_points[4] = 0.6323509880476823;
316 q_points[5] = 0.81111862674023;
317 q_points[6] = 0.940848166743287;
321 q_points[0] = 0.01332024416089244;
322 q_points[1] = 0.07975042901389491;
323 q_points[2] = 0.1978710293261864;
324 q_points[3] = 0.354153994351925;
325 q_points[4] = 0.5294585752348643;
326 q_points[5] = 0.7018145299391673;
327 q_points[6] = 0.849379320441094;
328 q_points[7] = 0.953326450056343;
332 q_points[0] = 0.01086933608417545;
333 q_points[1] = 0.06498366633800794;
334 q_points[2] = 0.1622293980238825;
335 q_points[3] = 0.2937499039716641;
336 q_points[4] = 0.4466318819056009;
337 q_points[5] = 0.6054816627755208;
338 q_points[6] = 0.7541101371585467;
339 q_points[7] = 0.877265828834263;
340 q_points[8] = 0.96225055941096;
344 q_points[0] = 0.00904263096219963;
345 q_points[1] = 0.05397126622250072;
346 q_points[2] = 0.1353118246392511;
347 q_points[3] = 0.2470524162871565;
348 q_points[4] = 0.3802125396092744;
349 q_points[5] = 0.5237923179723384;
350 q_points[6] = 0.6657752055148032;
351 q_points[7] = 0.7941904160147613;
352 q_points[8] = 0.898161091216429;
353 q_points[9] = 0.9688479887196;
358 q_points[0] = 0.007643941174637681;
359 q_points[1] = 0.04554182825657903;
360 q_points[2] = 0.1145222974551244;
361 q_points[3] = 0.2103785812270227;
362 q_points[4] = 0.3266955532217897;
363 q_points[5] = 0.4554532469286375;
364 q_points[6] = 0.5876483563573721;
365 q_points[7] = 0.7139638500230458;
366 q_points[8] = 0.825453217777127;
367 q_points[9] = 0.914193921640008;
368 q_points[10] = 0.973860256264123;
372 q_points[0] = 0.006548722279080035;
373 q_points[1] = 0.03894680956045022;
374 q_points[2] = 0.0981502631060046;
375 q_points[3] = 0.1811385815906331;
376 q_points[4] = 0.2832200676673157;
377 q_points[5] = 0.398434435164983;
378 q_points[6] = 0.5199526267791299;
379 q_points[7] = 0.6405109167754819;
380 q_points[8] = 0.7528650118926111;
381 q_points[9] = 0.850240024421055;
382 q_points[10] = 0.926749682988251;
383 q_points[11] = 0.977756129778486;
399 std::vector<double> quadrature_weights(n);
404 quadrature_weights[0] = -1.0;
407 quadrature_weights[0] = -0.7185393190303845;
408 quadrature_weights[1] = -0.2814606809696154;
412 quadrature_weights[0] = -0.5134045522323634;
413 quadrature_weights[1] = -0.3919800412014877;
414 quadrature_weights[2] = -0.0946154065661483;
418 quadrature_weights[0] = -0.3834640681451353;
419 quadrature_weights[1] = -0.3868753177747627;
420 quadrature_weights[2] = -0.1904351269501432;
421 quadrature_weights[3] = -0.03922548712995894;
425 quadrature_weights[0] = -0.2978934717828955;
426 quadrature_weights[1] = -0.3497762265132236;
427 quadrature_weights[2] = -0.234488290044052;
428 quadrature_weights[3] = -0.0989304595166356;
429 quadrature_weights[4] = -0.01891155214319462;
433 quadrature_weights[0] = -0.2387636625785478;
434 quadrature_weights[1] = -0.3082865732739458;
435 quadrature_weights[2] = -0.2453174265632108;
436 quadrature_weights[3] = -0.1420087565664786;
437 quadrature_weights[4] = -0.05545462232488041;
438 quadrature_weights[5] = -0.01016895869293513;
443 quadrature_weights[0] = -0.1961693894252476;
444 quadrature_weights[1] = -0.2703026442472726;
445 quadrature_weights[2] = -0.239681873007687;
446 quadrature_weights[3] = -0.1657757748104267;
447 quadrature_weights[4] = -0.0889432271377365;
448 quadrature_weights[5] = -0.03319430435645653;
449 quadrature_weights[6] = -0.005932787015162054;
453 quadrature_weights[0] = -0.164416604728002;
454 quadrature_weights[1] = -0.2375256100233057;
455 quadrature_weights[2] = -0.2268419844319134;
456 quadrature_weights[3] = -0.1757540790060772;
457 quadrature_weights[4] = -0.1129240302467932;
458 quadrature_weights[5] = -0.05787221071771947;
459 quadrature_weights[6] = -0.02097907374214317;
460 quadrature_weights[7] = -0.003686407104036044;
464 quadrature_weights[0] = -0.1400684387481339;
465 quadrature_weights[1] = -0.2097722052010308;
466 quadrature_weights[2] = -0.211427149896601;
467 quadrature_weights[3] = -0.1771562339380667;
468 quadrature_weights[4] = -0.1277992280331758;
469 quadrature_weights[5] = -0.07847890261203835;
470 quadrature_weights[6] = -0.0390225049841783;
471 quadrature_weights[7] = -0.01386729555074604;
472 quadrature_weights[8] = -0.002408041036090773;
476 quadrature_weights[0] = -0.12095513195457;
477 quadrature_weights[1] = -0.1863635425640733;
478 quadrature_weights[2] = -0.1956608732777627;
479 quadrature_weights[3] = -0.1735771421828997;
480 quadrature_weights[4] = -0.135695672995467;
481 quadrature_weights[5] = -0.0936467585378491;
482 quadrature_weights[6] = -0.05578772735275126;
483 quadrature_weights[7] = -0.02715981089692378;
484 quadrature_weights[8] = -0.00951518260454442;
485 quadrature_weights[9] = -0.001638157633217673;
490 quadrature_weights[0] = -0.1056522560990997;
491 quadrature_weights[1] = -0.1665716806006314;
492 quadrature_weights[2] = -0.1805632182877528;
493 quadrature_weights[3] = -0.1672787367737502;
494 quadrature_weights[4] = -0.1386970574017174;
495 quadrature_weights[5] = -0.1038334333650771;
496 quadrature_weights[6] = -0.06953669788988512;
497 quadrature_weights[7] = -0.04054160079499477;
498 quadrature_weights[8] = -0.01943540249522013;
499 quadrature_weights[9] = -0.006737429326043388;
500 quadrature_weights[10] = -0.001152486965101561;
504 quadrature_weights[0] = -0.09319269144393;
505 quadrature_weights[1] = -0.1497518275763289;
506 quadrature_weights[2] = -0.166557454364573;
507 quadrature_weights[3] = -0.1596335594369941;
508 quadrature_weights[4] = -0.1384248318647479;
509 quadrature_weights[5] = -0.1100165706360573;
510 quadrature_weights[6] = -0.07996182177673273;
511 quadrature_weights[7] = -0.0524069547809709;
512 quadrature_weights[8] = -0.03007108900074863;
513 quadrature_weights[9] = -0.01424924540252916;
514 quadrature_weights[10] = -0.004899924710875609;
515 quadrature_weights[11] = -0.000834029009809656;
523 return quadrature_weights;
531 const bool factor_out_singularity)
533 ((origin[0] == 0) || (origin[0] == 1)) ? (alpha == 1 ? n : 2 * n) : 4 * n)
534 , fraction(((origin[0] == 0) || (origin[0] == 1.)) ? 1. : origin[0])
559 unsigned int ns_offset = (
fraction == 1) ? n : 2 * n;
561 for (
unsigned int i = 0, j = ns_offset; i < n; ++i, ++j)
569 if ((alpha != 1) || (
fraction != 1))
589 if (factor_out_singularity ==
true)
590 for (
unsigned int i = 0; i <
size(); ++i)
595 "The singularity cannot be on a Gauss point of the same order!"));
598 Assert(denominator != 0.0,
600 "The quadrature formula you are using does not allow to "
601 "factor out the singularity, which is zero at one point."));
602 this->
weights[i] /= denominator;
611 const double eps = 1
e-8;
615 [
eps](
double coord) {
616 return std::abs(coord) < eps || std::abs(coord - 1.) < eps;
618 const bool on_vertex =
632 const bool factor_out_singularity)
641 std::vector<QGaussOneOverR<2>> quads;
642 std::vector<Point<2>> origins;
645 quads.emplace_back(n, 3, factor_out_singularity);
646 quads.emplace_back(n, 2, factor_out_singularity);
647 quads.emplace_back(n, 1, factor_out_singularity);
648 quads.emplace_back(n, 0, factor_out_singularity);
650 origins.emplace_back(0., 0.);
651 origins.emplace_back(singularity[0], 0.);
652 origins.emplace_back(0., singularity[1]);
653 origins.push_back(singularity);
658 unsigned int q_id = 0;
661 for (
unsigned int box = 0; box < 4; ++box)
665 double area = dist[0] * dist[1];
667 for (
unsigned int q = 0; q < quads[box].size(); ++q, ++q_id)
669 const Point<2> &qp = quads[box].point(q);
671 origins[box] +
Point<2>(dist[0] * qp[0], dist[1] * qp[1]);
672 this->
weights[q_id] = quads[box].weight(q) * area;
680 const unsigned int vertex_index,
681 const bool factor_out_singularity)
717 std::vector<double> & ws = this->
weights;
720 for (
unsigned int q = 0; q < gauss.
size(); ++q)
724 ps[q][1] = gp[0] *
std::tan(pi4 * gp[1]);
726 if (factor_out_singularity)
730 ws[gauss.
size() + q] = ws[q];
731 ps[gauss.
size() + q][0] = ps[q][1];
732 ps[gauss.
size() + q][1] = ps[q][0];
737 switch (vertex_index)
757 if (vertex_index != 0)
758 for (
unsigned int q = 0; q <
size(); ++q)
760 double x = ps[q][0] - .5, y = ps[q][1] - .5;
762 ps[q][0] = R00 * x + R01 * y + .5;
763 ps[q][1] = R10 * x + R11 * y + .5;
772 std::vector<unsigned int> permutation(quad.
size());
773 for (
unsigned int i = 0; i < quad.
size(); ++i)
776 std::sort(permutation.begin(),
778 [
this](
const unsigned int x,
const unsigned int y) {
779 return this->compare_weights(x, y);
789 for (
unsigned int i = 0; i < quad.
size(); ++i)
793 if (permutation[i] != i)
803 return (this->weights[a] < this->weights[
b]);
889 const double eta_bar = singularity[0] * 2. - 1.;
890 const double eta_star = eta_bar * eta_bar - 1.;
894 std::vector<double> weights_dummy(
weights.size());
895 unsigned int cont = 0;
896 const double tol = 1
e-10;
914 weights.resize(weights_dummy.size() - 1);
931 gamma_bar = (eta_bar * eta_star +
std::abs(eta_star)) /
935 (eta_bar * eta_star -
std::abs(eta_star)) /
945 gamma_bar * (gamma_bar * gamma_bar + 3)) /
946 (1 + 3 * gamma_bar * gamma_bar);
948 double J = 3 * ((
gamma - gamma_bar) * (
gamma - gamma_bar)) /
949 (1 + 3 * gamma_bar * gamma_bar);
966 std::vector<double> points(n);
968 for (
unsigned short i = 0; i < n; ++i)
975 (1. +
double(2 * i + 1) /
double(2 * (n - 1) + 2))));
988 std::vector<double> weights(n);
990 for (
unsigned short i = 0; i < n; ++i)
1006 Assert(n > 0,
ExcMessage(
"Need at least one point for the quadrature rule"));
1010 for (
unsigned int i = 0; i < this->
size(); ++i)
1033 std::vector<double> points(n);
1035 for (
unsigned short i = 0; i < n; ++i)
1041 case ::QGaussRadauChebyshev<1>::left:
1047 (1 + 2 *
double(i) / (2 *
double(n - 1) + 1.))));
1051 case ::QGaussRadauChebyshev<1>::right:
1056 (2 *
double(n - 1) + 1.))));
1064 "This constructor can only be called with either "
1065 "QGaussRadauChebyshev::left or QGaussRadauChebyshev::right as "
1066 "second argument."));
1079 std::vector<double> weights(n);
1081 for (
unsigned short i = 0; i < n; ++i)
1084 weights[i] = 2. *
numbers::PI / double(2 * (n - 1) + 1.);
1104 std::vector<double> p =
1106 std::vector<double>
w =
1109 for (
unsigned int i = 0; i < this->
size(); ++i)
1136 std::vector<double> points(n);
1138 for (
unsigned short i = 0; i < n; ++i)
1153 std::vector<double> weights(n);
1155 for (
unsigned short i = 0; i < n; ++i)
1159 if (i == 0 || i == (n - 1))
1176 "Need at least two points for Gauss-Lobatto quadrature rule"));
1177 std::vector<double> p =
1179 std::vector<double>
w =
1182 for (
unsigned int i = 0; i < this->
size(); ++i)
1200 std::vector<Point<dim>> qpoints;
1201 std::vector<double> weights;
1203 for (
unsigned int i = 0; i < quad.
size(); ++i)
1210 for (
int d = 0;
d < dim; ++
d)
1215 this->weights.push_back(quad.
weight(i));
1228 for (
unsigned int d = 0;
d < dim; ++
d)
1238 std::vector<Point<dim>> qp(this->size());
1239 std::vector<double>
w(this->size());
1241 for (
unsigned int i = 0; i < this->size(); ++i)
1244 w[i] = J * this->weight(i);
1259 for (
unsigned int i = 0; i < base.
size(); ++i)
1261 const auto &q = base.
point(i);
1262 const auto w = base.
weight(i);
1264 const auto xhat = q[0];
1265 const auto yhat = q[1];
1271 const double r = xhat / (st + ct);
1273 const double J = pi * xhat / (2 * (
std::sin(pi * yhat) + 1));
1296 for (
unsigned int i = 0; i < base.
size(); ++i)
1298 const auto &q = base.
point(i);
1299 const auto w = base.
weight(i);
1301 const auto xhat = q[0];
1302 const auto yhat = q[1];
1304 const double x =
std::pow(xhat, beta) * (1 - yhat);
1305 const double y =
std::pow(xhat, beta) * yhat;
1307 const double J = beta *
std::pow(xhat, 2. * beta - 1.);
1327 "The split point should be inside the unit reference cell."));
1329 std::array<Point<dim>, dim + 1>
vertices;
1337 for (
unsigned int start = 0; start < (dim > 2 ? 2 : 1); ++start)
1339 for (
unsigned int i = 0; i < dim; ++i)
1346 quad.get_points().begin(),
1347 quad.get_points().end());
1348 this->weights.insert(this->weights.end(),
1349 quad.get_weights().begin(),
1350 quad.get_weights().end());
1362 if (dim == 0 || dim == 1)
1364 const ::QGauss<dim> quad(n_points_1D);
1367 this->
weights = quad.get_weights();
1371 if (n_points_1D == 1)
1373 const double p = 1.0 / 3.0;
1375 this->
weights.emplace_back(0.5);
1377 else if (n_points_1D == 2)
1379 const double Q23 = 2.0 / 3.0;
1380 const double Q16 = 1.0 / 6.0;
1385 this->
weights.emplace_back(Q16);
1386 this->
weights.emplace_back(Q16);
1387 this->
weights.emplace_back(Q16);
1389 else if (n_points_1D == 3)
1391 const double q12 = 0.5;
1403 this->
weights.emplace_back(q12 * 0.225);
1404 this->
weights.emplace_back(q12 * 0.125939180545);
1405 this->
weights.emplace_back(q12 * 0.125939180545);
1406 this->
weights.emplace_back(q12 * 0.125939180545);
1407 this->
weights.emplace_back(q12 * 0.132394152789);
1408 this->
weights.emplace_back(q12 * 0.132394152789);
1409 this->
weights.emplace_back(q12 * 0.132394152789);
1411 else if (n_points_1D == 4)
1419 if (n_points_1D == 1)
1421 const double Q14 = 1.0 / 4.0;
1422 const double Q16 = 1.0 / 6.0;
1425 this->
weights.emplace_back(Q16);
1427 else if (n_points_1D == 2)
1429 const double Q124 = 1.0 / 6.0 / 4.0;
1431 const double palpha = (5.0 + 3.0 *
sqrt(5.0)) / 20.0;
1432 const double pbeta = (5.0 -
sqrt(5.0)) / 20.0;
1437 this->
weights.emplace_back(Q124);
1438 this->
weights.emplace_back(Q124);
1439 this->
weights.emplace_back(Q124);
1440 this->
weights.emplace_back(Q124);
1442 else if (n_points_1D == 3)
1444 const double Q16 = 1.0 / 6.0;
1447 this->
quadrature_points.emplace_back(0.5684305841968444, 0.1438564719343852, 0.1438564719343852);
1448 this->
quadrature_points.emplace_back(0.1438564719343852, 0.1438564719343852, 0.1438564719343852);
1449 this->
quadrature_points.emplace_back(0.1438564719343852, 0.1438564719343852, 0.5684305841968444);
1450 this->
quadrature_points.emplace_back(0.1438564719343852, 0.5684305841968444, 0.1438564719343852);
1451 this->
quadrature_points.emplace_back(0.0000000000000000, 0.5000000000000000, 0.5000000000000000);
1452 this->
quadrature_points.emplace_back(0.5000000000000000, 0.0000000000000000, 0.5000000000000000);
1453 this->
quadrature_points.emplace_back(0.5000000000000000, 0.5000000000000000, 0.0000000000000000);
1454 this->
quadrature_points.emplace_back(0.5000000000000000, 0.0000000000000000, 0.0000000000000000);
1455 this->
quadrature_points.emplace_back(0.0000000000000000, 0.5000000000000000, 0.0000000000000000);
1456 this->
quadrature_points.emplace_back(0.0000000000000000, 0.0000000000000000, 0.5000000000000000);
1459 this->
weights.emplace_back(0.2177650698804054 * Q16);
1460 this->
weights.emplace_back(0.2177650698804054 * Q16);
1461 this->
weights.emplace_back(0.2177650698804054 * Q16);
1462 this->
weights.emplace_back(0.2177650698804054 * Q16);
1463 this->
weights.emplace_back(0.0214899534130631 * Q16);
1464 this->
weights.emplace_back(0.0214899534130631 * Q16);
1465 this->
weights.emplace_back(0.0214899534130631 * Q16);
1466 this->
weights.emplace_back(0.0214899534130631 * Q16);
1467 this->
weights.emplace_back(0.0214899534130631 * Q16);
1468 this->
weights.emplace_back(0.0214899534130631 * Q16);
1470 else if (n_points_1D == 4)
1480 "QGaussSimplex is currently only implemented for "
1481 "n_points_1D = 1, 2, 3, and 4 while you are asking for "
1488 template <std::
size_t b_dim>
1489 std::vector<std::array<double, b_dim>>
1490 all_permutations(
const std::array<double, b_dim> &b_point)
1492 std::vector<std::array<double, b_dim>> output;
1497 std::array<double, b_dim> temp = b_point;
1498 std::sort(temp.begin(), temp.end());
1501 output.push_back(temp);
1503 while (std::next_permutation(temp.begin(), temp.end()));
1513 const unsigned int n_points_1D)
1525 std::array<double, dim + 1> centroid;
1526 std::fill(centroid.begin(), centroid.end(), 1.0 / (dim + 1.0));
1527 std::vector<std::vector<std::array<double, dim + 1>>> b_point_permutations;
1528 std::vector<double> b_weights;
1537 auto process_point_1 = [&](
const double a,
const double w) {
1538 const double b = 1.0 - dim * a;
1539 std::array<double, dim + 1> b_point;
1540 std::fill(b_point.begin(), b_point.begin() + dim, a);
1543 b_weights.push_back(
w);
1544 b_point_permutations.push_back(all_permutations(b_point));
1548 auto process_point_2 = [&](
const double a,
const double w) {
1550 const double b = (1.0 - 2.0 * a) / 2.0;
1551 std::array<double, dim + 1> b_point;
1552 std::fill(b_point.begin(), b_point.begin() + dim - 1, a);
1553 b_point[dim - 1] =
b;
1556 b_weights.push_back(
w);
1557 b_point_permutations.push_back(all_permutations(b_point));
1562 auto process_point_3 = [&](
const double a,
const double b,
const double w) {
1563 const double c = 1.0 - (dim - 1.0) * a -
b;
1564 std::array<double, dim + 1> b_point;
1565 std::fill(b_point.begin(), b_point.begin() + dim - 1, a);
1566 b_point[dim - 1] =
b;
1569 b_weights.push_back(
w);
1570 b_point_permutations.push_back(all_permutations(b_point));
1573 if (n_points_1D == 1)
1575 b_point_permutations.push_back({centroid});
1576 b_weights.push_back(1.0);
1578 else if (n_points_1D == 2)
1583 process_point_1(9.1576213509770743e-02, 1.0995174365532187e-01);
1584 process_point_1(4.4594849091596489e-01, 2.2338158967801147e-01);
1588 process_point_1(3.281633025163817e-01, 1.362178425370874e-01);
1589 process_point_1(1.080472498984286e-01, 1.137821574629126e-01);
1592 else if (n_points_1D == 3)
1597 b_weights.push_back(0.225);
1598 b_point_permutations.push_back({centroid});
1600 process_point_1(1.0128650732345634e-01, 1.2593918054482714e-01);
1601 process_point_1(4.7014206410511511e-01, 1.3239415278850619e-01);
1605 process_point_1(3.108859192633006e-01, 1.126879257180159e-01);
1606 process_point_1(9.273525031089125e-02, 7.349304311636196e-02);
1608 process_point_2(4.550370412564964e-02, 4.254602077708147e-02);
1611 else if (n_points_1D == 4)
1616 process_point_1(3.3730648554587850e-02, 1.6545050110792131e-02);
1617 process_point_1(4.7430969250471822e-01, 7.7086646185986069e-02);
1618 process_point_1(2.4157738259540357e-01, 1.2794417123015558e-01);
1619 process_point_3(4.7036644652595216e-02,
1620 1.9868331479735168e-01,
1621 5.5878732903199779e-02);
1625 b_point_permutations.push_back({centroid});
1626 b_weights.push_back(9.548528946413085e-02);
1628 process_point_1(3.157011497782028e-01, 4.232958120996703e-02);
1629 process_point_2(5.048982259839635e-02, 3.189692783285758e-02);
1631 process_point_3(1.888338310260010e-01,
1632 5.751716375870000e-01,
1633 3.720713072833462e-02);
1634 process_point_3(2.126547254148314e-02,
1635 8.108302410985486e-01,
1636 8.110770829903342e-03);
1639 else if (n_points_1D == 5)
1644 b_point_permutations.push_back({centroid});
1645 b_weights.push_back(9.7135796282798836e-02);
1647 process_point_1(4.4729513394452691e-02, 2.5577675658698031e-02);
1648 process_point_1(4.8968251919873762e-01, 3.1334700227139071e-02);
1649 process_point_1(4.3708959149293664e-01, 7.7827541004774278e-02);
1650 process_point_1(1.8820353561903275e-01, 7.9647738927210249e-02);
1652 process_point_3(3.6838412054736258e-02,
1653 2.2196298916076568e-01,
1654 4.3283539377289376e-02);
1658 b_point_permutations.push_back({centroid});
1659 b_weights.push_back(5.801054891248025e-02);
1661 process_point_1(6.198169755222693e-10, 6.431928175925639e-05);
1662 process_point_1(1.607745353952616e-01, 2.317333846242546e-02);
1663 process_point_1(3.222765218214210e-01, 2.956291233542929e-02);
1664 process_point_1(4.510891834541358e-02, 8.063979979616182e-03);
1666 process_point_2(1.122965460043761e-01, 3.813408010370246e-02);
1668 process_point_3(4.588714487524592e-01,
1669 2.554579233041310e-03,
1670 8.384422198298552e-03);
1671 process_point_3(3.377587068533860e-02,
1672 7.183503264420745e-01,
1673 1.023455935274533e-02);
1674 process_point_3(1.836413698099279e-01,
1675 3.441591057817528e-02,
1676 2.052491596798814e-02);
1679 else if (n_points_1D == 6)
1684 b_point_permutations.push_back({centroid});
1685 b_weights.push_back(8.5761179732224219e-02);
1687 process_point_1(2.8485417614371900e-02, 1.0431870512894697e-02);
1688 process_point_1(4.9589190096589092e-01, 1.6606273054585369e-02);
1689 process_point_1(1.0263548271224643e-01, 3.8630759237019321e-02);
1690 process_point_1(4.3846592676435220e-01, 6.7316154079468296e-02);
1691 process_point_1(2.1021995670317828e-01, 7.0515684111716576e-02);
1693 process_point_3(7.3254276860644785e-03,
1694 1.4932478865208237e-01,
1695 1.0290289572953278e-02);
1696 process_point_3(4.6010500165429957e-02,
1697 2.8958112563770588e-01,
1698 4.0332476640500554e-02);
1711 for (
unsigned int permutation_n = 0; permutation_n < b_weights.size();
1714 for (
const std::array<double, dim + 1> &b_point :
1715 b_point_permutations[permutation_n])
1717 const double volume = (dim == 2 ? 1.0 / 2.0 : 1.0 / 6.0);
1718 this->
weights.emplace_back(volume * b_weights[permutation_n]);
1721 b_point.begin() + dim,
1739 for (
unsigned int i = 0; i < quad_line.
size(); ++i)
1740 for (
unsigned int j = 0; j < quad_tri.
size(); ++j)
1743 quad_tri.
point(j)[1],
1744 quad_line.
point(i)[0]);
1761 if (n_points_1D == 1)
1763 const double Q14 = 1.0 / 4.0;
1764 const double Q43 = 4.0 / 3.0;
1767 this->
weights.emplace_back(Q43);
1769 else if (n_points_1D == 2)
1772 this->
quadrature_points.emplace_back(-0.26318405556971, -0.26318405556971, 0.54415184401122);
1773 this->
quadrature_points.emplace_back(-0.50661630334979, -0.50661630334979, 0.12251482265544);
1774 this->
quadrature_points.emplace_back(-0.26318405556971, +0.26318405556971, 0.54415184401122);
1775 this->
quadrature_points.emplace_back(-0.50661630334979, +0.50661630334979, 0.12251482265544);
1776 this->
quadrature_points.emplace_back(+0.26318405556971, -0.26318405556971, 0.54415184401122);
1777 this->
quadrature_points.emplace_back(+0.50661630334979, -0.50661630334979, 0.12251482265544);
1778 this->
quadrature_points.emplace_back(+0.26318405556971, +0.26318405556971, 0.54415184401122);
1779 this->
quadrature_points.emplace_back(+0.50661630334979, +0.50661630334979, 0.12251482265544);
1782 this->
weights.emplace_back(0.10078588207983);
1783 this->
weights.emplace_back(0.23254745125351);
1784 this->
weights.emplace_back(0.10078588207983);
1785 this->
weights.emplace_back(0.23254745125351);
1786 this->
weights.emplace_back(0.10078588207983);
1787 this->
weights.emplace_back(0.23254745125351);
1788 this->
weights.emplace_back(0.10078588207983);
1789 this->
weights.emplace_back(0.23254745125351);
QDuffy(const Quadrature< 1 > &radial_quadrature, const Quadrature< 1 > &angular_quadrature, const double beta=1.0)
QGaussChebyshev(const unsigned int n)
Generate a formula with n quadrature points.
QGaussLobattoChebyshev(const unsigned int n)
Generate a formula with n quadrature points.
QGaussLobatto(const unsigned int n)
QGaussLogR(const unsigned int n, const Point< dim > &x0=Point< dim >(), const double alpha=1, const bool factor_out_singular_weight=false)
QGaussLog(const unsigned int n, const bool revert=false)
static std::vector< double > get_quadrature_points(const unsigned int n)
static std::vector< double > get_quadrature_weights(const unsigned int n)
QGaussOneOverR(const unsigned int n, const Point< dim > &singularity, const bool factor_out_singular_weight=false)
static unsigned int quad_size(const Point< dim > &singularity, const unsigned int n)
QGaussPyramid(const unsigned int n_points_1D)
QGaussRadauChebyshev(const unsigned int n, EndPoint ep=QGaussRadauChebyshev::left)
Generate a formula with n quadrature points.
QGaussSimplex(const unsigned int n_points_1D)
QGaussWedge(const unsigned int n_points_1D)
QGauss(const unsigned int n)
QSimplex(const Quadrature< dim > &quad)
Quadrature< dim > compute_affine_transformation(const std::array< Point< dim >, dim+1 > &vertices) const
QSorted(const Quadrature< dim > &quad)
bool compare_weights(const unsigned int a, const unsigned int b) const
QSplit(const QSimplex< dim > &base, const Point< dim > &split_point)
QTelles(const Quadrature< 1 > &base_quad, const Point< dim > &singularity)
QTrianglePolar(const Quadrature< 1 > &radial_quadrature, const Quadrature< 1 > &angular_quadrature)
QWitherdenVincentSimplex(const unsigned int n_points_1D)
std::vector< Point< dim > > quadrature_points
Quadrature & operator=(const Quadrature< dim > &)
const Point< dim > & point(const unsigned int i) const
bool is_tensor_product_flag
double weight(const unsigned int i) const
std::vector< double > weights
unsigned int size() const
constexpr Number determinant(const SymmetricTensor< 2, dim, Number > &t)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
double norm(const FEValuesBase< dim > &fe, const ArrayView< const std::vector< Tensor< 1, dim > > > &Du)
Point< spacedim > point(const gp_Pnt &p, const double tolerance=1e-10)
void quadrature_points(const Triangulation< dim, spacedim > &triangulation, const Quadrature< dim > &quadrature, const std::vector< std::vector< BoundingBox< spacedim > > > &global_bounding_boxes, ParticleHandler< dim, spacedim > &particle_handler, const Mapping< dim, spacedim > &mapping=(ReferenceCells::get_hypercube< dim >() .template get_default_linear_mapping< dim, spacedim >()), const std::vector< std::vector< double > > &properties={})
Tensor< 2, dim, Number > w(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
SymmetricTensor< 2, dim, Number > b(const Tensor< 2, dim, Number > &F)
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
Number jacobi_polynomial_value(const unsigned int degree, const int alpha, const int beta, const Number x)
std::string to_string(const number value, const unsigned int digits=numbers::invalid_unsigned_int)
std::vector< double > get_quadrature_weights(const unsigned int n)
std::vector< double > get_quadrature_points(const unsigned int n)
std::vector< double > get_quadrature_points(const unsigned int n)
std::vector< double > get_quadrature_weights(const unsigned int n)
std::vector< long double > compute_quadrature_weights(const std::vector< long double > &x, const int alpha, const int beta)
long double gamma(const unsigned int n)
std::vector< double > get_quadrature_points(const unsigned int n, ::QGaussRadauChebyshev< 1 >::EndPoint ep)
std::vector< double > get_quadrature_weights(const unsigned int n, ::QGaussRadauChebyshev< 1 >::EndPoint ep)
void split_point(const Point< dim1+dim2 > &source, Point< dim1 > &p1, Point< dim2 > &p2)
void copy(const T *begin, const T *end, U *dest)
static constexpr double PI_2
static constexpr double PI
::VectorizedArray< Number, width > log(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > tan(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > cos(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sin(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sqrt(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > pow(const ::VectorizedArray< Number, width > &, const Number p)
::VectorizedArray< Number, width > abs(const ::VectorizedArray< Number, width > &)
static Point< dim > unit_cell_vertex(const unsigned int vertex)