LCOV - code coverage report
Current view: top level - src/quadrature - quadrature_monomial_2D.C (source / functions) Hit Total Coverage
Test: libMesh/libmesh: #4229 (6a9aeb) with base 727f46 Lines: 93 93 100.0 %
Date: 2025-08-19 19:27:09 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

          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             : // Local includes
      21             : #include "libmesh/quadrature_monomial.h"
      22             : #include "libmesh/quadrature_gauss.h"
      23             : 
      24             : namespace libMesh
      25             : {
      26             : 
      27             : 
      28        2414 : void QMonomial::init_2D()
      29             : {
      30             : 
      31        2414 :   switch (_type)
      32             :     {
      33             :       //---------------------------------------------
      34             :       // Quadrilateral quadrature rules
      35        1207 :     case QUAD4:
      36             :     case QUADSHELL4:
      37             :     case QUAD8:
      38             :     case QUADSHELL8:
      39             :     case QUAD9:
      40             :     case QUADSHELL9:
      41             :       {
      42          68 :         switch(get_order())
      43             :           {
      44          71 :           case SECOND:
      45             :             {
      46             :               // A degree=2 rule for the QUAD with 3 points.
      47             :               // A tensor product degree-2 Gauss would have 4 points.
      48             :               // This rule (or a variation on it) is probably available in
      49             :               //
      50             :               // A.H. Stroud, Approximate calculation of multiple integrals,
      51             :               // Prentice-Hall, Englewood Cliffs, N.J., 1971.
      52             :               //
      53             :               // though I have never actually seen a reference for it.
      54             :               // Luckily it's fairly easy to derive, which is what I've done
      55             :               // here [JWP].
      56             :               const Real
      57           2 :                 s=std::sqrt(Real(1)/3), // ~0.57735026919
      58           2 :                 t=std::sqrt(Real(2)/3); // ~0.81649658092
      59             : 
      60          71 :               const Real data[2][3] =
      61             :                 {
      62             :                   {0.0,  s,  2.0},
      63             :                   {  t, -s,  1.0}
      64             :                 };
      65             : 
      66          71 :               _points.resize(3);
      67          71 :               _weights.resize(3);
      68             : 
      69          71 :               wissmann_rule(data, 2);
      70             : 
      71           2 :               return;
      72             :             } // end case SECOND
      73             : 
      74             : 
      75             : 
      76             :             // For third-order, fall through to default case, use 2x2 Gauss product rule.
      77             :             // case THIRD:
      78             :             //   {
      79             :             //   }  // end case THIRD
      80             : 
      81             :             // Tabulated-in-double-precision rules aren't accurate enough for
      82             :             // higher precision, so fall back on Gauss
      83             : #if !defined(LIBMESH_DEFAULT_TRIPLE_PRECISION) && !defined(LIBMESH_DEFAULT_QUADRUPLE_PRECISION)
      84          71 :           case FOURTH:
      85             :             {
      86             :               // A pair of degree=4 rules for the QUAD "C2" due to
      87             :               // Wissmann and Becker. These rules both have six points.
      88             :               // A tensor product degree-4 Gauss would have 9 points.
      89             :               //
      90             :               // J. W. Wissmann and T. Becker, Partially symmetric cubature
      91             :               // formulas for even degrees of exactness, SIAM J. Numer. Anal.  23
      92             :               // (1986), 676--685.
      93          71 :               const Real data[4][3] =
      94             :                 {
      95             :                   // First of 2 degree-4 rules given by Wissmann
      96             :                   {Real(0.0000000000000000e+00),  Real(0.0000000000000000e+00),  Real(1.1428571428571428e+00)},
      97             :                   {Real(0.0000000000000000e+00),  Real(9.6609178307929590e-01),  Real(4.3956043956043956e-01)},
      98             :                   {Real(8.5191465330460049e-01),  Real(4.5560372783619284e-01),  Real(5.6607220700753210e-01)},
      99             :                   {Real(6.3091278897675402e-01), Real(-7.3162995157313452e-01),  Real(6.4271900178367668e-01)}
     100             :                   //
     101             :                   // Second of 2 degree-4 rules given by Wissmann.  These both
     102             :                   // yield 4th-order accurate rules, I just chose the one that
     103             :                   // happened to contain the origin.
     104             :                   // {0.000000000000000, -0.356822089773090,  1.286412084888852},
     105             :                   // {0.000000000000000,  0.934172358962716,  0.491365692888926},
     106             :                   // {0.774596669241483,  0.390885162530071,  0.761883709085613},
     107             :                   // {0.774596669241483, -0.852765377881771,  0.349227402025498}
     108             :                 };
     109             : 
     110          71 :               _points.resize(6);
     111          71 :               _weights.resize(6);
     112             : 
     113          71 :               wissmann_rule(data, 4);
     114             : 
     115           2 :               return;
     116             :             } // end case FOURTH
     117             : #endif
     118             : 
     119             : 
     120             : 
     121             : 
     122          71 :           case FIFTH:
     123             :             {
     124             :               // A degree 5, 7-point rule due to Stroud.
     125             :               //
     126             :               // A.H. Stroud, Approximate calculation of multiple integrals,
     127             :               // Prentice-Hall, Englewood Cliffs, N.J., 1971.
     128             :               //
     129             :               // This rule is provably minimal in the number of points.
     130             :               // A tensor-product rule accurate for "bi-quintic" polynomials would have 9 points.
     131             :               //              0,              0, ~1.14285714286
     132             :               //              0, ~0.96609178307, ~0.31746031746
     133             :               // ~0.77459666924, ~0.57735026919, ~0.55555555555
     134          71 :               const Real data[3][3] =
     135             :                 {
     136             :                   {                   0,                      0, Real(8)/7  }, // 1
     137             :                   {                   0, std::sqrt(Real(14)/15), Real(20)/63}, // 2
     138             :                   {std::sqrt(Real(3)/5),   std::sqrt(Real(1)/3), Real(20)/36}  // 4
     139             :                 };
     140             : 
     141          71 :               const unsigned int symmetry[3] = {
     142             :                 0, // Origin
     143             :                 7, // Central Symmetry
     144             :                 6  // Rectangular
     145             :               };
     146             : 
     147          71 :               _points.resize (7);
     148          71 :               _weights.resize(7);
     149             : 
     150          71 :               stroud_rule(data, symmetry, 3);
     151             : 
     152           2 :               return;
     153             :             } // end case FIFTH
     154             : 
     155             : 
     156             : 
     157             : 
     158             :             // Tabulated-in-double-precision rules aren't accurate enough for
     159             :             // higher precision, so fall back on Gauss
     160             : #if !defined(LIBMESH_DEFAULT_TRIPLE_PRECISION) && !defined(LIBMESH_DEFAULT_QUADRUPLE_PRECISION)
     161          71 :           case SIXTH:
     162             :             {
     163             :               // A pair of degree=6 rules for the QUAD "C2" due to
     164             :               // Wissmann and Becker. These rules both have 10 points.
     165             :               // A tensor product degree-6 Gauss would have 16 points.
     166             :               //
     167             :               // J. W. Wissmann and T. Becker, Partially symmetric cubature
     168             :               // formulas for even degrees of exactness, SIAM J. Numer. Anal.  23
     169             :               // (1986), 676--685.
     170          71 :               const Real data[6][3] =
     171             :                 {
     172             :                   // First of 2 degree-6, 10 point rules given by Wissmann
     173             :                   // {0.000000000000000,  0.836405633697626,  0.455343245714174},
     174             :                   // {0.000000000000000, -0.357460165391307,  0.827395973202966},
     175             :                   // {0.888764014654765,  0.872101531193131,  0.144000884599645},
     176             :                   // {0.604857639464685,  0.305985162155427,  0.668259104262665},
     177             :                   // {0.955447506641064, -0.410270899466658,  0.225474004890679},
     178             :                   // {0.565459993438754, -0.872869311156879,  0.320896396788441}
     179             :                   //
     180             :                   // Second of 2 degree-6, 10 point rules given by Wissmann.
     181             :                   // Either of these will work, I just chose the one with points
     182             :                   // slightly further into the element interior.
     183             :                   {Real(0.0000000000000000e+00),  Real(8.6983337525005900e-01),  Real(3.9275059096434794e-01)},
     184             :                   {Real(0.0000000000000000e+00), Real(-4.7940635161211124e-01),  Real(7.5476288124261053e-01)},
     185             :                   {Real(8.6374282634615388e-01),  Real(8.0283751620765670e-01),  Real(2.0616605058827902e-01)},
     186             :                   {Real(5.1869052139258234e-01),  Real(2.6214366550805818e-01),  Real(6.8999213848986375e-01)},
     187             :                   {Real(9.3397254497284950e-01), Real(-3.6309658314806653e-01),  Real(2.6051748873231697e-01)},
     188             :                   {Real(6.0897753601635630e-01), Real(-8.9660863276245265e-01),  Real(2.6956758608606100e-01)}
     189             :                 };
     190             : 
     191          71 :               _points.resize(10);
     192          71 :               _weights.resize(10);
     193             : 
     194          71 :               wissmann_rule(data, 6);
     195             : 
     196           2 :               return;
     197             :             } // end case SIXTH
     198             : #endif
     199             : 
     200             : 
     201             : 
     202             : 
     203          71 :           case SEVENTH:
     204             :             {
     205             :               // A degree 7, 12-point rule due to Tyler, can be found in Stroud's book
     206             :               //
     207             :               // A.H. Stroud, Approximate calculation of multiple integrals,
     208             :               // Prentice-Hall, Englewood Cliffs, N.J., 1971.
     209             :               //
     210             :               // This rule is fully-symmetric and provably minimal in the number of points.
     211             :               // A tensor-product rule accurate for "bi-septic" polynomials would have 16 points.
     212             :               const Real
     213           2 :                 r  = std::sqrt(Real(6)/7),                                    // ~0.92582009977
     214           2 :                 s  = std::sqrt( (Real(114) - 3*std::sqrt(Real(583))) / 287 ), // ~0.38055443320
     215           2 :                 t  = std::sqrt( (Real(114) + 3*std::sqrt(Real(583))) / 287 ), // ~0.80597978291
     216           2 :                 B1 = Real(196)/810,                                           // ~0.24197530864
     217           2 :                 B2 = 4 * (178981 + 2769*std::sqrt(Real(583))) / 1888920,      // ~0.52059291666
     218           2 :                 B3 = 4 * (178981 - 2769*std::sqrt(Real(583))) / 1888920;      // ~0.23743177469
     219             : 
     220          71 :               const Real data[3][3] =
     221             :                 {
     222             :                   {r, 0.0, B1}, // 4
     223             :                   {s, 0.0, B2}, // 4
     224             :                   {t, 0.0, B3}  // 4
     225             :                 };
     226             : 
     227          71 :               const unsigned int symmetry[3] = {
     228             :                 3, // Full Symmetry, (x,0)
     229             :                 2, // Full Symmetry, (x,x)
     230             :                 2  // Full Symmetry, (x,x)
     231             :               };
     232             : 
     233          71 :               _points.resize (12);
     234          71 :               _weights.resize(12);
     235             : 
     236          71 :               stroud_rule(data, symmetry, 3);
     237             : 
     238           2 :               return;
     239             :             } // end case SEVENTH
     240             : 
     241             : 
     242             : 
     243             : 
     244             :             // Tabulated-in-double-precision rules aren't accurate enough for
     245             :             // higher precision, so fall back on Gauss
     246             : #if !defined(LIBMESH_DEFAULT_TRIPLE_PRECISION) && !defined(LIBMESH_DEFAULT_QUADRUPLE_PRECISION)
     247          71 :           case EIGHTH:
     248             :             {
     249             :               // A pair of degree=8 rules for the QUAD "C2" due to
     250             :               // Wissmann and Becker. These rules both have 16 points.
     251             :               // A tensor product degree-6 Gauss would have 25 points.
     252             :               //
     253             :               // J. W. Wissmann and T. Becker, Partially symmetric cubature
     254             :               // formulas for even degrees of exactness, SIAM J. Numer. Anal.  23
     255             :               // (1986), 676--685.
     256          71 :               const Real data[10][3] =
     257             :                 {
     258             :                   // First of 2 degree-8, 16 point rules given by Wissmann
     259             :                   // {0.000000000000000,  0.000000000000000,  0.055364705621440},
     260             :                   // {0.000000000000000,  0.757629177660505,  0.404389368726076},
     261             :                   // {0.000000000000000, -0.236871842255702,  0.533546604952635},
     262             :                   // {0.000000000000000, -0.989717929044527,  0.117054188786739},
     263             :                   // {0.639091304900370,  0.950520955645667,  0.125614417613747},
     264             :                   // {0.937069076924990,  0.663882736885633,  0.136544584733588},
     265             :                   // {0.537083530541494,  0.304210681724104,  0.483408479211257},
     266             :                   // {0.887188506449625, -0.236496718536120,  0.252528506429544},
     267             :                   // {0.494698820670197, -0.698953476086564,  0.361262323882172},
     268             :                   // {0.897495818279768, -0.900390774211580,  0.085464254086247}
     269             :                   //
     270             :                   // Second of 2 degree-8, 16 point rules given by Wissmann.
     271             :                   // Either of these will work, I just chose the one with points
     272             :                   // further into the element interior.
     273             :                   {Real(0.0000000000000000e+00),  Real(6.5956013196034176e-01),  Real(4.5027677630559029e-01)},
     274             :                   {Real(0.0000000000000000e+00), Real(-9.4914292304312538e-01),  Real(1.6657042677781274e-01)},
     275             :                   {Real(9.5250946607156228e-01),  Real(7.6505181955768362e-01),  Real(9.8869459933431422e-02)},
     276             :                   {Real(5.3232745407420624e-01),  Real(9.3697598108841598e-01),  Real(1.5369674714081197e-01)},
     277             :                   {Real(6.8473629795173504e-01),  Real(3.3365671773574759e-01),  Real(3.9668697607290278e-01)},
     278             :                   {Real(2.3314324080140552e-01), Real(-7.9583272377396852e-02),  Real(3.5201436794569501e-01)},
     279             :                   {Real(9.2768331930611748e-01), Real(-2.7224008061253425e-01),  Real(1.8958905457779799e-01)},
     280             :                   {Real(4.5312068740374942e-01), Real(-6.1373535339802760e-01),  Real(3.7510100114758727e-01)},
     281             :                   {Real(8.3750364042281223e-01), Real(-8.8847765053597136e-01),  Real(1.2561879164007201e-01)}
     282             :                 };
     283             : 
     284          71 :               _points.resize(16);
     285          71 :               _weights.resize(16);
     286             : 
     287          71 :               wissmann_rule(data, /*10*/ 9);
     288             : 
     289           2 :               return;
     290             :             } // end case EIGHTH
     291             : 
     292             : 
     293             : 
     294             : 
     295          71 :           case NINTH:
     296             :             {
     297             :               // A degree 9, 17-point rule due to Moller.
     298             :               //
     299             :               // H.M. Moller,  Kubaturformeln mit minimaler Knotenzahl,
     300             :               // Numer. Math.  25 (1976), 185--200.
     301             :               //
     302             :               // This rule is provably minimal in the number of points.
     303             :               // A tensor-product rule accurate for "bi-ninth" degree polynomials would have 25 points.
     304          71 :               const Real data[5][3] =
     305             :                 {
     306             :                   {Real(0.0000000000000000e+00), Real(0.0000000000000000e+00), Real(5.2674897119341563e-01)}, // 1
     307             :                   {Real(6.3068011973166885e-01), Real(9.6884996636197772e-01), Real(8.8879378170198706e-02)}, // 4
     308             :                   {Real(9.2796164595956966e-01), Real(7.5027709997890053e-01), Real(1.1209960212959648e-01)}, // 4
     309             :                   {Real(4.5333982113564719e-01), Real(5.2373582021442933e-01), Real(3.9828243926207009e-01)}, // 4
     310             :                   {Real(8.5261572933366230e-01), Real(7.6208328192617173e-02), Real(2.6905133763978080e-01)}  // 4
     311             :                 };
     312             : 
     313          71 :               const unsigned int symmetry[5] = {
     314             :                 0, // Single point
     315             :                 4, // Rotational Invariant
     316             :                 4, // Rotational Invariant
     317             :                 4, // Rotational Invariant
     318             :                 4  // Rotational Invariant
     319             :               };
     320             : 
     321          71 :               _points.resize (17);
     322          71 :               _weights.resize(17);
     323             : 
     324          71 :               stroud_rule(data, symmetry, 5);
     325             : 
     326           2 :               return;
     327             :             } // end case NINTH
     328             : 
     329             : 
     330             : 
     331             : 
     332         142 :           case TENTH:
     333             :           case ELEVENTH:
     334             :             {
     335             :               // A degree 11, 24-point rule due to Cools and Haegemans.
     336             :               //
     337             :               // R. Cools and A. Haegemans, Another step forward in searching for
     338             :               // cubature formulae with a minimal number of knots for the square,
     339             :               // Computing 40 (1988), 139--146.
     340             :               //
     341             :               // P. Verlinden and R. Cools, The algebraic construction of a minimal
     342             :               // cubature formula of degree 11 for the square, Cubature Formulas
     343             :               // and their Applications (Russian) (Krasnoyarsk) (M.V. Noskov, ed.),
     344             :               // 1994, pp. 13--23.
     345             :               //
     346             :               // This rule is provably minimal in the number of points.
     347             :               // A tensor-product rule accurate for "bi-tenth" or "bi-eleventh" degree polynomials would have 36 points.
     348         142 :               const Real data[6][3] =
     349             :                 {
     350             :                   {Real(6.9807610454956756e-01), Real(9.8263922354085547e-01), Real(4.8020763350723814e-02)}, // 4
     351             :                   {Real(9.3948638281673690e-01), Real(8.2577583590296393e-01), Real(6.6071329164550595e-02)}, // 4
     352             :                   {Real(9.5353952820153201e-01), Real(1.8858613871864195e-01), Real(9.7386777358668164e-02)}, // 4
     353             :                   {Real(3.1562343291525419e-01), Real(8.1252054830481310e-01), Real(2.1173634999894860e-01)}, // 4
     354             :                   {Real(7.1200191307533630e-01), Real(5.2532025036454776e-01), Real(2.2562606172886338e-01)}, // 4
     355             :                   {Real(4.2484724884866925e-01), Real(4.1658071912022368e-02), Real(3.5115871839824543e-01)}  // 4
     356             :                 };
     357             : 
     358         142 :               const unsigned int symmetry[6] = {
     359             :                 4, // Rotational Invariant
     360             :                 4, // Rotational Invariant
     361             :                 4, // Rotational Invariant
     362             :                 4, // Rotational Invariant
     363             :                 4, // Rotational Invariant
     364             :                 4  // Rotational Invariant
     365             :               };
     366             : 
     367         142 :               _points.resize (24);
     368         142 :               _weights.resize(24);
     369             : 
     370         142 :               stroud_rule(data, symmetry, 6);
     371             : 
     372           4 :               return;
     373             :             } // end case TENTH,ELEVENTH
     374             : 
     375             : 
     376             : 
     377             : 
     378         142 :           case TWELFTH:
     379             :           case THIRTEENTH:
     380             :             {
     381             :               // A degree 13, 33-point rule due to Cools and Haegemans.
     382             :               //
     383             :               // R. Cools and A. Haegemans, Another step forward in searching for
     384             :               // cubature formulae with a minimal number of knots for the square,
     385             :               // Computing 40 (1988), 139--146.
     386             :               //
     387             :               // A tensor-product rule accurate for "bi-12" or "bi-13" degree polynomials would have 49 points.
     388         142 :               const Real data[9][3] =
     389             :                 {
     390             :                   {Real(0.0000000000000000e+00), Real(0.0000000000000000e+00), Real(3.0038211543122536e-01)}, // 1
     391             :                   {Real(9.8348668243987226e-01), Real(7.7880971155441942e-01), Real(2.9991838864499131e-02)}, // 4
     392             :                   {Real(8.5955600564163892e-01), Real(9.5729769978630736e-01), Real(3.8174421317083669e-02)}, // 4
     393             :                   {Real(9.5892517028753485e-01), Real(1.3818345986246535e-01), Real(6.0424923817749980e-02)}, // 4
     394             :                   {Real(3.9073621612946100e-01), Real(9.4132722587292523e-01), Real(7.7492738533105339e-02)}, // 4
     395             :                   {Real(8.5007667369974857e-01), Real(4.7580862521827590e-01), Real(1.1884466730059560e-01)}, // 4
     396             :                   {Real(6.4782163718701073e-01), Real(7.5580535657208143e-01), Real(1.2976355037000271e-01)}, // 4
     397             :                   {Real(7.0741508996444936e-02), Real(6.9625007849174941e-01), Real(2.1334158145718938e-01)}, // 4
     398             :                   {Real(4.0930456169403884e-01), Real(3.4271655604040678e-01), Real(2.5687074948196783e-01)}  // 4
     399             :                 };
     400             : 
     401         142 :               const unsigned int symmetry[9] = {
     402             :                 0, // Single point
     403             :                 4, // Rotational Invariant
     404             :                 4, // Rotational Invariant
     405             :                 4, // Rotational Invariant
     406             :                 4, // Rotational Invariant
     407             :                 4, // Rotational Invariant
     408             :                 4, // Rotational Invariant
     409             :                 4, // Rotational Invariant
     410             :                 4  // Rotational Invariant
     411             :               };
     412             : 
     413         142 :               _points.resize (33);
     414         142 :               _weights.resize(33);
     415             : 
     416         142 :               stroud_rule(data, symmetry, 9);
     417             : 
     418           4 :               return;
     419             :             } // end case TWELFTH,THIRTEENTH
     420             : 
     421             : 
     422             : 
     423             : 
     424         142 :           case FOURTEENTH:
     425             :           case FIFTEENTH:
     426             :             {
     427             :               // A degree-15, 48 point rule originally due to Rabinowitz and Richter,
     428             :               // can be found in Cools' 1971 book.
     429             :               //
     430             :               // A.H. Stroud, Approximate calculation of multiple integrals,
     431             :               // Prentice-Hall, Englewood Cliffs, N.J., 1971.
     432             :               //
     433             :               // The product Gauss rule for this order has 8^2=64 points.
     434         142 :               const Real data[9][3] =
     435             :                 {
     436             :                   {9.915377816777667e-01_R, 0.0000000000000000e+00 ,  3.01245207981210e-02_R}, // 4
     437             :                   {8.020163879230440e-01_R, 0.0000000000000000e+00 ,  8.71146840209092e-02_R}, // 4
     438             :                   {5.648674875232742e-01_R, 0.0000000000000000e+00 , 1.250080294351494e-01_R}, // 4
     439             :                   {9.354392392539896e-01_R, 0.0000000000000000e+00 ,  2.67651407861666e-02_R}, // 4
     440             :                   {7.624563338825799e-01_R, 0.0000000000000000e+00 ,  9.59651863624437e-02_R}, // 4
     441             :                   {2.156164241427213e-01_R, 0.0000000000000000e+00 , 1.750832998343375e-01_R}, // 4
     442             :                   {9.769662659711761e-01_R, 6.684480048977932e-01_R,  2.83136372033274e-02_R}, // 4
     443             :                   {8.937128379503403e-01_R, 3.735205277617582e-01_R,  8.66414716025093e-02_R}, // 4
     444             :                   {6.122485619312083e-01_R, 4.078983303613935e-01_R, 1.150144605755996e-01_R}  // 4
     445             :                 };
     446             : 
     447         142 :               const unsigned int symmetry[9] = {
     448             :                 3, // Full Symmetry, (x,0)
     449             :                 3, // Full Symmetry, (x,0)
     450             :                 3, // Full Symmetry, (x,0)
     451             :                 2, // Full Symmetry, (x,x)
     452             :                 2, // Full Symmetry, (x,x)
     453             :                 2, // Full Symmetry, (x,x)
     454             :                 1, // Full Symmetry, (x,y)
     455             :                 1, // Full Symmetry, (x,y)
     456             :                 1, // Full Symmetry, (x,y)
     457             :               };
     458             : 
     459         142 :               _points.resize (48);
     460         142 :               _weights.resize(48);
     461             : 
     462         142 :               stroud_rule(data, symmetry, 9);
     463             : 
     464           4 :               return;
     465             :             } //   case FOURTEENTH, FIFTEENTH:
     466             : 
     467             : 
     468             : 
     469             : 
     470          71 :           case SIXTEENTH:
     471             :           case SEVENTEENTH:
     472             :             {
     473             :               // A degree 17, 60-point rule due to Cools and Haegemans.
     474             :               //
     475             :               // R. Cools and A. Haegemans, Another step forward in searching for
     476             :               // cubature formulae with a minimal number of knots for the square,
     477             :               // Computing 40 (1988), 139--146.
     478             :               //
     479             :               // A tensor-product rule accurate for "bi-14" or "bi-15" degree polynomials would have 64 points.
     480             :               // A tensor-product rule accurate for "bi-16" or "bi-17" degree polynomials would have 81 points.
     481          71 :               const Real data[10][3] =
     482             :                 {
     483             :                   {Real(9.8935307451260049e-01), Real(0.0000000000000000e+00), Real(2.0614915919990959e-02)}, // 4
     484             :                   {Real(3.7628520715797329e-01), Real(0.0000000000000000e+00), Real(1.2802571617990983e-01)}, // 4
     485             :                   {Real(9.7884827926223311e-01), Real(0.0000000000000000e+00), Real(5.5117395340318905e-03)}, // 4
     486             :                   {Real(8.8579472916411612e-01), Real(0.0000000000000000e+00), Real(3.9207712457141880e-02)}, // 4
     487             :                   {Real(1.7175612383834817e-01), Real(0.0000000000000000e+00), Real(7.6396945079863302e-02)}, // 4
     488             :                   {Real(5.9049927380600241e-01), Real(3.1950503663457394e-01), Real(1.4151372994997245e-01)}, // 8
     489             :                   {Real(7.9907913191686325e-01), Real(5.9797245192945738e-01), Real(8.3903279363797602e-02)}, // 8
     490             :                   {Real(8.0374396295874471e-01), Real(5.8344481776550529e-02), Real(6.0394163649684546e-02)}, // 8
     491             :                   {Real(9.3650627612749478e-01), Real(3.4738631616620267e-01), Real(5.7387752969212695e-02)}, // 8
     492             :                   {Real(9.8132117980545229e-01), Real(7.0600028779864611e-01), Real(2.1922559481863763e-02)}, // 8
     493             :                 };
     494             : 
     495          71 :               const unsigned int symmetry[10] = {
     496             :                 3, // Fully symmetric (x,0)
     497             :                 3, // Fully symmetric (x,0)
     498             :                 2, // Fully symmetric (x,x)
     499             :                 2, // Fully symmetric (x,x)
     500             :                 2, // Fully symmetric (x,x)
     501             :                 1, // Fully symmetric (x,y)
     502             :                 1, // Fully symmetric (x,y)
     503             :                 1, // Fully symmetric (x,y)
     504             :                 1, // Fully symmetric (x,y)
     505             :                 1  // Fully symmetric (x,y)
     506             :               };
     507             : 
     508          71 :               _points.resize (60);
     509          71 :               _weights.resize(60);
     510             : 
     511          71 :               stroud_rule(data, symmetry, 10);
     512             : 
     513           2 :               return;
     514             :             } // end case FOURTEENTH through SEVENTEENTH
     515             : #endif
     516             : 
     517             : 
     518             : 
     519             :             // By default: construct and use a Gauss quadrature rule
     520           6 :           default:
     521             :             {
     522             :               // Break out and fall down into the default: case for the
     523             :               // outer switch statement.
     524           6 :               break;
     525             :             }
     526             : 
     527          80 :           } // end switch(_order + 2*p)
     528             :       } // end case QUAD4/8/9
     529             : 
     530             :       libmesh_fallthrough();
     531             : 
     532             :       // By default: construct and use a Gauss quadrature rule
     533             :     default:
     534             :       {
     535        1460 :         QGauss gauss_rule(2, _order);
     536        1420 :         gauss_rule.init(*this);
     537             : 
     538             :         // Swap points and weights with the about-to-be destroyed rule.
     539          40 :         _points.swap (gauss_rule.get_points() );
     540          40 :         _weights.swap(gauss_rule.get_weights());
     541             : 
     542          40 :         return;
     543             :       }
     544             :     } // end switch (_type)
     545             : }
     546             : 
     547             : } // namespace libMesh

Generated by: LCOV version 1.14