38 for (j = 0; j < ny; j++)
41 for (i = 0; i < nx; i++)
61 for (
int iz = 0; iz < nz; ++iz)
64 for (
int iy = 0; iy < ny; ++iy)
67 for (
int ix = 0; ix < nx; ++ix)
81 void IntegrationRule::GrundmannMollerSimplexRule(
int s,
int n)
85 const int d = 2*s + 1;
90 for (
int i = 1; i < fact.Size(); i++)
92 fact(i) = fact(i - 1)*i;
97 for (
int i = 0; i <= n; i++)
99 np *= (s + i + 1), f *= (i + 1);
105 for (
int i = 0; i <= s; i++)
109 weight = pow(2., -2*s)*pow(static_cast<double>(d + n - 2*i),
110 d)/fact(i)/fact(d + n - i);
122 IntegrationPoint &ip = IntPoint(pt++);
124 ip.x = double(2*beta[0] + 1)/(d + n - 2*i);
125 ip.y = double(2*beta[1] + 1)/(d + n - 2*i);
128 ip.z = double(2*beta[2] + 1)/(d + n - 2*i);
142 for (j--; j >= 0; j--)
156 class HP_Quadrature1D
159 mpfr_t pi, z, pp, p1, p2, p3, dz, w, rtol;
162 static const mpfr_rnd_t rnd = GMP_RNDN;
163 static const int default_prec = 128;
166 HP_Quadrature1D(
const int prec = default_prec)
168 mpfr_inits2(prec, pi, z, pp, p1, p2, p3, dz, w, rtol, (mpfr_ptr) 0);
169 mpfr_const_pi(pi, rnd);
170 mpfr_set_si_2exp(rtol, 1, -32, rnd);
176 void SetRelTol(
const int exponent = -32)
178 mpfr_set_si_2exp(rtol, 1, exponent, rnd);
184 void ComputeGaussLegendrePoint(
const int n,
const int k)
186 MFEM_ASSERT(n > 0 && 0 <= k && k < n,
"invalid n = " << n
187 <<
" and/or k = " << k);
189 int i = (k < (n+1)/2) ? k+1 : n-k;
194 mpfr_set_si(z, n+1-2*i, rnd);
195 mpfr_div_si(z, z, 2*n+1, rnd);
196 mpfr_mul(z, z, pi, rnd);
202 mpfr_set_si(p2, 1, rnd);
203 mpfr_set(p1, z, rnd);
204 for (
int j = 2; j <= n; j++)
206 mpfr_set(p3, p2, rnd);
207 mpfr_set(p2, p1, rnd);
209 mpfr_mul_si(p1, z, 2*j-1, rnd);
210 mpfr_mul_si(p3, p3, j-1, rnd);
211 mpfr_fms(p1, p1, p2, p3, rnd);
212 mpfr_div_si(p1, p1, j, rnd);
218 mpfr_fms(pp, z, p1, p2, rnd);
219 mpfr_mul_si(pp, pp, n, rnd);
220 mpfr_sqr(p2, z, rnd);
221 mpfr_sub_si(p2, p2, 1, rnd);
222 mpfr_div(pp, pp, p2, rnd);
227 mpfr_div(dz, p1, pp, rnd);
230 mpfr_si_sub(atol, 1, z, rnd);
231 mpfr_mul(atol, atol, rtol, rnd);
232 if (mpfr_cmpabs(dz, atol) <= 0)
238 mpfr_sub(z, z, dz, rnd);
242 mpfr_si_sub(z, 1, z, rnd);
243 mpfr_div_2si(z, z, 1, rnd);
246 mpfr_sqr(w, pp, rnd);
247 mpfr_mul_2si(w, w, 2, rnd);
248 mpfr_mul(w, w, z, rnd);
249 mpfr_si_sub(p1, 1, z, rnd);
250 mpfr_mul(w, w, p1, rnd);
251 mpfr_si_div(w, 1, w, rnd);
253 if (k >= (n+1)/2) { mpfr_swap(z, p1); }
259 void ComputeGaussLobattoPoint(
const int n,
const int k)
261 MFEM_ASSERT(n > 1 && 0 <= k && k < n,
"invalid n = " << n
262 <<
" and/or k = " << k);
264 int i = (k < (n+1)/2) ? k : n-1-k;
268 mpfr_set_si(z, 0, rnd);
269 mpfr_set_si(p1, 1, rnd);
270 mpfr_set_si(w, n*(n-1), rnd);
271 mpfr_si_div(w, 1, w, rnd);
276 mpfr_set_si(z, 2*i-n+1, rnd);
277 mpfr_div_si(z, z, 2*(n-1), rnd);
278 mpfr_mul(z, pi, z, rnd);
281 for (
int iter = 0 ; true ; ++iter)
284 mpfr_set_si(p1, 1, rnd);
285 mpfr_set(p2, z, rnd);
287 for (
int l = 1 ; l < (n-1) ; ++l)
290 mpfr_mul_si(p1, p1, l, rnd);
291 mpfr_mul_si(p3, z, 2*l+1, rnd);
292 mpfr_fms(p3, p3, p2, p1, rnd);
293 mpfr_div_si(p3, p3, l+1, rnd);
295 mpfr_set(p1, p2, rnd);
296 mpfr_set(p2, p3, rnd);
300 mpfr_fms(dz, z, p2, p1, rnd);
301 mpfr_mul_si(p3, p2, n, rnd);
302 mpfr_div(dz, dz, p3, rnd);
304 mpfr_sub(z, z, dz, rnd);
307 mpfr_add_si(atol, z, 1, rnd);
308 mpfr_mul(atol, atol, rtol, rnd);
310 if (mpfr_cmpabs(dz, atol) <= 0)
316 MFEM_VERIFY(iter < 8,
"n = " << n <<
", i = " << i
317 <<
", dz = " << mpfr_get_d(dz, rnd));
320 mpfr_add_si(z, z, 1, rnd);
321 mpfr_div_2si(z, z, 1, rnd);
323 mpfr_si_sub(p1, 1, z, rnd);
325 mpfr_sqr(w, p2, rnd);
326 mpfr_mul_si(w, w, n*(n-1), rnd);
327 mpfr_si_div(w, 1, w, rnd);
329 if (k >= (n+1)/2) { mpfr_swap(z, p1); }
332 double GetPoint()
const {
return mpfr_get_d(z, rnd); }
333 double GetSymmPoint()
const {
return mpfr_get_d(p1, rnd); }
334 double GetWeight()
const {
return mpfr_get_d(w, rnd); }
336 const mpfr_t &GetHPPoint()
const {
return z; }
337 const mpfr_t &GetHPSymmPoint()
const {
return p1; }
338 const mpfr_t &GetHPWeight()
const {
return w; }
342 mpfr_clears(pi, z, pp, p1, p2, p3, dz, w, rtol, (mpfr_ptr) 0);
347 #endif // MFEM_USE_MPFR
371 const int m = (n+1)/2;
373 #ifndef MFEM_USE_MPFR
375 for (
int i = 1; i <= m; i++)
377 double z = cos(M_PI * (i - 0.25) / (n + 0.5));
378 double pp, p1, dz, xi = 0.;
384 for (
int j = 2; j <= n; j++)
388 p1 = ((2 * j - 1) * z * p2 - (j - 1) * p3) / j;
392 pp = n * (z*p1-p2) / (z*z - 1);
396 if (fabs(dz) < 1e-16)
400 xi = ((1 - z) + dz)/2;
413 #else // MFEM_USE_MPFR is defined
415 HP_Quadrature1D hp_quad;
416 for (
int i = 1; i <= m; i++)
418 hp_quad.ComputeGaussLegendrePoint(n, i-1);
420 ir->
IntPoint(i-1).
x = hp_quad.GetPoint();
421 ir->
IntPoint(n-i).
x = hp_quad.GetSymmPoint();
425 #endif // MFEM_USE_MPFR
462 #ifndef MFEM_USE_MPFR
471 for (
int i = 1 ; i <= (np-1)/2 ; ++i)
475 double x_i = std::sin(M_PI * ((
double)(i)/(np-1) - 0.5));
476 double z_i = 0., p_l;
478 for (
int iter = 0 ; true ; ++iter)
484 for (
int l = 1 ; l < (np-1) ; ++l)
489 double p_lp1 = ( (2*l + 1)*x_i*p_l - l*p_lm1)/(l + 1);
507 double dx = (x_i*p_l - p_lm1) / (np*p_l);
508 if (std::abs(dx) < 1e-16)
512 z_i = ((1.0 + x_i) - dx)/2;
516 MFEM_VERIFY(iter < 8,
"np = " << np <<
", i = " << i
525 ip.
weight = (double)(1.0 / (np*(np-1)*p_l*p_l));
529 symm_ip.
x = 1.0 - z_i;
533 #else // MFEM_USE_MPFR is defined
535 HP_Quadrature1D hp_quad;
537 for (
int i = 0 ; i <= (np-1)/2 ; ++i)
539 hp_quad.ComputeGaussLobattoPoint(np, i);
541 ir->
IntPoint(np-1-i).
x = hp_quad.GetSymmPoint();
546 #endif // MFEM_USE_MPFR
557 for (
int i = 0; i < np ; ++i)
559 ir->
IntPoint(i).
x = double(i+1) / double(np + 1);
562 CalculateUniformWeights(ir, Quadrature1D::OpenUniform);
565 void QuadratureFunctions1D::ClosedUniform(
const int np,
575 for (
int i = 0; i < np ; ++i)
580 CalculateUniformWeights(ir, Quadrature1D::ClosedUniform);
588 for (
int i = 0; i < np ; ++i)
590 ir->
IntPoint(i).
x = double(2*i+1) / (2*np);
593 CalculateUniformWeights(ir, Quadrature1D::OpenHalfUniform);
596 void QuadratureFunctions1D::GivePolyPoints(
const int np,
double *pts,
603 case Quadrature1D::GaussLegendre:
605 GaussLegendre(np,&ir);
608 case Quadrature1D::GaussLobatto:
610 GaussLobatto(np, &ir);
613 case Quadrature1D::OpenUniform:
618 case Quadrature1D::ClosedUniform:
620 ClosedUniform(np,&ir);
623 case Quadrature1D::OpenHalfUniform:
625 OpenHalfUniform(np, &ir);
630 MFEM_ABORT(
"Asking for an unknown type of 1D Quadrature points, "
635 for (
int i = 0 ; i < np ; ++i)
641 void QuadratureFunctions1D::CalculateUniformWeights(
IntegrationRule *ir,
652 const int n = ir->
Size();
664 #ifndef MFEM_USE_MPFR
667 const IntegrationRule &glob_ir =
IntRules.
Get(Geometry::SEGMENT, n-1);
670 for (
int j = 0; j < n; j++)
674 Poly_1D::Basis basis(n-1, xv.GetData());
678 for (
int i = 0; i < m; i++)
680 const IntegrationPoint &ip = glob_ir.IntPoint(i);
681 basis.Eval(ip.x, xv);
682 w.Add(ip.weight, xv);
684 for (
int j = 0; j < n; j++)
689 #else // MFEM_USE_MPFR is defined
691 static const mpfr_rnd_t rnd = HP_Quadrature1D::rnd;
692 HP_Quadrature1D hp_quad;
693 mpfr_t l, lk, w0, wi, tmp, *weights;
694 mpfr_inits2(hp_quad.default_prec, l, lk, w0, wi, tmp, (mpfr_ptr) 0);
695 weights =
new mpfr_t[n];
696 for (
int i = 0; i < n; i++)
698 mpfr_init2(weights[i], hp_quad.default_prec);
699 mpfr_set_si(weights[i], 0, rnd);
701 hp_quad.SetRelTol(-48);
704 int hinv = 0, ihoffset = 0;
707 case Quadrature1D::ClosedUniform:
712 case Quadrature1D::OpenUniform:
717 case Quadrature1D::OpenHalfUniform:
723 MFEM_ABORT(
"invalid Quadrature1D type: " << type);
726 mpfr_fac_ui(w0, p, rnd);
727 mpfr_ui_pow_ui(tmp, hinv, p, rnd);
728 mpfr_div(w0, w0, tmp, rnd);
729 if (p%2) { mpfr_neg(w0, w0, rnd); }
731 for (
int j = 0; j < m; j++)
733 hp_quad.ComputeGaussLegendrePoint(m, j);
738 mpfr_mul_si(tmp, hp_quad.GetHPPoint(), hinv, rnd);
739 mpfr_sub_d(tmp, tmp, 0.5*ihoffset, rnd);
740 mpfr_round(tmp, tmp);
741 int k = min(max((
int)mpfr_get_si(tmp, rnd), 0), p);
742 mpfr_set_si(lk, 1, rnd);
743 for (
int i = 0; i <= p; i++)
745 mpfr_set_si(tmp, 2*i+ihoffset, rnd);
746 mpfr_div_si(tmp, tmp, 2*hinv, rnd);
747 mpfr_sub(tmp, hp_quad.GetHPPoint(), tmp, rnd);
750 mpfr_mul(lk, lk, tmp, rnd);
754 mpfr_set(l, tmp, rnd);
757 mpfr_mul(l, l, lk, rnd);
758 mpfr_set(wi, w0, rnd);
759 for (
int i = 0;
true; i++)
764 mpfr_set_si(tmp, 2*i+ihoffset, rnd);
765 mpfr_div_si(tmp, tmp, 2*hinv, rnd);
766 mpfr_sub(tmp, hp_quad.GetHPPoint(), tmp, rnd);
767 mpfr_mul(tmp, tmp, wi, rnd);
768 mpfr_div(tmp, l, tmp, rnd);
773 mpfr_div(tmp, lk, wi, rnd);
776 mpfr_mul(tmp, tmp, hp_quad.GetHPWeight(), rnd);
777 mpfr_add(weights[i], weights[i], tmp, rnd);
779 if (i == p) {
break; }
782 mpfr_mul_si(wi, wi, i+1, rnd);
783 mpfr_div_si(wi, wi, i-p, rnd);
786 for (
int i = 0; i < n; i++)
789 mpfr_clear(weights[i]);
792 mpfr_clears(l, lk, w0, wi, tmp, (mpfr_ptr) 0);
794 #endif // MFEM_USE_MPFR
799 int Quadrature1D::CheckClosed(
int type)
811 int Quadrature1D::CheckOpen(
int type)
819 case OpenHalfUniform:
831 IntegrationRules::IntegrationRules(
int Ref,
int _type):
836 if (refined < 0) { own_rules = 0;
return; }
840 PointIntRules.SetSize(2);
841 PointIntRules = NULL;
843 SegmentIntRules.SetSize(32);
844 SegmentIntRules = NULL;
847 TriangleIntRules.SetSize(32);
848 TriangleIntRules = NULL;
850 SquareIntRules.SetSize(32);
851 SquareIntRules = NULL;
854 TetrahedronIntRules.SetSize(32);
855 TetrahedronIntRules = NULL;
857 CubeIntRules.SetSize(32);
874 mfem_error(
"IntegrationRules::Get(...) : Unknown geometry type!");
883 if (!HaveIntRule(*ir_array, Order))
885 #ifdef MFEM_USE_OPENMP
889 if (!HaveIntRule(*ir_array, Order))
891 GenerateIntegrationRule(GeomType, Order);
896 return *(*ir_array)[Order];
912 mfem_error(
"IntegrationRules::Set(...) : Unknown geometry type!");
916 if (HaveIntRule(*ir_array, Order))
918 MFEM_ABORT(
"Overwriting set rules is not supported!");
921 AllocIntRule(*ir_array, Order);
923 (*ir_array)[Order] = &IntRule;
933 for (i = 0; i < ir_array.
Size(); i++)
935 if (ir_array[i] != NULL && ir_array[i] != ir)
945 if (!own_rules) {
return; }
947 DeleteIntRuleArray(PointIntRules);
948 DeleteIntRuleArray(SegmentIntRules);
949 DeleteIntRuleArray(TriangleIntRules);
950 DeleteIntRuleArray(SquareIntRules);
951 DeleteIntRuleArray(TetrahedronIntRules);
952 DeleteIntRuleArray(CubeIntRules);
956 IntegrationRule *IntegrationRules::GenerateIntegrationRule(
int GeomType,
962 return PointIntegrationRule(Order);
964 return SegmentIntegrationRule(Order);
966 return TriangleIntegrationRule(Order);
968 return SquareIntegrationRule(Order);
970 return TetrahedronIntegrationRule(Order);
972 return CubeIntegrationRule(Order);
974 mfem_error(
"IntegrationRules::Set(...) : Unknown geometry type!");
981 IntegrationRule *IntegrationRules::PointIntegrationRule(
int Order)
985 mfem_error(
"Point Integration Rule of Order > 1 not defined");
989 IntegrationRule *ir =
new IntegrationRule(1);
990 ir->IntPoint(0).x = .0;
991 ir->IntPoint(0).weight = 1.;
993 PointIntRules[1] = PointIntRules[0] = ir;
999 IntegrationRule *IntegrationRules::SegmentIntegrationRule(
int Order)
1001 int RealOrder = GetSegmentRealOrder(Order);
1003 AllocIntRule(SegmentIntRules, RealOrder);
1005 IntegrationRule tmp, *ir;
1006 ir = refined ? &tmp :
new IntegrationRule;
1050 MFEM_ABORT(
"unknown Quadrature1D type: " << quad_type);
1056 ir =
new IntegrationRule(2*n);
1057 for (
int j = 0; j < n; j++)
1059 ir->IntPoint(j).x = tmp.IntPoint(j).x/2.0;
1060 ir->IntPoint(j).weight = tmp.IntPoint(j).weight/2.0;
1061 ir->IntPoint(j+n).x = 0.5 + tmp.IntPoint(j).x/2.0;
1062 ir->IntPoint(j+n).weight = tmp.IntPoint(j).weight/2.0;
1065 SegmentIntRules[RealOrder-1] = SegmentIntRules[RealOrder] = ir;
1070 IntegrationRule *IntegrationRules::TriangleIntegrationRule(
int Order)
1072 IntegrationRule *ir = NULL;
1081 ir =
new IntegrationRule(1);
1082 ir->AddTriMidPoint(0, 0.5);
1083 TriangleIntRules[0] = TriangleIntRules[1] = ir;
1087 ir =
new IntegrationRule(3);
1088 ir->AddTriPoints3(0, 1./6., 1./6.);
1089 TriangleIntRules[2] = ir;
1094 ir =
new IntegrationRule(4);
1095 ir->AddTriMidPoint(0, -0.28125);
1096 ir->AddTriPoints3(1, 0.2, 25./96.);
1097 TriangleIntRules[3] = ir;
1101 ir =
new IntegrationRule(6);
1102 ir->AddTriPoints3(0, 0.091576213509770743460, 0.054975871827660933819);
1103 ir->AddTriPoints3(3, 0.44594849091596488632, 0.11169079483900573285);
1104 TriangleIntRules[4] = ir;
1108 ir =
new IntegrationRule(7);
1109 ir->AddTriMidPoint(0, 0.1125);
1110 ir->AddTriPoints3(1, 0.10128650732345633880, 0.062969590272413576298);
1111 ir->AddTriPoints3(4, 0.47014206410511508977, 0.066197076394253090369);
1112 TriangleIntRules[5] = ir;
1116 ir =
new IntegrationRule(12);
1117 ir->AddTriPoints3(0, 0.063089014491502228340, 0.025422453185103408460);
1118 ir->AddTriPoints3(3, 0.24928674517091042129, 0.058393137863189683013);
1119 ir->AddTriPoints6(6, 0.053145049844816947353, 0.31035245103378440542,
1120 0.041425537809186787597);
1121 TriangleIntRules[6] = ir;
1125 ir =
new IntegrationRule(12);
1126 ir->AddTriPoints3R(0, 0.062382265094402118174, 0.067517867073916085443,
1127 0.026517028157436251429);
1128 ir->AddTriPoints3R(3, 0.055225456656926611737, 0.32150249385198182267,
1129 0.043881408714446055037);
1131 ir->AddTriPoints3R(6, 0.034324302945097146470, 0.66094919618673565761,
1132 0.30472650086816719592, 0.028775042784981585738);
1133 ir->AddTriPoints3R(9, 0.51584233435359177926, 0.27771616697639178257,
1134 0.20644149867001643817, 0.067493187009802774463);
1135 TriangleIntRules[7] = ir;
1139 ir =
new IntegrationRule(16);
1140 ir->AddTriMidPoint(0, 0.0721578038388935841255455552445323);
1141 ir->AddTriPoints3(1, 0.170569307751760206622293501491464,
1142 0.0516086852673591251408957751460645);
1143 ir->AddTriPoints3(4, 0.0505472283170309754584235505965989,
1144 0.0162292488115990401554629641708902);
1145 ir->AddTriPoints3(7, 0.459292588292723156028815514494169,
1146 0.0475458171336423123969480521942921);
1147 ir->AddTriPoints6(10, 0.008394777409957605337213834539296,
1148 0.263112829634638113421785786284643,
1149 0.0136151570872174971324223450369544);
1150 TriangleIntRules[8] = ir;
1154 ir =
new IntegrationRule(19);
1155 ir->AddTriMidPoint(0, 0.0485678981413994169096209912536443);
1156 ir->AddTriPoints3b(1, 0.020634961602524744433,
1157 0.0156673501135695352684274156436046);
1158 ir->AddTriPoints3b(4, 0.12582081701412672546,
1159 0.0389137705023871396583696781497019);
1160 ir->AddTriPoints3(7, 0.188203535619032730240961280467335,
1161 0.0398238694636051265164458871320226);
1162 ir->AddTriPoints3(10, 0.0447295133944527098651065899662763,
1163 0.0127888378293490156308393992794999);
1164 ir->AddTriPoints6(13, 0.0368384120547362836348175987833851,
1165 0.2219629891607656956751025276931919,
1166 0.0216417696886446886446886446886446);
1167 TriangleIntRules[9] = ir;
1171 ir =
new IntegrationRule(25);
1172 ir->AddTriMidPoint(0, 0.0454089951913767900476432975500142);
1173 ir->AddTriPoints3b(1, 0.028844733232685245264984935583748,
1174 0.0183629788782333523585030359456832);
1175 ir->AddTriPoints3(4, 0.109481575485037054795458631340522,
1176 0.0226605297177639673913028223692986);
1177 ir->AddTriPoints6(7, 0.141707219414879954756683250476361,
1178 0.307939838764120950165155022930631,
1179 0.0363789584227100543021575883096803);
1180 ir->AddTriPoints6(13, 0.025003534762686386073988481007746,
1181 0.246672560639902693917276465411176,
1182 0.0141636212655287424183685307910495);
1183 ir->AddTriPoints6(19, 0.0095408154002994575801528096228873,
1184 0.0668032510122002657735402127620247,
1185 4.71083348186641172996373548344341E-03);
1186 TriangleIntRules[10] = ir;
1190 ir =
new IntegrationRule(28);
1191 ir->AddTriPoints6(0, 0.0,
1192 0.141129718717363295960826061941652,
1193 3.68119189165027713212944752369032E-03);
1194 ir->AddTriMidPoint(6, 0.0439886505811161193990465846607278);
1195 ir->AddTriPoints3(7, 0.0259891409282873952600324854988407,
1196 4.37215577686801152475821439991262E-03);
1197 ir->AddTriPoints3(10, 0.0942875026479224956305697762754049,
1198 0.0190407859969674687575121697178070);
1199 ir->AddTriPoints3b(13, 0.010726449965572372516734795387128,
1200 9.42772402806564602923839129555767E-03);
1201 ir->AddTriPoints3(16, 0.207343382614511333452934024112966,
1202 0.0360798487723697630620149942932315);
1203 ir->AddTriPoints3b(19, 0.122184388599015809877869236727746,
1204 0.0346645693527679499208828254519072);
1205 ir->AddTriPoints6(22, 0.0448416775891304433090523914688007,
1206 0.2772206675282791551488214673424523,
1207 0.0205281577146442833208261574536469);
1208 TriangleIntRules[11] = ir;
1212 ir =
new IntegrationRule(33);
1213 ir->AddTriPoints3b(0, 2.35652204523900E-02, 1.28655332202275E-02);
1214 ir->AddTriPoints3b(3, 1.20551215411079E-01, 2.18462722690190E-02);
1215 ir->AddTriPoints3(6, 2.71210385012116E-01, 3.14291121089425E-02);
1216 ir->AddTriPoints3(9, 1.27576145541586E-01, 1.73980564653545E-02);
1217 ir->AddTriPoints3(12, 2.13173504532100E-02, 3.08313052577950E-03);
1218 ir->AddTriPoints6(15, 1.15343494534698E-01, 2.75713269685514E-01,
1219 2.01857788831905E-02);
1220 ir->AddTriPoints6(21, 2.28383322222570E-02, 2.81325580989940E-01,
1221 1.11783866011515E-02);
1222 ir->AddTriPoints6(27, 2.57340505483300E-02, 1.16251915907597E-01,
1223 8.65811555432950E-03);
1224 TriangleIntRules[12] = ir;
1228 ir =
new IntegrationRule(37);
1229 ir->AddTriPoints3b(0, 0.0,
1230 2.67845189554543044455908674650066E-03);
1231 ir->AddTriMidPoint(3, 0.0293480398063595158995969648597808);
1232 ir->AddTriPoints3(4, 0.0246071886432302181878499494124643,
1233 3.92538414805004016372590903990464E-03);
1234 ir->AddTriPoints3b(7, 0.159382493797610632566158925635800,
1235 0.0253344765879434817105476355306468);
1236 ir->AddTriPoints3(10, 0.227900255506160619646298948153592,
1237 0.0250401630452545330803738542916538);
1238 ir->AddTriPoints3(13, 0.116213058883517905247155321839271,
1239 0.0158235572961491595176634480481793);
1240 ir->AddTriPoints3b(16, 0.046794039901841694097491569577008,
1241 0.0157462815379843978450278590138683);
1242 ir->AddTriPoints6(19, 0.0227978945382486125477207592747430,
1243 0.1254265183163409177176192369310890,
1244 7.90126610763037567956187298486575E-03);
1245 ir->AddTriPoints6(25, 0.0162757709910885409437036075960413,
1246 0.2909269114422506044621801030055257,
1247 7.99081889046420266145965132482933E-03);
1248 ir->AddTriPoints6(31, 0.0897330604516053590796290561145196,
1249 0.2723110556841851025078181617634414,
1250 0.0182757511120486476280967518782978);
1251 TriangleIntRules[13] = ir;
1255 ir =
new IntegrationRule(42);
1256 ir->AddTriPoints3b(0, 2.20721792756430E-02, 1.09417906847145E-02);
1257 ir->AddTriPoints3b(3, 1.64710561319092E-01, 1.63941767720625E-02);
1258 ir->AddTriPoints3(6, 2.73477528308839E-01, 2.58870522536460E-02);
1259 ir->AddTriPoints3(9, 1.77205532412543E-01, 2.10812943684965E-02);
1260 ir->AddTriPoints3(12, 6.17998830908730E-02, 7.21684983488850E-03);
1261 ir->AddTriPoints3(15, 1.93909612487010E-02, 2.46170180120000E-03);
1262 ir->AddTriPoints6(18, 5.71247574036480E-02, 1.72266687821356E-01,
1263 1.23328766062820E-02);
1264 ir->AddTriPoints6(24, 9.29162493569720E-02, 3.36861459796345E-01,
1265 1.92857553935305E-02);
1266 ir->AddTriPoints6(30, 1.46469500556540E-02, 2.98372882136258E-01,
1267 7.21815405676700E-03);
1268 ir->AddTriPoints6(36, 1.26833093287200E-03, 1.18974497696957E-01,
1269 2.50511441925050E-03);
1270 TriangleIntRules[14] = ir;
1274 ir =
new IntegrationRule(54);
1275 ir->AddTriPoints3b(0, 0.0834384072617499333, 0.016330909424402645);
1276 ir->AddTriPoints3b(3, 0.192779070841738867, 0.01370640901568218);
1277 ir->AddTriPoints3(6, 0.293197167913025367, 0.01325501829935165);
1278 ir->AddTriPoints3(9, 0.146467786942772933, 0.014607981068243055);
1279 ir->AddTriPoints3(12, 0.0563628676656034333, 0.005292304033121995);
1280 ir->AddTriPoints3(15, 0.0165751268583703333, 0.0018073215320460175);
1281 ir->AddTriPoints6(18, 0.0099122033092248, 0.239534554154794445,
1282 0.004263874050854718);
1283 ir->AddTriPoints6(24, 0.015803770630228, 0.404878807318339958,
1284 0.006958088258345965);
1285 ir->AddTriPoints6(30, 0.00514360881697066667, 0.0950021131130448885,
1286 0.0021459664703674175);
1287 ir->AddTriPoints6(36, 0.0489223257529888, 0.149753107322273969,
1288 0.008117664640887445);
1289 ir->AddTriPoints6(42, 0.0687687486325192, 0.286919612441334979,
1290 0.012803670460631195);
1291 ir->AddTriPoints6(48, 0.1684044181246992, 0.281835668099084562,
1292 0.016544097765822835);
1293 TriangleIntRules[15] = ir;
1298 ir =
new IntegrationRule(61);
1299 ir->AddTriMidPoint(0, 1.67185996454015E-02);
1300 ir->AddTriPoints3b(1, 5.65891888645200E-03, 2.54670772025350E-03);
1301 ir->AddTriPoints3b(4, 3.56473547507510E-02, 7.33543226381900E-03);
1302 ir->AddTriPoints3b(7, 9.95200619584370E-02, 1.21754391768360E-02);
1303 ir->AddTriPoints3b(10, 1.99467521245206E-01, 1.55537754344845E-02);
1304 ir->AddTriPoints3 (13, 2.52141267970953E-01, 1.56285556093100E-02);
1305 ir->AddTriPoints3 (16, 1.62047004658461E-01, 1.24078271698325E-02);
1306 ir->AddTriPoints3 (19, 7.58758822607460E-02, 7.02803653527850E-03);
1307 ir->AddTriPoints3 (22, 1.56547269678220E-02, 1.59733808688950E-03);
1308 ir->AddTriPoints6 (25, 1.01869288269190E-02, 3.34319867363658E-01,
1309 4.05982765949650E-03);
1310 ir->AddTriPoints6 (31, 1.35440871671036E-01, 2.92221537796944E-01,
1311 1.34028711415815E-02);
1312 ir->AddTriPoints6 (37, 5.44239242905830E-02, 3.19574885423190E-01,
1313 9.22999660541100E-03);
1314 ir->AddTriPoints6 (43, 1.28685608336370E-02, 1.90704224192292E-01,
1315 4.23843426716400E-03);
1316 ir->AddTriPoints6 (49, 6.71657824135240E-02, 1.80483211648746E-01,
1317 9.14639838501250E-03);
1318 ir->AddTriPoints6 (55, 1.46631822248280E-02, 8.07113136795640E-02,
1319 3.33281600208250E-03);
1320 TriangleIntRules[16] = TriangleIntRules[17] = ir;
1325 ir =
new IntegrationRule(73);
1326 ir->AddTriMidPoint(0, 0.0164531656944595);
1327 ir->AddTriPoints3b(1, 0.020780025853987, 0.005165365945636);
1328 ir->AddTriPoints3b(4, 0.090926214604215, 0.011193623631508);
1329 ir->AddTriPoints3b(7, 0.197166638701138, 0.015133062934734);
1330 ir->AddTriPoints3 (10, 0.255551654403098, 0.015245483901099);
1331 ir->AddTriPoints3 (13, 0.17707794215213, 0.0120796063708205);
1332 ir->AddTriPoints3 (16, 0.110061053227952, 0.0080254017934005);
1333 ir->AddTriPoints3 (19, 0.05552862425184, 0.004042290130892);
1334 ir->AddTriPoints3 (22, 0.012621863777229, 0.0010396810137425);
1335 ir->AddTriPoints6 (25, 0.003611417848412, 0.395754787356943,
1336 0.0019424384524905);
1337 ir->AddTriPoints6 (31, 0.13446675453078, 0.307929983880436,
1339 ir->AddTriPoints6 (37, 0.014446025776115, 0.26456694840652,
1341 ir->AddTriPoints6 (43, 0.046933578838178, 0.358539352205951,
1342 0.0080622733808655);
1343 ir->AddTriPoints6 (49, 0.002861120350567, 0.157807405968595,
1344 0.0012459709087455);
1345 ir->AddTriPoints6 (55, 0.075050596975911, 0.223861424097916,
1346 0.0091214200594755);
1347 ir->AddTriPoints6 (61, 0.03464707481676, 0.142421601113383,
1348 0.0051292818680995);
1349 ir->AddTriPoints6 (67, 0.065494628082938, 0.010161119296278,
1351 TriangleIntRules[18] = TriangleIntRules[19] = ir;
1355 ir =
new IntegrationRule(85);
1356 ir->AddTriMidPoint(0, 0.01380521349884976);
1357 ir->AddTriPoints3b(1, 0.001500649324429, 0.00088951477366337);
1358 ir->AddTriPoints3b(4, 0.0941397519389508667, 0.010056199056980585);
1359 ir->AddTriPoints3b(7, 0.2044721240895264, 0.013408923629665785);
1360 ir->AddTriPoints3(10, 0.264500202532787333, 0.012261566900751005);
1361 ir->AddTriPoints3(13, 0.211018964092076767, 0.008197289205347695);
1362 ir->AddTriPoints3(16, 0.107735607171271333, 0.0073979536993248);
1363 ir->AddTriPoints3(19, 0.0390690878378026667, 0.0022896411388521255);
1364 ir->AddTriPoints3(22, 0.0111743797293296333, 0.0008259132577881085);
1365 ir->AddTriPoints6(25, 0.00534961818733726667, 0.0635496659083522206,
1366 0.001174585454287792);
1367 ir->AddTriPoints6(31, 0.00795481706619893333, 0.157106918940706982,
1368 0.0022329628770908965);
1369 ir->AddTriPoints6(37, 0.0104223982812638, 0.395642114364374018,
1370 0.003049783403953986);
1371 ir->AddTriPoints6(43, 0.0109644147961233333, 0.273167570712910522,
1372 0.0034455406635941015);
1373 ir->AddTriPoints6(49, 0.0385667120854623333, 0.101785382485017108,
1374 0.0039987375362390815);
1375 ir->AddTriPoints6(55, 0.0355805078172182, 0.446658549176413815,
1376 0.003693067142668012);
1377 ir->AddTriPoints6(61, 0.0496708163627641333, 0.199010794149503095,
1378 0.00639966593932413);
1379 ir->AddTriPoints6(67, 0.0585197250843317333, 0.3242611836922827,
1380 0.008629035587848275);
1381 ir->AddTriPoints6(73, 0.121497787004394267, 0.208531363210132855,
1382 0.009336472951467735);
1383 ir->AddTriPoints6(79, 0.140710844943938733, 0.323170566536257485,
1384 0.01140911202919763);
1385 TriangleIntRules[20] = ir;
1393 ir =
new IntegrationRule(126);
1394 ir->AddTriPoints3b(0, 0.0279464830731742, 0.0040027909400102085);
1395 ir->AddTriPoints3b(3, 0.131178601327651467, 0.00797353841619525);
1396 ir->AddTriPoints3b(6, 0.220221729512072267, 0.006554570615397765);
1397 ir->AddTriPoints3 (9, 0.298443234019804467, 0.00979150048281781);
1398 ir->AddTriPoints3(12, 0.2340441723373718, 0.008235442720768635);
1399 ir->AddTriPoints3(15, 0.151468334609017567, 0.00427363953704605);
1400 ir->AddTriPoints3(18, 0.112733893545993667, 0.004080942928613246);
1401 ir->AddTriPoints3(21, 0.0777156920915263, 0.0030605732699918895);
1402 ir->AddTriPoints3(24, 0.034893093614297, 0.0014542491324683325);
1403 ir->AddTriPoints3(27, 0.00725818462093236667, 0.00034613762283099815);
1404 ir->AddTriPoints6(30, 0.0012923527044422, 0.227214452153364077,
1405 0.0006241445996386985);
1406 ir->AddTriPoints6(36, 0.0053997012721162, 0.435010554853571706,
1407 0.001702376454401511);
1408 ir->AddTriPoints6(42, 0.006384003033975, 0.320309599272204437,
1409 0.0016798271630320255);
1410 ir->AddTriPoints6(48, 0.00502821150199306667, 0.0917503222800051889,
1411 0.000858078269748377);
1412 ir->AddTriPoints6(54, 0.00682675862178186667, 0.0380108358587243835,
1413 0.000740428158357803);
1414 ir->AddTriPoints6(60, 0.0100161996399295333, 0.157425218485311668,
1415 0.0017556563053643425);
1416 ir->AddTriPoints6(66, 0.02575781317339, 0.239889659778533193,
1417 0.003696775074853242);
1418 ir->AddTriPoints6(72, 0.0302278981199158, 0.361943118126060531,
1419 0.003991543738688279);
1420 ir->AddTriPoints6(78, 0.0305049901071620667, 0.0835519609548285602,
1421 0.0021779813065790205);
1422 ir->AddTriPoints6(84, 0.0459565473625693333, 0.148443220732418205,
1423 0.003682528350708916);
1424 ir->AddTriPoints6(90, 0.0674428005402775333, 0.283739708727534955,
1425 0.005481786423209775);
1426 ir->AddTriPoints6(96, 0.0700450914159106, 0.406899375118787573,
1427 0.00587498087177056);
1428 ir->AddTriPoints6(102, 0.0839115246401166, 0.194113987024892542,
1429 0.005007800356899285);
1430 ir->AddTriPoints6(108, 0.120375535677152667, 0.32413434700070316,
1431 0.00665482039381434);
1432 ir->AddTriPoints6(114, 0.148066899157366667, 0.229277483555980969,
1433 0.00707722325261307);
1434 ir->AddTriPoints6(120, 0.191771865867325067, 0.325618122595983752,
1435 0.007440689780584005);
1436 TriangleIntRules[21] =
1437 TriangleIntRules[22] =
1438 TriangleIntRules[23] =
1439 TriangleIntRules[24] =
1440 TriangleIntRules[25] = ir;
1445 int i = (Order / 2) * 2 + 1;
1446 AllocIntRule(TriangleIntRules, i);
1447 ir =
new IntegrationRule;
1448 ir->GrundmannMollerSimplexRule(i/2,2);
1449 TriangleIntRules[i-1] = TriangleIntRules[i] = ir;
1455 IntegrationRule *IntegrationRules::SquareIntegrationRule(
int Order)
1457 int RealOrder = GetSegmentRealOrder(Order);
1459 if (!HaveIntRule(SegmentIntRules, RealOrder))
1461 SegmentIntegrationRule(RealOrder);
1463 AllocIntRule(SquareIntRules, RealOrder);
1464 SquareIntRules[RealOrder-1] =
1465 SquareIntRules[RealOrder] =
1466 new IntegrationRule(*SegmentIntRules[RealOrder],
1467 *SegmentIntRules[RealOrder]);
1468 return SquareIntRules[Order];
1473 IntegrationRule *IntegrationRules::TetrahedronIntegrationRule(
int Order)
1475 IntegrationRule *ir;
1484 ir =
new IntegrationRule(1);
1485 ir->AddTetMidPoint(0, 1./6.);
1486 TetrahedronIntRules[0] = TetrahedronIntRules[1] = ir;
1490 ir =
new IntegrationRule(4);
1492 ir->AddTetPoints4b(0, 0.58541019662496845446, 1./24.);
1493 TetrahedronIntRules[2] = ir;
1497 ir =
new IntegrationRule(5);
1498 ir->AddTetMidPoint(0, -2./15.);
1499 ir->AddTetPoints4b(1, 0.5, 0.075);
1500 TetrahedronIntRules[3] = ir;
1504 ir =
new IntegrationRule(11);
1505 ir->AddTetPoints4(0, 1./14., 343./45000.);
1506 ir->AddTetMidPoint(4, -74./5625.);
1507 ir->AddTetPoints6(5, 0.10059642383320079500, 28./1125.);
1508 TetrahedronIntRules[4] = ir;
1512 ir =
new IntegrationRule(14);
1513 ir->AddTetPoints6(0, 0.045503704125649649492,
1514 7.0910034628469110730E-03);
1515 ir->AddTetPoints4(6, 0.092735250310891226402, 0.012248840519393658257);
1516 ir->AddTetPoints4b(10, 0.067342242210098170608,
1517 0.018781320953002641800);
1518 TetrahedronIntRules[5] = ir;
1522 ir =
new IntegrationRule(24);
1523 ir->AddTetPoints4(0, 0.21460287125915202929,
1524 6.6537917096945820166E-03);
1525 ir->AddTetPoints4(4, 0.040673958534611353116,
1526 1.6795351758867738247E-03);
1527 ir->AddTetPoints4b(8, 0.032986329573173468968,
1528 9.2261969239424536825E-03);
1529 ir->AddTetPoints12(12, 0.063661001875017525299, 0.26967233145831580803,
1530 8.0357142857142857143E-03);
1531 TetrahedronIntRules[6] = ir;
1535 ir =
new IntegrationRule(31);
1536 ir->AddTetPoints6(0, 0.0, 9.7001763668430335097E-04);
1537 ir->AddTetMidPoint(6, 0.018264223466108820291);
1538 ir->AddTetPoints4(7, 0.078213192330318064374, 0.010599941524413686916);
1539 ir->AddTetPoints4(11, 0.12184321666390517465,
1540 -0.062517740114331851691);
1541 ir->AddTetPoints4b(15, 2.3825066607381275412E-03,
1542 4.8914252630734993858E-03);
1543 ir->AddTetPoints12(19, 0.1, 0.2, 0.027557319223985890653);
1544 TetrahedronIntRules[7] = ir;
1548 ir =
new IntegrationRule(43);
1549 ir->AddTetPoints4(0, 5.7819505051979972532E-03,
1550 1.6983410909288737984E-04);
1551 ir->AddTetPoints4(4, 0.082103588310546723091,
1552 1.9670333131339009876E-03);
1553 ir->AddTetPoints12(8, 0.036607749553197423679, 0.19048604193463345570,
1554 2.1405191411620925965E-03);
1555 ir->AddTetPoints6(20, 0.050532740018894224426,
1556 4.5796838244672818007E-03);
1557 ir->AddTetPoints12(26, 0.22906653611681113960, 0.035639582788534043717,
1558 5.7044858086819185068E-03);
1559 ir->AddTetPoints4(38, 0.20682993161067320408, 0.014250305822866901248);
1560 ir->AddTetMidPoint(42, -0.020500188658639915841);
1561 TetrahedronIntRules[8] = ir;
1565 ir =
new IntegrationRule;
1566 ir->GrundmannMollerSimplexRule(4,3);
1567 TetrahedronIntRules[9] = ir;
1571 int i = (Order / 2) * 2 + 1;
1572 AllocIntRule(TetrahedronIntRules, i);
1573 ir =
new IntegrationRule;
1574 ir->GrundmannMollerSimplexRule(i/2,3);
1575 TetrahedronIntRules[i-1] = TetrahedronIntRules[i] = ir;
1581 IntegrationRule *IntegrationRules::CubeIntegrationRule(
int Order)
1583 int RealOrder = GetSegmentRealOrder(Order);
1584 if (!HaveIntRule(SegmentIntRules, RealOrder))
1586 SegmentIntegrationRule(RealOrder);
1588 AllocIntRule(CubeIntRules, RealOrder);
1589 CubeIntRules[RealOrder-1] =
1590 CubeIntRules[RealOrder] =
1591 new IntegrationRule(*SegmentIntRules[RealOrder],
1592 *SegmentIntRules[RealOrder],
1593 *SegmentIntRules[RealOrder]);
1594 return CubeIntRules[Order];
int GetNPoints() const
Returns the number of the points in the integration rule.
int Size() const
Logical size of the array.
Class for an integration rule - an Array of IntegrationPoint.
const IntegrationRule & Get(int GeomType, int Order)
Returns an integration rule for given GeomType and Order.
void ClosedUniform(const int np, IntegrationRule *ir)
~IntegrationRules()
Destroys an IntegrationRules object.
Container class for integration rules.
void OpenUniform(const int np, IntegrationRule *ir)
void GaussLobatto(const int np, IntegrationRule *ir)
IntegrationPoint & IntPoint(int i)
Returns a reference to the i-th integration point.
void OpenHalfUniform(const int np, IntegrationRule *ir)
void mfem_error(const char *msg)
void SetSize(int nsize)
Change logical size of the array, keep existing entries.
Class for integration point with weight.
aka "open half" Newton-Cotes
IntegrationRules RefinedIntRules(1, Quadrature1D::GaussLegendre)
A global object with all refined integration rules.
void Set(int GeomType, int Order, IntegrationRule &IntRule)
IntegrationRules IntRules(0, Quadrature1D::GaussLegendre)
A global object with all integration rules (defined in intrules.cpp)
void Set1w(const double x1, const double w)
void GaussLegendre(const int np, IntegrationRule *ir)