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)
83 if (weights.Size() != GetNPoints())
86 for (
int i = 0; i < GetNPoints(); i++)
88 weights[i] = IntPoint(i).weight;
94 void IntegrationRule::GrundmannMollerSimplexRule(
int s,
int n)
98 const int d = 2*s + 1;
103 for (
int i = 1; i < fact.Size(); i++)
105 fact(i) = fact(i - 1)*i;
110 for (
int i = 0; i <= n; i++)
112 np *= (s + i + 1), f *= (i + 1);
118 for (
int i = 0; i <= s; i++)
122 weight = pow(2., -2*s)*pow(static_cast<double>(d + n - 2*i),
123 d)/fact(i)/fact(d + n - i);
135 IntegrationPoint &ip = IntPoint(pt++);
137 ip.x = double(2*beta[0] + 1)/(d + n - 2*i);
138 ip.y = double(2*beta[1] + 1)/(d + n - 2*i);
141 ip.z = double(2*beta[2] + 1)/(d + n - 2*i);
155 for (j--; j >= 0; j--)
169 class HP_Quadrature1D
172 mpfr_t pi, z, pp, p1, p2, p3, dz, w, rtol;
175 static const mpfr_rnd_t rnd = GMP_RNDN;
176 static const int default_prec = 128;
179 HP_Quadrature1D(
const int prec = default_prec)
181 mpfr_inits2(prec, pi, z, pp, p1, p2, p3, dz, w, rtol, (mpfr_ptr) 0);
182 mpfr_const_pi(pi, rnd);
183 mpfr_set_si_2exp(rtol, 1, -32, rnd);
189 void SetRelTol(
const int exponent = -32)
191 mpfr_set_si_2exp(rtol, 1, exponent, rnd);
197 void ComputeGaussLegendrePoint(
const int n,
const int k)
199 MFEM_ASSERT(n > 0 && 0 <= k && k < n,
"invalid n = " << n
200 <<
" and/or k = " << k);
202 int i = (k < (n+1)/2) ? k+1 : n-k;
207 mpfr_set_si(z, n+1-2*i, rnd);
208 mpfr_div_si(z, z, 2*n+1, rnd);
209 mpfr_mul(z, z, pi, rnd);
215 mpfr_set_si(p2, 1, rnd);
216 mpfr_set(p1, z, rnd);
217 for (
int j = 2; j <= n; j++)
219 mpfr_set(p3, p2, rnd);
220 mpfr_set(p2, p1, rnd);
222 mpfr_mul_si(p1, z, 2*j-1, rnd);
223 mpfr_mul_si(p3, p3, j-1, rnd);
224 mpfr_fms(p1, p1, p2, p3, rnd);
225 mpfr_div_si(p1, p1, j, rnd);
231 mpfr_fms(pp, z, p1, p2, rnd);
232 mpfr_mul_si(pp, pp, n, rnd);
233 mpfr_sqr(p2, z, rnd);
234 mpfr_sub_si(p2, p2, 1, rnd);
235 mpfr_div(pp, pp, p2, rnd);
240 mpfr_div(dz, p1, pp, rnd);
243 mpfr_si_sub(atol, 1, z, rnd);
244 mpfr_mul(atol, atol, rtol, rnd);
245 if (mpfr_cmpabs(dz, atol) <= 0)
251 mpfr_sub(z, z, dz, rnd);
255 mpfr_si_sub(z, 1, z, rnd);
256 mpfr_div_2si(z, z, 1, rnd);
259 mpfr_sqr(w, pp, rnd);
260 mpfr_mul_2si(w, w, 2, rnd);
261 mpfr_mul(w, w, z, rnd);
262 mpfr_si_sub(p1, 1, z, rnd);
263 mpfr_mul(w, w, p1, rnd);
264 mpfr_si_div(w, 1, w, rnd);
266 if (k >= (n+1)/2) { mpfr_swap(z, p1); }
272 void ComputeGaussLobattoPoint(
const int n,
const int k)
274 MFEM_ASSERT(n > 1 && 0 <= k && k < n,
"invalid n = " << n
275 <<
" and/or k = " << k);
277 int i = (k < (n+1)/2) ? k : n-1-k;
281 mpfr_set_si(z, 0, rnd);
282 mpfr_set_si(p1, 1, rnd);
283 mpfr_set_si(w, n*(n-1), rnd);
284 mpfr_si_div(w, 1, w, rnd);
289 mpfr_set_si(z, 2*i-n+1, rnd);
290 mpfr_div_si(z, z, 2*(n-1), rnd);
291 mpfr_mul(z, pi, z, rnd);
294 for (
int iter = 0 ; true ; ++iter)
297 mpfr_set_si(p1, 1, rnd);
298 mpfr_set(p2, z, rnd);
300 for (
int l = 1 ; l < (n-1) ; ++l)
303 mpfr_mul_si(p1, p1, l, rnd);
304 mpfr_mul_si(p3, z, 2*l+1, rnd);
305 mpfr_fms(p3, p3, p2, p1, rnd);
306 mpfr_div_si(p3, p3, l+1, rnd);
308 mpfr_set(p1, p2, rnd);
309 mpfr_set(p2, p3, rnd);
313 mpfr_fms(dz, z, p2, p1, rnd);
314 mpfr_mul_si(p3, p2, n, rnd);
315 mpfr_div(dz, dz, p3, rnd);
317 mpfr_sub(z, z, dz, rnd);
320 mpfr_add_si(atol, z, 1, rnd);
321 mpfr_mul(atol, atol, rtol, rnd);
323 if (mpfr_cmpabs(dz, atol) <= 0)
329 MFEM_VERIFY(iter < 8,
"n = " << n <<
", i = " << i
330 <<
", dz = " << mpfr_get_d(dz, rnd));
333 mpfr_add_si(z, z, 1, rnd);
334 mpfr_div_2si(z, z, 1, rnd);
336 mpfr_si_sub(p1, 1, z, rnd);
338 mpfr_sqr(w, p2, rnd);
339 mpfr_mul_si(w, w, n*(n-1), rnd);
340 mpfr_si_div(w, 1, w, rnd);
342 if (k >= (n+1)/2) { mpfr_swap(z, p1); }
345 double GetPoint()
const {
return mpfr_get_d(z, rnd); }
346 double GetSymmPoint()
const {
return mpfr_get_d(p1, rnd); }
347 double GetWeight()
const {
return mpfr_get_d(w, rnd); }
349 const mpfr_t &GetHPPoint()
const {
return z; }
350 const mpfr_t &GetHPSymmPoint()
const {
return p1; }
351 const mpfr_t &GetHPWeight()
const {
return w; }
355 mpfr_clears(pi, z, pp, p1, p2, p3, dz, w, rtol, (mpfr_ptr) 0);
360 #endif // MFEM_USE_MPFR
384 const int m = (n+1)/2;
386 #ifndef MFEM_USE_MPFR
388 for (
int i = 1; i <= m; i++)
390 double z = cos(M_PI * (i - 0.25) / (n + 0.5));
391 double pp, p1, dz, xi = 0.;
397 for (
int j = 2; j <= n; j++)
401 p1 = ((2 * j - 1) * z * p2 - (j - 1) * p3) / j;
405 pp = n * (z*p1-p2) / (z*z - 1);
409 if (fabs(dz) < 1e-16)
413 xi = ((1 - z) + dz)/2;
426 #else // MFEM_USE_MPFR is defined
428 HP_Quadrature1D hp_quad;
429 for (
int i = 1; i <= m; i++)
431 hp_quad.ComputeGaussLegendrePoint(n, i-1);
433 ir->
IntPoint(i-1).
x = hp_quad.GetPoint();
434 ir->
IntPoint(n-i).
x = hp_quad.GetSymmPoint();
438 #endif // MFEM_USE_MPFR
475 #ifndef MFEM_USE_MPFR
484 for (
int i = 1 ; i <= (np-1)/2 ; ++i)
488 double x_i = std::sin(M_PI * ((
double)(i)/(np-1) - 0.5));
489 double z_i = 0., p_l;
491 for (
int iter = 0 ; true ; ++iter)
497 for (
int l = 1 ; l < (np-1) ; ++l)
502 double p_lp1 = ( (2*l + 1)*x_i*p_l - l*p_lm1)/(l + 1);
520 double dx = (x_i*p_l - p_lm1) / (np*p_l);
521 if (std::abs(dx) < 1e-16)
525 z_i = ((1.0 + x_i) - dx)/2;
529 MFEM_VERIFY(iter < 8,
"np = " << np <<
", i = " << i
538 ip.
weight = (double)(1.0 / (np*(np-1)*p_l*p_l));
542 symm_ip.
x = 1.0 - z_i;
546 #else // MFEM_USE_MPFR is defined
548 HP_Quadrature1D hp_quad;
550 for (
int i = 0 ; i <= (np-1)/2 ; ++i)
552 hp_quad.ComputeGaussLobattoPoint(np, i);
554 ir->
IntPoint(np-1-i).
x = hp_quad.GetSymmPoint();
559 #endif // MFEM_USE_MPFR
570 for (
int i = 0; i < np ; ++i)
572 ir->
IntPoint(i).
x = double(i+1) / double(np + 1);
575 CalculateUniformWeights(ir, Quadrature1D::OpenUniform);
578 void QuadratureFunctions1D::ClosedUniform(
const int np,
588 for (
int i = 0; i < np ; ++i)
593 CalculateUniformWeights(ir, Quadrature1D::ClosedUniform);
601 for (
int i = 0; i < np ; ++i)
603 ir->
IntPoint(i).
x = double(2*i+1) / (2*np);
606 CalculateUniformWeights(ir, Quadrature1D::OpenHalfUniform);
609 void QuadratureFunctions1D::GivePolyPoints(
const int np,
double *
pts,
616 case Quadrature1D::GaussLegendre:
618 GaussLegendre(np,&ir);
621 case Quadrature1D::GaussLobatto:
623 GaussLobatto(np, &ir);
626 case Quadrature1D::OpenUniform:
631 case Quadrature1D::ClosedUniform:
633 ClosedUniform(np,&ir);
636 case Quadrature1D::OpenHalfUniform:
638 OpenHalfUniform(np, &ir);
643 MFEM_ABORT(
"Asking for an unknown type of 1D Quadrature points, "
648 for (
int i = 0 ; i < np ; ++i)
654 void QuadratureFunctions1D::CalculateUniformWeights(
IntegrationRule *ir,
665 const int n = ir->
Size();
677 #ifndef MFEM_USE_MPFR
680 const IntegrationRule &glob_ir =
IntRules.
Get(Geometry::SEGMENT, n-1);
683 for (
int j = 0; j < n; j++)
687 Poly_1D::Basis basis(n-1, xv.GetData());
691 for (
int i = 0; i < m; i++)
693 const IntegrationPoint &ip = glob_ir.IntPoint(i);
694 basis.Eval(ip.x, xv);
695 w.Add(ip.weight, xv);
697 for (
int j = 0; j < n; j++)
702 #else // MFEM_USE_MPFR is defined
704 static const mpfr_rnd_t rnd = HP_Quadrature1D::rnd;
705 HP_Quadrature1D hp_quad;
706 mpfr_t l, lk, w0, wi, tmp, *weights;
707 mpfr_inits2(hp_quad.default_prec, l, lk, w0, wi, tmp, (mpfr_ptr) 0);
708 weights =
new mpfr_t[n];
709 for (
int i = 0; i < n; i++)
711 mpfr_init2(weights[i], hp_quad.default_prec);
712 mpfr_set_si(weights[i], 0, rnd);
714 hp_quad.SetRelTol(-48);
717 int hinv = 0, ihoffset = 0;
720 case Quadrature1D::ClosedUniform:
725 case Quadrature1D::OpenUniform:
730 case Quadrature1D::OpenHalfUniform:
736 MFEM_ABORT(
"invalid Quadrature1D type: " << type);
739 mpfr_fac_ui(w0, p, rnd);
740 mpfr_ui_pow_ui(tmp, hinv, p, rnd);
741 mpfr_div(w0, w0, tmp, rnd);
742 if (p%2) { mpfr_neg(w0, w0, rnd); }
744 for (
int j = 0; j < m; j++)
746 hp_quad.ComputeGaussLegendrePoint(m, j);
751 mpfr_mul_si(tmp, hp_quad.GetHPPoint(), hinv, rnd);
752 mpfr_sub_d(tmp, tmp, 0.5*ihoffset, rnd);
753 mpfr_round(tmp, tmp);
754 int k = min(max((
int)mpfr_get_si(tmp, rnd), 0), p);
755 mpfr_set_si(lk, 1, rnd);
756 for (
int i = 0; i <= p; i++)
758 mpfr_set_si(tmp, 2*i+ihoffset, rnd);
759 mpfr_div_si(tmp, tmp, 2*hinv, rnd);
760 mpfr_sub(tmp, hp_quad.GetHPPoint(), tmp, rnd);
763 mpfr_mul(lk, lk, tmp, rnd);
767 mpfr_set(l, tmp, rnd);
770 mpfr_mul(l, l, lk, rnd);
771 mpfr_set(wi, w0, rnd);
772 for (
int i = 0;
true; i++)
777 mpfr_set_si(tmp, 2*i+ihoffset, rnd);
778 mpfr_div_si(tmp, tmp, 2*hinv, rnd);
779 mpfr_sub(tmp, hp_quad.GetHPPoint(), tmp, rnd);
780 mpfr_mul(tmp, tmp, wi, rnd);
781 mpfr_div(tmp, l, tmp, rnd);
786 mpfr_div(tmp, lk, wi, rnd);
789 mpfr_mul(tmp, tmp, hp_quad.GetHPWeight(), rnd);
790 mpfr_add(weights[i], weights[i], tmp, rnd);
792 if (i == p) {
break; }
795 mpfr_mul_si(wi, wi, i+1, rnd);
796 mpfr_div_si(wi, wi, i-p, rnd);
799 for (
int i = 0; i < n; i++)
802 mpfr_clear(weights[i]);
805 mpfr_clears(l, lk, w0, wi, tmp, (mpfr_ptr) 0);
807 #endif // MFEM_USE_MPFR
812 int Quadrature1D::CheckClosed(
int type)
824 int Quadrature1D::CheckOpen(
int type)
832 case OpenHalfUniform:
844 IntegrationRules::IntegrationRules(
int Ref,
int _type):
849 if (refined < 0) { own_rules = 0;
return; }
853 PointIntRules.SetSize(2);
854 PointIntRules = NULL;
856 SegmentIntRules.SetSize(32);
857 SegmentIntRules = NULL;
860 TriangleIntRules.SetSize(32);
861 TriangleIntRules = NULL;
863 SquareIntRules.SetSize(32);
864 SquareIntRules = NULL;
867 TetrahedronIntRules.SetSize(32);
868 TetrahedronIntRules = NULL;
870 PrismIntRules.SetSize(32);
871 PrismIntRules = NULL;
873 CubeIntRules.SetSize(32);
891 mfem_error(
"IntegrationRules::Get(...) : Unknown geometry type!");
900 if (!HaveIntRule(*ir_array, Order))
902 #ifdef MFEM_USE_LEGACY_OPENMP
906 if (!HaveIntRule(*ir_array, Order))
909 int RealOrder = Order;
910 while (RealOrder+1 < ir_array->
Size() &&
911 (*ir_array)[RealOrder+1] == ir)
920 return *(*ir_array)[Order];
937 mfem_error(
"IntegrationRules::Set(...) : Unknown geometry type!");
941 if (HaveIntRule(*ir_array, Order))
943 MFEM_ABORT(
"Overwriting set rules is not supported!");
946 AllocIntRule(*ir_array, Order);
948 (*ir_array)[Order] = &IntRule;
958 for (i = 0; i < ir_array.
Size(); i++)
960 if (ir_array[i] != NULL && ir_array[i] != ir)
970 if (!own_rules) {
return; }
972 DeleteIntRuleArray(PointIntRules);
973 DeleteIntRuleArray(SegmentIntRules);
974 DeleteIntRuleArray(TriangleIntRules);
975 DeleteIntRuleArray(SquareIntRules);
976 DeleteIntRuleArray(TetrahedronIntRules);
977 DeleteIntRuleArray(CubeIntRules);
978 DeleteIntRuleArray(PrismIntRules);
982 IntegrationRule *IntegrationRules::GenerateIntegrationRule(
int GeomType,
988 return PointIntegrationRule(Order);
990 return SegmentIntegrationRule(Order);
992 return TriangleIntegrationRule(Order);
994 return SquareIntegrationRule(Order);
996 return TetrahedronIntegrationRule(Order);
998 return CubeIntegrationRule(Order);
1000 return PrismIntegrationRule(Order);
1002 mfem_error(
"IntegrationRules::Set(...) : Unknown geometry type!");
1009 IntegrationRule *IntegrationRules::PointIntegrationRule(
int Order)
1013 mfem_error(
"Point Integration Rule of Order > 1 not defined");
1017 IntegrationRule *ir =
new IntegrationRule(1);
1018 ir->IntPoint(0).x = .0;
1019 ir->IntPoint(0).weight = 1.;
1021 PointIntRules[1] = PointIntRules[0] = ir;
1027 IntegrationRule *IntegrationRules::SegmentIntegrationRule(
int Order)
1029 int RealOrder = GetSegmentRealOrder(Order);
1031 AllocIntRule(SegmentIntRules, RealOrder);
1033 IntegrationRule tmp, *ir;
1034 ir = refined ? &tmp :
new IntegrationRule;
1078 MFEM_ABORT(
"unknown Quadrature1D type: " << quad_type);
1084 ir =
new IntegrationRule(2*n);
1085 for (
int j = 0; j < n; j++)
1087 ir->IntPoint(j).x = tmp.IntPoint(j).x/2.0;
1088 ir->IntPoint(j).weight = tmp.IntPoint(j).weight/2.0;
1089 ir->IntPoint(j+n).x = 0.5 + tmp.IntPoint(j).x/2.0;
1090 ir->IntPoint(j+n).weight = tmp.IntPoint(j).weight/2.0;
1093 SegmentIntRules[RealOrder-1] = SegmentIntRules[RealOrder] = ir;
1098 IntegrationRule *IntegrationRules::TriangleIntegrationRule(
int Order)
1100 IntegrationRule *ir = NULL;
1109 ir =
new IntegrationRule(1);
1110 ir->AddTriMidPoint(0, 0.5);
1111 TriangleIntRules[0] = TriangleIntRules[1] = ir;
1115 ir =
new IntegrationRule(3);
1116 ir->AddTriPoints3(0, 1./6., 1./6.);
1117 TriangleIntRules[2] = ir;
1122 ir =
new IntegrationRule(4);
1123 ir->AddTriMidPoint(0, -0.28125);
1124 ir->AddTriPoints3(1, 0.2, 25./96.);
1125 TriangleIntRules[3] = ir;
1129 ir =
new IntegrationRule(6);
1130 ir->AddTriPoints3(0, 0.091576213509770743460, 0.054975871827660933819);
1131 ir->AddTriPoints3(3, 0.44594849091596488632, 0.11169079483900573285);
1132 TriangleIntRules[4] = ir;
1136 ir =
new IntegrationRule(7);
1137 ir->AddTriMidPoint(0, 0.1125);
1138 ir->AddTriPoints3(1, 0.10128650732345633880, 0.062969590272413576298);
1139 ir->AddTriPoints3(4, 0.47014206410511508977, 0.066197076394253090369);
1140 TriangleIntRules[5] = ir;
1144 ir =
new IntegrationRule(12);
1145 ir->AddTriPoints3(0, 0.063089014491502228340, 0.025422453185103408460);
1146 ir->AddTriPoints3(3, 0.24928674517091042129, 0.058393137863189683013);
1147 ir->AddTriPoints6(6, 0.053145049844816947353, 0.31035245103378440542,
1148 0.041425537809186787597);
1149 TriangleIntRules[6] = ir;
1153 ir =
new IntegrationRule(12);
1154 ir->AddTriPoints3R(0, 0.062382265094402118174, 0.067517867073916085443,
1155 0.026517028157436251429);
1156 ir->AddTriPoints3R(3, 0.055225456656926611737, 0.32150249385198182267,
1157 0.043881408714446055037);
1159 ir->AddTriPoints3R(6, 0.034324302945097146470, 0.66094919618673565761,
1160 0.30472650086816719592, 0.028775042784981585738);
1161 ir->AddTriPoints3R(9, 0.51584233435359177926, 0.27771616697639178257,
1162 0.20644149867001643817, 0.067493187009802774463);
1163 TriangleIntRules[7] = ir;
1167 ir =
new IntegrationRule(16);
1168 ir->AddTriMidPoint(0, 0.0721578038388935841255455552445323);
1169 ir->AddTriPoints3(1, 0.170569307751760206622293501491464,
1170 0.0516086852673591251408957751460645);
1171 ir->AddTriPoints3(4, 0.0505472283170309754584235505965989,
1172 0.0162292488115990401554629641708902);
1173 ir->AddTriPoints3(7, 0.459292588292723156028815514494169,
1174 0.0475458171336423123969480521942921);
1175 ir->AddTriPoints6(10, 0.008394777409957605337213834539296,
1176 0.263112829634638113421785786284643,
1177 0.0136151570872174971324223450369544);
1178 TriangleIntRules[8] = ir;
1182 ir =
new IntegrationRule(19);
1183 ir->AddTriMidPoint(0, 0.0485678981413994169096209912536443);
1184 ir->AddTriPoints3b(1, 0.020634961602524744433,
1185 0.0156673501135695352684274156436046);
1186 ir->AddTriPoints3b(4, 0.12582081701412672546,
1187 0.0389137705023871396583696781497019);
1188 ir->AddTriPoints3(7, 0.188203535619032730240961280467335,
1189 0.0398238694636051265164458871320226);
1190 ir->AddTriPoints3(10, 0.0447295133944527098651065899662763,
1191 0.0127888378293490156308393992794999);
1192 ir->AddTriPoints6(13, 0.0368384120547362836348175987833851,
1193 0.2219629891607656956751025276931919,
1194 0.0216417696886446886446886446886446);
1195 TriangleIntRules[9] = ir;
1199 ir =
new IntegrationRule(25);
1200 ir->AddTriMidPoint(0, 0.0454089951913767900476432975500142);
1201 ir->AddTriPoints3b(1, 0.028844733232685245264984935583748,
1202 0.0183629788782333523585030359456832);
1203 ir->AddTriPoints3(4, 0.109481575485037054795458631340522,
1204 0.0226605297177639673913028223692986);
1205 ir->AddTriPoints6(7, 0.141707219414879954756683250476361,
1206 0.307939838764120950165155022930631,
1207 0.0363789584227100543021575883096803);
1208 ir->AddTriPoints6(13, 0.025003534762686386073988481007746,
1209 0.246672560639902693917276465411176,
1210 0.0141636212655287424183685307910495);
1211 ir->AddTriPoints6(19, 0.0095408154002994575801528096228873,
1212 0.0668032510122002657735402127620247,
1213 4.71083348186641172996373548344341E-03);
1214 TriangleIntRules[10] = ir;
1218 ir =
new IntegrationRule(28);
1219 ir->AddTriPoints6(0, 0.0,
1220 0.141129718717363295960826061941652,
1221 3.68119189165027713212944752369032E-03);
1222 ir->AddTriMidPoint(6, 0.0439886505811161193990465846607278);
1223 ir->AddTriPoints3(7, 0.0259891409282873952600324854988407,
1224 4.37215577686801152475821439991262E-03);
1225 ir->AddTriPoints3(10, 0.0942875026479224956305697762754049,
1226 0.0190407859969674687575121697178070);
1227 ir->AddTriPoints3b(13, 0.010726449965572372516734795387128,
1228 9.42772402806564602923839129555767E-03);
1229 ir->AddTriPoints3(16, 0.207343382614511333452934024112966,
1230 0.0360798487723697630620149942932315);
1231 ir->AddTriPoints3b(19, 0.122184388599015809877869236727746,
1232 0.0346645693527679499208828254519072);
1233 ir->AddTriPoints6(22, 0.0448416775891304433090523914688007,
1234 0.2772206675282791551488214673424523,
1235 0.0205281577146442833208261574536469);
1236 TriangleIntRules[11] = ir;
1240 ir =
new IntegrationRule(33);
1241 ir->AddTriPoints3b(0, 2.35652204523900E-02, 1.28655332202275E-02);
1242 ir->AddTriPoints3b(3, 1.20551215411079E-01, 2.18462722690190E-02);
1243 ir->AddTriPoints3(6, 2.71210385012116E-01, 3.14291121089425E-02);
1244 ir->AddTriPoints3(9, 1.27576145541586E-01, 1.73980564653545E-02);
1245 ir->AddTriPoints3(12, 2.13173504532100E-02, 3.08313052577950E-03);
1246 ir->AddTriPoints6(15, 1.15343494534698E-01, 2.75713269685514E-01,
1247 2.01857788831905E-02);
1248 ir->AddTriPoints6(21, 2.28383322222570E-02, 2.81325580989940E-01,
1249 1.11783866011515E-02);
1250 ir->AddTriPoints6(27, 2.57340505483300E-02, 1.16251915907597E-01,
1251 8.65811555432950E-03);
1252 TriangleIntRules[12] = ir;
1256 ir =
new IntegrationRule(37);
1257 ir->AddTriPoints3b(0, 0.0,
1258 2.67845189554543044455908674650066E-03);
1259 ir->AddTriMidPoint(3, 0.0293480398063595158995969648597808);
1260 ir->AddTriPoints3(4, 0.0246071886432302181878499494124643,
1261 3.92538414805004016372590903990464E-03);
1262 ir->AddTriPoints3b(7, 0.159382493797610632566158925635800,
1263 0.0253344765879434817105476355306468);
1264 ir->AddTriPoints3(10, 0.227900255506160619646298948153592,
1265 0.0250401630452545330803738542916538);
1266 ir->AddTriPoints3(13, 0.116213058883517905247155321839271,
1267 0.0158235572961491595176634480481793);
1268 ir->AddTriPoints3b(16, 0.046794039901841694097491569577008,
1269 0.0157462815379843978450278590138683);
1270 ir->AddTriPoints6(19, 0.0227978945382486125477207592747430,
1271 0.1254265183163409177176192369310890,
1272 7.90126610763037567956187298486575E-03);
1273 ir->AddTriPoints6(25, 0.0162757709910885409437036075960413,
1274 0.2909269114422506044621801030055257,
1275 7.99081889046420266145965132482933E-03);
1276 ir->AddTriPoints6(31, 0.0897330604516053590796290561145196,
1277 0.2723110556841851025078181617634414,
1278 0.0182757511120486476280967518782978);
1279 TriangleIntRules[13] = ir;
1283 ir =
new IntegrationRule(42);
1284 ir->AddTriPoints3b(0, 2.20721792756430E-02, 1.09417906847145E-02);
1285 ir->AddTriPoints3b(3, 1.64710561319092E-01, 1.63941767720625E-02);
1286 ir->AddTriPoints3(6, 2.73477528308839E-01, 2.58870522536460E-02);
1287 ir->AddTriPoints3(9, 1.77205532412543E-01, 2.10812943684965E-02);
1288 ir->AddTriPoints3(12, 6.17998830908730E-02, 7.21684983488850E-03);
1289 ir->AddTriPoints3(15, 1.93909612487010E-02, 2.46170180120000E-03);
1290 ir->AddTriPoints6(18, 5.71247574036480E-02, 1.72266687821356E-01,
1291 1.23328766062820E-02);
1292 ir->AddTriPoints6(24, 9.29162493569720E-02, 3.36861459796345E-01,
1293 1.92857553935305E-02);
1294 ir->AddTriPoints6(30, 1.46469500556540E-02, 2.98372882136258E-01,
1295 7.21815405676700E-03);
1296 ir->AddTriPoints6(36, 1.26833093287200E-03, 1.18974497696957E-01,
1297 2.50511441925050E-03);
1298 TriangleIntRules[14] = ir;
1302 ir =
new IntegrationRule(54);
1303 ir->AddTriPoints3b(0, 0.0834384072617499333, 0.016330909424402645);
1304 ir->AddTriPoints3b(3, 0.192779070841738867, 0.01370640901568218);
1305 ir->AddTriPoints3(6, 0.293197167913025367, 0.01325501829935165);
1306 ir->AddTriPoints3(9, 0.146467786942772933, 0.014607981068243055);
1307 ir->AddTriPoints3(12, 0.0563628676656034333, 0.005292304033121995);
1308 ir->AddTriPoints3(15, 0.0165751268583703333, 0.0018073215320460175);
1309 ir->AddTriPoints6(18, 0.0099122033092248, 0.239534554154794445,
1310 0.004263874050854718);
1311 ir->AddTriPoints6(24, 0.015803770630228, 0.404878807318339958,
1312 0.006958088258345965);
1313 ir->AddTriPoints6(30, 0.00514360881697066667, 0.0950021131130448885,
1314 0.0021459664703674175);
1315 ir->AddTriPoints6(36, 0.0489223257529888, 0.149753107322273969,
1316 0.008117664640887445);
1317 ir->AddTriPoints6(42, 0.0687687486325192, 0.286919612441334979,
1318 0.012803670460631195);
1319 ir->AddTriPoints6(48, 0.1684044181246992, 0.281835668099084562,
1320 0.016544097765822835);
1321 TriangleIntRules[15] = ir;
1326 ir =
new IntegrationRule(61);
1327 ir->AddTriMidPoint(0, 1.67185996454015E-02);
1328 ir->AddTriPoints3b(1, 5.65891888645200E-03, 2.54670772025350E-03);
1329 ir->AddTriPoints3b(4, 3.56473547507510E-02, 7.33543226381900E-03);
1330 ir->AddTriPoints3b(7, 9.95200619584370E-02, 1.21754391768360E-02);
1331 ir->AddTriPoints3b(10, 1.99467521245206E-01, 1.55537754344845E-02);
1332 ir->AddTriPoints3 (13, 2.52141267970953E-01, 1.56285556093100E-02);
1333 ir->AddTriPoints3 (16, 1.62047004658461E-01, 1.24078271698325E-02);
1334 ir->AddTriPoints3 (19, 7.58758822607460E-02, 7.02803653527850E-03);
1335 ir->AddTriPoints3 (22, 1.56547269678220E-02, 1.59733808688950E-03);
1336 ir->AddTriPoints6 (25, 1.01869288269190E-02, 3.34319867363658E-01,
1337 4.05982765949650E-03);
1338 ir->AddTriPoints6 (31, 1.35440871671036E-01, 2.92221537796944E-01,
1339 1.34028711415815E-02);
1340 ir->AddTriPoints6 (37, 5.44239242905830E-02, 3.19574885423190E-01,
1341 9.22999660541100E-03);
1342 ir->AddTriPoints6 (43, 1.28685608336370E-02, 1.90704224192292E-01,
1343 4.23843426716400E-03);
1344 ir->AddTriPoints6 (49, 6.71657824135240E-02, 1.80483211648746E-01,
1345 9.14639838501250E-03);
1346 ir->AddTriPoints6 (55, 1.46631822248280E-02, 8.07113136795640E-02,
1347 3.33281600208250E-03);
1348 TriangleIntRules[16] = TriangleIntRules[17] = ir;
1353 ir =
new IntegrationRule(73);
1354 ir->AddTriMidPoint(0, 0.0164531656944595);
1355 ir->AddTriPoints3b(1, 0.020780025853987, 0.005165365945636);
1356 ir->AddTriPoints3b(4, 0.090926214604215, 0.011193623631508);
1357 ir->AddTriPoints3b(7, 0.197166638701138, 0.015133062934734);
1358 ir->AddTriPoints3 (10, 0.255551654403098, 0.015245483901099);
1359 ir->AddTriPoints3 (13, 0.17707794215213, 0.0120796063708205);
1360 ir->AddTriPoints3 (16, 0.110061053227952, 0.0080254017934005);
1361 ir->AddTriPoints3 (19, 0.05552862425184, 0.004042290130892);
1362 ir->AddTriPoints3 (22, 0.012621863777229, 0.0010396810137425);
1363 ir->AddTriPoints6 (25, 0.003611417848412, 0.395754787356943,
1364 0.0019424384524905);
1365 ir->AddTriPoints6 (31, 0.13446675453078, 0.307929983880436,
1367 ir->AddTriPoints6 (37, 0.014446025776115, 0.26456694840652,
1369 ir->AddTriPoints6 (43, 0.046933578838178, 0.358539352205951,
1370 0.0080622733808655);
1371 ir->AddTriPoints6 (49, 0.002861120350567, 0.157807405968595,
1372 0.0012459709087455);
1373 ir->AddTriPoints6 (55, 0.075050596975911, 0.223861424097916,
1374 0.0091214200594755);
1375 ir->AddTriPoints6 (61, 0.03464707481676, 0.142421601113383,
1376 0.0051292818680995);
1377 ir->AddTriPoints6 (67, 0.065494628082938, 0.010161119296278,
1379 TriangleIntRules[18] = TriangleIntRules[19] = ir;
1383 ir =
new IntegrationRule(85);
1384 ir->AddTriMidPoint(0, 0.01380521349884976);
1385 ir->AddTriPoints3b(1, 0.001500649324429, 0.00088951477366337);
1386 ir->AddTriPoints3b(4, 0.0941397519389508667, 0.010056199056980585);
1387 ir->AddTriPoints3b(7, 0.2044721240895264, 0.013408923629665785);
1388 ir->AddTriPoints3(10, 0.264500202532787333, 0.012261566900751005);
1389 ir->AddTriPoints3(13, 0.211018964092076767, 0.008197289205347695);
1390 ir->AddTriPoints3(16, 0.107735607171271333, 0.0073979536993248);
1391 ir->AddTriPoints3(19, 0.0390690878378026667, 0.0022896411388521255);
1392 ir->AddTriPoints3(22, 0.0111743797293296333, 0.0008259132577881085);
1393 ir->AddTriPoints6(25, 0.00534961818733726667, 0.0635496659083522206,
1394 0.001174585454287792);
1395 ir->AddTriPoints6(31, 0.00795481706619893333, 0.157106918940706982,
1396 0.0022329628770908965);
1397 ir->AddTriPoints6(37, 0.0104223982812638, 0.395642114364374018,
1398 0.003049783403953986);
1399 ir->AddTriPoints6(43, 0.0109644147961233333, 0.273167570712910522,
1400 0.0034455406635941015);
1401 ir->AddTriPoints6(49, 0.0385667120854623333, 0.101785382485017108,
1402 0.0039987375362390815);
1403 ir->AddTriPoints6(55, 0.0355805078172182, 0.446658549176413815,
1404 0.003693067142668012);
1405 ir->AddTriPoints6(61, 0.0496708163627641333, 0.199010794149503095,
1406 0.00639966593932413);
1407 ir->AddTriPoints6(67, 0.0585197250843317333, 0.3242611836922827,
1408 0.008629035587848275);
1409 ir->AddTriPoints6(73, 0.121497787004394267, 0.208531363210132855,
1410 0.009336472951467735);
1411 ir->AddTriPoints6(79, 0.140710844943938733, 0.323170566536257485,
1412 0.01140911202919763);
1413 TriangleIntRules[20] = ir;
1421 ir =
new IntegrationRule(126);
1422 ir->AddTriPoints3b(0, 0.0279464830731742, 0.0040027909400102085);
1423 ir->AddTriPoints3b(3, 0.131178601327651467, 0.00797353841619525);
1424 ir->AddTriPoints3b(6, 0.220221729512072267, 0.006554570615397765);
1425 ir->AddTriPoints3 (9, 0.298443234019804467, 0.00979150048281781);
1426 ir->AddTriPoints3(12, 0.2340441723373718, 0.008235442720768635);
1427 ir->AddTriPoints3(15, 0.151468334609017567, 0.00427363953704605);
1428 ir->AddTriPoints3(18, 0.112733893545993667, 0.004080942928613246);
1429 ir->AddTriPoints3(21, 0.0777156920915263, 0.0030605732699918895);
1430 ir->AddTriPoints3(24, 0.034893093614297, 0.0014542491324683325);
1431 ir->AddTriPoints3(27, 0.00725818462093236667, 0.00034613762283099815);
1432 ir->AddTriPoints6(30, 0.0012923527044422, 0.227214452153364077,
1433 0.0006241445996386985);
1434 ir->AddTriPoints6(36, 0.0053997012721162, 0.435010554853571706,
1435 0.001702376454401511);
1436 ir->AddTriPoints6(42, 0.006384003033975, 0.320309599272204437,
1437 0.0016798271630320255);
1438 ir->AddTriPoints6(48, 0.00502821150199306667, 0.0917503222800051889,
1439 0.000858078269748377);
1440 ir->AddTriPoints6(54, 0.00682675862178186667, 0.0380108358587243835,
1441 0.000740428158357803);
1442 ir->AddTriPoints6(60, 0.0100161996399295333, 0.157425218485311668,
1443 0.0017556563053643425);
1444 ir->AddTriPoints6(66, 0.02575781317339, 0.239889659778533193,
1445 0.003696775074853242);
1446 ir->AddTriPoints6(72, 0.0302278981199158, 0.361943118126060531,
1447 0.003991543738688279);
1448 ir->AddTriPoints6(78, 0.0305049901071620667, 0.0835519609548285602,
1449 0.0021779813065790205);
1450 ir->AddTriPoints6(84, 0.0459565473625693333, 0.148443220732418205,
1451 0.003682528350708916);
1452 ir->AddTriPoints6(90, 0.0674428005402775333, 0.283739708727534955,
1453 0.005481786423209775);
1454 ir->AddTriPoints6(96, 0.0700450914159106, 0.406899375118787573,
1455 0.00587498087177056);
1456 ir->AddTriPoints6(102, 0.0839115246401166, 0.194113987024892542,
1457 0.005007800356899285);
1458 ir->AddTriPoints6(108, 0.120375535677152667, 0.32413434700070316,
1459 0.00665482039381434);
1460 ir->AddTriPoints6(114, 0.148066899157366667, 0.229277483555980969,
1461 0.00707722325261307);
1462 ir->AddTriPoints6(120, 0.191771865867325067, 0.325618122595983752,
1463 0.007440689780584005);
1464 TriangleIntRules[21] =
1465 TriangleIntRules[22] =
1466 TriangleIntRules[23] =
1467 TriangleIntRules[24] =
1468 TriangleIntRules[25] = ir;
1473 int i = (Order / 2) * 2 + 1;
1474 AllocIntRule(TriangleIntRules, i);
1475 ir =
new IntegrationRule;
1476 ir->GrundmannMollerSimplexRule(i/2,2);
1477 TriangleIntRules[i-1] = TriangleIntRules[i] = ir;
1483 IntegrationRule *IntegrationRules::SquareIntegrationRule(
int Order)
1485 int RealOrder = GetSegmentRealOrder(Order);
1487 if (!HaveIntRule(SegmentIntRules, RealOrder))
1489 SegmentIntegrationRule(RealOrder);
1491 AllocIntRule(SquareIntRules, RealOrder);
1492 SquareIntRules[RealOrder-1] =
1493 SquareIntRules[RealOrder] =
1494 new IntegrationRule(*SegmentIntRules[RealOrder],
1495 *SegmentIntRules[RealOrder]);
1496 return SquareIntRules[Order];
1501 IntegrationRule *IntegrationRules::TetrahedronIntegrationRule(
int Order)
1503 IntegrationRule *ir;
1512 ir =
new IntegrationRule(1);
1513 ir->AddTetMidPoint(0, 1./6.);
1514 TetrahedronIntRules[0] = TetrahedronIntRules[1] = ir;
1518 ir =
new IntegrationRule(4);
1520 ir->AddTetPoints4b(0, 0.58541019662496845446, 1./24.);
1521 TetrahedronIntRules[2] = ir;
1525 ir =
new IntegrationRule(5);
1526 ir->AddTetMidPoint(0, -2./15.);
1527 ir->AddTetPoints4b(1, 0.5, 0.075);
1528 TetrahedronIntRules[3] = ir;
1532 ir =
new IntegrationRule(11);
1533 ir->AddTetPoints4(0, 1./14., 343./45000.);
1534 ir->AddTetMidPoint(4, -74./5625.);
1535 ir->AddTetPoints6(5, 0.10059642383320079500, 28./1125.);
1536 TetrahedronIntRules[4] = ir;
1540 ir =
new IntegrationRule(14);
1541 ir->AddTetPoints6(0, 0.045503704125649649492,
1542 7.0910034628469110730E-03);
1543 ir->AddTetPoints4(6, 0.092735250310891226402, 0.012248840519393658257);
1544 ir->AddTetPoints4b(10, 0.067342242210098170608,
1545 0.018781320953002641800);
1546 TetrahedronIntRules[5] = ir;
1550 ir =
new IntegrationRule(24);
1551 ir->AddTetPoints4(0, 0.21460287125915202929,
1552 6.6537917096945820166E-03);
1553 ir->AddTetPoints4(4, 0.040673958534611353116,
1554 1.6795351758867738247E-03);
1555 ir->AddTetPoints4b(8, 0.032986329573173468968,
1556 9.2261969239424536825E-03);
1557 ir->AddTetPoints12(12, 0.063661001875017525299, 0.26967233145831580803,
1558 8.0357142857142857143E-03);
1559 TetrahedronIntRules[6] = ir;
1563 ir =
new IntegrationRule(31);
1564 ir->AddTetPoints6(0, 0.0, 9.7001763668430335097E-04);
1565 ir->AddTetMidPoint(6, 0.018264223466108820291);
1566 ir->AddTetPoints4(7, 0.078213192330318064374, 0.010599941524413686916);
1567 ir->AddTetPoints4(11, 0.12184321666390517465,
1568 -0.062517740114331851691);
1569 ir->AddTetPoints4b(15, 2.3825066607381275412E-03,
1570 4.8914252630734993858E-03);
1571 ir->AddTetPoints12(19, 0.1, 0.2, 0.027557319223985890653);
1572 TetrahedronIntRules[7] = ir;
1576 ir =
new IntegrationRule(43);
1577 ir->AddTetPoints4(0, 5.7819505051979972532E-03,
1578 1.6983410909288737984E-04);
1579 ir->AddTetPoints4(4, 0.082103588310546723091,
1580 1.9670333131339009876E-03);
1581 ir->AddTetPoints12(8, 0.036607749553197423679, 0.19048604193463345570,
1582 2.1405191411620925965E-03);
1583 ir->AddTetPoints6(20, 0.050532740018894224426,
1584 4.5796838244672818007E-03);
1585 ir->AddTetPoints12(26, 0.22906653611681113960, 0.035639582788534043717,
1586 5.7044858086819185068E-03);
1587 ir->AddTetPoints4(38, 0.20682993161067320408, 0.014250305822866901248);
1588 ir->AddTetMidPoint(42, -0.020500188658639915841);
1589 TetrahedronIntRules[8] = ir;
1593 ir =
new IntegrationRule;
1594 ir->GrundmannMollerSimplexRule(4,3);
1595 TetrahedronIntRules[9] = ir;
1599 int i = (Order / 2) * 2 + 1;
1600 AllocIntRule(TetrahedronIntRules, i);
1601 ir =
new IntegrationRule;
1602 ir->GrundmannMollerSimplexRule(i/2,3);
1603 TetrahedronIntRules[i-1] = TetrahedronIntRules[i] = ir;
1609 IntegrationRule *IntegrationRules::PrismIntegrationRule(
int Order)
1613 int nt = irt.GetNPoints();
1614 int ns = irs.GetNPoints();
1615 AllocIntRule(PrismIntRules, Order);
1616 PrismIntRules[Order] =
new IntegrationRule(nt * ns);
1618 for (
int ks=0; ks<ns; ks++)
1620 const IntegrationPoint & ips = irs.IntPoint(ks);
1621 for (
int kt=0; kt<nt; kt++)
1623 int kp = ks * nt + kt;
1624 const IntegrationPoint & ipt = irt.IntPoint(kt);
1625 IntegrationPoint & ipp = PrismIntRules[Order]->IntPoint(kp);
1629 ipp.weight = ipt.weight * ips.weight;
1632 return PrismIntRules[Order];
1636 IntegrationRule *IntegrationRules::CubeIntegrationRule(
int Order)
1638 int RealOrder = GetSegmentRealOrder(Order);
1639 if (!HaveIntRule(SegmentIntRules, RealOrder))
1641 SegmentIntegrationRule(RealOrder);
1643 AllocIntRule(CubeIntRules, RealOrder);
1644 CubeIntRules[RealOrder-1] =
1645 CubeIntRules[RealOrder] =
1646 new IntegrationRule(*SegmentIntRules[RealOrder],
1647 *SegmentIntRules[RealOrder],
1648 *SegmentIntRules[RealOrder]);
1649 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 mfem_error(const char *msg)
Function called when an error is encountered. Used by the macros MFEM_ABORT, MFEM_ASSERT, MFEM_VERIFY.
void OpenHalfUniform(const int np, IntegrationRule *ir)
void SetSize(int nsize)
Change logical size of the array, keep existing entries.
void SetOrder(const int order)
Sets the order of the integration rule. This is only for keeping order information, it does not alter any data in the IntegrationRule.
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 pts(int iphi, int t, double x[])
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)