LCOV - code coverage report
Current view: top level - src/quadrature - quadrature_gauss_2D.C (source / functions) Hit Total Coverage
Test: libMesh/libmesh: #4229 (6a9aeb) with base 727f46 Lines: 203 224 90.6 %
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_gauss.h"
      22             : #include "libmesh/quadrature_conical.h"
      23             : #include "libmesh/enum_to_string.h"
      24             : 
      25             : #include "libmesh/face_c0polygon.h"
      26             : 
      27             : namespace libMesh
      28             : {
      29             : 
      30             : 
      31      677193 : void QGauss::init_2D()
      32             : {
      33             : #if LIBMESH_DIM > 1
      34             : 
      35             :   //-----------------------------------------------------------------------
      36             :   // 2D quadrature rules
      37      677193 :   switch (_type)
      38             :     {
      39             : 
      40             : 
      41             :       //---------------------------------------------
      42             :       // Quadrilateral quadrature rules
      43      488975 :     case QUAD4:
      44             :     case QUADSHELL4:
      45             :     case QUAD8:
      46             :     case QUADSHELL8:
      47             :     case QUAD9:
      48             :     case QUADSHELL9:
      49             :       {
      50             :         // We compute the 2D quadrature rule as a tensor
      51             :         // product of the 1D quadrature rule.
      52             :         //
      53             :         // For QUADs, a quadrature rule of order 'p' must be able to integrate
      54             :         // bilinear (p=1), biquadratic (p=2), bicubic (p=3), etc. polynomials of the form
      55             :         //
      56             :         // (x^p + x^{p-1} + ... + 1) * (y^p + y^{p-1} + ... + 1)
      57             :         //
      58             :         // These polynomials have terms *up to* degree 2p but they are *not* complete
      59             :         // polynomials of degree 2p. For example, when p=2 we have
      60             :         //        1
      61             :         //     x      y
      62             :         // x^2    xy     y^2
      63             :         //    yx^2   xy^2
      64             :         //       x^2y^2
      65      558622 :         QGauss q1D(1,get_order());
      66      488975 :         tensor_product_quad( q1D );
      67       34925 :         return;
      68             :       }
      69             : 
      70             : 
      71             :       //---------------------------------------------
      72             :       // Triangle quadrature rules
      73      187418 :     case TRI3:
      74             :     case TRISHELL3:
      75             :     case TRI3SUBDIVISION:
      76             :     case TRI6:
      77             :     case TRI7:
      78             :       {
      79      200810 :         switch(get_order())
      80             :           {
      81       10346 :           case CONSTANT:
      82             :           case FIRST:
      83             :             {
      84             :               // Exact for linears
      85       10346 :               _points.resize(1);
      86       10346 :               _weights.resize(1);
      87             : 
      88       10346 :               _points[0](0) = Real(1)/3;
      89       10346 :               _points[0](1) = Real(1)/3;
      90             : 
      91       10346 :               _weights[0] = 0.5;
      92             : 
      93       10346 :               return;
      94             :             }
      95        7233 :           case SECOND:
      96             :             {
      97             :               // Exact for quadratics
      98        7233 :               _points.resize(3);
      99        7233 :               _weights.resize(3);
     100             : 
     101             :               // Alternate rule with points on ref. elt. boundaries.
     102             :               // Not ideal for problems with material coefficient discontinuities
     103             :               // aligned along element boundaries.
     104             :               // _points[0](0) = .5;
     105             :               // _points[0](1) = .5;
     106             :               // _points[1](0) = 0.;
     107             :               // _points[1](1) = .5;
     108             :               // _points[2](0) = .5;
     109             :               // _points[2](1) = .0;
     110             : 
     111        7233 :               _points[0](0) = Real(2)/3;
     112        7233 :               _points[0](1) = Real(1)/6;
     113             : 
     114        7233 :               _points[1](0) = Real(1)/6;
     115        7233 :               _points[1](1) = Real(2)/3;
     116             : 
     117        7233 :               _points[2](0) = Real(1)/6;
     118        7233 :               _points[2](1) = Real(1)/6;
     119             : 
     120             : 
     121        7233 :               _weights[0] = Real(1)/6;
     122        7233 :               _weights[1] = Real(1)/6;
     123        7233 :               _weights[2] = Real(1)/6;
     124             : 
     125        7233 :               return;
     126             :             }
     127       85328 :           case THIRD:
     128             :             {
     129             :               // Exact for cubics
     130       85328 :               _points.resize(4);
     131       85328 :               _weights.resize(4);
     132             : 
     133             :               // This rule is formed from a tensor product of
     134             :               // appropriately-scaled Gauss and Jacobi rules.  (See
     135             :               // also the QConical quadrature class, this is a
     136             :               // hard-coded version of one of those rules.)  For high
     137             :               // orders these rules generally have too many points,
     138             :               // but at extremely low order they are competitive and
     139             :               // have the additional benefit of having all positive
     140             :               // weights.
     141       85328 :               _points[0](0) = 1.5505102572168219018027159252941e-01_R;
     142       85328 :               _points[0](1) = 1.7855872826361642311703513337422e-01_R;
     143       85328 :               _points[1](0) = 6.4494897427831780981972840747059e-01_R;
     144       85328 :               _points[1](1) = 7.5031110222608118177475598324603e-02_R;
     145       85328 :               _points[2](0) = 1.5505102572168219018027159252941e-01_R;
     146       85328 :               _points[2](1) = 6.6639024601470138670269327409637e-01_R;
     147       85328 :               _points[3](0) = 6.4494897427831780981972840747059e-01_R;
     148       85328 :               _points[3](1) = 2.8001991549907407200279599420481e-01_R;
     149             : 
     150       85328 :               _weights[0] = 1.5902069087198858469718450103758e-01_R;
     151       85328 :               _weights[1] = 9.0979309128011415302815498962418e-02_R;
     152       85328 :               _weights[2] = 1.5902069087198858469718450103758e-01_R;
     153       85328 :               _weights[3] = 9.0979309128011415302815498962418e-02_R;
     154             : 
     155       85328 :               return;
     156             : 
     157             : 
     158             :               // The following third-order rule is quite commonly cited
     159             :               // in the literature and most likely works fine.  However,
     160             :               // we generally prefer a rule with all positive weights
     161             :               // and an equal number of points, when available.
     162             :               //
     163             :               //  (allow_rules_with_negative_weights)
     164             :               // {
     165             :               //   // Exact for cubics
     166             :               //   _points.resize(4);
     167             :               //   _weights.resize(4);
     168             :               //
     169             :               //   _points[0](0) = .33333333333333333333333333333333;
     170             :               //   _points[0](1) = .33333333333333333333333333333333;
     171             :               //
     172             :               //   _points[1](0) = .2;
     173             :               //   _points[1](1) = .6;
     174             :               //
     175             :               //   _points[2](0) = .2;
     176             :               //   _points[2](1) = .2;
     177             :               //
     178             :               //   _points[3](0) = .6;
     179             :               //   _points[3](1) = .2;
     180             :               //
     181             :               //
     182             :               //   _weights[0] = -27./96.;
     183             :               //   _weights[1] =  25./96.;
     184             :               //   _weights[2] =  25./96.;
     185             :               //   _weights[3] =  25./96.;
     186             :               //
     187             :               //   return;
     188             :               // } // end if (allow_rules_with_negative_weights)
     189             :               // Note: if !allow_rules_with_negative_weights, fall through to next case.
     190             :             }
     191             : 
     192             : 
     193             : 
     194             :             // A degree 4 rule with six points.  This rule can be found in many places
     195             :             // including:
     196             :             //
     197             :             // J.N. Lyness and D. Jespersen, Moderate degree symmetric
     198             :             // quadrature rules for the triangle, J. Inst. Math. Appl.  15 (1975),
     199             :             // 19--32.
     200             :             //
     201             :             // We used the code in:
     202             :             // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
     203             :             // on triangles and tetrahedra"  Journal of Computational Mathematics,
     204             :             // v. 27, no. 1, 2009, pp. 89-96.
     205             :             // to generate additional precision.
     206        2778 :           case FOURTH:
     207             :             {
     208          84 :               const unsigned int n_wts = 2;
     209        2778 :               const Real wts[n_wts] =
     210             :                 {
     211             :                   1.1169079483900573284750350421656140e-01_R,
     212             :                   5.4975871827660933819163162450105264e-02_R
     213             :                 };
     214             : 
     215        2778 :               const Real a[n_wts] =
     216             :                 {
     217             :                   4.4594849091596488631832925388305199e-01_R,
     218             :                   9.1576213509770743459571463402201508e-02_R
     219             :                 };
     220             : 
     221        2778 :               const Real b[n_wts] = {0., 0.}; // not used
     222        2778 :               const unsigned int permutation_ids[n_wts] = {3, 3};
     223             : 
     224        2778 :               dunavant_rule2(wts, a, b, permutation_ids, n_wts); // 6 total points
     225             : 
     226          84 :               return;
     227             :             }
     228             : 
     229             : 
     230             : 
     231             :             // Exact for quintics
     232             :             // Can be found in "Quadrature on Simplices of Arbitrary
     233             :             // Dimension" by Walkington.
     234       31514 :           case FIFTH:
     235             :             {
     236        2681 :               const unsigned int n_wts = 3;
     237       31514 :               const Real wts[n_wts] =
     238             :                 {
     239             :                   Real(9)/80,                              // ~0.1125
     240             :                   Real(31)/480 + std::sqrt(Real(15))/2400, // ~0.06619707639
     241             :                   Real(31)/480 - std::sqrt(Real(15))/2400  // ~0.06296959027
     242             :                 };
     243             : 
     244       31514 :               const Real a[n_wts] =
     245             :                 {
     246             :                   0., // 'a' parameter not used for origin permutation
     247             :                   Real(2)/7 + std::sqrt(Real(15))/21, // ~0.4701420641
     248             :                   Real(2)/7 - std::sqrt(Real(15))/21  // ~0.1012865073
     249             :                 };
     250             : 
     251       31514 :               const Real b[n_wts] = {0., 0., 0.}; // not used
     252       31514 :               const unsigned int permutation_ids[n_wts] = {1, 3, 3};
     253             : 
     254       31514 :               dunavant_rule2(wts, a, b, permutation_ids, n_wts); // 7 total points
     255             : 
     256        2681 :               return;
     257             :             }
     258             : 
     259             : 
     260             : 
     261             :             // A degree 6 rule with 12 points.  This rule can be found in many places
     262             :             // including:
     263             :             //
     264             :             // J.N. Lyness and D. Jespersen, Moderate degree symmetric
     265             :             // quadrature rules for the triangle, J. Inst. Math. Appl.  15 (1975),
     266             :             // 19--32.
     267             :             //
     268             :             // We used the code in:
     269             :             // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
     270             :             // on triangles and tetrahedra"  Journal of Computational Mathematics,
     271             :             // v. 27, no. 1, 2009, pp. 89-96.
     272             :             // to generate additional precision.
     273             :             //
     274             :             // Note that the following 7th-order Ro3-invariant rule also has only 12 points,
     275             :             // which technically makes it the superior rule.  This one is here for completeness.
     276        1420 :           case SIXTH:
     277             :             {
     278          40 :               const unsigned int n_wts = 3;
     279        1420 :               const Real wts[n_wts] =
     280             :                 {
     281             :                   5.8393137863189683012644805692789721e-02_R,
     282             :                   2.5422453185103408460468404553434492e-02_R,
     283             :                   4.1425537809186787596776728210221227e-02_R
     284             :                 };
     285             : 
     286        1420 :               const Real a[n_wts] =
     287             :                 {
     288             :                   2.4928674517091042129163855310701908e-01_R,
     289             :                   6.3089014491502228340331602870819157e-02_R,
     290             :                   3.1035245103378440541660773395655215e-01_R
     291             :                 };
     292             : 
     293        1420 :               const Real b[n_wts] =
     294             :                 {
     295             :                   0.,
     296             :                   0.,
     297             :                   6.3650249912139864723014259441204970e-01_R
     298             :                 };
     299             : 
     300        1420 :               const unsigned int permutation_ids[n_wts] = {3, 3, 6}; // 12 total points
     301             : 
     302        1420 :               dunavant_rule2(wts, a, b, permutation_ids, n_wts);
     303             : 
     304          40 :               return;
     305             :             }
     306             : 
     307             : 
     308             :             // A degree 7 rule with 12 points.  This rule can be found in:
     309             :             //
     310             :             // K. Gatermann, The construction of symmetric cubature
     311             :             // formulas for the square and the triangle, Computing 40
     312             :             // (1988), 229--240.
     313             :             //
     314             :             // This rule, which is provably minimal in the number of
     315             :             // integration points, is said to be 'Ro3 invariant' which
     316             :             // means that a given set of barycentric coordinates
     317             :             // (z1,z2,z3) implies the quadrature points (z1,z2),
     318             :             // (z3,z1), (z2,z3) which are formed by taking the first
     319             :             // two entries in cyclic permutations of the barycentric
     320             :             // point.  Barycentric coordinates are related in the
     321             :             // sense that: z3 = 1 - z1 - z2.
     322             :             //
     323             :             // The 12-point sixth-order rule for triangles given in
     324             :             // Flaherty's (http://www.cs.rpi.edu/~flaherje/FEM/fem6.ps)
     325             :             // lecture notes has been removed in favor of this rule
     326             :             // which is higher-order (for the same number of
     327             :             // quadrature points) and has a few more digits of
     328             :             // precision in the points and weights.  Some 10-point
     329             :             // degree 6 rules exist for the triangle but they have
     330             :             // quadrature points outside the region of integration.
     331       26582 :           case SEVENTH:
     332             :             {
     333       26582 :               _points.resize (12);
     334       26582 :               _weights.resize(12);
     335             : 
     336        1715 :               const unsigned int nrows=4;
     337             : 
     338             :               // In each of the rows below, the first two entries are (z1, z2) which imply
     339             :               // z3.  The third entry is the weight for each of the points in the cyclic permutation.
     340             :               // The original publication tabulated about 16 decimal digits for each point and weight
     341             :               // parameter. The additional digits shown here were obtained using a code in the
     342             :               // mp-quadrature library, https://github.com/jwpeterson/mp-quadrature
     343       26582 :               const Real rule_data[nrows][3] = {
     344             :                 {6.2382265094402118173683000996350e-02_R, 6.7517867073916085442557131050869e-02_R, 2.6517028157436251428754180460739e-02_R}, // group A
     345             :                 {5.5225456656926611737479190275645e-02_R, 3.2150249385198182266630784919920e-01_R, 4.3881408714446055036769903139288e-02_R}, // group B
     346             :                 {3.4324302945097146469630642483938e-02_R, 6.6094919618673565761198031019780e-01_R, 2.8775042784981585738445496900219e-02_R}, // group C
     347             :                 {5.1584233435359177925746338682643e-01_R, 2.7771616697639178256958187139372e-01_R, 6.7493187009802774462697086166421e-02_R}  // group D
     348             :               };
     349             : 
     350      132910 :               for (unsigned int i=0, offset=0; i<nrows; ++i)
     351             :                 {
     352      106328 :                   _points[offset + 0] = Point(rule_data[i][0],                    rule_data[i][1]); // (z1,z2)
     353      106328 :                   _points[offset + 1] = Point(1.-rule_data[i][0]-rule_data[i][1], rule_data[i][0]); // (z3,z1)
     354      106328 :                   _points[offset + 2] = Point(rule_data[i][1], 1.-rule_data[i][0]-rule_data[i][1]); // (z2,z3)
     355             : 
     356             :                   // All these points get the same weight
     357      113188 :                   _weights[offset + 0] = rule_data[i][2];
     358      106328 :                   _weights[offset + 1] = rule_data[i][2];
     359      106328 :                   _weights[offset + 2] = rule_data[i][2];
     360             : 
     361             :                   // Increment offset
     362      106328 :                   offset += 3;
     363             :                 }
     364             : 
     365        1715 :               return;
     366             : 
     367             : 
     368             :               //       // The following is an inferior 7th-order Lyness-style rule with 15 points.
     369             :               //       // It's here only for completeness and the Ro3-invariant rule above should
     370             :               //       // be used instead!
     371             :               //       const unsigned int n_wts = 3;
     372             :               //       const Real wts[n_wts] =
     373             :               // {
     374             :               //   2.6538900895116205835977487499847719e-02_R,
     375             :               //   3.5426541846066783659206291623201826e-02_R,
     376             :               //   3.4637341039708446756138297960207647e-02_R
     377             :               // };
     378             :               //
     379             :               //       const Real a[n_wts] =
     380             :               // {
     381             :               //   6.4930513159164863078379776030396538e-02_R,
     382             :               //   2.8457558424917033519741605734978046e-01_R,
     383             :               //   3.1355918438493150795585190219862865e-01_R
     384             :               // };
     385             :               //
     386             :               //       const Real b[n_wts] =
     387             :               // {
     388             :               //   0.,
     389             :               //   1.9838447668150671917987659863332941e-01_R,
     390             :               //   4.3863471792372471511798695971295936e-02_R
     391             :               // };
     392             :               //
     393             :               //       const unsigned int permutation_ids[n_wts] = {3, 6, 6}; // 15 total points
     394             :               //
     395             :               //       dunavant_rule2(wts, a, b, permutation_ids, n_wts);
     396             :               //
     397             :               //       return;
     398             :             }
     399             : 
     400             : 
     401             : 
     402             : 
     403             :             // Another Dunavant rule.  This one has all positive weights.  This rule has
     404             :             // 16 points while a comparable conical product rule would have 5*5=25.
     405             :             //
     406             :             // It was copied 23rd June 2008 from:
     407             :             // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
     408             :             //
     409             :             // Additional precision obtained from the code in:
     410             :             // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
     411             :             // on triangles and tetrahedra"  Journal of Computational Mathematics,
     412             :             // v. 27, no. 1, 2009, pp. 89-96.
     413        3383 :           case EIGHTH:
     414             :             {
     415         204 :               const unsigned int n_wts = 5;
     416        3383 :               const Real wts[n_wts] =
     417             :                 {
     418             :                   7.2157803838893584125545555244532310e-02_R,
     419             :                   4.7545817133642312396948052194292159e-02_R,
     420             :                   5.1608685267359125140895775146064515e-02_R,
     421             :                   1.6229248811599040155462964170890299e-02_R,
     422             :                   1.3615157087217497132422345036954462e-02_R
     423             :                 };
     424             : 
     425        3383 :               const Real a[n_wts] =
     426             :                 {
     427             :                   0.0, // 'a' parameter not used for origin permutation
     428             :                   4.5929258829272315602881551449416932e-01_R,
     429             :                   1.7056930775176020662229350149146450e-01_R,
     430             :                   5.0547228317030975458423550596598947e-02_R,
     431             :                   2.6311282963463811342178578628464359e-01_R,
     432             :                 };
     433             : 
     434        3383 :               const Real b[n_wts] =
     435             :                 {
     436             :                   0.,
     437             :                   0.,
     438             :                   0.,
     439             :                   0.,
     440             :                   7.2849239295540428124100037917606196e-01_R
     441             :                 };
     442             : 
     443        3383 :               const unsigned int permutation_ids[n_wts] = {1, 3, 3, 3, 6}; // 16 total points
     444             : 
     445        3383 :               dunavant_rule2(wts, a, b, permutation_ids, n_wts);
     446             : 
     447         204 :               return;
     448             :             }
     449             : 
     450             : 
     451             : 
     452             :             // Another Dunavant rule.  This one has all positive weights.  This rule has 19
     453             :             // points. The comparable conical product rule would have 25.
     454             :             // It was copied 23rd June 2008 from:
     455             :             // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
     456             :             //
     457             :             // Additional precision obtained from the code in:
     458             :             // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
     459             :             // on triangles and tetrahedra"  Journal of Computational Mathematics,
     460             :             // v. 27, no. 1, 2009, pp. 89-96.
     461       14706 :           case NINTH:
     462             :             {
     463        1105 :               const unsigned int n_wts = 6;
     464       14706 :               const Real wts[n_wts] =
     465             :                 {
     466             :                   4.8567898141399416909620991253644315e-02_R,
     467             :                   1.5667350113569535268427415643604658e-02_R,
     468             :                   1.2788837829349015630839399279499912e-02_R,
     469             :                   3.8913770502387139658369678149701978e-02_R,
     470             :                   3.9823869463605126516445887132022637e-02_R,
     471             :                   2.1641769688644688644688644688644689e-02_R
     472             :                 };
     473             : 
     474       14706 :               const Real a[n_wts] =
     475             :                 {
     476             :                   0.0, // 'a' parameter not used for origin permutation
     477             :                   4.8968251919873762778370692483619280e-01_R,
     478             :                   4.4729513394452709865106589966276365e-02_R,
     479             :                   4.3708959149293663726993036443535497e-01_R,
     480             :                   1.8820353561903273024096128046733557e-01_R,
     481             :                   2.2196298916076569567510252769319107e-01_R
     482             :                 };
     483             : 
     484       14706 :               const Real b[n_wts] =
     485             :                 {
     486             :                   0.,
     487             :                   0.,
     488             :                   0.,
     489             :                   0.,
     490             :                   0.,
     491             :                   7.4119859878449802069007987352342383e-01_R
     492             :                 };
     493             : 
     494       14706 :               const unsigned int permutation_ids[n_wts] = {1, 3, 3, 3, 3, 6}; // 19 total points
     495             : 
     496       14706 :               dunavant_rule2(wts, a, b, permutation_ids, n_wts);
     497             : 
     498        1105 :               return;
     499             :             }
     500             : 
     501             : 
     502             :             // Another Dunavant rule with all positive weights.  This rule has 25
     503             :             // points. The comparable conical product rule would have 36.
     504             :             // It was copied 23rd June 2008 from:
     505             :             // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
     506             :             //
     507             :             // Additional precision obtained from the code in:
     508             :             // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
     509             :             // on triangles and tetrahedra"  Journal of Computational Mathematics,
     510             :             // v. 27, no. 1, 2009, pp. 89-96.
     511         426 :           case TENTH:
     512             :             {
     513          12 :               const unsigned int n_wts = 6;
     514         426 :               const Real wts[n_wts] =
     515             :                 {
     516             :                   4.5408995191376790047643297550014267e-02_R,
     517             :                   1.8362978878233352358503035945683300e-02_R,
     518             :                   2.2660529717763967391302822369298659e-02_R,
     519             :                   3.6378958422710054302157588309680344e-02_R,
     520             :                   1.4163621265528742418368530791049552e-02_R,
     521             :                   4.7108334818664117299637354834434138e-03_R
     522             :                 };
     523             : 
     524         426 :               const Real a[n_wts] =
     525             :                 {
     526             :                   0.0, // 'a' parameter not used for origin permutation
     527             :                   4.8557763338365737736750753220812615e-01_R,
     528             :                   1.0948157548503705479545863134052284e-01_R,
     529             :                   3.0793983876412095016515502293063162e-01_R,
     530             :                   2.4667256063990269391727646541117681e-01_R,
     531             :                   6.6803251012200265773540212762024737e-02_R
     532             :                 };
     533             : 
     534         426 :               const Real b[n_wts] =
     535             :                 {
     536             :                   0.,
     537             :                   0.,
     538             :                   0.,
     539             :                   5.5035294182099909507816172659300821e-01_R,
     540             :                   7.2832390459741092000873505358107866e-01_R,
     541             :                   9.2365593358750027664630697761508843e-01_R
     542             :                 };
     543             : 
     544         426 :               const unsigned int permutation_ids[n_wts] = {1, 3, 3, 6, 6, 6}; // 25 total points
     545             : 
     546         426 :               dunavant_rule2(wts, a, b, permutation_ids, n_wts);
     547             : 
     548          12 :               return;
     549             :             }
     550             : 
     551             : 
     552             :             // Dunavant's 11th-order rule contains points outside the region of
     553             :             // integration, and is thus unacceptable for our FEM calculations.
     554             :             //
     555             :             // This 30-point, 11th-order rule was obtained by me [JWP] using the code in
     556             :             //
     557             :             // Additional precision obtained from the code in:
     558             :             // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
     559             :             // on triangles and tetrahedra"  Journal of Computational Mathematics,
     560             :             // v. 27, no. 1, 2009, pp. 89-96.
     561             :             //
     562             :             // Note: the 28-point 11th-order rule obtained by Zhang in the paper above
     563             :             // does not appear to be unique.  It is a solution in the sense that it
     564             :             // minimizes the error in the least-squares minimization problem, but
     565             :             // it involves too many unknowns and the Jacobian is therefore singular
     566             :             // when attempting to improve the solution via Newton's method.
     567        1714 :           case ELEVENTH:
     568             :             {
     569         138 :               const unsigned int n_wts = 6;
     570        1714 :               const Real wts[n_wts] =
     571             :                 {
     572             :                   3.6089021198604635216985338480426484e-02_R,
     573             :                   2.1607717807680420303346736867931050e-02_R,
     574             :                   3.1144524293927978774861144478241807e-03_R,
     575             :                   2.9086855161081509446654185084988077e-02_R,
     576             :                   8.4879241614917017182977532679947624e-03_R,
     577             :                   1.3795732078224796530729242858347546e-02_R
     578             :                 };
     579             : 
     580        1714 :               const Real a[n_wts] =
     581             :                 {
     582             :                   3.9355079629947969884346551941969960e-01_R,
     583             :                   4.7979065808897448654107733982929214e-01_R,
     584             :                   5.1003445645828061436081405648347852e-03_R,
     585             :                   2.6597620190330158952732822450744488e-01_R,
     586             :                   2.8536418538696461608233522814483715e-01_R,
     587             :                   1.3723536747817085036455583801851025e-01_R
     588             :                 };
     589             : 
     590        1714 :               const Real b[n_wts] =
     591             :                 {
     592             :                   0.,
     593             :                   0.,
     594             :                   5.6817155788572446538150614865768991e-02_R,
     595             :                   1.2539956353662088473247489775203396e-01_R,
     596             :                   1.2409970153698532116262152247041742e-02_R,
     597             :                   5.2792057988217708934207928630851643e-02_R
     598             :                 };
     599             : 
     600        1714 :               const unsigned int permutation_ids[n_wts] = {3, 3, 6, 6, 6, 6}; // 30 total points
     601             : 
     602        1714 :               dunavant_rule2(wts, a, b, permutation_ids, n_wts);
     603             : 
     604         138 :               return;
     605             :             }
     606             : 
     607             : 
     608             : 
     609             : 
     610             :             // Another Dunavant rule with all positive weights.  This rule has 33
     611             :             // points. The comparable conical product rule would have 36 (ELEVENTH) or 49 (TWELFTH).
     612             :             //
     613             :             // It was copied 23rd June 2008 from:
     614             :             // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
     615             :             //
     616             :             // Additional precision obtained from the code in:
     617             :             // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
     618             :             // on triangles and tetrahedra"  Journal of Computational Mathematics,
     619             :             // v. 27, no. 1, 2009, pp. 89-96.
     620         284 :           case TWELFTH:
     621             :             {
     622           8 :               const unsigned int n_wts = 8;
     623         284 :               const Real wts[n_wts] =
     624             :                 {
     625             :                   3.0831305257795086169332418926151771e-03_R,
     626             :                   3.1429112108942550177135256546441273e-02_R,
     627             :                   1.7398056465354471494664198647499687e-02_R,
     628             :                   2.1846272269019201067728631278737487e-02_R,
     629             :                   1.2865533220227667708895461535782215e-02_R,
     630             :                   1.1178386601151722855919538351159995e-02_R,
     631             :                   8.6581155543294461858210504055170332e-03_R,
     632             :                   2.0185778883190464758914349626118386e-02_R
     633             :                 };
     634             : 
     635         284 :               const Real a[n_wts] =
     636             :                 {
     637             :                   2.1317350453210370246856975515728246e-02_R,
     638             :                   2.7121038501211592234595134039689474e-01_R,
     639             :                   1.2757614554158592467389632515428357e-01_R,
     640             :                   4.3972439229446027297973662348436108e-01_R,
     641             :                   4.8821738977380488256466206525881104e-01_R,
     642             :                   2.8132558098993954824813069297455275e-01_R,
     643             :                   1.1625191590759714124135414784260182e-01_R,
     644             :                   2.7571326968551419397479634607976398e-01_R
     645             :                 };
     646             : 
     647         284 :               const Real b[n_wts] =
     648             :                 {
     649             :                   0.,
     650             :                   0.,
     651             :                   0.,
     652             :                   0.,
     653             :                   0.,
     654             :                   6.9583608678780342214163552323607254e-01_R,
     655             :                   8.5801403354407263059053661662617818e-01_R,
     656             :                   6.0894323577978780685619243776371007e-01_R
     657             :                 };
     658             : 
     659         284 :               const unsigned int permutation_ids[n_wts] = {3, 3, 3, 3, 3, 6, 6, 6}; // 33 total points
     660             : 
     661         284 :               dunavant_rule2(wts, a, b, permutation_ids, n_wts);
     662             : 
     663           8 :               return;
     664             :             }
     665             : 
     666             : 
     667             :             // Another Dunavant rule with all positive weights.  This rule has 37
     668             :             // points. The comparable conical product rule would have 49 points.
     669             :             //
     670             :             // It was copied 23rd June 2008 from:
     671             :             // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
     672             :             //
     673             :             // A second rule with additional precision obtained from the code in:
     674             :             // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
     675             :             // on triangles and tetrahedra"  Journal of Computational Mathematics,
     676             :             // v. 27, no. 1, 2009, pp. 89-96.
     677         284 :           case THIRTEENTH:
     678             :             {
     679           8 :               const unsigned int n_wts = 9;
     680         284 :               const Real wts[n_wts] =
     681             :                 {
     682             :                   3.3980018293415822140887212340442440e-02_R,
     683             :                   2.7800983765226664353628733005230734e-02_R,
     684             :                   2.9139242559599990702383541756669905e-02_R,
     685             :                   3.0261685517695859208964000161454122e-03_R,
     686             :                   1.1997200964447365386855399725479827e-02_R,
     687             :                   1.7320638070424185232993414255459110e-02_R,
     688             :                   7.4827005525828336316229285664517190e-03_R,
     689             :                   1.2089519905796909568722872786530380e-02_R,
     690             :                   4.7953405017716313612975450830554457e-03_R
     691             :                 };
     692             : 
     693         284 :               const Real a[n_wts] =
     694             :                 {
     695             :                   0., // 'a' parameter not used for origin permutation
     696             :                   4.2694141425980040602081253503137421e-01_R,
     697             :                   2.2137228629183290065481255470507908e-01_R,
     698             :                   2.1509681108843183869291313534052083e-02_R,
     699             :                   4.8907694645253934990068971909020439e-01_R,
     700             :                   3.0844176089211777465847185254124531e-01_R,
     701             :                   1.1092204280346339541286954522167452e-01_R,
     702             :                   1.6359740106785048023388790171095725e-01_R,
     703             :                   2.7251581777342966618005046435408685e-01_R
     704             :                 };
     705             : 
     706         284 :               const Real b[n_wts] =
     707             :                 {
     708             :                   0.,
     709             :                   0.,
     710             :                   0.,
     711             :                   0.,
     712             :                   0.,
     713             :                   6.2354599555367557081585435318623659e-01_R,
     714             :                   8.6470777029544277530254595089569318e-01_R,
     715             :                   7.4850711589995219517301859578870965e-01_R,
     716             :                   7.2235779312418796526062013230478405e-01_R
     717             :                 };
     718             : 
     719         284 :               const unsigned int permutation_ids[n_wts] = {1, 3, 3, 3, 3, 6, 6, 6, 6}; // 37 total points
     720             : 
     721         284 :               dunavant_rule2(wts, a, b, permutation_ids, n_wts);
     722             : 
     723           8 :               return;
     724             :             }
     725             : 
     726             : 
     727             :             // Another Dunavant rule.  This rule has 42 points, while
     728             :             // a comparable conical product rule would have 64.
     729             :             //
     730             :             // It was copied 23rd June 2008 from:
     731             :             // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
     732             :             //
     733             :             // Additional precision obtained from the code in:
     734             :             // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
     735             :             // on triangles and tetrahedra"  Journal of Computational Mathematics,
     736             :             // v. 27, no. 1, 2009, pp. 89-96.
     737         284 :           case FOURTEENTH:
     738             :             {
     739           8 :               const unsigned int n_wts = 10;
     740         284 :               const Real wts[n_wts] =
     741             :                 {
     742             :                   1.0941790684714445320422472981662986e-02_R,
     743             :                   1.6394176772062675320655489369312672e-02_R,
     744             :                   2.5887052253645793157392455083198201e-02_R,
     745             :                   2.1081294368496508769115218662093065e-02_R,
     746             :                   7.2168498348883338008549607403266583e-03_R,
     747             :                   2.4617018012000408409130117545210774e-03_R,
     748             :                   1.2332876606281836981437622591818114e-02_R,
     749             :                   1.9285755393530341614244513905205430e-02_R,
     750             :                   7.2181540567669202480443459995079017e-03_R,
     751             :                   2.5051144192503358849300465412445582e-03_R
     752             :                 };
     753             : 
     754         284 :               const Real a[n_wts] =
     755             :                 {
     756             :                   4.8896391036217863867737602045239024e-01_R,
     757             :                   4.1764471934045392250944082218564344e-01_R,
     758             :                   2.7347752830883865975494428326269856e-01_R,
     759             :                   1.7720553241254343695661069046505908e-01_R,
     760             :                   6.1799883090872601267478828436935788e-02_R,
     761             :                   1.9390961248701048178250095054529511e-02_R,
     762             :                   1.7226668782135557837528960161365733e-01_R,
     763             :                   3.3686145979634500174405519708892539e-01_R,
     764             :                   2.9837288213625775297083151805961273e-01_R,
     765             :                   1.1897449769695684539818196192990548e-01_R
     766             :                 };
     767             : 
     768         284 :               const Real b[n_wts] =
     769             :                 {
     770             :                   0.,
     771             :                   0.,
     772             :                   0.,
     773             :                   0.,
     774             :                   0.,
     775             :                   0.,
     776             :                   7.7060855477499648258903327416742796e-01_R,
     777             :                   5.7022229084668317349769621336235426e-01_R,
     778             :                   6.8698016780808783735862715402031306e-01_R,
     779             :                   8.7975717137017112951457163697460183e-01_R
     780             :                 };
     781             : 
     782         284 :               const unsigned int permutation_ids[n_wts]
     783             :                 = {3, 3, 3, 3, 3, 3, 6, 6, 6, 6}; // 42 total points
     784             : 
     785         284 :               dunavant_rule2(wts, a, b, permutation_ids, n_wts);
     786             : 
     787           8 :               return;
     788             :             }
     789             : 
     790             : 
     791             :             // This 49-point rule was found by me [JWP] using the code in:
     792             :             //
     793             :             // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
     794             :             // on triangles and tetrahedra"  Journal of Computational Mathematics,
     795             :             // v. 27, no. 1, 2009, pp. 89-96.
     796             :             //
     797             :             // A 54-point, 15th-order rule is reported by
     798             :             //
     799             :             // Stephen Wandzura, Hong Xiao,
     800             :             // Symmetric Quadrature Rules on a Triangle,
     801             :             // Computers and Mathematics with Applications,
     802             :             // Volume 45, Number 12, June 2003, pages 1829-1840.
     803             :             //
     804             :             // can be found here:
     805             :             // http://people.scs.fsu.edu/~burkardt/f_src/wandzura/wandzura.f90
     806             :             //
     807             :             // but this 49-point rule is superior.
     808         284 :           case FIFTEENTH:
     809             :             {
     810           8 :               const unsigned int n_wts = 11;
     811         284 :               const Real wts[n_wts] =
     812             :                 {
     813             :                   2.4777380743035579804788826970198951e-02_R,
     814             :                   9.2433943023307730591540642828347660e-03_R,
     815             :                   2.2485768962175402793245929133296627e-03_R,
     816             :                   6.7052581900064143760518398833360903e-03_R,
     817             :                   1.9011381726930579256700190357527956e-02_R,
     818             :                   1.4605445387471889398286155981802858e-02_R,
     819             :                   1.5087322572773133722829435011138258e-02_R,
     820             :                   1.5630213780078803020711746273129099e-02_R,
     821             :                   6.1808086085778203192616856133701233e-03_R,
     822             :                   3.2209366452594664857296985751120513e-03_R,
     823             :                   5.8747373242569702667677969985668817e-03_R
     824             :                 };
     825             : 
     826         284 :               const Real a[n_wts] =
     827             :                 {
     828             :                   0.0, // 'a' parameter not used for origin
     829             :                   7.9031013655541635005816956762252155e-02_R,
     830             :                   1.8789501810770077611247984432284226e-02_R,
     831             :                   4.9250168823249670532514526605352905e-01_R,
     832             :                   4.0886316907744105975059040108092775e-01_R,
     833             :                   5.3877851064220142445952549348423733e-01_R,
     834             :                   2.0250549804829997692885033941362673e-01_R,
     835             :                   5.5349674918711643207148086558288110e-01_R,
     836             :                   7.8345022567320812359258882143250181e-01_R,
     837             :                   8.9514624528794883409864566727625002e-01_R,
     838             :                   3.2515745241110782862789881780746490e-01_R
     839             :                 };
     840             : 
     841         284 :               const Real b[n_wts] =
     842             :                 {
     843             :                   0.,
     844             :                   0.,
     845             :                   0.,
     846             :                   0.,
     847             :                   0.,
     848             :                   1.9412620368774630292701241080996842e-01_R,
     849             :                   9.8765911355712115933807754318089099e-02_R,
     850             :                   7.7663767064308164090246588765178087e-02_R,
     851             :                   2.1594628433980258573654682690950798e-02_R,
     852             :                   1.2563596287784997705599005477153617e-02_R,
     853             :                   1.5082654870922784345283124845552190e-02_R
     854             :                 };
     855             : 
     856         284 :               const unsigned int permutation_ids[n_wts]
     857             :                 = {1, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6}; // 49 total points
     858             : 
     859         284 :               dunavant_rule2(wts, a, b, permutation_ids, n_wts);
     860             : 
     861           8 :               return;
     862             :             }
     863             : 
     864             : 
     865             : 
     866             : 
     867             :             // Dunavant's 16th-order rule contains points outside the region of
     868             :             // integration, and is thus unacceptable for our FEM calculations.
     869             :             //
     870             :             // This 55-point, 16th-order rule was obtained by me [JWP] using the code in
     871             :             //
     872             :             // Additional precision obtained from the code in:
     873             :             // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
     874             :             // on triangles and tetrahedra"  Journal of Computational Mathematics,
     875             :             // v. 27, no. 1, 2009, pp. 89-96.
     876             :             //
     877             :             // Note: the 55-point 16th-order rule obtained by Zhang in the paper above
     878             :             // does not appear to be unique.  It is a solution in the sense that it
     879             :             // minimizes the error in the least-squares minimization problem, but
     880             :             // it involves too many unknowns and the Jacobian is therefore singular
     881             :             // when attempting to improve the solution via Newton's method.
     882         284 :           case SIXTEENTH:
     883             :             {
     884           8 :               const unsigned int n_wts = 12;
     885         284 :               const Real wts[n_wts] =
     886             :                 {
     887             :                   2.2668082505910087151996321171534230e-02_R,
     888             :                   8.4043060714818596159798961899306135e-03_R,
     889             :                   1.0850949634049747713966288634484161e-03_R,
     890             :                   7.2252773375423638869298219383808751e-03_R,
     891             :                   1.2997715227338366024036316182572871e-02_R,
     892             :                   2.0054466616677715883228810959112227e-02_R,
     893             :                   9.7299841600417010281624372720122710e-03_R,
     894             :                   1.1651974438298104227427176444311766e-02_R,
     895             :                   9.1291185550484450744725847363097389e-03_R,
     896             :                   3.5568614040947150231712567900113671e-03_R,
     897             :                   5.8355861686234326181790822005304303e-03_R,
     898             :                   4.7411314396804228041879331486234396e-03_R
     899             :                 };
     900             : 
     901         284 :               const Real a[n_wts] =
     902             :                 {
     903             :                   0.0, // 'a' parameter not used for centroid weight
     904             :                   8.5402539407933203673769900926355911e-02_R,
     905             :                   1.2425572001444092841183633409631260e-02_R,
     906             :                   4.9174838341891594024701017768490960e-01_R,
     907             :                   4.5669426695387464162068900231444462e-01_R,
     908             :                   4.8506759880447437974189793537259677e-01_R,
     909             :                   2.0622099278664205707909858461264083e-01_R,
     910             :                   3.2374950270039093446805340265853956e-01_R,
     911             :                   7.3834330556606586255186213302750029e-01_R,
     912             :                   9.1210673061680792565673823935174611e-01_R,
     913             :                   6.6129919222598721544966837350891531e-01_R,
     914             :                   1.7807138906021476039088828811346122e-01_R
     915             :                 };
     916             : 
     917         284 :               const Real b[n_wts] =
     918             :                 {
     919             :                   0.0,
     920             :                   0.0,
     921             :                   0.0,
     922             :                   0.0,
     923             :                   0.0,
     924             :                   3.2315912848634384647700266402091638e-01_R,
     925             :                   1.5341553679414688425981898952416987e-01_R,
     926             :                   7.4295478991330687632977899141707872e-02_R,
     927             :                   7.1278762832147862035977841733532020e-02_R,
     928             :                   1.6623223223705792825395256602140459e-02_R,
     929             :                   1.4160772533794791868984026749196156e-02_R,
     930             :                   1.4539694958941854654807449467759690e-02_R
     931             :                 };
     932             : 
     933         284 :               const unsigned int permutation_ids[n_wts]
     934             :                 = {1, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6}; // 55 total points
     935             : 
     936         284 :               dunavant_rule2(wts, a, b, permutation_ids, n_wts);
     937             : 
     938           8 :               return;
     939             :             }
     940             : 
     941             : 
     942             :             // Dunavant's 17th-order rule has 61 points, while a
     943             :             // comparable conical product rule would have 81 (16th and 17th orders).
     944             :             //
     945             :             // It can be found here:
     946             :             // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
     947             :             //
     948             :             // Zhang reports an identical rule in:
     949             :             // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
     950             :             // on triangles and tetrahedra"  Journal of Computational Mathematics,
     951             :             // v. 27, no. 1, 2009, pp. 89-96.
     952             :             //
     953             :             // Note: the 61-point 17th-order rule obtained by Dunavant and Zhang
     954             :             // does not appear to be unique.  It is a solution in the sense that it
     955             :             // minimizes the error in the least-squares minimization problem, but
     956             :             // it involves too many unknowns and the Jacobian is therefore singular
     957             :             // when attempting to improve the solution via Newton's method.
     958             :             //
     959             :             // Therefore, we prefer the following 63-point rule which
     960             :             // I [JWP] found.  It appears to be more accurate than the
     961             :             // rule reported by Dunavant and Zhang, even though it has
     962             :             // a few more points.
     963         142 :           case SEVENTEENTH:
     964             :             {
     965           4 :               const unsigned int n_wts = 12;
     966         142 :               const Real wts[n_wts] =
     967             :                 {
     968             :                   1.7464603792572004485690588092246146e-02_R,
     969             :                   5.9429003555801725246549713984660076e-03_R,
     970             :                   1.2490753345169579649319736639588729e-02_R,
     971             :                   1.5386987188875607593083456905596468e-02_R,
     972             :                   1.1185807311917706362674684312990270e-02_R,
     973             :                   1.0301845740670206831327304917180007e-02_R,
     974             :                   1.1767783072977049696840016810370464e-02_R,
     975             :                   3.8045312849431209558329128678945240e-03_R,
     976             :                   4.5139302178876351271037137230354382e-03_R,
     977             :                   2.2178812517580586419412547665472893e-03_R,
     978             :                   5.2216271537483672304731416553063103e-03_R,
     979             :                   9.8381136389470256422419930926212114e-04_R
     980             :                 };
     981             : 
     982         142 :               const Real a[n_wts] =
     983             :                 {
     984             :                   2.8796825754667362165337965123570514e-01_R,
     985             :                   4.9216175986208465345536805750663939e-01_R,
     986             :                   4.6252866763171173685916780827044612e-01_R,
     987             :                   1.6730292951631792248498303276090273e-01_R,
     988             :                   1.5816335500814652972296428532213019e-01_R,
     989             :                   1.6352252138387564873002458959679529e-01_R,
     990             :                   6.2447680488959768233910286168417367e-01_R,
     991             :                   8.7317249935244454285263604347964179e-01_R,
     992             :                   3.4428164322282694677972239461699271e-01_R,
     993             :                   9.1584484467813674010523309855340209e-02_R,
     994             :                   2.0172088013378989086826623852040632e-01_R,
     995             :                   9.6538762758254643474731509845084691e-01_R
     996             :                 };
     997             : 
     998         142 :               const Real b[n_wts] =
     999             :                 {
    1000             :                   0.0,
    1001             :                   0.0,
    1002             :                   0.0,
    1003             :                   3.4429160695501713926320695771253348e-01_R,
    1004             :                   2.2541623431550639817203145525444726e-01_R,
    1005             :                   8.0670083153531811694942222940484991e-02_R,
    1006             :                   6.5967451375050925655738829747288190e-02_R,
    1007             :                   4.5677879890996762665044366994439565e-02_R,
    1008             :                   1.1528411723154215812386518751976084e-02_R,
    1009             :                   9.3057714323900610398389176844165892e-03_R,
    1010             :                   1.5916814107619812717966560404970160e-02_R,
    1011             :                   1.0734733163764032541125434215228937e-02_R
    1012             :                 };
    1013             : 
    1014         142 :               const unsigned int permutation_ids[n_wts]
    1015             :                 = {3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6}; // 63 total points
    1016             : 
    1017         142 :               dunavant_rule2(wts, a, b, permutation_ids, n_wts);
    1018             : 
    1019           4 :               return;
    1020             : 
    1021             :               //       _points.resize (61);
    1022             :               //       _weights.resize(61);
    1023             : 
    1024             :               //       // The raw data for the quadrature rule.
    1025             :               //       const Real p[15][4] = {
    1026             :               // {                1./3.,                    0.,                    0., 0.033437199290803e+00 / 2.0}, // 1-perm
    1027             :               // {0.005658918886452e+00, 0.497170540556774e+00,                    0., 0.005093415440507e+00 / 2.0}, // 3-perm
    1028             :               // {0.035647354750751e+00, 0.482176322624625e+00,                    0., 0.014670864527638e+00 / 2.0}, // 3-perm
    1029             :               // {0.099520061958437e+00, 0.450239969020782e+00,                    0., 0.024350878353672e+00 / 2.0}, // 3-perm
    1030             :               // {0.199467521245206e+00, 0.400266239377397e+00,                    0., 0.031107550868969e+00 / 2.0}, // 3-perm
    1031             :               // {0.495717464058095e+00, 0.252141267970953e+00,                    0., 0.031257111218620e+00 / 2.0}, // 3-perm
    1032             :               // {0.675905990683077e+00, 0.162047004658461e+00,                    0., 0.024815654339665e+00 / 2.0}, // 3-perm
    1033             :               // {0.848248235478508e+00, 0.075875882260746e+00,                    0., 0.014056073070557e+00 / 2.0}, // 3-perm
    1034             :               // {0.968690546064356e+00, 0.015654726967822e+00,                    0., 0.003194676173779e+00 / 2.0}, // 3-perm
    1035             :               // {0.010186928826919e+00, 0.334319867363658e+00, 0.655493203809423e+00, 0.008119655318993e+00 / 2.0}, // 6-perm
    1036             :               // {0.135440871671036e+00, 0.292221537796944e+00, 0.572337590532020e+00, 0.026805742283163e+00 / 2.0}, // 6-perm
    1037             :               // {0.054423924290583e+00, 0.319574885423190e+00, 0.626001190286228e+00, 0.018459993210822e+00 / 2.0}, // 6-perm
    1038             :               // {0.012868560833637e+00, 0.190704224192292e+00, 0.796427214974071e+00, 0.008476868534328e+00 / 2.0}, // 6-perm
    1039             :               // {0.067165782413524e+00, 0.180483211648746e+00, 0.752351005937729e+00, 0.018292796770025e+00 / 2.0}, // 6-perm
    1040             :               // {0.014663182224828e+00, 0.080711313679564e+00, 0.904625504095608e+00, 0.006665632004165e+00 / 2.0}  // 6-perm
    1041             :               //       };
    1042             : 
    1043             : 
    1044             :               //       // Now call the dunavant routine to generate _points and _weights
    1045             :               //       dunavant_rule(p, 15);
    1046             : 
    1047             :               //       return;
    1048             :             }
    1049             : 
    1050             : 
    1051             : 
    1052             :             // Dunavant's 18th-order rule contains points outside the region and is therefore unsuitable
    1053             :             // for our FEM calculations.  His 19th-order rule has 73 points, compared with 100 points for
    1054             :             // a comparable-order conical product rule.
    1055             :             //
    1056             :             // It was copied 23rd June 2008 from:
    1057             :             // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
    1058         284 :           case EIGHTTEENTH:
    1059             :           case NINETEENTH:
    1060             :             {
    1061         284 :               _points.resize (73);
    1062         284 :               _weights.resize(73);
    1063             : 
    1064             :               // The raw data for the quadrature rule.
    1065         284 :               const Real rule_data[17][4] = {
    1066             :                 {                1./3.,                    0.,                    0., 0.032906331388919e+00 / 2.0}, // 1-perm
    1067             :                 {0.020780025853987e+00, 0.489609987073006e+00,                    0., 0.010330731891272e+00 / 2.0}, // 3-perm
    1068             :                 {0.090926214604215e+00, 0.454536892697893e+00,                    0., 0.022387247263016e+00 / 2.0}, // 3-perm
    1069             :                 {0.197166638701138e+00, 0.401416680649431e+00,                    0., 0.030266125869468e+00 / 2.0}, // 3-perm
    1070             :                 {0.488896691193805e+00, 0.255551654403098e+00,                    0., 0.030490967802198e+00 / 2.0}, // 3-perm
    1071             :                 {0.645844115695741e+00, 0.177077942152130e+00,                    0., 0.024159212741641e+00 / 2.0}, // 3-perm
    1072             :                 {0.779877893544096e+00, 0.110061053227952e+00,                    0., 0.016050803586801e+00 / 2.0}, // 3-perm
    1073             :                 {0.888942751496321e+00, 0.055528624251840e+00,                    0., 0.008084580261784e+00 / 2.0}, // 3-perm
    1074             :                 {0.974756272445543e+00, 0.012621863777229e+00,                    0., 0.002079362027485e+00 / 2.0}, // 3-perm
    1075             :                 {0.003611417848412e+00, 0.395754787356943e+00, 0.600633794794645e+00, 0.003884876904981e+00 / 2.0}, // 6-perm
    1076             :                 {0.134466754530780e+00, 0.307929983880436e+00, 0.557603261588784e+00, 0.025574160612022e+00 / 2.0}, // 6-perm
    1077             :                 {0.014446025776115e+00, 0.264566948406520e+00, 0.720987025817365e+00, 0.008880903573338e+00 / 2.0}, // 6-perm
    1078             :                 {0.046933578838178e+00, 0.358539352205951e+00, 0.594527068955871e+00, 0.016124546761731e+00 / 2.0}, // 6-perm
    1079             :                 {0.002861120350567e+00, 0.157807405968595e+00, 0.839331473680839e+00, 0.002491941817491e+00 / 2.0}, // 6-perm
    1080             :                 {0.223861424097916e+00, 0.075050596975911e+00, 0.701087978926173e+00, 0.018242840118951e+00 / 2.0}, // 6-perm
    1081             :                 {0.034647074816760e+00, 0.142421601113383e+00, 0.822931324069857e+00, 0.010258563736199e+00 / 2.0}, // 6-perm
    1082             :                 {0.010161119296278e+00, 0.065494628082938e+00, 0.924344252620784e+00, 0.003799928855302e+00 / 2.0}  // 6-perm
    1083             :               };
    1084             : 
    1085             : 
    1086             :               // Now call the dunavant routine to generate _points and _weights
    1087         284 :               dunavant_rule(rule_data, 17);
    1088             : 
    1089           8 :               return;
    1090             :             }
    1091             : 
    1092             : 
    1093             :             // 20th-order rule by Wandzura.
    1094             :             //
    1095             :             // Stephen Wandzura, Hong Xiao,
    1096             :             // Symmetric Quadrature Rules on a Triangle,
    1097             :             // Computers and Mathematics with Applications,
    1098             :             // Volume 45, Number 12, June 2003, pages 1829-1840.
    1099             :             //
    1100             :             // Wandzura's work extends the work of Dunavant by providing degree
    1101             :             // 5,10,15,20,25, and 30 rules with positive weights for the triangle.
    1102             :             //
    1103             :             // Copied on 3rd July 2008 from:
    1104             :             // http://people.scs.fsu.edu/~burkardt/f_src/wandzura/wandzura.f90
    1105         142 :           case TWENTIETH:
    1106             :             {
    1107             :               // The equivalent conical product rule would have 121 points
    1108         142 :               _points.resize (85);
    1109         142 :               _weights.resize(85);
    1110             : 
    1111             :               // The raw data for the quadrature rule.
    1112         142 :               const Real rule_data[19][4] = {
    1113             :                 {0.33333333333333e+00,                  0.0,                  0.0, 0.2761042699769952e-01 / 2.0}, // 1-perm
    1114             :                 {0.00150064932443e+00, 0.49924967533779e+00,                  0.0, 0.1779029547326740e-02 / 2.0}, // 3-perm
    1115             :                 {0.09413975193895e+00, 0.45293012403052e+00,                  0.0, 0.2011239811396117e-01 / 2.0}, // 3-perm
    1116             :                 {0.20447212408953e+00, 0.39776393795524e+00,                  0.0, 0.2681784725933157e-01 / 2.0}, // 3-perm
    1117             :                 {0.47099959493443e+00, 0.26450020253279e+00,                  0.0, 0.2452313380150201e-01 / 2.0}, // 3-perm
    1118             :                 {0.57796207181585e+00, 0.21101896409208e+00,                  0.0, 0.1639457841069539e-01 / 2.0}, // 3-perm
    1119             :                 {0.78452878565746e+00, 0.10773560717127e+00,                  0.0, 0.1479590739864960e-01 / 2.0}, // 3-perm
    1120             :                 {0.92186182432439e+00, 0.03906908783780e+00,                  0.0, 0.4579282277704251e-02 / 2.0}, // 3-perm
    1121             :                 {0.97765124054134e+00, 0.01117437972933e+00,                  0.0, 0.1651826515576217e-02 / 2.0}, // 3-perm
    1122             :                 {0.00534961818734e+00, 0.06354966590835e+00, 0.93110071590431e+00, 0.2349170908575584e-02 / 2.0}, // 6-perm
    1123             :                 {0.00795481706620e+00, 0.15710691894071e+00, 0.83493826399309e+00, 0.4465925754181793e-02 / 2.0}, // 6-perm
    1124             :                 {0.01042239828126e+00, 0.39564211436437e+00, 0.59393548735436e+00, 0.6099566807907972e-02 / 2.0}, // 6-perm
    1125             :                 {0.01096441479612e+00, 0.27316757071291e+00, 0.71586801449097e+00, 0.6891081327188203e-02 / 2.0}, // 6-perm
    1126             :                 {0.03856671208546e+00, 0.10178538248502e+00, 0.85964790542952e+00, 0.7997475072478163e-02 / 2.0}, // 6-perm
    1127             :                 {0.03558050781722e+00, 0.44665854917641e+00, 0.51776094300637e+00, 0.7386134285336024e-02 / 2.0}, // 6-perm
    1128             :                 {0.04967081636276e+00, 0.19901079414950e+00, 0.75131838948773e+00, 0.1279933187864826e-01 / 2.0}, // 6-perm
    1129             :                 {0.05851972508433e+00, 0.32426118369228e+00, 0.61721909122339e+00, 0.1725807117569655e-01 / 2.0}, // 6-perm
    1130             :                 {0.12149778700439e+00, 0.20853136321013e+00, 0.66997084978547e+00, 0.1867294590293547e-01 / 2.0}, // 6-perm
    1131             :                 {0.14071084494394e+00, 0.32317056653626e+00, 0.53611858851980e+00, 0.2281822405839526e-01 / 2.0}  // 6-perm
    1132             :               };
    1133             : 
    1134             : 
    1135             :               // Now call the dunavant routine to generate _points and _weights
    1136         142 :               dunavant_rule(rule_data, 19);
    1137             : 
    1138           4 :               return;
    1139             :             }
    1140             : 
    1141             : 
    1142             : 
    1143             :             // 25th-order rule by Wandzura.
    1144             :             //
    1145             :             // Stephen Wandzura, Hong Xiao,
    1146             :             // Symmetric Quadrature Rules on a Triangle,
    1147             :             // Computers and Mathematics with Applications,
    1148             :             // Volume 45, Number 12, June 2003, pages 1829-1840.
    1149             :             //
    1150             :             // Wandzura's work extends the work of Dunavant by providing degree
    1151             :             // 5,10,15,20,25, and 30 rules with positive weights for the triangle.
    1152             :             //
    1153             :             // Copied on 3rd July 2008 from:
    1154             :             // http://people.scs.fsu.edu/~burkardt/f_src/wandzura/wandzura.f90
    1155             :             // case TWENTYFIRST: // fall through to 121 point conical product rule below
    1156           0 :           case TWENTYSECOND:
    1157             :           case TWENTYTHIRD:
    1158             :           case TWENTYFOURTH:
    1159             :           case TWENTYFIFTH:
    1160             :             {
    1161             :               // The equivalent conical product rule would have 169 points
    1162           0 :               _points.resize (126);
    1163           0 :               _weights.resize(126);
    1164             : 
    1165             :               // The raw data for the quadrature rule.
    1166           0 :               const Real rule_data[26][4] = {
    1167             :                 {0.02794648307317e+00, 0.48602675846341e+00,                  0.0, 0.8005581880020417e-02 / 2.0},  // 3-perm
    1168             :                 {0.13117860132765e+00, 0.43441069933617e+00,                  0.0, 0.1594707683239050e-01 / 2.0},  // 3-perm
    1169             :                 {0.22022172951207e+00, 0.38988913524396e+00,                  0.0, 0.1310914123079553e-01 / 2.0},  // 3-perm
    1170             :                 {0.40311353196039e+00, 0.29844323401980e+00,                  0.0, 0.1958300096563562e-01 / 2.0},  // 3-perm
    1171             :                 {0.53191165532526e+00, 0.23404417233737e+00,                  0.0, 0.1647088544153727e-01 / 2.0},  // 3-perm
    1172             :                 {0.69706333078196e+00, 0.15146833460902e+00,                  0.0, 0.8547279074092100e-02 / 2.0},  // 3-perm
    1173             :                 {0.77453221290801e+00, 0.11273389354599e+00,                  0.0, 0.8161885857226492e-02 / 2.0},  // 3-perm
    1174             :                 {0.84456861581695e+00, 0.07771569209153e+00,                  0.0, 0.6121146539983779e-02 / 2.0},  // 3-perm
    1175             :                 {0.93021381277141e+00, 0.03489309361430e+00,                  0.0, 0.2908498264936665e-02 / 2.0},  // 3-perm
    1176             :                 {0.98548363075813e+00, 0.00725818462093e+00,                  0.0, 0.6922752456619963e-03 / 2.0},  // 3-perm
    1177             :                 {0.00129235270444e+00, 0.22721445215336e+00, 0.77149319514219e+00, 0.1248289199277397e-02 / 2.0},  // 6-perm
    1178             :                 {0.00539970127212e+00, 0.43501055485357e+00, 0.55958974387431e+00, 0.3404752908803022e-02 / 2.0},  // 6-perm
    1179             :                 {0.00638400303398e+00, 0.32030959927220e+00, 0.67330639769382e+00, 0.3359654326064051e-02 / 2.0},  // 6-perm
    1180             :                 {0.00502821150199e+00, 0.09175032228001e+00, 0.90322146621800e+00, 0.1716156539496754e-02 / 2.0},  // 6-perm
    1181             :                 {0.00682675862178e+00, 0.03801083585872e+00, 0.95516240551949e+00, 0.1480856316715606e-02 / 2.0},  // 6-perm
    1182             :                 {0.01001619963993e+00, 0.15742521848531e+00, 0.83255858187476e+00, 0.3511312610728685e-02 / 2.0},  // 6-perm
    1183             :                 {0.02575781317339e+00, 0.23988965977853e+00, 0.73435252704808e+00, 0.7393550149706484e-02 / 2.0},  // 6-perm
    1184             :                 {0.03022789811992e+00, 0.36194311812606e+00, 0.60782898375402e+00, 0.7983087477376558e-02 / 2.0},  // 6-perm
    1185             :                 {0.03050499010716e+00, 0.08355196095483e+00, 0.88594304893801e+00, 0.4355962613158041e-02 / 2.0},  // 6-perm
    1186             :                 {0.04595654736257e+00, 0.14844322073242e+00, 0.80560023190501e+00, 0.7365056701417832e-02 / 2.0},  // 6-perm
    1187             :                 {0.06744280054028e+00, 0.28373970872753e+00, 0.64881749073219e+00, 0.1096357284641955e-01 / 2.0},  // 6-perm
    1188             :                 {0.07004509141591e+00, 0.40689937511879e+00, 0.52305553346530e+00, 0.1174996174354112e-01 / 2.0},  // 6-perm
    1189             :                 {0.08391152464012e+00, 0.19411398702489e+00, 0.72197448833499e+00, 0.1001560071379857e-01 / 2.0},  // 6-perm
    1190             :                 {0.12037553567715e+00, 0.32413434700070e+00, 0.55549011732214e+00, 0.1330964078762868e-01 / 2.0},  // 6-perm
    1191             :                 {0.14806689915737e+00, 0.22927748355598e+00, 0.62265561728665e+00, 0.1415444650522614e-01 / 2.0},  // 6-perm
    1192             :                 {0.19177186586733e+00, 0.32561812259598e+00, 0.48261001153669e+00, 0.1488137956116801e-01 / 2.0}   // 6-perm
    1193             :               };
    1194             : 
    1195             : 
    1196             :               // Now call the dunavant routine to generate _points and _weights
    1197           0 :               dunavant_rule(rule_data, 26);
    1198             : 
    1199           0 :               return;
    1200             :             }
    1201             : 
    1202             : 
    1203             : 
    1204             :             // 30th-order rule by Wandzura.
    1205             :             //
    1206             :             // Stephen Wandzura, Hong Xiao,
    1207             :             // Symmetric Quadrature Rules on a Triangle,
    1208             :             // Computers and Mathematics with Applications,
    1209             :             // Volume 45, Number 12, June 2003, pages 1829-1840.
    1210             :             //
    1211             :             // Wandzura's work extends the work of Dunavant by providing degree
    1212             :             // 5,10,15,20,25, and 30 rules with positive weights for the triangle.
    1213             :             //
    1214             :             // Copied on 3rd July 2008 from:
    1215             :             // http://people.scs.fsu.edu/~burkardt/f_src/wandzura/wandzura.f90
    1216           0 :           case TWENTYSIXTH:
    1217             :           case TWENTYSEVENTH:
    1218             :           case TWENTYEIGHTH:
    1219             :           case TWENTYNINTH:
    1220             :           case THIRTIETH:
    1221             :             {
    1222             :               // The equivalent conical product rule would have 256 points
    1223           0 :               _points.resize (175);
    1224           0 :               _weights.resize(175);
    1225             : 
    1226             :               // The raw data for the quadrature rule.
    1227           0 :               const Real rule_data[36][4] = {
    1228             :                 {0.33333333333333e+00,                  0.0,                  0.0, 0.1557996020289920e-01 / 2.0}, // 1-perm
    1229             :                 {0.00733011643277e+00, 0.49633494178362e+00,                  0.0, 0.3177233700534134e-02 / 2.0}, // 3-perm
    1230             :                 {0.08299567580296e+00, 0.45850216209852e+00,                  0.0, 0.1048342663573077e-01 / 2.0}, // 3-perm
    1231             :                 {0.15098095612541e+00, 0.42450952193729e+00,                  0.0, 0.1320945957774363e-01 / 2.0}, // 3-perm
    1232             :                 {0.23590585989217e+00, 0.38204707005392e+00,                  0.0, 0.1497500696627150e-01 / 2.0}, // 3-perm
    1233             :                 {0.43802430840785e+00, 0.28098784579608e+00,                  0.0, 0.1498790444338419e-01 / 2.0}, // 3-perm
    1234             :                 {0.54530204829193e+00, 0.22734897585403e+00,                  0.0, 0.1333886474102166e-01 / 2.0}, // 3-perm
    1235             :                 {0.65088177698254e+00, 0.17455911150873e+00,                  0.0, 0.1088917111390201e-01 / 2.0}, // 3-perm
    1236             :                 {0.75348314559713e+00, 0.12325842720144e+00,                  0.0, 0.8189440660893461e-02 / 2.0}, // 3-perm
    1237             :                 {0.83983154221561e+00, 0.08008422889220e+00,                  0.0, 0.5575387588607785e-02 / 2.0}, // 3-perm
    1238             :                 {0.90445106518420e+00, 0.04777446740790e+00,                  0.0, 0.3191216473411976e-02 / 2.0}, // 3-perm
    1239             :                 {0.95655897063972e+00, 0.02172051468014e+00,                  0.0, 0.1296715144327045e-02 / 2.0}, // 3-perm
    1240             :                 {0.99047064476913e+00, 0.00476467761544e+00,                  0.0, 0.2982628261349172e-03 / 2.0}, // 3-perm
    1241             :                 {0.00092537119335e+00, 0.41529527091331e+00, 0.58377935789334e+00, 0.9989056850788964e-03 / 2.0}, // 6-perm
    1242             :                 {0.00138592585556e+00, 0.06118990978535e+00, 0.93742416435909e+00, 0.4628508491732533e-03 / 2.0}, // 6-perm
    1243             :                 {0.00368241545591e+00, 0.16490869013691e+00, 0.83140889440718e+00, 0.1234451336382413e-02 / 2.0}, // 6-perm
    1244             :                 {0.00390322342416e+00, 0.02503506223200e+00, 0.97106171434384e+00, 0.5707198522432062e-03 / 2.0}, // 6-perm
    1245             :                 {0.00323324815501e+00, 0.30606446515110e+00, 0.69070228669389e+00, 0.1126946125877624e-02 / 2.0}, // 6-perm
    1246             :                 {0.00646743211224e+00, 0.10707328373022e+00, 0.88645928415754e+00, 0.1747866949407337e-02 / 2.0}, // 6-perm
    1247             :                 {0.00324747549133e+00, 0.22995754934558e+00, 0.76679497516308e+00, 0.1182818815031657e-02 / 2.0}, // 6-perm
    1248             :                 {0.00867509080675e+00, 0.33703663330578e+00, 0.65428827588746e+00, 0.1990839294675034e-02 / 2.0}, // 6-perm
    1249             :                 {0.01559702646731e+00, 0.05625657618206e+00, 0.92814639735063e+00, 0.1900412795035980e-02 / 2.0}, // 6-perm
    1250             :                 {0.01797672125369e+00, 0.40245137521240e+00, 0.57957190353391e+00, 0.4498365808817451e-02 / 2.0}, // 6-perm
    1251             :                 {0.01712424535389e+00, 0.24365470201083e+00, 0.73922105263528e+00, 0.3478719460274719e-02 / 2.0}, // 6-perm
    1252             :                 {0.02288340534658e+00, 0.16538958561453e+00, 0.81172700903888e+00, 0.4102399036723953e-02 / 2.0}, // 6-perm
    1253             :                 {0.03273759728777e+00, 0.09930187449585e+00, 0.86796052821639e+00, 0.4021761549744162e-02 / 2.0}, // 6-perm
    1254             :                 {0.03382101234234e+00, 0.30847833306905e+00, 0.65770065458860e+00, 0.6033164660795066e-02 / 2.0}, // 6-perm
    1255             :                 {0.03554761446002e+00, 0.46066831859211e+00, 0.50378406694787e+00, 0.3946290302129598e-02 / 2.0}, // 6-perm
    1256             :                 {0.05053979030687e+00, 0.21881529945393e+00, 0.73064491023920e+00, 0.6644044537680268e-02 / 2.0}, // 6-perm
    1257             :                 {0.05701471491573e+00, 0.37920955156027e+00, 0.56377573352399e+00, 0.8254305856078458e-02 / 2.0}, // 6-perm
    1258             :                 {0.06415280642120e+00, 0.14296081941819e+00, 0.79288637416061e+00, 0.6496056633406411e-02 / 2.0}, // 6-perm
    1259             :                 {0.08050114828763e+00, 0.28373128210592e+00, 0.63576756960645e+00, 0.9252778144146602e-02 / 2.0}, // 6-perm
    1260             :                 {0.10436706813453e+00, 0.19673744100444e+00, 0.69889549086103e+00, 0.9164920726294280e-02 / 2.0}, // 6-perm
    1261             :                 {0.11384489442875e+00, 0.35588914121166e+00, 0.53026596435959e+00, 0.1156952462809767e-01 / 2.0}, // 6-perm
    1262             :                 {0.14536348771552e+00, 0.25981868535191e+00, 0.59481782693256e+00, 0.1176111646760917e-01 / 2.0}, // 6-perm
    1263             :                 {0.18994565282198e+00, 0.32192318123130e+00, 0.48813116594672e+00, 0.1382470218216540e-01 / 2.0}  // 6-perm
    1264             :               };
    1265             : 
    1266             : 
    1267             :               // Now call the dunavant routine to generate _points and _weights
    1268           0 :               dunavant_rule(rule_data, 36);
    1269             : 
    1270           0 :               return;
    1271             :             }
    1272             : 
    1273             : 
    1274             :             // By default, we fall back on the conical product rules.  If the user
    1275             :             // requests an order higher than what is currently available in the 1D
    1276             :             // rules, an error will be thrown from the respective 1D code.
    1277           0 :           default:
    1278             :             {
    1279             :               // The following quadrature rules are generated as
    1280             :               // conical products.  These tend to be non-optimal
    1281             :               // (use too many points, cluster points in certain
    1282             :               // regions of the domain) but they are quite easy to
    1283             :               // automatically generate using a 1D Gauss rule on
    1284             :               // [0,1] and two 1D Jacobi-Gauss rules on [0,1].
    1285           0 :               QConical conical_rule(2, _order);
    1286           0 :               conical_rule.init(*this);
    1287             : 
    1288             :               // Swap points and weights with the about-to-be destroyed rule.
    1289           0 :               _points.swap (conical_rule.get_points() );
    1290           0 :               _weights.swap(conical_rule.get_weights());
    1291             : 
    1292           0 :               return;
    1293             :             }
    1294             :           }
    1295             :       }
    1296             : 
    1297             : 
    1298             :       //---------------------------------------------
    1299             :       // Arbitrary polygon quadrature rules
    1300         800 :     case C0POLYGON:
    1301             :       {
    1302         851 :         QGauss tri_rule(2, _order);
    1303         800 :         tri_rule.init(TRI3, _p_level, true);
    1304             : 
    1305          51 :         std::vector<Point> & tripoints = tri_rule.get_points();
    1306          51 :         std::vector<Real> & triweights = tri_rule.get_weights();
    1307             : 
    1308         102 :         std::size_t numtripts = tripoints.size();
    1309             : 
    1310             :         // C0Polygon requires the newer Quadrature API
    1311         800 :         if (!_elem)
    1312           0 :           libmesh_error();
    1313             : 
    1314          51 :         libmesh_assert(_elem->type() == C0POLYGON);
    1315             : 
    1316          51 :         const C0Polygon & poly = *cast_ptr<const C0Polygon *>(_elem);
    1317             : 
    1318         800 :         std::size_t numtris = poly.n_subtriangles();
    1319         800 :         _points.resize(numtripts*numtris);
    1320         800 :         _weights.resize(numtripts*numtris);
    1321        3129 :         for (std::size_t t = 0; t != numtris; ++t)
    1322             :           {
    1323        2329 :             auto master_points = poly.master_subtriangle(t);
    1324             : 
    1325             :             // The factor of one half from the triweights cancels out
    1326             :             // the factor of two here, so we don't need to do so
    1327             :             // ourselves.
    1328             :             const Real twice_master_tri_area =
    1329        2329 :               (- master_points[1](1) * master_points[2](0)
    1330        2329 :                - master_points[0](1) * master_points[1](0)
    1331        2329 :                + master_points[0](1) * master_points[2](0)
    1332        2329 :                + master_points[0](0) * master_points[1](1)
    1333        2329 :                - master_points[0](0) * master_points[2](1)
    1334        2329 :                + master_points[1](0) * master_points[2](1));
    1335             : 
    1336         151 :             const Point v01 = master_points[1] - master_points[0];
    1337         151 :             const Point v02 = master_points[2] - master_points[0];
    1338             : 
    1339       13049 :             for (std::size_t i = 0; i != numtripts; ++i)
    1340             :               {
    1341       10720 :                 _points[numtripts*t+i] =
    1342         721 :                   master_points[0] +
    1343        2163 :                   v01 * tripoints[i](0) +
    1344        2884 :                   v02 * tripoints[i](1);
    1345       12162 :                 _weights[numtripts*t+i] = triweights[i] *
    1346             :                                           twice_master_tri_area;
    1347             :               }
    1348             :           }
    1349          51 :         return;
    1350             :       }
    1351             : 
    1352             :       //---------------------------------------------
    1353             :       // Unsupported type
    1354           0 :     default:
    1355           0 :       libmesh_error_msg("Element type not supported:" << Utility::enum_to_string(_type));
    1356             :     }
    1357             : #endif
    1358             : }
    1359             : 
    1360             : } // namespace libMesh

Generated by: LCOV version 1.14