19 #include "../mesh/nurbs.hpp" 41 for (j = 0; j < ny; j++)
44 for (i = 0; i < nx; i++)
66 for (
int iz = 0; iz < nz; ++iz)
69 for (
int iy = 0; iy < ny; ++iy)
72 for (
int ix = 0; ix < nx; ++ix)
88 if (weights.Size() != GetNPoints())
91 for (
int i = 0; i < GetNPoints(); i++)
93 weights[i] = IntPoint(i).weight;
99 void IntegrationRule::SetPointIndices()
101 for (
int i = 0; i < Size(); i++)
103 IntPoint(i).index = i;
107 void IntegrationRule::GrundmannMollerSimplexRule(
int s,
int n)
111 const int d = 2*
s + 1;
116 for (
int i = 1; i < fact.Size(); i++)
118 fact(i) = fact(i - 1)*i;
123 for (
int i = 0; i <= n; i++)
125 np *= (
s + i + 1),
f *= (i + 1);
133 for (
int i = 0; i <=
s; i++)
137 weight = pow(2., -2*
s)*pow(static_cast<double>(d + n - 2*i),
138 d)/fact(i)/fact(d + n - i);
150 IntegrationPoint &ip = IntPoint(pt++);
152 ip.x = double(2*
beta[0] + 1)/(d + n - 2*i);
153 ip.y = double(2*
beta[1] + 1)/(d + n - 2*i);
156 ip.z = double(2*
beta[2] + 1)/(d + n - 2*i);
170 for (j--; j >= 0; j--)
181 IntegrationRule::ApplyToKnotIntervals(
KnotVector const& kv)
const 183 const int np = this->GetNPoints();
184 const int ne = kv.
GetNE();
193 for (
int e=0; e<ne; ++e)
199 x1 = kv[kv.
Size() - 1];
204 while (
id < kv.
Size() - 1)
215 const double s = x1 - x0;
217 for (
int j=0; j<this->GetNPoints(); ++j)
219 const double x = x0 + (
s * (*this)[j].x);
220 (*kvir)[(e * np) + j].Set1w(x, (*
this)[j].weight);
230 class HP_Quadrature1D
233 mpfr_t pi, z, pp, p1, p2, p3, dz, w, rtol;
236 static const mpfr_rnd_t rnd = GMP_RNDN;
237 static const int default_prec = 128;
240 HP_Quadrature1D(
const int prec = default_prec)
242 mpfr_inits2(prec, pi, z, pp, p1, p2, p3, dz, w, rtol, (mpfr_ptr) 0);
243 mpfr_const_pi(pi, rnd);
244 mpfr_set_si_2exp(rtol, 1, -32, rnd);
250 void SetRelTol(
const int exponent = -32)
252 mpfr_set_si_2exp(rtol, 1, exponent, rnd);
258 void ComputeGaussLegendrePoint(
const int n,
const int k)
260 MFEM_ASSERT(n > 0 && 0 <= k && k < n,
"invalid n = " << n
261 <<
" and/or k = " << k);
263 int i = (k < (n+1)/2) ? k+1 : n-k;
268 mpfr_set_si(z, n+1-2*i, rnd);
269 mpfr_div_si(z, z, 2*n+1, rnd);
270 mpfr_mul(z, z, pi, rnd);
276 mpfr_set_si(p2, 1, rnd);
277 mpfr_set(p1, z, rnd);
278 for (
int j = 2; j <= n; j++)
280 mpfr_set(p3, p2, rnd);
281 mpfr_set(p2, p1, rnd);
283 mpfr_mul_si(p1, z, 2*j-1, rnd);
284 mpfr_mul_si(p3, p3, j-1, rnd);
285 mpfr_fms(p1, p1, p2, p3, rnd);
286 mpfr_div_si(p1, p1, j, rnd);
292 mpfr_fms(pp, z, p1, p2, rnd);
293 mpfr_mul_si(pp, pp, n, rnd);
294 mpfr_sqr(p2, z, rnd);
295 mpfr_sub_si(p2, p2, 1, rnd);
296 mpfr_div(pp, pp, p2, rnd);
301 mpfr_div(dz, p1, pp, rnd);
304 mpfr_si_sub(atol, 1, z, rnd);
305 mpfr_mul(atol, atol, rtol, rnd);
306 if (mpfr_cmpabs(dz, atol) <= 0)
312 mpfr_sub(z, z, dz, rnd);
316 mpfr_si_sub(z, 1, z, rnd);
317 mpfr_div_2si(z, z, 1, rnd);
320 mpfr_sqr(w, pp, rnd);
321 mpfr_mul_2si(w, w, 2, rnd);
322 mpfr_mul(w, w, z, rnd);
323 mpfr_si_sub(p1, 1, z, rnd);
324 mpfr_mul(w, w, p1, rnd);
325 mpfr_si_div(w, 1, w, rnd);
327 if (k >= (n+1)/2) { mpfr_swap(z, p1); }
333 void ComputeGaussLobattoPoint(
const int n,
const int k)
335 MFEM_ASSERT(n > 1 && 0 <= k && k < n,
"invalid n = " << n
336 <<
" and/or k = " << k);
338 int i = (k < (n+1)/2) ? k : n-1-k;
342 mpfr_set_si(z, 0, rnd);
343 mpfr_set_si(p1, 1, rnd);
344 mpfr_set_si(w, n*(n-1), rnd);
345 mpfr_si_div(w, 1, w, rnd);
350 mpfr_set_si(z, 2*i-n+1, rnd);
351 mpfr_div_si(z, z, 2*(n-1), rnd);
352 mpfr_mul(z, pi, z, rnd);
355 for (
int iter = 0 ; true ; ++iter)
358 mpfr_set_si(p1, 1, rnd);
359 mpfr_set(p2, z, rnd);
361 for (
int l = 1 ; l < (n-1) ; ++l)
364 mpfr_mul_si(p1, p1, l, rnd);
365 mpfr_mul_si(p3, z, 2*l+1, rnd);
366 mpfr_fms(p3, p3, p2, p1, rnd);
367 mpfr_div_si(p3, p3, l+1, rnd);
369 mpfr_set(p1, p2, rnd);
370 mpfr_set(p2, p3, rnd);
374 mpfr_fms(dz, z, p2, p1, rnd);
375 mpfr_mul_si(p3, p2, n, rnd);
376 mpfr_div(dz, dz, p3, rnd);
378 mpfr_sub(z, z, dz, rnd);
381 mpfr_add_si(atol, z, 1, rnd);
382 mpfr_mul(atol, atol, rtol, rnd);
384 if (mpfr_cmpabs(dz, atol) <= 0)
390 MFEM_VERIFY(iter < 8,
"n = " << n <<
", i = " << i
391 <<
", dz = " << mpfr_get_d(dz, rnd));
394 mpfr_add_si(z, z, 1, rnd);
395 mpfr_div_2si(z, z, 1, rnd);
397 mpfr_si_sub(p1, 1, z, rnd);
399 mpfr_sqr(w, p2, rnd);
400 mpfr_mul_si(w, w, n*(n-1), rnd);
401 mpfr_si_div(w, 1, w, rnd);
403 if (k >= (n+1)/2) { mpfr_swap(z, p1); }
406 double GetPoint()
const {
return mpfr_get_d(z, rnd); }
407 double GetSymmPoint()
const {
return mpfr_get_d(p1, rnd); }
408 double GetWeight()
const {
return mpfr_get_d(w, rnd); }
410 const mpfr_t &GetHPPoint()
const {
return z; }
411 const mpfr_t &GetHPSymmPoint()
const {
return p1; }
412 const mpfr_t &GetHPWeight()
const {
return w; }
416 mpfr_clears(pi, z, pp, p1, p2, p3, dz, w, rtol, (mpfr_ptr) 0);
421 #endif // MFEM_USE_MPFR 447 const int m = (n+1)/2;
449 #ifndef MFEM_USE_MPFR 451 for (
int i = 1; i <= m; i++)
453 double z = cos(M_PI * (i - 0.25) / (n + 0.5));
454 double pp, p1, dz, xi = 0.;
460 for (
int j = 2; j <= n; j++)
464 p1 = ((2 * j - 1) * z * p2 - (j - 1) * p3) / j;
468 pp = n * (z*p1-p2) / (z*z - 1);
472 if (fabs(dz) < 1e-16)
476 xi = ((1 - z) + dz)/2;
489 #else // MFEM_USE_MPFR is defined 491 HP_Quadrature1D hp_quad;
492 for (
int i = 1; i <= m; i++)
494 hp_quad.ComputeGaussLegendrePoint(n, i-1);
496 ir->
IntPoint(i-1).
x = hp_quad.GetPoint();
497 ir->
IntPoint(n-i).
x = hp_quad.GetSymmPoint();
501 #endif // MFEM_USE_MPFR 541 #ifndef MFEM_USE_MPFR 550 for (
int i = 1 ; i <= (np-1)/2 ; ++i)
554 double x_i = std::sin(M_PI * ((
double)(i)/(np-1) - 0.5));
555 double z_i = 0., p_l;
557 for (
int iter = 0 ; true ; ++iter)
563 for (
int l = 1 ; l < (np-1) ; ++l)
568 double p_lp1 = ( (2*l + 1)*x_i*p_l - l*p_lm1)/(l + 1);
586 double dx = (x_i*p_l - p_lm1) / (np*p_l);
587 if (std::abs(dx) < 1e-16)
591 z_i = ((1.0 + x_i) - dx)/2;
595 MFEM_VERIFY(iter < 8,
"np = " << np <<
", i = " << i
604 ip.
weight = (double)(1.0 / (np*(np-1)*p_l*p_l));
608 symm_ip.
x = 1.0 - z_i;
612 #else // MFEM_USE_MPFR is defined 614 HP_Quadrature1D hp_quad;
616 for (
int i = 0 ; i <= (np-1)/2 ; ++i)
618 hp_quad.ComputeGaussLobattoPoint(np, i);
620 ir->
IntPoint(np-1-i).
x = hp_quad.GetSymmPoint();
625 #endif // MFEM_USE_MPFR 638 for (
int i = 0; i < np ; ++i)
640 ir->
IntPoint(i).
x = double(i+1) / double(np + 1);
643 CalculateUniformWeights(ir, Quadrature1D::OpenUniform);
646 void QuadratureFunctions1D::ClosedUniform(
const int np,
658 for (
int i = 0; i < np ; ++i)
663 CalculateUniformWeights(ir, Quadrature1D::ClosedUniform);
673 for (
int i = 0; i < np ; ++i)
675 ir->
IntPoint(i).
x = double(2*i+1) / (2*np);
678 CalculateUniformWeights(ir, Quadrature1D::OpenHalfUniform);
692 GaussLegendre(np-1, &gl_ir);
694 for (
int i = 1; i < np-1; ++i)
700 CalculateUniformWeights(ir, Quadrature1D::ClosedGL);
703 void QuadratureFunctions1D::GivePolyPoints(
const int np,
double *
pts,
710 case Quadrature1D::GaussLegendre:
712 GaussLegendre(np,&ir);
715 case Quadrature1D::GaussLobatto:
717 GaussLobatto(np, &ir);
720 case Quadrature1D::OpenUniform:
725 case Quadrature1D::ClosedUniform:
727 ClosedUniform(np,&ir);
730 case Quadrature1D::OpenHalfUniform:
732 OpenHalfUniform(np, &ir);
735 case Quadrature1D::ClosedGL:
742 MFEM_ABORT(
"Asking for an unknown type of 1D Quadrature points, " 747 for (
int i = 0 ; i < np ; ++i)
753 void QuadratureFunctions1D::CalculateUniformWeights(
IntegrationRule *ir,
764 const int n = ir->
Size();
776 #ifndef MFEM_USE_MPFR 779 const IntegrationRule &glob_ir =
IntRules.
Get(Geometry::SEGMENT, n-1);
782 for (
int j = 0; j < n; j++)
786 Poly_1D::Basis basis(n-1, xv.GetData());
790 for (
int i = 0; i < m; i++)
792 const IntegrationPoint &ip = glob_ir.IntPoint(i);
793 basis.Eval(ip.x, xv);
794 w.Add(ip.weight, xv);
796 for (
int j = 0; j < n; j++)
801 #else // MFEM_USE_MPFR is defined 803 static const mpfr_rnd_t rnd = HP_Quadrature1D::rnd;
804 HP_Quadrature1D hp_quad;
805 mpfr_t l, lk, w0, wi, tmp, *weights;
806 mpfr_inits2(hp_quad.default_prec, l, lk, w0, wi, tmp, (mpfr_ptr) 0);
807 weights =
new mpfr_t[n];
808 for (
int i = 0; i < n; i++)
810 mpfr_init2(weights[i], hp_quad.default_prec);
811 mpfr_set_si(weights[i], 0, rnd);
813 hp_quad.SetRelTol(-48);
816 int hinv = 0, ihoffset = 0;
819 case Quadrature1D::ClosedUniform:
824 case Quadrature1D::OpenUniform:
829 case Quadrature1D::OpenHalfUniform:
835 MFEM_ABORT(
"invalid Quadrature1D type: " << type);
838 mpfr_fac_ui(w0,
p, rnd);
839 mpfr_ui_pow_ui(tmp, hinv,
p, rnd);
840 mpfr_div(w0, w0, tmp, rnd);
841 if (
p%2) { mpfr_neg(w0, w0, rnd); }
843 for (
int j = 0; j < m; j++)
845 hp_quad.ComputeGaussLegendrePoint(m, j);
850 mpfr_mul_si(tmp, hp_quad.GetHPPoint(), hinv, rnd);
851 mpfr_sub_d(tmp, tmp, 0.5*ihoffset, rnd);
852 mpfr_round(tmp, tmp);
853 int k = min(max((
int)mpfr_get_si(tmp, rnd), 0),
p);
854 mpfr_set_si(lk, 1, rnd);
855 for (
int i = 0; i <=
p; i++)
857 mpfr_set_si(tmp, 2*i+ihoffset, rnd);
858 mpfr_div_si(tmp, tmp, 2*hinv, rnd);
859 mpfr_sub(tmp, hp_quad.GetHPPoint(), tmp, rnd);
862 mpfr_mul(lk, lk, tmp, rnd);
866 mpfr_set(l, tmp, rnd);
869 mpfr_mul(l, l, lk, rnd);
870 mpfr_set(wi, w0, rnd);
871 for (
int i = 0;
true; i++)
876 mpfr_set_si(tmp, 2*i+ihoffset, rnd);
877 mpfr_div_si(tmp, tmp, 2*hinv, rnd);
878 mpfr_sub(tmp, hp_quad.GetHPPoint(), tmp, rnd);
879 mpfr_mul(tmp, tmp, wi, rnd);
880 mpfr_div(tmp, l, tmp, rnd);
885 mpfr_div(tmp, lk, wi, rnd);
888 mpfr_mul(tmp, tmp, hp_quad.GetHPWeight(), rnd);
889 mpfr_add(weights[i], weights[i], tmp, rnd);
891 if (i ==
p) {
break; }
894 mpfr_mul_si(wi, wi, i+1, rnd);
895 mpfr_div_si(wi, wi, i-
p, rnd);
898 for (
int i = 0; i < n; i++)
901 mpfr_clear(weights[i]);
904 mpfr_clears(l, lk, w0, wi, tmp, (mpfr_ptr) 0);
906 #endif // MFEM_USE_MPFR 911 int Quadrature1D::CheckClosed(
int type)
923 int Quadrature1D::CheckOpen(
int type)
931 case OpenHalfUniform:
943 IntegrationRules::IntegrationRules(
int Ref,
int type_):
948 if (refined < 0) { own_rules = 0;
return; }
953 PointIntRules.SetSize(2, h_mt);
954 PointIntRules = NULL;
956 SegmentIntRules.SetSize(32, h_mt);
957 SegmentIntRules = NULL;
960 TriangleIntRules.SetSize(32, h_mt);
961 TriangleIntRules = NULL;
963 SquareIntRules.SetSize(32, h_mt);
964 SquareIntRules = NULL;
967 TetrahedronIntRules.SetSize(32, h_mt);
968 TetrahedronIntRules = NULL;
970 PyramidIntRules.SetSize(32, h_mt);
971 PyramidIntRules = NULL;
973 PrismIntRules.SetSize(32, h_mt);
974 PrismIntRules = NULL;
976 CubeIntRules.SetSize(32, h_mt);
995 mfem_error(
"IntegrationRules::Get(...) : Unknown geometry type!");
1004 if (!HaveIntRule(*ir_array, Order))
1006 #ifdef MFEM_USE_LEGACY_OPENMP 1007 #pragma omp critical 1010 if (!HaveIntRule(*ir_array, Order))
1014 int RealOrder = Order;
1015 while (RealOrder+1 < ir_array->
Size() &&
1016 (*ir_array)[RealOrder+1] == ir)
1020 MFEM_VERIFY(RealOrder == ir->
GetOrder(),
"internal error");
1022 MFEM_CONTRACT_VAR(ir);
1028 return *(*ir_array)[Order];
1046 mfem_error(
"IntegrationRules::Set(...) : Unknown geometry type!");
1050 if (HaveIntRule(*ir_array, Order))
1052 MFEM_ABORT(
"Overwriting set rules is not supported!");
1055 AllocIntRule(*ir_array, Order);
1057 (*ir_array)[Order] = &IntRule;
1067 for (i = 0; i < ir_array.
Size(); i++)
1069 if (ir_array[i] != NULL && ir_array[i] != ir)
1079 if (!own_rules) {
return; }
1081 DeleteIntRuleArray(PointIntRules);
1082 DeleteIntRuleArray(SegmentIntRules);
1083 DeleteIntRuleArray(TriangleIntRules);
1084 DeleteIntRuleArray(SquareIntRules);
1085 DeleteIntRuleArray(TetrahedronIntRules);
1086 DeleteIntRuleArray(CubeIntRules);
1087 DeleteIntRuleArray(PrismIntRules);
1088 DeleteIntRuleArray(PyramidIntRules);
1092 IntegrationRule *IntegrationRules::GenerateIntegrationRule(
int GeomType,
1098 return PointIntegrationRule(Order);
1100 return SegmentIntegrationRule(Order);
1102 return TriangleIntegrationRule(Order);
1104 return SquareIntegrationRule(Order);
1106 return TetrahedronIntegrationRule(Order);
1108 return CubeIntegrationRule(Order);
1110 return PrismIntegrationRule(Order);
1112 return PyramidIntegrationRule(Order);
1114 mfem_error(
"IntegrationRules::Set(...) : Unknown geometry type!");
1121 IntegrationRule *IntegrationRules::PointIntegrationRule(
int Order)
1125 mfem_error(
"Point Integration Rule of Order > 1 not defined");
1129 IntegrationRule *ir =
new IntegrationRule(1);
1130 ir->IntPoint(0).x = .0;
1131 ir->IntPoint(0).weight = 1.;
1134 PointIntRules[1] = PointIntRules[0] = ir;
1140 IntegrationRule *IntegrationRules::SegmentIntegrationRule(
int Order)
1142 int RealOrder = GetSegmentRealOrder(Order);
1144 AllocIntRule(SegmentIntRules, RealOrder);
1146 IntegrationRule *ir =
new IntegrationRule;
1190 MFEM_ABORT(
"unknown Quadrature1D type: " << quad_type);
1196 IntegrationRule *refined_ir =
new IntegrationRule(2*n);
1197 refined_ir->SetOrder(ir->GetOrder());
1198 for (
int j = 0; j < n; j++)
1200 refined_ir->IntPoint(j).x = ir->IntPoint(j).x/2.0;
1201 refined_ir->IntPoint(j).weight = ir->IntPoint(j).weight/2.0;
1202 refined_ir->IntPoint(j+n).x = 0.5 + ir->IntPoint(j).x/2.0;
1203 refined_ir->IntPoint(j+n).weight = ir->IntPoint(j).weight/2.0;
1208 SegmentIntRules[RealOrder-1] = SegmentIntRules[RealOrder] = ir;
1213 IntegrationRule *IntegrationRules::TriangleIntegrationRule(
int Order)
1215 IntegrationRule *ir = NULL;
1224 ir =
new IntegrationRule(1);
1225 ir->AddTriMidPoint(0, 0.5);
1227 TriangleIntRules[0] = TriangleIntRules[1] = ir;
1231 ir =
new IntegrationRule(3);
1232 ir->AddTriPoints3(0, 1./6., 1./6.);
1234 TriangleIntRules[2] = ir;
1239 ir =
new IntegrationRule(4);
1240 ir->AddTriMidPoint(0, -0.28125);
1241 ir->AddTriPoints3(1, 0.2, 25./96.);
1243 TriangleIntRules[3] = ir;
1247 ir =
new IntegrationRule(6);
1248 ir->AddTriPoints3(0, 0.091576213509770743460, 0.054975871827660933819);
1249 ir->AddTriPoints3(3, 0.44594849091596488632, 0.11169079483900573285);
1251 TriangleIntRules[4] = ir;
1255 ir =
new IntegrationRule(7);
1256 ir->AddTriMidPoint(0, 0.1125);
1257 ir->AddTriPoints3(1, 0.10128650732345633880, 0.062969590272413576298);
1258 ir->AddTriPoints3(4, 0.47014206410511508977, 0.066197076394253090369);
1260 TriangleIntRules[5] = ir;
1264 ir =
new IntegrationRule(12);
1265 ir->AddTriPoints3(0, 0.063089014491502228340, 0.025422453185103408460);
1266 ir->AddTriPoints3(3, 0.24928674517091042129, 0.058393137863189683013);
1267 ir->AddTriPoints6(6, 0.053145049844816947353, 0.31035245103378440542,
1268 0.041425537809186787597);
1270 TriangleIntRules[6] = ir;
1274 ir =
new IntegrationRule(12);
1275 ir->AddTriPoints3R(0, 0.062382265094402118174, 0.067517867073916085443,
1276 0.026517028157436251429);
1277 ir->AddTriPoints3R(3, 0.055225456656926611737, 0.32150249385198182267,
1278 0.043881408714446055037);
1280 ir->AddTriPoints3R(6, 0.034324302945097146470, 0.66094919618673565761,
1281 0.30472650086816719592, 0.028775042784981585738);
1282 ir->AddTriPoints3R(9, 0.51584233435359177926, 0.27771616697639178257,
1283 0.20644149867001643817, 0.067493187009802774463);
1285 TriangleIntRules[7] = ir;
1289 ir =
new IntegrationRule(16);
1290 ir->AddTriMidPoint(0, 0.0721578038388935841255455552445323);
1291 ir->AddTriPoints3(1, 0.170569307751760206622293501491464,
1292 0.0516086852673591251408957751460645);
1293 ir->AddTriPoints3(4, 0.0505472283170309754584235505965989,
1294 0.0162292488115990401554629641708902);
1295 ir->AddTriPoints3(7, 0.459292588292723156028815514494169,
1296 0.0475458171336423123969480521942921);
1297 ir->AddTriPoints6(10, 0.008394777409957605337213834539296,
1298 0.263112829634638113421785786284643,
1299 0.0136151570872174971324223450369544);
1301 TriangleIntRules[8] = ir;
1305 ir =
new IntegrationRule(19);
1306 ir->AddTriMidPoint(0, 0.0485678981413994169096209912536443);
1307 ir->AddTriPoints3b(1, 0.020634961602524744433,
1308 0.0156673501135695352684274156436046);
1309 ir->AddTriPoints3b(4, 0.12582081701412672546,
1310 0.0389137705023871396583696781497019);
1311 ir->AddTriPoints3(7, 0.188203535619032730240961280467335,
1312 0.0398238694636051265164458871320226);
1313 ir->AddTriPoints3(10, 0.0447295133944527098651065899662763,
1314 0.0127888378293490156308393992794999);
1315 ir->AddTriPoints6(13, 0.0368384120547362836348175987833851,
1316 0.2219629891607656956751025276931919,
1317 0.0216417696886446886446886446886446);
1319 TriangleIntRules[9] = ir;
1323 ir =
new IntegrationRule(25);
1324 ir->AddTriMidPoint(0, 0.0454089951913767900476432975500142);
1325 ir->AddTriPoints3b(1, 0.028844733232685245264984935583748,
1326 0.0183629788782333523585030359456832);
1327 ir->AddTriPoints3(4, 0.109481575485037054795458631340522,
1328 0.0226605297177639673913028223692986);
1329 ir->AddTriPoints6(7, 0.141707219414879954756683250476361,
1330 0.307939838764120950165155022930631,
1331 0.0363789584227100543021575883096803);
1332 ir->AddTriPoints6(13, 0.025003534762686386073988481007746,
1333 0.246672560639902693917276465411176,
1334 0.0141636212655287424183685307910495);
1335 ir->AddTriPoints6(19, 0.0095408154002994575801528096228873,
1336 0.0668032510122002657735402127620247,
1337 4.71083348186641172996373548344341E-03);
1339 TriangleIntRules[10] = ir;
1343 ir =
new IntegrationRule(28);
1344 ir->AddTriPoints6(0, 0.0,
1345 0.141129718717363295960826061941652,
1346 3.68119189165027713212944752369032E-03);
1347 ir->AddTriMidPoint(6, 0.0439886505811161193990465846607278);
1348 ir->AddTriPoints3(7, 0.0259891409282873952600324854988407,
1349 4.37215577686801152475821439991262E-03);
1350 ir->AddTriPoints3(10, 0.0942875026479224956305697762754049,
1351 0.0190407859969674687575121697178070);
1352 ir->AddTriPoints3b(13, 0.010726449965572372516734795387128,
1353 9.42772402806564602923839129555767E-03);
1354 ir->AddTriPoints3(16, 0.207343382614511333452934024112966,
1355 0.0360798487723697630620149942932315);
1356 ir->AddTriPoints3b(19, 0.122184388599015809877869236727746,
1357 0.0346645693527679499208828254519072);
1358 ir->AddTriPoints6(22, 0.0448416775891304433090523914688007,
1359 0.2772206675282791551488214673424523,
1360 0.0205281577146442833208261574536469);
1362 TriangleIntRules[11] = ir;
1366 ir =
new IntegrationRule(33);
1367 ir->AddTriPoints3b(0, 2.35652204523900E-02, 1.28655332202275E-02);
1368 ir->AddTriPoints3b(3, 1.20551215411079E-01, 2.18462722690190E-02);
1369 ir->AddTriPoints3(6, 2.71210385012116E-01, 3.14291121089425E-02);
1370 ir->AddTriPoints3(9, 1.27576145541586E-01, 1.73980564653545E-02);
1371 ir->AddTriPoints3(12, 2.13173504532100E-02, 3.08313052577950E-03);
1372 ir->AddTriPoints6(15, 1.15343494534698E-01, 2.75713269685514E-01,
1373 2.01857788831905E-02);
1374 ir->AddTriPoints6(21, 2.28383322222570E-02, 2.81325580989940E-01,
1375 1.11783866011515E-02);
1376 ir->AddTriPoints6(27, 2.57340505483300E-02, 1.16251915907597E-01,
1377 8.65811555432950E-03);
1379 TriangleIntRules[12] = ir;
1383 ir =
new IntegrationRule(37);
1384 ir->AddTriPoints3b(0, 0.0,
1385 2.67845189554543044455908674650066E-03);
1386 ir->AddTriMidPoint(3, 0.0293480398063595158995969648597808);
1387 ir->AddTriPoints3(4, 0.0246071886432302181878499494124643,
1388 3.92538414805004016372590903990464E-03);
1389 ir->AddTriPoints3b(7, 0.159382493797610632566158925635800,
1390 0.0253344765879434817105476355306468);
1391 ir->AddTriPoints3(10, 0.227900255506160619646298948153592,
1392 0.0250401630452545330803738542916538);
1393 ir->AddTriPoints3(13, 0.116213058883517905247155321839271,
1394 0.0158235572961491595176634480481793);
1395 ir->AddTriPoints3b(16, 0.046794039901841694097491569577008,
1396 0.0157462815379843978450278590138683);
1397 ir->AddTriPoints6(19, 0.0227978945382486125477207592747430,
1398 0.1254265183163409177176192369310890,
1399 7.90126610763037567956187298486575E-03);
1400 ir->AddTriPoints6(25, 0.0162757709910885409437036075960413,
1401 0.2909269114422506044621801030055257,
1402 7.99081889046420266145965132482933E-03);
1403 ir->AddTriPoints6(31, 0.0897330604516053590796290561145196,
1404 0.2723110556841851025078181617634414,
1405 0.0182757511120486476280967518782978);
1407 TriangleIntRules[13] = ir;
1411 ir =
new IntegrationRule(42);
1412 ir->AddTriPoints3b(0, 2.20721792756430E-02, 1.09417906847145E-02);
1413 ir->AddTriPoints3b(3, 1.64710561319092E-01, 1.63941767720625E-02);
1414 ir->AddTriPoints3(6, 2.73477528308839E-01, 2.58870522536460E-02);
1415 ir->AddTriPoints3(9, 1.77205532412543E-01, 2.10812943684965E-02);
1416 ir->AddTriPoints3(12, 6.17998830908730E-02, 7.21684983488850E-03);
1417 ir->AddTriPoints3(15, 1.93909612487010E-02, 2.46170180120000E-03);
1418 ir->AddTriPoints6(18, 5.71247574036480E-02, 1.72266687821356E-01,
1419 1.23328766062820E-02);
1420 ir->AddTriPoints6(24, 9.29162493569720E-02, 3.36861459796345E-01,
1421 1.92857553935305E-02);
1422 ir->AddTriPoints6(30, 1.46469500556540E-02, 2.98372882136258E-01,
1423 7.21815405676700E-03);
1424 ir->AddTriPoints6(36, 1.26833093287200E-03, 1.18974497696957E-01,
1425 2.50511441925050E-03);
1427 TriangleIntRules[14] = ir;
1431 ir =
new IntegrationRule(54);
1432 ir->AddTriPoints3b(0, 0.0834384072617499333, 0.016330909424402645);
1433 ir->AddTriPoints3b(3, 0.192779070841738867, 0.01370640901568218);
1434 ir->AddTriPoints3(6, 0.293197167913025367, 0.01325501829935165);
1435 ir->AddTriPoints3(9, 0.146467786942772933, 0.014607981068243055);
1436 ir->AddTriPoints3(12, 0.0563628676656034333, 0.005292304033121995);
1437 ir->AddTriPoints3(15, 0.0165751268583703333, 0.0018073215320460175);
1438 ir->AddTriPoints6(18, 0.0099122033092248, 0.239534554154794445,
1439 0.004263874050854718);
1440 ir->AddTriPoints6(24, 0.015803770630228, 0.404878807318339958,
1441 0.006958088258345965);
1442 ir->AddTriPoints6(30, 0.00514360881697066667, 0.0950021131130448885,
1443 0.0021459664703674175);
1444 ir->AddTriPoints6(36, 0.0489223257529888, 0.149753107322273969,
1445 0.008117664640887445);
1446 ir->AddTriPoints6(42, 0.0687687486325192, 0.286919612441334979,
1447 0.012803670460631195);
1448 ir->AddTriPoints6(48, 0.1684044181246992, 0.281835668099084562,
1449 0.016544097765822835);
1451 TriangleIntRules[15] = ir;
1456 ir =
new IntegrationRule(61);
1457 ir->AddTriMidPoint(0, 1.67185996454015E-02);
1458 ir->AddTriPoints3b(1, 5.65891888645200E-03, 2.54670772025350E-03);
1459 ir->AddTriPoints3b(4, 3.56473547507510E-02, 7.33543226381900E-03);
1460 ir->AddTriPoints3b(7, 9.95200619584370E-02, 1.21754391768360E-02);
1461 ir->AddTriPoints3b(10, 1.99467521245206E-01, 1.55537754344845E-02);
1462 ir->AddTriPoints3 (13, 2.52141267970953E-01, 1.56285556093100E-02);
1463 ir->AddTriPoints3 (16, 1.62047004658461E-01, 1.24078271698325E-02);
1464 ir->AddTriPoints3 (19, 7.58758822607460E-02, 7.02803653527850E-03);
1465 ir->AddTriPoints3 (22, 1.56547269678220E-02, 1.59733808688950E-03);
1466 ir->AddTriPoints6 (25, 1.01869288269190E-02, 3.34319867363658E-01,
1467 4.05982765949650E-03);
1468 ir->AddTriPoints6 (31, 1.35440871671036E-01, 2.92221537796944E-01,
1469 1.34028711415815E-02);
1470 ir->AddTriPoints6 (37, 5.44239242905830E-02, 3.19574885423190E-01,
1471 9.22999660541100E-03);
1472 ir->AddTriPoints6 (43, 1.28685608336370E-02, 1.90704224192292E-01,
1473 4.23843426716400E-03);
1474 ir->AddTriPoints6 (49, 6.71657824135240E-02, 1.80483211648746E-01,
1475 9.14639838501250E-03);
1476 ir->AddTriPoints6 (55, 1.46631822248280E-02, 8.07113136795640E-02,
1477 3.33281600208250E-03);
1479 TriangleIntRules[16] = TriangleIntRules[17] = ir;
1484 ir =
new IntegrationRule(73);
1485 ir->AddTriMidPoint(0, 0.0164531656944595);
1486 ir->AddTriPoints3b(1, 0.020780025853987, 0.005165365945636);
1487 ir->AddTriPoints3b(4, 0.090926214604215, 0.011193623631508);
1488 ir->AddTriPoints3b(7, 0.197166638701138, 0.015133062934734);
1489 ir->AddTriPoints3 (10, 0.255551654403098, 0.015245483901099);
1490 ir->AddTriPoints3 (13, 0.17707794215213, 0.0120796063708205);
1491 ir->AddTriPoints3 (16, 0.110061053227952, 0.0080254017934005);
1492 ir->AddTriPoints3 (19, 0.05552862425184, 0.004042290130892);
1493 ir->AddTriPoints3 (22, 0.012621863777229, 0.0010396810137425);
1494 ir->AddTriPoints6 (25, 0.003611417848412, 0.395754787356943,
1495 0.0019424384524905);
1496 ir->AddTriPoints6 (31, 0.13446675453078, 0.307929983880436,
1498 ir->AddTriPoints6 (37, 0.014446025776115, 0.26456694840652,
1500 ir->AddTriPoints6 (43, 0.046933578838178, 0.358539352205951,
1501 0.0080622733808655);
1502 ir->AddTriPoints6 (49, 0.002861120350567, 0.157807405968595,
1503 0.0012459709087455);
1504 ir->AddTriPoints6 (55, 0.075050596975911, 0.223861424097916,
1505 0.0091214200594755);
1506 ir->AddTriPoints6 (61, 0.03464707481676, 0.142421601113383,
1507 0.0051292818680995);
1508 ir->AddTriPoints6 (67, 0.065494628082938, 0.010161119296278,
1511 TriangleIntRules[18] = TriangleIntRules[19] = ir;
1515 ir =
new IntegrationRule(85);
1516 ir->AddTriMidPoint(0, 0.01380521349884976);
1517 ir->AddTriPoints3b(1, 0.001500649324429, 0.00088951477366337);
1518 ir->AddTriPoints3b(4, 0.0941397519389508667, 0.010056199056980585);
1519 ir->AddTriPoints3b(7, 0.2044721240895264, 0.013408923629665785);
1520 ir->AddTriPoints3(10, 0.264500202532787333, 0.012261566900751005);
1521 ir->AddTriPoints3(13, 0.211018964092076767, 0.008197289205347695);
1522 ir->AddTriPoints3(16, 0.107735607171271333, 0.0073979536993248);
1523 ir->AddTriPoints3(19, 0.0390690878378026667, 0.0022896411388521255);
1524 ir->AddTriPoints3(22, 0.0111743797293296333, 0.0008259132577881085);
1525 ir->AddTriPoints6(25, 0.00534961818733726667, 0.0635496659083522206,
1526 0.001174585454287792);
1527 ir->AddTriPoints6(31, 0.00795481706619893333, 0.157106918940706982,
1528 0.0022329628770908965);
1529 ir->AddTriPoints6(37, 0.0104223982812638, 0.395642114364374018,
1530 0.003049783403953986);
1531 ir->AddTriPoints6(43, 0.0109644147961233333, 0.273167570712910522,
1532 0.0034455406635941015);
1533 ir->AddTriPoints6(49, 0.0385667120854623333, 0.101785382485017108,
1534 0.0039987375362390815);
1535 ir->AddTriPoints6(55, 0.0355805078172182, 0.446658549176413815,
1536 0.003693067142668012);
1537 ir->AddTriPoints6(61, 0.0496708163627641333, 0.199010794149503095,
1538 0.00639966593932413);
1539 ir->AddTriPoints6(67, 0.0585197250843317333, 0.3242611836922827,
1540 0.008629035587848275);
1541 ir->AddTriPoints6(73, 0.121497787004394267, 0.208531363210132855,
1542 0.009336472951467735);
1543 ir->AddTriPoints6(79, 0.140710844943938733, 0.323170566536257485,
1544 0.01140911202919763);
1546 TriangleIntRules[20] = ir;
1554 ir =
new IntegrationRule(126);
1555 ir->AddTriPoints3b(0, 0.0279464830731742, 0.0040027909400102085);
1556 ir->AddTriPoints3b(3, 0.131178601327651467, 0.00797353841619525);
1557 ir->AddTriPoints3b(6, 0.220221729512072267, 0.006554570615397765);
1558 ir->AddTriPoints3 (9, 0.298443234019804467, 0.00979150048281781);
1559 ir->AddTriPoints3(12, 0.2340441723373718, 0.008235442720768635);
1560 ir->AddTriPoints3(15, 0.151468334609017567, 0.00427363953704605);
1561 ir->AddTriPoints3(18, 0.112733893545993667, 0.004080942928613246);
1562 ir->AddTriPoints3(21, 0.0777156920915263, 0.0030605732699918895);
1563 ir->AddTriPoints3(24, 0.034893093614297, 0.0014542491324683325);
1564 ir->AddTriPoints3(27, 0.00725818462093236667, 0.00034613762283099815);
1565 ir->AddTriPoints6(30, 0.0012923527044422, 0.227214452153364077,
1566 0.0006241445996386985);
1567 ir->AddTriPoints6(36, 0.0053997012721162, 0.435010554853571706,
1568 0.001702376454401511);
1569 ir->AddTriPoints6(42, 0.006384003033975, 0.320309599272204437,
1570 0.0016798271630320255);
1571 ir->AddTriPoints6(48, 0.00502821150199306667, 0.0917503222800051889,
1572 0.000858078269748377);
1573 ir->AddTriPoints6(54, 0.00682675862178186667, 0.0380108358587243835,
1574 0.000740428158357803);
1575 ir->AddTriPoints6(60, 0.0100161996399295333, 0.157425218485311668,
1576 0.0017556563053643425);
1577 ir->AddTriPoints6(66, 0.02575781317339, 0.239889659778533193,
1578 0.003696775074853242);
1579 ir->AddTriPoints6(72, 0.0302278981199158, 0.361943118126060531,
1580 0.003991543738688279);
1581 ir->AddTriPoints6(78, 0.0305049901071620667, 0.0835519609548285602,
1582 0.0021779813065790205);
1583 ir->AddTriPoints6(84, 0.0459565473625693333, 0.148443220732418205,
1584 0.003682528350708916);
1585 ir->AddTriPoints6(90, 0.0674428005402775333, 0.283739708727534955,
1586 0.005481786423209775);
1587 ir->AddTriPoints6(96, 0.0700450914159106, 0.406899375118787573,
1588 0.00587498087177056);
1589 ir->AddTriPoints6(102, 0.0839115246401166, 0.194113987024892542,
1590 0.005007800356899285);
1591 ir->AddTriPoints6(108, 0.120375535677152667, 0.32413434700070316,
1592 0.00665482039381434);
1593 ir->AddTriPoints6(114, 0.148066899157366667, 0.229277483555980969,
1594 0.00707722325261307);
1595 ir->AddTriPoints6(120, 0.191771865867325067, 0.325618122595983752,
1596 0.007440689780584005);
1598 TriangleIntRules[21] =
1599 TriangleIntRules[22] =
1600 TriangleIntRules[23] =
1601 TriangleIntRules[24] =
1602 TriangleIntRules[25] = ir;
1607 int i = (Order / 2) * 2 + 1;
1608 AllocIntRule(TriangleIntRules, i);
1609 ir =
new IntegrationRule;
1610 ir->GrundmannMollerSimplexRule(i/2,2);
1611 TriangleIntRules[i-1] = TriangleIntRules[i] = ir;
1617 IntegrationRule *IntegrationRules::SquareIntegrationRule(
int Order)
1619 int RealOrder = GetSegmentRealOrder(Order);
1621 if (!HaveIntRule(SegmentIntRules, RealOrder))
1623 SegmentIntegrationRule(RealOrder);
1625 AllocIntRule(SquareIntRules, RealOrder);
1626 SquareIntRules[RealOrder-1] =
1627 SquareIntRules[RealOrder] =
1628 new IntegrationRule(*SegmentIntRules[RealOrder],
1629 *SegmentIntRules[RealOrder]);
1630 return SquareIntRules[Order];
1635 IntegrationRule *IntegrationRules::TetrahedronIntegrationRule(
int Order)
1637 IntegrationRule *ir;
1646 ir =
new IntegrationRule(1);
1647 ir->AddTetMidPoint(0, 1./6.);
1649 TetrahedronIntRules[0] = TetrahedronIntRules[1] = ir;
1653 ir =
new IntegrationRule(4);
1655 ir->AddTetPoints4b(0, 0.58541019662496845446, 1./24.);
1657 TetrahedronIntRules[2] = ir;
1661 ir =
new IntegrationRule(5);
1662 ir->AddTetMidPoint(0, -2./15.);
1663 ir->AddTetPoints4b(1, 0.5, 0.075);
1665 TetrahedronIntRules[3] = ir;
1669 ir =
new IntegrationRule(11);
1670 ir->AddTetPoints4(0, 1./14., 343./45000.);
1671 ir->AddTetMidPoint(4, -74./5625.);
1672 ir->AddTetPoints6(5, 0.10059642383320079500, 28./1125.);
1674 TetrahedronIntRules[4] = ir;
1678 ir =
new IntegrationRule(14);
1679 ir->AddTetPoints6(0, 0.045503704125649649492,
1680 7.0910034628469110730E-03);
1681 ir->AddTetPoints4(6, 0.092735250310891226402, 0.012248840519393658257);
1682 ir->AddTetPoints4b(10, 0.067342242210098170608,
1683 0.018781320953002641800);
1685 TetrahedronIntRules[5] = ir;
1689 ir =
new IntegrationRule(24);
1690 ir->AddTetPoints4(0, 0.21460287125915202929,
1691 6.6537917096945820166E-03);
1692 ir->AddTetPoints4(4, 0.040673958534611353116,
1693 1.6795351758867738247E-03);
1694 ir->AddTetPoints4b(8, 0.032986329573173468968,
1695 9.2261969239424536825E-03);
1696 ir->AddTetPoints12(12, 0.063661001875017525299, 0.26967233145831580803,
1697 8.0357142857142857143E-03);
1699 TetrahedronIntRules[6] = ir;
1703 ir =
new IntegrationRule(31);
1704 ir->AddTetPoints6(0, 0.0, 9.7001763668430335097E-04);
1705 ir->AddTetMidPoint(6, 0.018264223466108820291);
1706 ir->AddTetPoints4(7, 0.078213192330318064374, 0.010599941524413686916);
1707 ir->AddTetPoints4(11, 0.12184321666390517465,
1708 -0.062517740114331851691);
1709 ir->AddTetPoints4b(15, 2.3825066607381275412E-03,
1710 4.8914252630734993858E-03);
1711 ir->AddTetPoints12(19, 0.1, 0.2, 0.027557319223985890653);
1713 TetrahedronIntRules[7] = ir;
1717 ir =
new IntegrationRule(43);
1718 ir->AddTetPoints4(0, 5.7819505051979972532E-03,
1719 1.6983410909288737984E-04);
1720 ir->AddTetPoints4(4, 0.082103588310546723091,
1721 1.9670333131339009876E-03);
1722 ir->AddTetPoints12(8, 0.036607749553197423679, 0.19048604193463345570,
1723 2.1405191411620925965E-03);
1724 ir->AddTetPoints6(20, 0.050532740018894224426,
1725 4.5796838244672818007E-03);
1726 ir->AddTetPoints12(26, 0.22906653611681113960, 0.035639582788534043717,
1727 5.7044858086819185068E-03);
1728 ir->AddTetPoints4(38, 0.20682993161067320408, 0.014250305822866901248);
1729 ir->AddTetMidPoint(42, -0.020500188658639915841);
1731 TetrahedronIntRules[8] = ir;
1735 ir =
new IntegrationRule;
1736 ir->GrundmannMollerSimplexRule(4,3);
1737 TetrahedronIntRules[9] = ir;
1741 int i = (Order / 2) * 2 + 1;
1742 AllocIntRule(TetrahedronIntRules, i);
1743 ir =
new IntegrationRule;
1744 ir->GrundmannMollerSimplexRule(i/2,3);
1745 TetrahedronIntRules[i-1] = TetrahedronIntRules[i] = ir;
1751 IntegrationRule *IntegrationRules::PyramidIntegrationRule(
int Order)
1758 int npts = irc.GetNPoints();
1759 AllocIntRule(PyramidIntRules, Order);
1760 PyramidIntRules[Order] =
new IntegrationRule(npts);
1761 PyramidIntRules[Order]->SetOrder(Order);
1763 for (
int k=0; k<npts; k++)
1765 const IntegrationPoint & ipc = irc.IntPoint(k);
1766 IntegrationPoint & ipp = PyramidIntRules[Order]->IntPoint(k);
1767 ipp.x = ipc.x * (1.0 - ipc.z);
1768 ipp.y = ipc.y * (1.0 - ipc.z);
1770 ipp.weight = ipc.weight / 3.0;
1772 return PyramidIntRules[Order];
1776 IntegrationRule *IntegrationRules::PrismIntegrationRule(
int Order)
1780 int nt = irt.GetNPoints();
1781 int ns = irs.GetNPoints();
1782 AllocIntRule(PrismIntRules, Order);
1783 PrismIntRules[Order] =
new IntegrationRule(nt * ns);
1784 PrismIntRules[Order]->SetOrder(std::min(irt.GetOrder(), irs.GetOrder()));
1786 for (
int ks=0; ks<ns; ks++)
1788 const IntegrationPoint & ips = irs.IntPoint(ks);
1789 for (
int kt=0; kt<nt; kt++)
1791 int kp = ks * nt + kt;
1792 const IntegrationPoint & ipt = irt.IntPoint(kt);
1793 IntegrationPoint & ipp = PrismIntRules[Order]->IntPoint(kp);
1797 ipp.weight = ipt.weight * ips.weight;
1800 return PrismIntRules[Order];
1804 IntegrationRule *IntegrationRules::CubeIntegrationRule(
int Order)
1806 int RealOrder = GetSegmentRealOrder(Order);
1807 if (!HaveIntRule(SegmentIntRules, RealOrder))
1809 SegmentIntegrationRule(RealOrder);
1811 AllocIntRule(CubeIntRules, RealOrder);
1812 CubeIntRules[RealOrder-1] =
1813 CubeIntRules[RealOrder] =
1814 new IntegrationRule(*SegmentIntRules[RealOrder],
1815 *SegmentIntRules[RealOrder],
1816 *SegmentIntRules[RealOrder]);
1817 return CubeIntRules[Order];
1821 const int patch,
const int *ijk,
1823 bool & deleteRule)
const 1828 auto search = elementToRule.find(elem);
1829 if (search != elementToRule.end())
1831 return *elementRule[search->second];
1834 MFEM_VERIFY(patchRules1D.NumRows(),
1835 "Undefined rule in NURBSMeshRules::GetElementRule");
1838 MFEM_VERIFY(kv.
Size() == dim,
"");
1841 std::vector<std::vector<double>> el(dim);
1843 std::vector<int> npd;
1846 for (
int d=0; d<dim; ++d)
1848 const int order = kv[d]->GetOrder();
1850 const double kv0 = (*kv[d])[order + ijk[d]];
1851 const double kv1 = (*kv[d])[order + ijk[d] + 1];
1853 const bool rightEnd = (order + ijk[d] + 1) == (kv[d]->Size() - 1);
1855 for (
int i=0; i<patchRules1D(patch,d)->Size(); ++i)
1858 if (kv0 <= ip.
x && (ip.
x < kv1 || rightEnd))
1860 const double x = (ip.
x - kv0) / (kv1 - kv0);
1862 el[d].push_back(ip.
weight);
1866 npd[d] = el[d].size() / 2;
1876 MFEM_VERIFY(npd[0] > 0 && npd[1] > 0,
"Assuming 2D or 3D");
1878 for (
int i = 0; i < npd[0]; ++i)
1880 for (
int j = 0; j < npd[1]; ++j)
1882 for (
int k = 0; k < std::max(npd[2], 1); ++k)
1884 const int id = i + j*npd[0] + k*npd[0]*npd[1];
1885 (*irp)[id].x = el[0][2*i];
1886 (*irp)[id].y = el[1][2*j];
1888 (*irp)[id].weight = el[0][(2*i)+1];
1889 (*irp)[id].weight *= el[1][(2*j)+1];
1893 (*irp)[id].z = el[2][2*k];
1894 (*irp)[id].weight *= el[2][(2*k)+1];
1906 MFEM_VERIFY(patchRules1D.NumRows() > 0,
1907 "Assuming patchRules1D is set.");
1909 ip.
weight = (*patchRules1D(patch,0))[i].weight;
1910 ip.
x = (*patchRules1D(patch,0))[i].x;
1914 ip.
weight *= (*patchRules1D(patch,1))[j].weight;
1915 ip.
y = (*patchRules1D(patch,1))[j].x;
1920 ip.
weight *= (*patchRules1D(patch,2))[k].weight;
1921 ip.
z = (*patchRules1D(patch,2))[k].x;
1927 if ((
int) pointToElem.size() == npatches) {
return; }
1929 MFEM_VERIFY(elementToRule.empty() && patchRules1D.NumRows() > 0
1930 && npatches > 0,
"Assuming patchRules1D is set.");
1932 MFEM_VERIFY(mesh.
Dimension() == dim,
"");
1934 pointToElem.resize(npatches);
1935 patchRules1D_KnotSpan.resize(npatches);
1938 std::vector<std::vector<int>> patchElements(npatches);
1940 for (
int e=0; e<mesh.
GetNE(); ++e)
1952 for (
int p=0;
p<npatches; ++
p)
1954 patchRules1D_KnotSpan[
p].resize(dim);
1958 MFEM_VERIFY((
int) pkv.
Size() == dim,
"");
1962 for (
int d=0; d<dim; ++d)
1964 maxijk[d] = pkv[d]->GetNKS();
1965 np[d] = patchRules1D(
p,d)->Size();
1969 Array3D<int> ijk2elem(maxijk[0], maxijk[1], maxijk[2]);
1972 for (
auto elem : patchElements[
p])
1975 MFEM_VERIFY(ijk2elem(ijk[0], ijk[1], ijk[2]) == -1,
"");
1976 ijk2elem(ijk[0], ijk[1], ijk[2]) = elem;
1983 for (
int d=0; d<
dim; ++d)
1985 patchRules1D_KnotSpan[
p][d].SetSize(patchRules1D(
p,d)->Size());
1987 for (
int r=0; r<patchRules1D(
p,d)->Size(); ++r)
1991 const int order = pkv[d]->GetOrder();
1998 const double kv0 = (*pkv[d])[order + ijk_d];
1999 const double kv1 = (*pkv[d])[order + ijk_d + 1];
2001 const bool rightEnd = (order + ijk_d + 1) == (pkv[d]->Size() - 1);
2003 if (kv0 <= ip.
x && (ip.
x < kv1 || rightEnd))
2013 patchRules1D_KnotSpan[
p][d][r] = ijk_d;
2017 pointToElem[
p].SetSize(np[0], np[1], np[2]);
2018 for (
int i=0; i<np[0]; ++i)
2019 for (
int j=0; j<np[1]; ++j)
2020 for (
int k=0; k<np[2]; ++k)
2022 const int elem = ijk2elem(patchRules1D_KnotSpan[
p][0][i],
2023 patchRules1D_KnotSpan[
p][1][j],
2024 patchRules1D_KnotSpan[
p][2][k]);
2025 MFEM_VERIFY(elem >= 0,
"");
2026 pointToElem[
p](i,j,k) = elem;
2032 std::vector<const IntegrationRule*> & ir1D)
2034 MFEM_VERIFY((
int) ir1D.size() == dim,
"Wrong dimension");
2036 for (
int i=0; i<dim; ++i)
2038 patchRules1D(patch,i) = ir1D[i];
2044 for (
int i=0; i<patchRules1D.NumRows(); ++i)
2045 for (
int j=0; j<patchRules1D.NumCols(); ++j)
2047 delete patchRules1D(i, j);
int GetElementPatch(int elem) const
Returns the index of the patch containing element elem.
int GetNPoints() const
Returns the number of the points in the integration rule.
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.
static void ClosedUniform(const int np, IntegrationRule *ir)
int Dimension() const
Dimension of the reference space used within the elements.
~IntegrationRules()
Destroys an IntegrationRules object.
void GetIntegrationPointFrom1D(const int patch, int i, int j, int k, IntegrationPoint &ip)
For tensor product rules defined on each patch by SetPatchRules1D(), return the integration point wit...
aka "open half" Newton-Cotes
Container class for integration rules.
IntegrationRules RefinedIntRules(1, Quadrature1D::GaussLegendre)
A global object with all refined integration rules.
void GetElementIJK(int elem, Array< int > &ijk)
static void OpenUniform(const int np, IntegrationRule *ir)
void Finalize(Mesh const &mesh)
Finalize() must be called before this class can be used for assembly. In particular, it defines data used by GetPointElement().
IntegrationRules IntRules(0, Quadrature1D::GaussLegendre)
A global object with all integration rules (defined in intrules.cpp)
static void GaussLobatto(const int np, IntegrationRule *ir)
IntegrationPoint & IntPoint(int i)
Returns a reference to the i-th integration point.
void SetPatchRules1D(const int patch, std::vector< const IntegrationRule *> &ir1D)
Set 1D integration rules to be used as a tensor product rule on the patch with index patch...
void mfem_error(const char *msg)
Function called when an error is encountered. Used by the macros MFEM_ABORT, MFEM_ASSERT, MFEM_VERIFY.
int GetOrder() const
Returns the order of the integration rule.
void SetPointIndices()
Sets the indices of each quadrature point on initialization.
double p(const Vector &x, double t)
static void OpenHalfUniform(const int np, IntegrationRule *ir)
MemoryType
Memory types supported by MFEM.
void SetSize(int nsize)
Change the logical size of the array, keep existing entries.
void GetPatchKnotVectors(int p, Array< KnotVector *> &kv)
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.
int GetNE() const
Returns number of elements.
NURBSExtension * NURBSext
Optional NURBS mesh extension.
Class for integration point with weight.
Host memory; using new[] and delete[].
int Size() const
Return the logical size of the array.
void pts(int iphi, int t, double x[])
IntegrationRule & GetElementRule(const int elem, const int patch, const int *ijk, Array< const KnotVector *> const &kv, bool &deleteRule) const
Returns a rule for the element.
void Set(int GeomType, int Order, IntegrationRule &IntRule)
void Set1w(const double x1, const double w)
static void GaussLegendre(const int np, IntegrationRule *ir)
double f(const Vector &p)