quadrature_gauss_2D.C
Go to the documentation of this file.00001 // The libMesh Finite Element Library. 00002 // Copyright (C) 2002-2012 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner 00003 00004 // This library is free software; you can redistribute it and/or 00005 // modify it under the terms of the GNU Lesser General Public 00006 // License as published by the Free Software Foundation; either 00007 // version 2.1 of the License, or (at your option) any later version. 00008 00009 // This library is distributed in the hope that it will be useful, 00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 // Lesser General Public License for more details. 00013 00014 // You should have received a copy of the GNU Lesser General Public 00015 // License along with this library; if not, write to the Free Software 00016 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00017 00018 00019 00020 // Local includes 00021 #include "libmesh/quadrature_gauss.h" 00022 #include "libmesh/quadrature_conical.h" 00023 00024 namespace libMesh 00025 { 00026 00027 00028 void QGauss::init_2D(const ElemType type_in, 00029 unsigned int p) 00030 { 00031 #if LIBMESH_DIM > 1 00032 00033 //----------------------------------------------------------------------- 00034 // 2D quadrature rules 00035 switch (type_in) 00036 { 00037 00038 00039 //--------------------------------------------- 00040 // Quadrilateral quadrature rules 00041 case QUAD4: 00042 case QUAD8: 00043 case QUAD9: 00044 { 00045 // We compute the 2D quadrature rule as a tensor 00046 // product of the 1D quadrature rule. 00047 // 00048 // For QUADs, a quadrature rule of order 'p' must be able to integrate 00049 // bilinear (p=1), biquadratic (p=2), bicubic (p=3), etc. polynomials of the form 00050 // 00051 // (x^p + x^{p-1} + ... + 1) * (y^p + y^{p-1} + ... + 1) 00052 // 00053 // These polynomials have terms *up to* degree 2p but they are *not* complete 00054 // polynomials of degree 2p. For example, when p=2 we have 00055 // 1 00056 // x y 00057 // x^2 xy y^2 00058 // yx^2 xy^2 00059 // x^2y^2 00060 QGauss q1D(1,_order); 00061 q1D.init(EDGE2,p); 00062 tensor_product_quad( q1D ); 00063 return; 00064 } 00065 00066 00067 //--------------------------------------------- 00068 // Triangle quadrature rules 00069 case TRI3: 00070 case TRI6: 00071 { 00072 switch(_order + 2*p) 00073 { 00074 case CONSTANT: 00075 case FIRST: 00076 { 00077 // Exact for linears 00078 _points.resize(1); 00079 _weights.resize(1); 00080 00081 _points[0](0) = 1.0L/3.0L; 00082 _points[0](1) = 1.0L/3.0L; 00083 00084 _weights[0] = 0.5; 00085 00086 return; 00087 } 00088 case SECOND: 00089 { 00090 // Exact for quadratics 00091 _points.resize(3); 00092 _weights.resize(3); 00093 00094 // Alternate rule with points on ref. elt. boundaries. 00095 // Not ideal for problems with material coefficient discontinuities 00096 // aligned along element boundaries. 00097 // _points[0](0) = .5; 00098 // _points[0](1) = .5; 00099 // _points[1](0) = 0.; 00100 // _points[1](1) = .5; 00101 // _points[2](0) = .5; 00102 // _points[2](1) = .0; 00103 00104 _points[0](0) = 2.0L/3.0L; 00105 _points[0](1) = 1.0L/6.0L; 00106 00107 _points[1](0) = 1.0L/6.0L; 00108 _points[1](1) = 2.0L/3.0L; 00109 00110 _points[2](0) = 1.0L/6.0L; 00111 _points[2](1) = 1.0L/6.0L; 00112 00113 00114 _weights[0] = 1.0L/6.0L; 00115 _weights[1] = 1.0L/6.0L; 00116 _weights[2] = 1.0L/6.0L; 00117 00118 return; 00119 } 00120 case THIRD: 00121 { 00122 // Exact for cubics 00123 _points.resize(4); 00124 _weights.resize(4); 00125 00126 // This rule is formed from a tensor product of 00127 // appropriately-scaled Gauss and Jacobi rules. (See 00128 // also the QConical quadrature class, this is a 00129 // hard-coded version of one of those rules.) For high 00130 // orders these rules generally have too many points, 00131 // but at extremely low order they are competitive and 00132 // have the additional benefit of having all positive 00133 // weights. 00134 _points[0](0) = 1.5505102572168219018027159252941e-01L; 00135 _points[0](1) = 1.7855872826361642311703513337422e-01L; 00136 _points[1](0) = 6.4494897427831780981972840747059e-01L; 00137 _points[1](1) = 7.5031110222608118177475598324603e-02L; 00138 _points[2](0) = 1.5505102572168219018027159252941e-01L; 00139 _points[2](1) = 6.6639024601470138670269327409637e-01L; 00140 _points[3](0) = 6.4494897427831780981972840747059e-01L; 00141 _points[3](1) = 2.8001991549907407200279599420481e-01L; 00142 00143 _weights[0] = 1.5902069087198858469718450103758e-01L; 00144 _weights[1] = 9.0979309128011415302815498962418e-02L; 00145 _weights[2] = 1.5902069087198858469718450103758e-01L; 00146 _weights[3] = 9.0979309128011415302815498962418e-02L; 00147 00148 return; 00149 00150 00151 // The following third-order rule is quite commonly cited 00152 // in the literature and most likely works fine. However, 00153 // we generally prefer a rule with all positive weights 00154 // and an equal number of points, when available. 00155 // 00156 // (allow_rules_with_negative_weights) 00157 // { 00158 // // Exact for cubics 00159 // _points.resize(4); 00160 // _weights.resize(4); 00161 // 00162 // _points[0](0) = .33333333333333333333333333333333; 00163 // _points[0](1) = .33333333333333333333333333333333; 00164 // 00165 // _points[1](0) = .2; 00166 // _points[1](1) = .6; 00167 // 00168 // _points[2](0) = .2; 00169 // _points[2](1) = .2; 00170 // 00171 // _points[3](0) = .6; 00172 // _points[3](1) = .2; 00173 // 00174 // 00175 // _weights[0] = -27./96.; 00176 // _weights[1] = 25./96.; 00177 // _weights[2] = 25./96.; 00178 // _weights[3] = 25./96.; 00179 // 00180 // return; 00181 // } // end if (allow_rules_with_negative_weights) 00182 // Note: if !allow_rules_with_negative_weights, fall through to next case. 00183 } 00184 00185 00186 00187 // A degree 4 rule with six points. This rule can be found in many places 00188 // including: 00189 // 00190 // J.N. Lyness and D. Jespersen, Moderate degree symmetric 00191 // quadrature rules for the triangle, J. Inst. Math. Appl. 15 (1975), 00192 // 19--32. 00193 // 00194 // We used the code in: 00195 // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules 00196 // on triangles and tetrahedra" Journal of Computational Mathematics, 00197 // v. 27, no. 1, 2009, pp. 89-96. 00198 // to generate additional precision. 00199 case FOURTH: 00200 { 00201 const unsigned int n_wts = 2; 00202 const Real wts[n_wts] = 00203 { 00204 1.1169079483900573284750350421656140e-01L, 00205 5.4975871827660933819163162450105264e-02L 00206 }; 00207 00208 const Real a[n_wts] = 00209 { 00210 4.4594849091596488631832925388305199e-01L, 00211 9.1576213509770743459571463402201508e-02L 00212 }; 00213 00214 const Real b[n_wts] = {0., 0.}; // not used 00215 const unsigned int permutation_ids[n_wts] = {3, 3}; 00216 00217 dunavant_rule2(wts, a, b, permutation_ids, n_wts); // 6 total points 00218 00219 return; 00220 } 00221 00222 00223 00224 // Exact for quintics 00225 // Can be found in "Quadrature on Simplices of Arbitrary 00226 // Dimension" by Walkington. 00227 case FIFTH: 00228 { 00229 const unsigned int n_wts = 3; 00230 const Real wts[n_wts] = 00231 { 00232 static_cast<Real>(9.0L/80.0L), 00233 static_cast<Real>(31.0L/480.0L + std::sqrt(15.0L)/2400.0L), 00234 static_cast<Real>(31.0L/480.0L - std::sqrt(15.0L)/2400.0L) 00235 }; 00236 00237 const Real a[n_wts] = 00238 { 00239 0., // 'a' parameter not used for origin permutation 00240 static_cast<Real>(2.0L/7.0L + std::sqrt(15.0L)/21.0L), 00241 static_cast<Real>(2.0L/7.0L - std::sqrt(15.0L)/21.0L) 00242 }; 00243 00244 const Real b[n_wts] = {0., 0., 0.}; // not used 00245 const unsigned int permutation_ids[n_wts] = {1, 3, 3}; 00246 00247 dunavant_rule2(wts, a, b, permutation_ids, n_wts); // 7 total points 00248 00249 return; 00250 } 00251 00252 00253 00254 // A degree 6 rule with 12 points. This rule can be found in many places 00255 // including: 00256 // 00257 // J.N. Lyness and D. Jespersen, Moderate degree symmetric 00258 // quadrature rules for the triangle, J. Inst. Math. Appl. 15 (1975), 00259 // 19--32. 00260 // 00261 // We used the code in: 00262 // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules 00263 // on triangles and tetrahedra" Journal of Computational Mathematics, 00264 // v. 27, no. 1, 2009, pp. 89-96. 00265 // to generate additional precision. 00266 // 00267 // Note that the following 7th-order Ro3-invariant rule also has only 12 points, 00268 // which technically makes it the superior rule. This one is here for completeness. 00269 case SIXTH: 00270 { 00271 const unsigned int n_wts = 3; 00272 const Real wts[n_wts] = 00273 { 00274 5.8393137863189683012644805692789721e-02L, 00275 2.5422453185103408460468404553434492e-02L, 00276 4.1425537809186787596776728210221227e-02L 00277 }; 00278 00279 const Real a[n_wts] = 00280 { 00281 2.4928674517091042129163855310701908e-01L, 00282 6.3089014491502228340331602870819157e-02L, 00283 3.1035245103378440541660773395655215e-01L 00284 }; 00285 00286 const Real b[n_wts] = 00287 { 00288 0., 00289 0., 00290 6.3650249912139864723014259441204970e-01L 00291 }; 00292 00293 const unsigned int permutation_ids[n_wts] = {3, 3, 6}; // 12 total points 00294 00295 dunavant_rule2(wts, a, b, permutation_ids, n_wts); 00296 00297 return; 00298 } 00299 00300 00301 // A degree 7 rule with 12 points. This rule can be found in: 00302 // 00303 // K. Gatermann, The construction of symmetric cubature 00304 // formulas for the square and the triangle, Computing 40 00305 // (1988), 229--240. 00306 // 00307 // This rule, which is provably minimal in the number of 00308 // integration points, is said to be 'Ro3 invariant' which 00309 // means that a given set of barycentric coordinates 00310 // (z1,z2,z3) implies the quadrature points (z1,z2), 00311 // (z3,z1), (z2,z3) which are formed by taking the first 00312 // two entries in cyclic permutations of the barycentric 00313 // point. Barycentric coordinates are related in the 00314 // sense that: z3 = 1 - z1 - z2. 00315 // 00316 // The 12-point sixth-order rule for triangles given in 00317 // Flaherty's (http://www.cs.rpi.edu/~flaherje/FEM/fem6.ps) 00318 // lecture notes has been removed in favor of this rule 00319 // which is higher-order (for the same number of 00320 // quadrature points) and has a few more digits of 00321 // precision in the points and weights. Some 10-point 00322 // degree 6 rules exist for the triangle but they have 00323 // quadrature points outside the region of integration. 00324 case SEVENTH: 00325 { 00326 _points.resize (12); 00327 _weights.resize(12); 00328 00329 const unsigned int nrows=4; 00330 00331 // In each of the rows below, the first two entries are (z1, z2) which imply 00332 // z3. The third entry is the weight for each of the points in the cyclic permutation. 00333 const Real rule_data[nrows][3] = { 00334 {6.2382265094402118e-02, 6.7517867073916085e-02, 2.6517028157436251e-02}, // group A 00335 {5.5225456656926611e-02, 3.2150249385198182e-01, 4.3881408714446055e-02}, // group B 00336 {3.4324302945097146e-02, 6.6094919618673565e-01, 2.8775042784981585e-02}, // group C 00337 {5.1584233435359177e-01, 2.7771616697639178e-01, 6.7493187009802774e-02} // group D 00338 }; 00339 00340 for (unsigned int i=0, offset=0; i<nrows; ++i) 00341 { 00342 _points[offset + 0] = Point(rule_data[i][0], rule_data[i][1]); // (z1,z2) 00343 _points[offset + 1] = Point(1.-rule_data[i][0]-rule_data[i][1], rule_data[i][0]); // (z3,z1) 00344 _points[offset + 2] = Point(rule_data[i][1], 1.-rule_data[i][0]-rule_data[i][1]); // (z2,z3) 00345 00346 // All these points get the same weight 00347 _weights[offset + 0] = rule_data[i][2]; 00348 _weights[offset + 1] = rule_data[i][2]; 00349 _weights[offset + 2] = rule_data[i][2]; 00350 00351 // Increment offset 00352 offset += 3; 00353 } 00354 00355 return; 00356 00357 00358 // // The following is an inferior 7th-order Lyness-style rule with 15 points. 00359 // // It's here only for completeness and the Ro3-invariant rule above should 00360 // // be used instead! 00361 // const unsigned int n_wts = 3; 00362 // const Real wts[n_wts] = 00363 // { 00364 // 2.6538900895116205835977487499847719e-02L, 00365 // 3.5426541846066783659206291623201826e-02L, 00366 // 3.4637341039708446756138297960207647e-02L 00367 // }; 00368 // 00369 // const Real a[n_wts] = 00370 // { 00371 // 6.4930513159164863078379776030396538e-02L, 00372 // 2.8457558424917033519741605734978046e-01L, 00373 // 3.1355918438493150795585190219862865e-01L 00374 // }; 00375 // 00376 // const Real b[n_wts] = 00377 // { 00378 // 0., 00379 // 1.9838447668150671917987659863332941e-01L, 00380 // 4.3863471792372471511798695971295936e-02L 00381 // }; 00382 // 00383 // const unsigned int permutation_ids[n_wts] = {3, 6, 6}; // 15 total points 00384 // 00385 // dunavant_rule2(wts, a, b, permutation_ids, n_wts); 00386 // 00387 // return; 00388 } 00389 00390 00391 00392 00393 // Another Dunavant rule. This one has all positive weights. This rule has 00394 // 16 points while a comparable conical product rule would have 5*5=25. 00395 // 00396 // It was copied 23rd June 2008 from: 00397 // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90 00398 // 00399 // Additional precision obtained from the code in: 00400 // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules 00401 // on triangles and tetrahedra" Journal of Computational Mathematics, 00402 // v. 27, no. 1, 2009, pp. 89-96. 00403 case EIGHTH: 00404 { 00405 const unsigned int n_wts = 5; 00406 const Real wts[n_wts] = 00407 { 00408 7.2157803838893584125545555244532310e-02L, 00409 4.7545817133642312396948052194292159e-02L, 00410 5.1608685267359125140895775146064515e-02L, 00411 1.6229248811599040155462964170890299e-02L, 00412 1.3615157087217497132422345036954462e-02L 00413 }; 00414 00415 const Real a[n_wts] = 00416 { 00417 0.0, // 'a' parameter not used for origin permutation 00418 4.5929258829272315602881551449416932e-01L, 00419 1.7056930775176020662229350149146450e-01L, 00420 5.0547228317030975458423550596598947e-02L, 00421 2.6311282963463811342178578628464359e-01L, 00422 }; 00423 00424 const Real b[n_wts] = 00425 { 00426 0., 00427 0., 00428 0., 00429 0., 00430 7.2849239295540428124100037917606196e-01L 00431 }; 00432 00433 const unsigned int permutation_ids[n_wts] = {1, 3, 3, 3, 6}; // 16 total points 00434 00435 dunavant_rule2(wts, a, b, permutation_ids, n_wts); 00436 00437 return; 00438 } 00439 00440 00441 00442 // Another Dunavant rule. This one has all positive weights. This rule has 19 00443 // points. The comparable conical product rule would have 25. 00444 // It was copied 23rd June 2008 from: 00445 // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90 00446 // 00447 // Additional precision obtained from the code in: 00448 // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules 00449 // on triangles and tetrahedra" Journal of Computational Mathematics, 00450 // v. 27, no. 1, 2009, pp. 89-96. 00451 case NINTH: 00452 { 00453 const unsigned int n_wts = 6; 00454 const Real wts[n_wts] = 00455 { 00456 4.8567898141399416909620991253644315e-02L, 00457 1.5667350113569535268427415643604658e-02L, 00458 1.2788837829349015630839399279499912e-02L, 00459 3.8913770502387139658369678149701978e-02L, 00460 3.9823869463605126516445887132022637e-02L, 00461 2.1641769688644688644688644688644689e-02L 00462 }; 00463 00464 const Real a[n_wts] = 00465 { 00466 0.0, // 'a' parameter not used for origin permutation 00467 4.8968251919873762778370692483619280e-01L, 00468 4.4729513394452709865106589966276365e-02L, 00469 4.3708959149293663726993036443535497e-01L, 00470 1.8820353561903273024096128046733557e-01L, 00471 2.2196298916076569567510252769319107e-01L 00472 }; 00473 00474 const Real b[n_wts] = 00475 { 00476 0., 00477 0., 00478 0., 00479 0., 00480 0., 00481 7.4119859878449802069007987352342383e-01L 00482 }; 00483 00484 const unsigned int permutation_ids[n_wts] = {1, 3, 3, 3, 3, 6}; // 19 total points 00485 00486 dunavant_rule2(wts, a, b, permutation_ids, n_wts); 00487 00488 return; 00489 } 00490 00491 00492 // Another Dunavant rule with all positive weights. This rule has 25 00493 // points. The comparable conical product rule would have 36. 00494 // It was copied 23rd June 2008 from: 00495 // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90 00496 // 00497 // Additional precision obtained from the code in: 00498 // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules 00499 // on triangles and tetrahedra" Journal of Computational Mathematics, 00500 // v. 27, no. 1, 2009, pp. 89-96. 00501 case TENTH: 00502 { 00503 const unsigned int n_wts = 6; 00504 const Real wts[n_wts] = 00505 { 00506 4.5408995191376790047643297550014267e-02L, 00507 1.8362978878233352358503035945683300e-02L, 00508 2.2660529717763967391302822369298659e-02L, 00509 3.6378958422710054302157588309680344e-02L, 00510 1.4163621265528742418368530791049552e-02L, 00511 4.7108334818664117299637354834434138e-03L 00512 }; 00513 00514 const Real a[n_wts] = 00515 { 00516 0.0, // 'a' parameter not used for origin permutation 00517 4.8557763338365737736750753220812615e-01L, 00518 1.0948157548503705479545863134052284e-01L, 00519 3.0793983876412095016515502293063162e-01L, 00520 2.4667256063990269391727646541117681e-01L, 00521 6.6803251012200265773540212762024737e-02L 00522 }; 00523 00524 const Real b[n_wts] = 00525 { 00526 0., 00527 0., 00528 0., 00529 5.5035294182099909507816172659300821e-01L, 00530 7.2832390459741092000873505358107866e-01L, 00531 9.2365593358750027664630697761508843e-01L 00532 }; 00533 00534 const unsigned int permutation_ids[n_wts] = {1, 3, 3, 6, 6, 6}; // 25 total points 00535 00536 dunavant_rule2(wts, a, b, permutation_ids, n_wts); 00537 00538 return; 00539 } 00540 00541 00542 // Dunavant's 11th-order rule contains points outside the region of 00543 // integration, and is thus unacceptable for our FEM calculations. 00544 // 00545 // This 30-point, 11th-order rule was obtained by me [JWP] using the code in 00546 // 00547 // Additional precision obtained from the code in: 00548 // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules 00549 // on triangles and tetrahedra" Journal of Computational Mathematics, 00550 // v. 27, no. 1, 2009, pp. 89-96. 00551 // 00552 // Note: the 28-point 11th-order rule obtained by Zhang in the paper above 00553 // does not appear to be unique. It is a solution in the sense that it 00554 // minimizes the error in the least-squares minimization problem, but 00555 // it involves too many unknowns and the Jacobian is therefore singular 00556 // when attempting to improve the solution via Newton's method. 00557 case ELEVENTH: 00558 { 00559 const unsigned int n_wts = 6; 00560 const Real wts[n_wts] = 00561 { 00562 3.6089021198604635216985338480426484e-02L, 00563 2.1607717807680420303346736867931050e-02L, 00564 3.1144524293927978774861144478241807e-03L, 00565 2.9086855161081509446654185084988077e-02L, 00566 8.4879241614917017182977532679947624e-03L, 00567 1.3795732078224796530729242858347546e-02L 00568 }; 00569 00570 const Real a[n_wts] = 00571 { 00572 3.9355079629947969884346551941969960e-01L, 00573 4.7979065808897448654107733982929214e-01L, 00574 5.1003445645828061436081405648347852e-03L, 00575 2.6597620190330158952732822450744488e-01L, 00576 2.8536418538696461608233522814483715e-01L, 00577 1.3723536747817085036455583801851025e-01L 00578 }; 00579 00580 const Real b[n_wts] = 00581 { 00582 0., 00583 0., 00584 5.6817155788572446538150614865768991e-02L, 00585 1.2539956353662088473247489775203396e-01L, 00586 1.2409970153698532116262152247041742e-02L, 00587 5.2792057988217708934207928630851643e-02L 00588 }; 00589 00590 const unsigned int permutation_ids[n_wts] = {3, 3, 6, 6, 6, 6}; // 30 total points 00591 00592 dunavant_rule2(wts, a, b, permutation_ids, n_wts); 00593 00594 return; 00595 } 00596 00597 00598 00599 00600 // Another Dunavant rule with all positive weights. This rule has 33 00601 // points. The comparable conical product rule would have 36 (ELEVENTH) or 49 (TWELFTH). 00602 // 00603 // It was copied 23rd June 2008 from: 00604 // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90 00605 // 00606 // Additional precision obtained from the code in: 00607 // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules 00608 // on triangles and tetrahedra" Journal of Computational Mathematics, 00609 // v. 27, no. 1, 2009, pp. 89-96. 00610 case TWELFTH: 00611 { 00612 const unsigned int n_wts = 8; 00613 const Real wts[n_wts] = 00614 { 00615 3.0831305257795086169332418926151771e-03L, 00616 3.1429112108942550177135256546441273e-02L, 00617 1.7398056465354471494664198647499687e-02L, 00618 2.1846272269019201067728631278737487e-02L, 00619 1.2865533220227667708895461535782215e-02L, 00620 1.1178386601151722855919538351159995e-02L, 00621 8.6581155543294461858210504055170332e-03L, 00622 2.0185778883190464758914349626118386e-02L 00623 }; 00624 00625 const Real a[n_wts] = 00626 { 00627 2.1317350453210370246856975515728246e-02L, 00628 2.7121038501211592234595134039689474e-01L, 00629 1.2757614554158592467389632515428357e-01L, 00630 4.3972439229446027297973662348436108e-01L, 00631 4.8821738977380488256466206525881104e-01L, 00632 2.8132558098993954824813069297455275e-01L, 00633 1.1625191590759714124135414784260182e-01L, 00634 2.7571326968551419397479634607976398e-01L 00635 }; 00636 00637 const Real b[n_wts] = 00638 { 00639 0., 00640 0., 00641 0., 00642 0., 00643 0., 00644 6.9583608678780342214163552323607254e-01L, 00645 8.5801403354407263059053661662617818e-01L, 00646 6.0894323577978780685619243776371007e-01L 00647 }; 00648 00649 const unsigned int permutation_ids[n_wts] = {3, 3, 3, 3, 3, 6, 6, 6}; // 33 total points 00650 00651 dunavant_rule2(wts, a, b, permutation_ids, n_wts); 00652 00653 return; 00654 } 00655 00656 00657 // Another Dunavant rule with all positive weights. This rule has 37 00658 // points. The comparable conical product rule would have 49 points. 00659 // 00660 // It was copied 23rd June 2008 from: 00661 // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90 00662 // 00663 // A second rule with additional precision obtained from the code in: 00664 // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules 00665 // on triangles and tetrahedra" Journal of Computational Mathematics, 00666 // v. 27, no. 1, 2009, pp. 89-96. 00667 case THIRTEENTH: 00668 { 00669 const unsigned int n_wts = 9; 00670 const Real wts[n_wts] = 00671 { 00672 3.3980018293415822140887212340442440e-02L, 00673 2.7800983765226664353628733005230734e-02L, 00674 2.9139242559599990702383541756669905e-02L, 00675 3.0261685517695859208964000161454122e-03L, 00676 1.1997200964447365386855399725479827e-02L, 00677 1.7320638070424185232993414255459110e-02L, 00678 7.4827005525828336316229285664517190e-03L, 00679 1.2089519905796909568722872786530380e-02L, 00680 4.7953405017716313612975450830554457e-03L 00681 }; 00682 00683 const Real a[n_wts] = 00684 { 00685 0., // 'a' parameter not used for origin permutation 00686 4.2694141425980040602081253503137421e-01L, 00687 2.2137228629183290065481255470507908e-01L, 00688 2.1509681108843183869291313534052083e-02L, 00689 4.8907694645253934990068971909020439e-01L, 00690 3.0844176089211777465847185254124531e-01L, 00691 1.1092204280346339541286954522167452e-01L, 00692 1.6359740106785048023388790171095725e-01L, 00693 2.7251581777342966618005046435408685e-01L 00694 }; 00695 00696 const Real b[n_wts] = 00697 { 00698 0., 00699 0., 00700 0., 00701 0., 00702 0., 00703 6.2354599555367557081585435318623659e-01L, 00704 8.6470777029544277530254595089569318e-01L, 00705 7.4850711589995219517301859578870965e-01L, 00706 7.2235779312418796526062013230478405e-01L 00707 }; 00708 00709 const unsigned int permutation_ids[n_wts] = {1, 3, 3, 3, 3, 6, 6, 6, 6}; // 37 total points 00710 00711 dunavant_rule2(wts, a, b, permutation_ids, n_wts); 00712 00713 return; 00714 } 00715 00716 00717 // Another Dunavant rule. This rule has 42 points, while 00718 // a comparable conical product rule would have 64. 00719 // 00720 // It was copied 23rd June 2008 from: 00721 // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90 00722 // 00723 // Additional precision obtained from the code in: 00724 // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules 00725 // on triangles and tetrahedra" Journal of Computational Mathematics, 00726 // v. 27, no. 1, 2009, pp. 89-96. 00727 case FOURTEENTH: 00728 { 00729 const unsigned int n_wts = 10; 00730 const Real wts[n_wts] = 00731 { 00732 1.0941790684714445320422472981662986e-02L, 00733 1.6394176772062675320655489369312672e-02L, 00734 2.5887052253645793157392455083198201e-02L, 00735 2.1081294368496508769115218662093065e-02L, 00736 7.2168498348883338008549607403266583e-03L, 00737 2.4617018012000408409130117545210774e-03L, 00738 1.2332876606281836981437622591818114e-02L, 00739 1.9285755393530341614244513905205430e-02L, 00740 7.2181540567669202480443459995079017e-03L, 00741 2.5051144192503358849300465412445582e-03L 00742 }; 00743 00744 const Real a[n_wts] = 00745 { 00746 4.8896391036217863867737602045239024e-01L, 00747 4.1764471934045392250944082218564344e-01L, 00748 2.7347752830883865975494428326269856e-01L, 00749 1.7720553241254343695661069046505908e-01L, 00750 6.1799883090872601267478828436935788e-02L, 00751 1.9390961248701048178250095054529511e-02L, 00752 1.7226668782135557837528960161365733e-01L, 00753 3.3686145979634500174405519708892539e-01L, 00754 2.9837288213625775297083151805961273e-01L, 00755 1.1897449769695684539818196192990548e-01L 00756 }; 00757 00758 const Real b[n_wts] = 00759 { 00760 0., 00761 0., 00762 0., 00763 0., 00764 0., 00765 0., 00766 7.7060855477499648258903327416742796e-01L, 00767 5.7022229084668317349769621336235426e-01L, 00768 6.8698016780808783735862715402031306e-01L, 00769 8.7975717137017112951457163697460183e-01L 00770 }; 00771 00772 const unsigned int permutation_ids[n_wts] 00773 = {3, 3, 3, 3, 3, 3, 6, 6, 6, 6}; // 42 total points 00774 00775 dunavant_rule2(wts, a, b, permutation_ids, n_wts); 00776 00777 return; 00778 } 00779 00780 00781 // This 49-point rule was found by me [JWP] using the code in: 00782 // 00783 // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules 00784 // on triangles and tetrahedra" Journal of Computational Mathematics, 00785 // v. 27, no. 1, 2009, pp. 89-96. 00786 // 00787 // A 54-point, 15th-order rule is reported by 00788 // 00789 // Stephen Wandzura, Hong Xiao, 00790 // Symmetric Quadrature Rules on a Triangle, 00791 // Computers and Mathematics with Applications, 00792 // Volume 45, Number 12, June 2003, pages 1829-1840. 00793 // 00794 // can be found here: 00795 // http://people.scs.fsu.edu/~burkardt/f_src/wandzura/wandzura.f90 00796 // 00797 // but this 49-point rule is superior. 00798 case FIFTEENTH: 00799 { 00800 const unsigned int n_wts = 11; 00801 const Real wts[n_wts] = 00802 { 00803 2.4777380743035579804788826970198951e-02L, 00804 9.2433943023307730591540642828347660e-03L, 00805 2.2485768962175402793245929133296627e-03L, 00806 6.7052581900064143760518398833360903e-03L, 00807 1.9011381726930579256700190357527956e-02L, 00808 1.4605445387471889398286155981802858e-02L, 00809 1.5087322572773133722829435011138258e-02L, 00810 1.5630213780078803020711746273129099e-02L, 00811 6.1808086085778203192616856133701233e-03L, 00812 3.2209366452594664857296985751120513e-03L, 00813 5.8747373242569702667677969985668817e-03L 00814 }; 00815 00816 const Real a[n_wts] = 00817 { 00818 0.0, // 'a' parameter not used for origin 00819 7.9031013655541635005816956762252155e-02L, 00820 1.8789501810770077611247984432284226e-02L, 00821 4.9250168823249670532514526605352905e-01L, 00822 4.0886316907744105975059040108092775e-01L, 00823 5.3877851064220142445952549348423733e-01L, 00824 2.0250549804829997692885033941362673e-01L, 00825 5.5349674918711643207148086558288110e-01L, 00826 7.8345022567320812359258882143250181e-01L, 00827 8.9514624528794883409864566727625002e-01L, 00828 3.2515745241110782862789881780746490e-01L 00829 }; 00830 00831 const Real b[n_wts] = 00832 { 00833 0., 00834 0., 00835 0., 00836 0., 00837 0., 00838 1.9412620368774630292701241080996842e-01L, 00839 9.8765911355712115933807754318089099e-02L, 00840 7.7663767064308164090246588765178087e-02L, 00841 2.1594628433980258573654682690950798e-02L, 00842 1.2563596287784997705599005477153617e-02L, 00843 1.5082654870922784345283124845552190e-02L 00844 }; 00845 00846 const unsigned int permutation_ids[n_wts] 00847 = {1, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6}; // 49 total points 00848 00849 dunavant_rule2(wts, a, b, permutation_ids, n_wts); 00850 00851 return; 00852 } 00853 00854 00855 00856 00857 // Dunavant's 16th-order rule contains points outside the region of 00858 // integration, and is thus unacceptable for our FEM calculations. 00859 // 00860 // This 55-point, 16th-order rule was obtained by me [JWP] using the code in 00861 // 00862 // Additional precision obtained from the code in: 00863 // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules 00864 // on triangles and tetrahedra" Journal of Computational Mathematics, 00865 // v. 27, no. 1, 2009, pp. 89-96. 00866 // 00867 // Note: the 55-point 16th-order rule obtained by Zhang in the paper above 00868 // does not appear to be unique. It is a solution in the sense that it 00869 // minimizes the error in the least-squares minimization problem, but 00870 // it involves too many unknowns and the Jacobian is therefore singular 00871 // when attempting to improve the solution via Newton's method. 00872 case SIXTEENTH: 00873 { 00874 const unsigned int n_wts = 12; 00875 const Real wts[n_wts] = 00876 { 00877 2.2668082505910087151996321171534230e-02L, 00878 8.4043060714818596159798961899306135e-03L, 00879 1.0850949634049747713966288634484161e-03L, 00880 7.2252773375423638869298219383808751e-03L, 00881 1.2997715227338366024036316182572871e-02L, 00882 2.0054466616677715883228810959112227e-02L, 00883 9.7299841600417010281624372720122710e-03L, 00884 1.1651974438298104227427176444311766e-02L, 00885 9.1291185550484450744725847363097389e-03L, 00886 3.5568614040947150231712567900113671e-03L, 00887 5.8355861686234326181790822005304303e-03L, 00888 4.7411314396804228041879331486234396e-03L 00889 }; 00890 00891 const Real a[n_wts] = 00892 { 00893 0.0, // 'a' parameter not used for centroid weight 00894 8.5402539407933203673769900926355911e-02L, 00895 1.2425572001444092841183633409631260e-02L, 00896 4.9174838341891594024701017768490960e-01L, 00897 4.5669426695387464162068900231444462e-01L, 00898 4.8506759880447437974189793537259677e-01L, 00899 2.0622099278664205707909858461264083e-01L, 00900 3.2374950270039093446805340265853956e-01L, 00901 7.3834330556606586255186213302750029e-01L, 00902 9.1210673061680792565673823935174611e-01L, 00903 6.6129919222598721544966837350891531e-01L, 00904 1.7807138906021476039088828811346122e-01L 00905 }; 00906 00907 const Real b[n_wts] = 00908 { 00909 0.0, 00910 0.0, 00911 0.0, 00912 0.0, 00913 0.0, 00914 3.2315912848634384647700266402091638e-01L, 00915 1.5341553679414688425981898952416987e-01L, 00916 7.4295478991330687632977899141707872e-02L, 00917 7.1278762832147862035977841733532020e-02L, 00918 1.6623223223705792825395256602140459e-02L, 00919 1.4160772533794791868984026749196156e-02L, 00920 1.4539694958941854654807449467759690e-02L 00921 }; 00922 00923 const unsigned int permutation_ids[n_wts] 00924 = {1, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6}; // 55 total points 00925 00926 dunavant_rule2(wts, a, b, permutation_ids, n_wts); 00927 00928 return; 00929 } 00930 00931 00932 // Dunavant's 17th-order rule has 61 points, while a 00933 // comparable conical product rule would have 81 (16th and 17th orders). 00934 // 00935 // It can be found here: 00936 // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90 00937 // 00938 // Zhang reports an identical rule in: 00939 // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules 00940 // on triangles and tetrahedra" Journal of Computational Mathematics, 00941 // v. 27, no. 1, 2009, pp. 89-96. 00942 // 00943 // Note: the 61-point 17th-order rule obtained by Dunavant and Zhang 00944 // does not appear to be unique. It is a solution in the sense that it 00945 // minimizes the error in the least-squares minimization problem, but 00946 // it involves too many unknowns and the Jacobian is therefore singular 00947 // when attempting to improve the solution via Newton's method. 00948 // 00949 // Therefore, we prefer the following 63-point rule which 00950 // I [JWP] found. It appears to be more accurate than the 00951 // rule reported by Dunavant and Zhang, even though it has 00952 // a few more points. 00953 case SEVENTEENTH: 00954 { 00955 const unsigned int n_wts = 12; 00956 const Real wts[n_wts] = 00957 { 00958 1.7464603792572004485690588092246146e-02L, 00959 5.9429003555801725246549713984660076e-03L, 00960 1.2490753345169579649319736639588729e-02L, 00961 1.5386987188875607593083456905596468e-02L, 00962 1.1185807311917706362674684312990270e-02L, 00963 1.0301845740670206831327304917180007e-02L, 00964 1.1767783072977049696840016810370464e-02L, 00965 3.8045312849431209558329128678945240e-03L, 00966 4.5139302178876351271037137230354382e-03L, 00967 2.2178812517580586419412547665472893e-03L, 00968 5.2216271537483672304731416553063103e-03L, 00969 9.8381136389470256422419930926212114e-04L 00970 }; 00971 00972 const Real a[n_wts] = 00973 { 00974 2.8796825754667362165337965123570514e-01L, 00975 4.9216175986208465345536805750663939e-01L, 00976 4.6252866763171173685916780827044612e-01L, 00977 1.6730292951631792248498303276090273e-01L, 00978 1.5816335500814652972296428532213019e-01L, 00979 1.6352252138387564873002458959679529e-01L, 00980 6.2447680488959768233910286168417367e-01L, 00981 8.7317249935244454285263604347964179e-01L, 00982 3.4428164322282694677972239461699271e-01L, 00983 9.1584484467813674010523309855340209e-02L, 00984 2.0172088013378989086826623852040632e-01L, 00985 9.6538762758254643474731509845084691e-01L 00986 }; 00987 00988 const Real b[n_wts] = 00989 { 00990 0.0, 00991 0.0, 00992 0.0, 00993 3.4429160695501713926320695771253348e-01L, 00994 2.2541623431550639817203145525444726e-01L, 00995 8.0670083153531811694942222940484991e-02L, 00996 6.5967451375050925655738829747288190e-02L, 00997 4.5677879890996762665044366994439565e-02L, 00998 1.1528411723154215812386518751976084e-02L, 00999 9.3057714323900610398389176844165892e-03L, 01000 1.5916814107619812717966560404970160e-02L, 01001 1.0734733163764032541125434215228937e-02L 01002 }; 01003 01004 const unsigned int permutation_ids[n_wts] 01005 = {3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6}; // 63 total points 01006 01007 dunavant_rule2(wts, a, b, permutation_ids, n_wts); 01008 01009 return; 01010 01011 // _points.resize (61); 01012 // _weights.resize(61); 01013 01014 // // The raw data for the quadrature rule. 01015 // const Real p[15][4] = { 01016 // { 1./3., 0., 0., 0.033437199290803e+00 / 2.0}, // 1-perm 01017 // {0.005658918886452e+00, 0.497170540556774e+00, 0., 0.005093415440507e+00 / 2.0}, // 3-perm 01018 // {0.035647354750751e+00, 0.482176322624625e+00, 0., 0.014670864527638e+00 / 2.0}, // 3-perm 01019 // {0.099520061958437e+00, 0.450239969020782e+00, 0., 0.024350878353672e+00 / 2.0}, // 3-perm 01020 // {0.199467521245206e+00, 0.400266239377397e+00, 0., 0.031107550868969e+00 / 2.0}, // 3-perm 01021 // {0.495717464058095e+00, 0.252141267970953e+00, 0., 0.031257111218620e+00 / 2.0}, // 3-perm 01022 // {0.675905990683077e+00, 0.162047004658461e+00, 0., 0.024815654339665e+00 / 2.0}, // 3-perm 01023 // {0.848248235478508e+00, 0.075875882260746e+00, 0., 0.014056073070557e+00 / 2.0}, // 3-perm 01024 // {0.968690546064356e+00, 0.015654726967822e+00, 0., 0.003194676173779e+00 / 2.0}, // 3-perm 01025 // {0.010186928826919e+00, 0.334319867363658e+00, 0.655493203809423e+00, 0.008119655318993e+00 / 2.0}, // 6-perm 01026 // {0.135440871671036e+00, 0.292221537796944e+00, 0.572337590532020e+00, 0.026805742283163e+00 / 2.0}, // 6-perm 01027 // {0.054423924290583e+00, 0.319574885423190e+00, 0.626001190286228e+00, 0.018459993210822e+00 / 2.0}, // 6-perm 01028 // {0.012868560833637e+00, 0.190704224192292e+00, 0.796427214974071e+00, 0.008476868534328e+00 / 2.0}, // 6-perm 01029 // {0.067165782413524e+00, 0.180483211648746e+00, 0.752351005937729e+00, 0.018292796770025e+00 / 2.0}, // 6-perm 01030 // {0.014663182224828e+00, 0.080711313679564e+00, 0.904625504095608e+00, 0.006665632004165e+00 / 2.0} // 6-perm 01031 // }; 01032 01033 01034 // // Now call the dunavant routine to generate _points and _weights 01035 // dunavant_rule(p, 15); 01036 01037 // return; 01038 } 01039 01040 01041 01042 // Dunavant's 18th-order rule contains points outside the region and is therefore unsuitable 01043 // for our FEM calculations. His 19th-order rule has 73 points, compared with 100 points for 01044 // a comparable-order conical product rule. 01045 // 01046 // It was copied 23rd June 2008 from: 01047 // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90 01048 case EIGHTTEENTH: 01049 case NINTEENTH: 01050 { 01051 _points.resize (73); 01052 _weights.resize(73); 01053 01054 // The raw data for the quadrature rule. 01055 const Real rule_data[17][4] = { 01056 { 1./3., 0., 0., 0.032906331388919e+00 / 2.0}, // 1-perm 01057 {0.020780025853987e+00, 0.489609987073006e+00, 0., 0.010330731891272e+00 / 2.0}, // 3-perm 01058 {0.090926214604215e+00, 0.454536892697893e+00, 0., 0.022387247263016e+00 / 2.0}, // 3-perm 01059 {0.197166638701138e+00, 0.401416680649431e+00, 0., 0.030266125869468e+00 / 2.0}, // 3-perm 01060 {0.488896691193805e+00, 0.255551654403098e+00, 0., 0.030490967802198e+00 / 2.0}, // 3-perm 01061 {0.645844115695741e+00, 0.177077942152130e+00, 0., 0.024159212741641e+00 / 2.0}, // 3-perm 01062 {0.779877893544096e+00, 0.110061053227952e+00, 0., 0.016050803586801e+00 / 2.0}, // 3-perm 01063 {0.888942751496321e+00, 0.055528624251840e+00, 0., 0.008084580261784e+00 / 2.0}, // 3-perm 01064 {0.974756272445543e+00, 0.012621863777229e+00, 0., 0.002079362027485e+00 / 2.0}, // 3-perm 01065 {0.003611417848412e+00, 0.395754787356943e+00, 0.600633794794645e+00, 0.003884876904981e+00 / 2.0}, // 6-perm 01066 {0.134466754530780e+00, 0.307929983880436e+00, 0.557603261588784e+00, 0.025574160612022e+00 / 2.0}, // 6-perm 01067 {0.014446025776115e+00, 0.264566948406520e+00, 0.720987025817365e+00, 0.008880903573338e+00 / 2.0}, // 6-perm 01068 {0.046933578838178e+00, 0.358539352205951e+00, 0.594527068955871e+00, 0.016124546761731e+00 / 2.0}, // 6-perm 01069 {0.002861120350567e+00, 0.157807405968595e+00, 0.839331473680839e+00, 0.002491941817491e+00 / 2.0}, // 6-perm 01070 {0.223861424097916e+00, 0.075050596975911e+00, 0.701087978926173e+00, 0.018242840118951e+00 / 2.0}, // 6-perm 01071 {0.034647074816760e+00, 0.142421601113383e+00, 0.822931324069857e+00, 0.010258563736199e+00 / 2.0}, // 6-perm 01072 {0.010161119296278e+00, 0.065494628082938e+00, 0.924344252620784e+00, 0.003799928855302e+00 / 2.0} // 6-perm 01073 }; 01074 01075 01076 // Now call the dunavant routine to generate _points and _weights 01077 dunavant_rule(rule_data, 17); 01078 01079 return; 01080 } 01081 01082 01083 // 20th-order rule by Wandzura. 01084 // 01085 // Stephen Wandzura, Hong Xiao, 01086 // Symmetric Quadrature Rules on a Triangle, 01087 // Computers and Mathematics with Applications, 01088 // Volume 45, Number 12, June 2003, pages 1829-1840. 01089 // 01090 // Wandzura's work extends the work of Dunavant by providing degree 01091 // 5,10,15,20,25, and 30 rules with positive weights for the triangle. 01092 // 01093 // Copied on 3rd July 2008 from: 01094 // http://people.scs.fsu.edu/~burkardt/f_src/wandzura/wandzura.f90 01095 case TWENTIETH: 01096 { 01097 // The equivalent concial product rule would have 121 points 01098 _points.resize (85); 01099 _weights.resize(85); 01100 01101 // The raw data for the quadrature rule. 01102 const Real rule_data[19][4] = { 01103 {0.33333333333333e+00, 0.0, 0.0, 0.2761042699769952e-01 / 2.0}, // 1-perm 01104 {0.00150064932443e+00, 0.49924967533779e+00, 0.0, 0.1779029547326740e-02 / 2.0}, // 3-perm 01105 {0.09413975193895e+00, 0.45293012403052e+00, 0.0, 0.2011239811396117e-01 / 2.0}, // 3-perm 01106 {0.20447212408953e+00, 0.39776393795524e+00, 0.0, 0.2681784725933157e-01 / 2.0}, // 3-perm 01107 {0.47099959493443e+00, 0.26450020253279e+00, 0.0, 0.2452313380150201e-01 / 2.0}, // 3-perm 01108 {0.57796207181585e+00, 0.21101896409208e+00, 0.0, 0.1639457841069539e-01 / 2.0}, // 3-perm 01109 {0.78452878565746e+00, 0.10773560717127e+00, 0.0, 0.1479590739864960e-01 / 2.0}, // 3-perm 01110 {0.92186182432439e+00, 0.03906908783780e+00, 0.0, 0.4579282277704251e-02 / 2.0}, // 3-perm 01111 {0.97765124054134e+00, 0.01117437972933e+00, 0.0, 0.1651826515576217e-02 / 2.0}, // 3-perm 01112 {0.00534961818734e+00, 0.06354966590835e+00, 0.93110071590431e+00, 0.2349170908575584e-02 / 2.0}, // 6-perm 01113 {0.00795481706620e+00, 0.15710691894071e+00, 0.83493826399309e+00, 0.4465925754181793e-02 / 2.0}, // 6-perm 01114 {0.01042239828126e+00, 0.39564211436437e+00, 0.59393548735436e+00, 0.6099566807907972e-02 / 2.0}, // 6-perm 01115 {0.01096441479612e+00, 0.27316757071291e+00, 0.71586801449097e+00, 0.6891081327188203e-02 / 2.0}, // 6-perm 01116 {0.03856671208546e+00, 0.10178538248502e+00, 0.85964790542952e+00, 0.7997475072478163e-02 / 2.0}, // 6-perm 01117 {0.03558050781722e+00, 0.44665854917641e+00, 0.51776094300637e+00, 0.7386134285336024e-02 / 2.0}, // 6-perm 01118 {0.04967081636276e+00, 0.19901079414950e+00, 0.75131838948773e+00, 0.1279933187864826e-01 / 2.0}, // 6-perm 01119 {0.05851972508433e+00, 0.32426118369228e+00, 0.61721909122339e+00, 0.1725807117569655e-01 / 2.0}, // 6-perm 01120 {0.12149778700439e+00, 0.20853136321013e+00, 0.66997084978547e+00, 0.1867294590293547e-01 / 2.0}, // 6-perm 01121 {0.14071084494394e+00, 0.32317056653626e+00, 0.53611858851980e+00, 0.2281822405839526e-01 / 2.0} // 6-perm 01122 }; 01123 01124 01125 // Now call the dunavant routine to generate _points and _weights 01126 dunavant_rule(rule_data, 19); 01127 01128 return; 01129 } 01130 01131 01132 01133 // 25th-order rule by Wandzura. 01134 // 01135 // Stephen Wandzura, Hong Xiao, 01136 // Symmetric Quadrature Rules on a Triangle, 01137 // Computers and Mathematics with Applications, 01138 // Volume 45, Number 12, June 2003, pages 1829-1840. 01139 // 01140 // Wandzura's work extends the work of Dunavant by providing degree 01141 // 5,10,15,20,25, and 30 rules with positive weights for the triangle. 01142 // 01143 // Copied on 3rd July 2008 from: 01144 // http://people.scs.fsu.edu/~burkardt/f_src/wandzura/wandzura.f90 01145 // case TWENTYFIRST: // fall through to 121 point conical product rule below 01146 case TWENTYSECOND: 01147 case TWENTYTHIRD: 01148 case TWENTYFOURTH: 01149 case TWENTYFIFTH: 01150 { 01151 // The equivalent concial product rule would have 169 points 01152 _points.resize (126); 01153 _weights.resize(126); 01154 01155 // The raw data for the quadrature rule. 01156 const Real rule_data[26][4] = { 01157 {0.02794648307317e+00, 0.48602675846341e+00, 0.0, 0.8005581880020417e-02 / 2.0}, // 3-perm 01158 {0.13117860132765e+00, 0.43441069933617e+00, 0.0, 0.1594707683239050e-01 / 2.0}, // 3-perm 01159 {0.22022172951207e+00, 0.38988913524396e+00, 0.0, 0.1310914123079553e-01 / 2.0}, // 3-perm 01160 {0.40311353196039e+00, 0.29844323401980e+00, 0.0, 0.1958300096563562e-01 / 2.0}, // 3-perm 01161 {0.53191165532526e+00, 0.23404417233737e+00, 0.0, 0.1647088544153727e-01 / 2.0}, // 3-perm 01162 {0.69706333078196e+00, 0.15146833460902e+00, 0.0, 0.8547279074092100e-02 / 2.0}, // 3-perm 01163 {0.77453221290801e+00, 0.11273389354599e+00, 0.0, 0.8161885857226492e-02 / 2.0}, // 3-perm 01164 {0.84456861581695e+00, 0.07771569209153e+00, 0.0, 0.6121146539983779e-02 / 2.0}, // 3-perm 01165 {0.93021381277141e+00, 0.03489309361430e+00, 0.0, 0.2908498264936665e-02 / 2.0}, // 3-perm 01166 {0.98548363075813e+00, 0.00725818462093e+00, 0.0, 0.6922752456619963e-03 / 2.0}, // 3-perm 01167 {0.00129235270444e+00, 0.22721445215336e+00, 0.77149319514219e+00, 0.1248289199277397e-02 / 2.0}, // 6-perm 01168 {0.00539970127212e+00, 0.43501055485357e+00, 0.55958974387431e+00, 0.3404752908803022e-02 / 2.0}, // 6-perm 01169 {0.00638400303398e+00, 0.32030959927220e+00, 0.67330639769382e+00, 0.3359654326064051e-02 / 2.0}, // 6-perm 01170 {0.00502821150199e+00, 0.09175032228001e+00, 0.90322146621800e+00, 0.1716156539496754e-02 / 2.0}, // 6-perm 01171 {0.00682675862178e+00, 0.03801083585872e+00, 0.95516240551949e+00, 0.1480856316715606e-02 / 2.0}, // 6-perm 01172 {0.01001619963993e+00, 0.15742521848531e+00, 0.83255858187476e+00, 0.3511312610728685e-02 / 2.0}, // 6-perm 01173 {0.02575781317339e+00, 0.23988965977853e+00, 0.73435252704808e+00, 0.7393550149706484e-02 / 2.0}, // 6-perm 01174 {0.03022789811992e+00, 0.36194311812606e+00, 0.60782898375402e+00, 0.7983087477376558e-02 / 2.0}, // 6-perm 01175 {0.03050499010716e+00, 0.08355196095483e+00, 0.88594304893801e+00, 0.4355962613158041e-02 / 2.0}, // 6-perm 01176 {0.04595654736257e+00, 0.14844322073242e+00, 0.80560023190501e+00, 0.7365056701417832e-02 / 2.0}, // 6-perm 01177 {0.06744280054028e+00, 0.28373970872753e+00, 0.64881749073219e+00, 0.1096357284641955e-01 / 2.0}, // 6-perm 01178 {0.07004509141591e+00, 0.40689937511879e+00, 0.52305553346530e+00, 0.1174996174354112e-01 / 2.0}, // 6-perm 01179 {0.08391152464012e+00, 0.19411398702489e+00, 0.72197448833499e+00, 0.1001560071379857e-01 / 2.0}, // 6-perm 01180 {0.12037553567715e+00, 0.32413434700070e+00, 0.55549011732214e+00, 0.1330964078762868e-01 / 2.0}, // 6-perm 01181 {0.14806689915737e+00, 0.22927748355598e+00, 0.62265561728665e+00, 0.1415444650522614e-01 / 2.0}, // 6-perm 01182 {0.19177186586733e+00, 0.32561812259598e+00, 0.48261001153669e+00, 0.1488137956116801e-01 / 2.0} // 6-perm 01183 }; 01184 01185 01186 // Now call the dunavant routine to generate _points and _weights 01187 dunavant_rule(rule_data, 26); 01188 01189 return; 01190 } 01191 01192 01193 01194 // 30th-order rule by Wandzura. 01195 // 01196 // Stephen Wandzura, Hong Xiao, 01197 // Symmetric Quadrature Rules on a Triangle, 01198 // Computers and Mathematics with Applications, 01199 // Volume 45, Number 12, June 2003, pages 1829-1840. 01200 // 01201 // Wandzura's work extends the work of Dunavant by providing degree 01202 // 5,10,15,20,25, and 30 rules with positive weights for the triangle. 01203 // 01204 // Copied on 3rd July 2008 from: 01205 // http://people.scs.fsu.edu/~burkardt/f_src/wandzura/wandzura.f90 01206 case TWENTYSIXTH: 01207 case TWENTYSEVENTH: 01208 case TWENTYEIGHTH: 01209 case TWENTYNINTH: 01210 case THIRTIETH: 01211 { 01212 // The equivalent concial product rule would have 256 points 01213 _points.resize (175); 01214 _weights.resize(175); 01215 01216 // The raw data for the quadrature rule. 01217 const Real rule_data[36][4] = { 01218 {0.33333333333333e+00, 0.0, 0.0, 0.1557996020289920e-01 / 2.0}, // 1-perm 01219 {0.00733011643277e+00, 0.49633494178362e+00, 0.0, 0.3177233700534134e-02 / 2.0}, // 3-perm 01220 {0.08299567580296e+00, 0.45850216209852e+00, 0.0, 0.1048342663573077e-01 / 2.0}, // 3-perm 01221 {0.15098095612541e+00, 0.42450952193729e+00, 0.0, 0.1320945957774363e-01 / 2.0}, // 3-perm 01222 {0.23590585989217e+00, 0.38204707005392e+00, 0.0, 0.1497500696627150e-01 / 2.0}, // 3-perm 01223 {0.43802430840785e+00, 0.28098784579608e+00, 0.0, 0.1498790444338419e-01 / 2.0}, // 3-perm 01224 {0.54530204829193e+00, 0.22734897585403e+00, 0.0, 0.1333886474102166e-01 / 2.0}, // 3-perm 01225 {0.65088177698254e+00, 0.17455911150873e+00, 0.0, 0.1088917111390201e-01 / 2.0}, // 3-perm 01226 {0.75348314559713e+00, 0.12325842720144e+00, 0.0, 0.8189440660893461e-02 / 2.0}, // 3-perm 01227 {0.83983154221561e+00, 0.08008422889220e+00, 0.0, 0.5575387588607785e-02 / 2.0}, // 3-perm 01228 {0.90445106518420e+00, 0.04777446740790e+00, 0.0, 0.3191216473411976e-02 / 2.0}, // 3-perm 01229 {0.95655897063972e+00, 0.02172051468014e+00, 0.0, 0.1296715144327045e-02 / 2.0}, // 3-perm 01230 {0.99047064476913e+00, 0.00476467761544e+00, 0.0, 0.2982628261349172e-03 / 2.0}, // 3-perm 01231 {0.00092537119335e+00, 0.41529527091331e+00, 0.58377935789334e+00, 0.9989056850788964e-03 / 2.0}, // 6-perm 01232 {0.00138592585556e+00, 0.06118990978535e+00, 0.93742416435909e+00, 0.4628508491732533e-03 / 2.0}, // 6-perm 01233 {0.00368241545591e+00, 0.16490869013691e+00, 0.83140889440718e+00, 0.1234451336382413e-02 / 2.0}, // 6-perm 01234 {0.00390322342416e+00, 0.02503506223200e+00, 0.97106171434384e+00, 0.5707198522432062e-03 / 2.0}, // 6-perm 01235 {0.00323324815501e+00, 0.30606446515110e+00, 0.69070228669389e+00, 0.1126946125877624e-02 / 2.0}, // 6-perm 01236 {0.00646743211224e+00, 0.10707328373022e+00, 0.88645928415754e+00, 0.1747866949407337e-02 / 2.0}, // 6-perm 01237 {0.00324747549133e+00, 0.22995754934558e+00, 0.76679497516308e+00, 0.1182818815031657e-02 / 2.0}, // 6-perm 01238 {0.00867509080675e+00, 0.33703663330578e+00, 0.65428827588746e+00, 0.1990839294675034e-02 / 2.0}, // 6-perm 01239 {0.01559702646731e+00, 0.05625657618206e+00, 0.92814639735063e+00, 0.1900412795035980e-02 / 2.0}, // 6-perm 01240 {0.01797672125369e+00, 0.40245137521240e+00, 0.57957190353391e+00, 0.4498365808817451e-02 / 2.0}, // 6-perm 01241 {0.01712424535389e+00, 0.24365470201083e+00, 0.73922105263528e+00, 0.3478719460274719e-02 / 2.0}, // 6-perm 01242 {0.02288340534658e+00, 0.16538958561453e+00, 0.81172700903888e+00, 0.4102399036723953e-02 / 2.0}, // 6-perm 01243 {0.03273759728777e+00, 0.09930187449585e+00, 0.86796052821639e+00, 0.4021761549744162e-02 / 2.0}, // 6-perm 01244 {0.03382101234234e+00, 0.30847833306905e+00, 0.65770065458860e+00, 0.6033164660795066e-02 / 2.0}, // 6-perm 01245 {0.03554761446002e+00, 0.46066831859211e+00, 0.50378406694787e+00, 0.3946290302129598e-02 / 2.0}, // 6-perm 01246 {0.05053979030687e+00, 0.21881529945393e+00, 0.73064491023920e+00, 0.6644044537680268e-02 / 2.0}, // 6-perm 01247 {0.05701471491573e+00, 0.37920955156027e+00, 0.56377573352399e+00, 0.8254305856078458e-02 / 2.0}, // 6-perm 01248 {0.06415280642120e+00, 0.14296081941819e+00, 0.79288637416061e+00, 0.6496056633406411e-02 / 2.0}, // 6-perm 01249 {0.08050114828763e+00, 0.28373128210592e+00, 0.63576756960645e+00, 0.9252778144146602e-02 / 2.0}, // 6-perm 01250 {0.10436706813453e+00, 0.19673744100444e+00, 0.69889549086103e+00, 0.9164920726294280e-02 / 2.0}, // 6-perm 01251 {0.11384489442875e+00, 0.35588914121166e+00, 0.53026596435959e+00, 0.1156952462809767e-01 / 2.0}, // 6-perm 01252 {0.14536348771552e+00, 0.25981868535191e+00, 0.59481782693256e+00, 0.1176111646760917e-01 / 2.0}, // 6-perm 01253 {0.18994565282198e+00, 0.32192318123130e+00, 0.48813116594672e+00, 0.1382470218216540e-01 / 2.0} // 6-perm 01254 }; 01255 01256 01257 // Now call the dunavant routine to generate _points and _weights 01258 dunavant_rule(rule_data, 36); 01259 01260 return; 01261 } 01262 01263 01264 // By default, we fall back on the conical product rules. If the user 01265 // requests an order higher than what is currently available in the 1D 01266 // rules, an error will be thrown from the respective 1D code. 01267 default: 01268 { 01269 // The following quadrature rules are generated as 01270 // conical products. These tend to be non-optimal 01271 // (use too many points, cluster points in certain 01272 // regions of the domain) but they are quite easy to 01273 // automatically generate using a 1D Gauss rule on 01274 // [0,1] and two 1D Jacobi-Gauss rules on [0,1]. 01275 QConical conical_rule(2, _order); 01276 conical_rule.init(type_in, p); 01277 01278 // Swap points and weights with the about-to-be destroyed rule. 01279 _points.swap (conical_rule.get_points() ); 01280 _weights.swap(conical_rule.get_weights()); 01281 01282 return; 01283 } 01284 } 01285 } 01286 01287 01288 //--------------------------------------------- 01289 // Unsupported type 01290 default: 01291 { 01292 libMesh::err << "Element type not supported!:" << type_in << std::endl; 01293 libmesh_error(); 01294 } 01295 } 01296 01297 libmesh_error(); 01298 01299 return; 01300 01301 #endif 01302 } 01303 01304 } // namespace libMesh
Site Created By: libMesh Developers
Last modified: February 05 2013 19:54:48 UTC
Hosted By: