VectorXd Rectangle8::Give_weights() { VectorXd w(ngauss); VectorXd w1d(3); w1d(0) = 0.555555555, w1d(1) = 0.888888888, w1d(2) = 0.555555555; double n; for(int j=0; j<3; j++) { for(int i=0; i<3; i++) { n = 3*(j)+i; w(n) = w1d(i)*w1d(j); } } return w; }
// Set quadrature weights and points void SetQuadWgtsPts(const int mpoints1d, dTensor1& wgt, dTensor2& spts) { { const int mpoints = mpoints1d*mpoints1d*mpoints1d; assert_eq(mpoints, wgt.getsize()); assert_eq(mpoints, spts.getsize(1)); } const int md2 = mpoints1d/2; dTensor1 w1d(mpoints1d),x1d(mpoints1d); switch (mpoints1d) { case 1: w1d.set(1, 2.0 ); x1d.set(1, 0.0 ); break; case 2: w1d.set(1, 1.0 ); w1d.set(2, 1.0 ); x1d.set(1, -1.0/sq3 ); x1d.set(2, 1.0/sq3 ); break; case 3: w1d.set(1, 5.0/9.0 ); w1d.set(2, 8.0/9.0 ); w1d.set(3, 5.0/9.0 ); x1d.set(1, sq3/sq5 ); x1d.set(2, 0.0 ); x1d.set(3, -sq3/sq5 ); break; case 4: w1d.set(1, (18.0 - sq3*sq10)/36.0 ); w1d.set(2, (18.0 + sq3*sq10)/36.0 ); w1d.set(3, w1d.get(2) ); w1d.set(4, w1d.get(1) ); x1d.set(1, sqrt(3.0 + sqrt(4.8))/(-sq7) ); x1d.set(2, sqrt(3.0 - sqrt(4.8))/(-sq7) ); x1d.set(3, -x1d.get(2) ); x1d.set(4, -x1d.get(1) ); break; case 5: w1d.set(1, (322.0 - 13.0*sq7*sq10)/900.0 ); w1d.set(2, (322.0 + 13.0*sq7*sq10)/900.0 ); w1d.set(3, 128.0/225.0 ); w1d.set(4, w1d.get(2) ); w1d.set(5, w1d.get(1) ); x1d.set(1, sqrt(5.0 + 2.0*sq10/sq7)/(-3.0) ); x1d.set(2, sqrt(5.0 - 2.0*sq10/sq7)/(-3.0) ); x1d.set(3, 0.0 ); x1d.set(4, -x1d.get(2) ); x1d.set(5, -x1d.get(1) ); break; case 6: w1d.set(1, 0.1713244923791703450402961 ); w1d.set(2, 0.3607615730481386075698335 ); w1d.set(3, 0.4679139345726910473898703 ); x1d.set(1, 0.9324695142031520278123016 ); x1d.set(2, 0.6612093864662645136613996 ); x1d.set(3, 0.2386191860831969086305017 ); for (int k=1; k<=md2; k++) { w1d.set(md2+k, w1d.get(md2+1-k) ); } for (int k=1; k<=md2; k++) { x1d.set(md2+k, -x1d.get(md2+1-k) ); } break; case 8: w1d.set(1, 0.1012285362903762591525314 ); w1d.set(2, 0.2223810344533744705443560 ); w1d.set(3, 0.3137066458778872873379622 ); w1d.set(4, 0.3626837833783619829651504 ); x1d.set(1, 0.9602898564975362316835609 ); x1d.set(2, 0.7966664774136267395915539 ); x1d.set(3, 0.5255324099163289858177390 ); x1d.set(4, 0.1834346424956498049394761 ); for (int k=1; k<=md2; k++) { w1d.set(md2+k, w1d.get(md2+1-k) ); } for (int k=1; k<=md2; k++) { x1d.set(md2+k, -x1d.get(md2+1-k) ); } break; case 10: w1d.set(1, 0.0666713443086881375935688 ); w1d.set(2, 0.1494513491505805931457763 ); w1d.set(3, 0.2190863625159820439955349 ); w1d.set(4, 0.2692667193099963550912269 ); w1d.set(5, 0.2955242247147528701738930 ); x1d.set(1, 0.9739065285171717200779640 ); x1d.set(2, 0.8650633666889845107320967 ); x1d.set(3, 0.6794095682990244062343274 ); x1d.set(4, 0.4333953941292471907992659 ); x1d.set(5, 0.1488743389816312108848260 ); for (int k=1; k<=md2; k++) { w1d.set(md2+k, w1d.get(md2+1-k) ); } for (int k=1; k<=md2; k++) { x1d.set(md2+k, -x1d.get(md2+1-k) ); } break; case 12: w1d.set(1, 0.0471753363865118271946160 ); w1d.set(2, 0.1069393259953184309602547 ); w1d.set(3, 0.1600783285433462263346525 ); w1d.set(4, 0.2031674267230659217490645 ); w1d.set(5, 0.2334925365383548087608499 ); w1d.set(6, 0.2491470458134027850005624 ); x1d.set(1, 0.9815606342467192506905491 ); x1d.set(2, 0.9041172563704748566784659 ); x1d.set(3, 0.7699026741943046870368938 ); x1d.set(4, 0.5873179542866174472967024 ); x1d.set(5, 0.3678314989981801937526915 ); x1d.set(6, 0.1252334085114689154724414 ); for (int k=1; k<=md2; k++) { w1d.set(md2+k, w1d.get(md2+1-k) ); } for (int k=1; k<=md2; k++) { x1d.set(md2+k, -x1d.get(md2+1-k) ); } break; case 14: w1d.set(1, 0.0351194603317518630318329 ); w1d.set(2, 0.0801580871597602098056333 ); w1d.set(3, 0.1215185706879031846894148 ); w1d.set(4, 0.1572031671581935345696019 ); w1d.set(5, 0.1855383974779378137417166 ); w1d.set(6, 0.2051984637212956039659241 ); w1d.set(7, 0.2152638534631577901958764 ); x1d.set(1, 0.9862838086968123388415973 ); x1d.set(2, 0.9284348836635735173363911 ); x1d.set(3, 0.8272013150697649931897947 ); x1d.set(4, 0.6872929048116854701480198 ); x1d.set(5, 0.5152486363581540919652907 ); x1d.set(6, 0.3191123689278897604356718 ); x1d.set(7, 0.1080549487073436620662447 ); for (int k=1; k<=md2; k++) { w1d.set(md2+k, w1d.get(md2+1-k) ); } for (int k=1; k<=md2; k++) { x1d.set(md2+k, -x1d.get(md2+1-k) ); } break; case 16: w1d.set(1, 0.0271524594117540948517806 ); w1d.set(2, 0.0622535239386478928628438 ); w1d.set(3, 0.0951585116824927848099251 ); w1d.set(4, 0.1246289712555338720524763 ); w1d.set(5, 0.1495959888165767320815017 ); w1d.set(6, 0.1691565193950025381893121 ); w1d.set(7, 0.1826034150449235888667637 ); w1d.set(8, 0.1894506104550684962853967 ); x1d.set(1, 0.9894009349916499325961542 ); x1d.set(2, 0.9445750230732325760779884 ); x1d.set(3, 0.8656312023878317438804679 ); x1d.set(4, 0.7554044083550030338951012 ); x1d.set(5, 0.6178762444026437484466718 ); x1d.set(6, 0.4580167776572273863424194 ); x1d.set(7, 0.2816035507792589132304605 ); x1d.set(8, 0.0950125098376374401853193 ); for (int k=1; k<=md2; k++) { w1d.set(md2+k, w1d.get(md2+1-k) ); } for (int k=1; k<=md2; k++) { x1d.set(md2+k, -x1d.get(md2+1-k) ); } break; case 18: w1d.set(1, 0.0216160135264833103133427 ); w1d.set(2, 0.0497145488949697964533349 ); w1d.set(3, 0.0764257302548890565291297 ); w1d.set(4, 0.1009420441062871655628140 ); w1d.set(5, 0.1225552067114784601845191 ); w1d.set(6, 0.1406429146706506512047313 ); w1d.set(7, 0.1546846751262652449254180 ); w1d.set(8, 0.1642764837458327229860538 ); w1d.set(9, 0.1691423829631435918406565 ); x1d.set(1, 0.9915651684209309467300160 ); x1d.set(2, 0.9558239495713977551811959 ); x1d.set(3, 0.8926024664975557392060606 ); x1d.set(4, 0.8037049589725231156824175 ); x1d.set(5, 0.6916870430603532078748911 ); x1d.set(6, 0.5597708310739475346078715 ); x1d.set(7, 0.4117511614628426460359318 ); x1d.set(8, 0.2518862256915055095889729 ); x1d.set(9, 0.0847750130417353012422619 ); for (int k=1; k<=md2; k++) { w1d.set(md2+k, w1d.get(md2+1-k) ); } for (int k=1; k<=md2; k++) { x1d.set(md2+k, -x1d.get(md2+1-k) ); } break; case 20: w1d.set(1, 0.0176140071391521183118620 ); w1d.set(2, 0.0406014298003869413310400 ); w1d.set(3, 0.0626720483341090635695065 ); w1d.set(4, 0.0832767415767047487247581 ); w1d.set(5, 0.1019301198172404350367501 ); w1d.set(6, 0.1181945319615184173123774 ); w1d.set(7, 0.1316886384491766268984945 ); w1d.set(8, 0.1420961093183820513292983 ); w1d.set(9, 0.1491729864726037467878287 ); w1d.set(10, 0.1527533871307258506980843 ); x1d.set(1, 0.9931285991850949247861224 ); x1d.set(2, 0.9639719272779137912676661 ); x1d.set(3, 0.9122344282513259058677524 ); x1d.set(4, 0.8391169718222188233945291 ); x1d.set(5, 0.7463319064601507926143051 ); x1d.set(6, 0.6360536807265150254528367 ); x1d.set(7, 0.5108670019508270980043641 ); x1d.set(8, 0.3737060887154195606725482 ); x1d.set(9, 0.2277858511416450780804962 ); x1d.set(10, 0.0765265211334973337546404 ); for (int k=1; k<=md2; k++) { w1d.set(md2+k, w1d.get(md2+1-k) ); } for (int k=1; k<=md2; k++) { x1d.set(md2+k, -x1d.get(md2+1-k) ); } break; default: unsupported_value_error(mpoints1d); } // Tensor product Gaussian Quadrature int k=0; for (int m1=1; m1<=(mpoints1d); m1++) for (int m2=1; m2<=(mpoints1d); m2++) for (int m3=1; m3<=(mpoints1d); m3++) { k = k+1; wgt.set(k, w1d.get(m1)*w1d.get(m2)*w1d.get(m3) ); spts.set(k,1, x1d.get(m1) ); spts.set(k,2, x1d.get(m2) ); spts.set(k,3, x1d.get(m3) ); } }