54 :
StdExpansion(LibUtilities::StdPyrData::getNumberOfCoefficients(
55 Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
58 Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
63 "order in 'a' direction is higher "
64 "than order in 'c' direction");
66 "order in 'b' direction is higher "
67 "than order in 'c' direction");
70 "Expected basis type in 'c' direction to be ModifiedPyr_C or "
104 int Qx =
m_base[0]->GetNumPoints();
105 int Qy =
m_base[1]->GetNumPoints();
106 int Qz =
m_base[2]->GetNumPoints();
114 eta_x =
m_base[0]->GetZ();
115 eta_y =
m_base[1]->GetZ();
116 eta_z =
m_base[2]->GetZ();
120 if (out_dxi1.size() > 0)
122 for (k = 0, n = 0; k < Qz; ++k)
125 for (j = 0; j < Qy; ++j)
127 for (i = 0; i < Qx; ++i, ++n)
129 out_dxi1[n] = fac * dEta_bar1[n];
135 if (out_dxi2.size() > 0)
137 for (k = 0, n = 0; k < Qz; ++k)
140 for (j = 0; j < Qy; ++j)
142 for (i = 0; i < Qx; ++i, ++n)
144 out_dxi2[n] = fac * dXi2[n];
150 if (out_dxi3.size() > 0)
152 for (k = 0, n = 0; k < Qz; ++k)
155 for (j = 0; j < Qy; ++j)
158 for (i = 0; i < Qx; ++i, ++n)
160 out_dxi3[n] = (1.0 + eta_x[i]) * fac * dEta_bar1[n] +
161 fac1 * fac * dXi2[n] + dEta3[n];
200 int nquad0 =
m_base[0]->GetNumPoints();
201 int nquad1 =
m_base[1]->GetNumPoints();
202 int nquad2 =
m_base[2]->GetNumPoints();
204 int nmodes0 =
m_base[0]->GetNumModes();
205 int nmodes1 =
m_base[1]->GetNumModes();
206 int nmodes2 =
m_base[2]->GetNumModes();
210 std::vector<vec_t, tinysimd::allocator<vec_t>> wsp0(nmodes0 * nmodes1),
221#define BWDTRANS_DEF \
222 BwdTransPyrKernel(nmodes0, nmodes1, nmodes2, nquad0, nquad1, nquad2, \
223 isModified, (const vec_t *)base0.data(), \
224 (const vec_t *)base1.data(), \
225 (const vec_t *)base2.data(), wsp0.data(), wsp1.data(), \
226 (const vec_t *)inarray.data(), (vec_t *)outarray.data())
230#define BWDTRANS_Q(r, i) \
233 NM(i), NM(i), NM(i), NQ(i), NQ(i), NQ_M1(i), isModified, \
234 (const vec_t *)base0.data(), (const vec_t *)base1.data(), \
235 (const vec_t *)base2.data(), wsp0.data(), wsp1.data(), \
236 (const vec_t *)inarray.data(), (vec_t *)outarray.data()); \
241#define BWDTRANS_M(r, i) \
246 BOOST_PP_FOR_##r((NM(i), NM_P1(i), BOOST_PP_MUL(2, NM(i))), \
247 STDLEV2TEST1, STDLEV2UPDATE1, BWDTRANS_Q) default \
257 if ((nmodes0 == nmodes1) && (nmodes1 == nmodes2) && (nquad0 == nquad1) &&
258 (nquad1 == nquad2 + 1))
304 const bool Deformed, [[maybe_unused]]
bool CollDir0,
305 [[maybe_unused]]
bool CollDir1, [[maybe_unused]]
bool CollDir2)
307 int nquad0 =
m_base[0]->GetNumPoints();
308 int nquad1 =
m_base[1]->GetNumPoints();
309 int nquad2 =
m_base[2]->GetNumPoints();
311 int order0 =
m_base[0]->GetNumModes();
312 int order1 =
m_base[1]->GetNumModes();
313 int order2 =
m_base[2]->GetNumModes();
315 const bool isModified =
318 std::vector<vec_t, tinysimd::allocator<vec_t>> wsp0(nquad1 * nquad2),
330#undef IPRODUCTWRTBASE_DEF
331#define IPRODUCTWRTBASE_DEF \
332 IProductPyrKernel<false, false, true>( \
333 order0, order1, order2, nquad0, nquad1, nquad2, isModified, \
334 (const vec_t *)inarray.data(), (const vec_t *)base0.data(), \
335 (const vec_t *)base1.data(), (const vec_t *)base2.data(), \
336 (const vec_t *)m_weights[0].data(), \
337 (const vec_t *)m_weights[1].data(), \
338 (const vec_t *)m_weights[2].data(), (const vec_t *)jac.data(), \
339 (vec_t *)wsp0.data(), (vec_t *)wsp1.data(), (vec_t *)outarray.data())
342#undef IPRODUCTWRTBASE_Q
343#define IPRODUCTWRTBASE_Q(r, i) \
345 IProductPyrKernel<false, false, true>( \
346 NM(i), NM(i), NM(i), NQ(i), NQ(i), NQ_M1(i), isModified, \
347 (const vec_t *)inarray.data(), (const vec_t *)base0.data(), \
348 (const vec_t *)base1.data(), (const vec_t *)base2.data(), \
349 (const vec_t *)m_weights[0].data(), \
350 (const vec_t *)m_weights[1].data(), \
351 (const vec_t *)m_weights[2].data(), (const vec_t *)jac.data(), \
352 (vec_t *)wsp0.data(), (vec_t *)wsp1.data(), \
353 (vec_t *)outarray.data()); \
357#undef IPRODUCTWRTBASE_M
358#define IPRODUCTWRTBASE_M(r, i) \
363 BOOST_PP_FOR_##r((NM(i), NM_P1(i), BOOST_PP_MUL(2, NM(i))), \
364 STDLEV2TEST1, STDLEV2UPDATE1, \
365 IPRODUCTWRTBASE_Q) default : IPRODUCTWRTBASE_DEF; \
373 if ((order0 == order1) && (order1 == order2) && (nquad0 == nquad1) &&
374 (nquad1 == nquad2 + 1))
393#undef IPRODUCTWRTBASE_DEF
394#define IPRODUCTWRTBASE_DEF \
395 IProductPyrKernel<false, false, false>( \
396 order0, order1, order2, nquad0, nquad1, nquad2, isModified, \
397 (const vec_t *)inarray.data(), (const vec_t *)base0.data(), \
398 (const vec_t *)base1.data(), (const vec_t *)base2.data(), \
399 (const vec_t *)m_weights[0].data(), \
400 (const vec_t *)m_weights[1].data(), \
401 (const vec_t *)m_weights[2].data(), (const vec_t *)jac.data(), \
402 (vec_t *)wsp0.data(), (vec_t *)wsp1.data(), (vec_t *)outarray.data())
405#undef IPRODUCTWRTBASE_Q
406#define IPRODUCTWRTBASE_Q(r, i) \
408 IProductPyrKernel<false, false, false>( \
409 NM(i), NM(i), NM(i), NQ(i), NQ(i), NQ_M1(i), isModified, \
410 (const vec_t *)inarray.data(), (const vec_t *)base0.data(), \
411 (const vec_t *)base1.data(), (const vec_t *)base2.data(), \
412 (const vec_t *)m_weights[0].data(), \
413 (const vec_t *)m_weights[1].data(), \
414 (const vec_t *)m_weights[2].data(), (const vec_t *)jac.data(), \
415 (vec_t *)wsp0.data(), (vec_t *)wsp1.data(), \
416 (vec_t *)outarray.data()); \
420#undef IPRODUCTWRTBASE_M
421#define IPRODUCTWRTBASE_M(r, i) \
426 BOOST_PP_FOR_##r((NM(i), NM_P1(i), BOOST_PP_MUL(2, NM(i))), \
427 STDLEV2TEST1, STDLEV2UPDATE1, \
428 IPRODUCTWRTBASE_Q) default : IPRODUCTWRTBASE_DEF; \
436 if ((order0 == order1) && (order1 == order2) && (nquad0 == nquad1) &&
437 (nquad1 == nquad2 + 1))
459 int nquad0 =
m_base[0]->GetNumPoints();
460 int nquad1 =
m_base[1]->GetNumPoints();
461 int nquad2 =
m_base[2]->GetNumPoints();
469 const int nq01 = nquad0 * nquad1;
470 for (
int i = 0; i < nquad2; ++i)
472 Vmath::Smul(nq01, gfac2[i], &inarray[0] + i * nq01, 1,
473 &tmp0[0] + i * nq01, 1);
484 m_base[2]->GetBdata(), tmp0, outarray, one,
false);
491 m_base[2]->GetBdata(), tmp0, outarray, one,
false);
505 for (
int i = 0; i < nquad1 * nquad2; ++i)
507 Vmath::Vmul(nquad0, tmp0.data() + i * nquad0, 1, gfac0.data(),
508 1, tmp0.data() + i * nquad0, 1);
512 m_base[2]->GetBdata(), tmp0, tmp3, one,
false);
515 for (
int i = 0; i < nquad2; ++i)
517 Vmath::Smul(nq01, gfac2[i], &inarray[0] + i * nq01, 1,
518 &tmp0[0] + i * nq01, 1);
521 for (
int i = 0; i < nquad1 * nquad2; ++i)
523 Vmath::Smul(nquad0, gfac1[i % nquad1], &tmp0[0] + i * nquad0, 1,
524 &tmp0[0] + i * nquad0, 1);
529 m_base[2]->GetBdata(), tmp0, tmp4, one,
false);
533 m_base[2]->GetDbdata(), inarray, outarray, one,
false);
543 ASSERTL1(
false,
"input dir is out of range");
569 eta[1] = 2.0 * (1.0 + xi[1]) / d2 - 1.0;
570 eta[0] = 2.0 * (1.0 + xi[0]) / d2 - 1.0;
576 xi[0] = (1.0 + eta[0]) * (1.0 - eta[2]) * 0.5 - 1.0;
577 xi[1] = (1.0 + eta[1]) * (1.0 - eta[2]) * 0.5 - 1.0;
593 for (
int k = 0; k < Qz; ++k)
595 for (
int j = 0; j < Qy; ++j)
597 for (
int i = 0; i < Qx; ++i)
599 int s = i + Qx * (j + Qy * k);
602 xi_y[s] = (1.0 + eta_y[j]) * (1.0 - eta_z[k]) / 2.0 - 1.0;
603 xi_x[s] = (1.0 + etaBar_x[i]) * (1.0 - eta_z[k]) / 2.0 - 1.0;
615 const int nm0 =
m_base[0]->GetNumModes();
616 const int nm1 =
m_base[1]->GetNumModes();
617 const int nm2 =
m_base[2]->GetNumModes();
619 int mode0 = 0, mode1 = 0, mode2 = 0, cnt = 0;
622 for (mode0 = 0; mode0 < nm0; ++mode0)
624 for (mode1 = 0; mode1 < nm1; ++mode1)
626 int maxpq =
max(mode0, mode1);
627 for (mode2 = 0; mode2 < nm2 - maxpq; ++mode2, ++cnt)
647 for (
int j = nm1; j < nm2; ++j)
649 int ijmax =
max(mode0, j);
650 mode2 += nm2 - ijmax;
656 return StdExpansion::BaryEvaluateBasis<2>(coll[2], 1);
660 return StdExpansion::BaryEvaluateBasis<0>(coll[0], mode0) *
661 StdExpansion::BaryEvaluateBasis<1>(coll[1], mode1) *
662 StdExpansion::BaryEvaluateBasis<2>(coll[2], mode2);
669 std::array<NekDouble, 3> &firstOrderDerivs)
676 if ((1 - coll[2]) < 1e-5)
680 EphysDeriv2(totPoints);
681 v_PhysDeriv(inarray, EphysDeriv0, EphysDeriv1, EphysDeriv2);
684 I[0] =
GetBase()[0]->GetI(coll);
685 I[1] =
GetBase()[1]->GetI(coll + 1);
686 I[2] =
GetBase()[2]->GetI(coll + 2);
694 std::array<NekDouble, 3> interDeriv;
699 firstOrderDerivs[0] = fac * interDeriv[0];
700 firstOrderDerivs[1] = fac * interDeriv[1];
701 firstOrderDerivs[2] = ((1.0 + coll[0]) / (1.0 - coll[2])) * interDeriv[0] +
702 ((1.0 + coll[1]) / (1.0 - coll[2])) * interDeriv[1] +
718 int nummodes[3] = {
m_base[0]->GetNumModes(),
m_base[1]->GetNumModes(),
719 m_base[2]->GetNumModes()};
725 numModes0 = nummodes[0];
726 numModes1 = nummodes[1];
732 numModes0 = nummodes[0];
733 numModes1 = nummodes[2];
739 numModes0 = nummodes[1];
740 numModes1 = nummodes[2];
747 std::swap(numModes0, numModes1);
779 "BasisType is not a boundary interior form");
782 "BasisType is not a boundary interior form");
785 "BasisType is not a boundary interior form");
787 int P =
m_base[0]->GetNumModes();
788 int Q =
m_base[1]->GetNumModes();
789 int R =
m_base[2]->GetNumModes();
798 "BasisType is not a boundary interior form");
801 "BasisType is not a boundary interior form");
804 "BasisType is not a boundary interior form");
806 int P =
m_base[0]->GetNumModes() - 1;
807 int Q =
m_base[1]->GetNumModes() - 1;
808 int R =
m_base[2]->GetNumModes() - 1;
810 return (
P + 1) * (Q + 1)
811 + 2 * (R + 1) +
P * (1 + 2 * R -
P)
812 + 2 * (R + 1) + Q * (1 + 2 * R - Q);
817 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
823 else if (i == 1 || i == 3)
826 return Q + 1 + (
P * (1 + 2 * Q -
P)) / 2;
831 return Q + 1 + (
P * (1 + 2 * Q -
P)) / 2;
837 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
839 int P =
m_base[0]->GetNumModes() - 1;
840 int Q =
m_base[1]->GetNumModes() - 1;
841 int R =
m_base[2]->GetNumModes() - 1;
845 return (
P - 1) * (Q - 1);
847 else if (i == 1 || i == 3)
849 return (
P - 1) * (2 * (R - 1) - (
P - 1) - 1) / 2;
853 return (Q - 1) * (2 * (R - 1) - (Q - 1) - 1) / 2;
859 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
863 return m_base[0]->GetNumPoints() *
m_base[1]->GetNumPoints();
865 else if (i == 1 || i == 3)
867 return m_base[0]->GetNumPoints() *
m_base[2]->GetNumPoints();
871 return m_base[1]->GetNumPoints() *
m_base[2]->GetNumPoints();
877 ASSERTL2(i >= 0 && i <= 7,
"edge id is out of range");
879 if (i == 0 || i == 2)
883 else if (i == 1 || i == 3)
897 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
898 ASSERTL2(k >= 0 && k <= 1,
"basis key id is out of range");
923 const std::vector<unsigned int> &nummodes,
int &modes_offset)
926 nummodes[modes_offset], nummodes[modes_offset + 1],
927 nummodes[modes_offset + 2]);
938 "Mapping not defined for this type of basis");
942 if (useCoeffPacking ==
true)
962 ASSERTL0(
false,
"local vertex id must be between 0 and 4");
985 ASSERTL0(
false,
"local vertex id must be between 0 and 4");
996 "BasisType is not a boundary interior form");
999 "BasisType is not a boundary interior form");
1002 "BasisType is not a boundary interior form");
1004 int P =
m_base[0]->GetNumModes() - 1, p;
1005 int Q =
m_base[1]->GetNumModes() - 1, q;
1006 int R =
m_base[2]->GetNumModes() - 1, r;
1010 if (outarray.size() != nIntCoeffs)
1018 for (p = 2; p <=
P; ++p)
1020 for (q = 2; q <= Q; ++q)
1022 int maxpq =
max(p, q);
1023 for (r = 1; r <= R - maxpq; ++r)
1025 outarray[idx++] =
GetMode(p, q, r);
1035 "BasisType is not a boundary interior form");
1038 "BasisType is not a boundary interior form");
1041 "BasisType is not a boundary interior form");
1043 int P =
m_base[0]->GetNumModes() - 1, p;
1044 int Q =
m_base[1]->GetNumModes() - 1, q;
1045 int R =
m_base[2]->GetNumModes() - 1, r;
1050 if (maparray.size() != nBnd)
1056 for (p = 0; p <=
P; ++p)
1061 for (q = 0; q <= Q; ++q)
1063 int maxpq =
max(p, q);
1064 for (r = 0; r <= R - maxpq; ++r)
1066 maparray[idx++] =
GetMode(p, q, r);
1074 for (q = 0; q <= Q; ++q)
1078 for (r = 0; r <= R - p; ++r)
1080 maparray[idx++] =
GetMode(p, q, r);
1085 maparray[idx++] =
GetMode(p, q, 0);
1096 "Method only implemented if BasisType is identical"
1097 "in x and y directions");
1100 "Method only implemented for Modified_A BasisType"
1101 "(x and y direction) and ModifiedPyr_C BasisType (z "
1104 int p, q, r,
P = 0, Q = 0, idx = 0;
1106 int order0 =
m_base[0]->GetNumModes();
1107 int order1 =
m_base[1]->GetNumModes();
1108 int order2 =
m_base[2]->GetNumModes();
1127 ASSERTL0(
false,
"fid must be between 0 and 4");
1130 if (maparray.size() !=
P * Q)
1141 for (q = 0; q < Q; ++q)
1143 for (p = 0; p <
P; ++p)
1145 maparray[q *
P + p] =
GetMode(p, q, 0);
1151 for (p = 0; p <
P; ++p)
1153 for (r = 0; r < Q - p; ++r)
1155 maparray[idx++] =
GetMode(p, 0, r);
1161 maparray[idx++] =
GetMode(1, 0, 0);
1162 maparray[idx++] =
GetMode(0, 0, 1);
1163 for (r = 1; r < Q - 1; ++r)
1165 maparray[idx++] =
GetMode(1, 0, r);
1168 for (q = 1; q <
P; ++q)
1170 for (r = 0; r < Q - q; ++r)
1172 maparray[idx++] =
GetMode(1, q, r);
1178 maparray[idx++] =
GetMode(0, 1, 0);
1179 maparray[idx++] =
GetMode(0, 0, 1);
1180 for (r = 1; r < Q - 1; ++r)
1182 maparray[idx++] =
GetMode(0, 1, r);
1185 for (p = 1; p <
P; ++p)
1187 for (r = 0; r < Q - p; ++r)
1189 maparray[idx++] =
GetMode(p, 1, r);
1195 for (q = 0; q <
P; ++q)
1197 for (r = 0; r < Q - q; ++r)
1199 maparray[idx++] =
GetMode(0, q, r);
1205 ASSERTL0(
false,
"Face to element map unavailable.");
1215 "Method only implemented if BasisType is identical"
1216 "in x and y directions");
1219 "Method only implemented for Modified_A BasisType"
1220 "(x and y direction) and ModifiedPyr_C BasisType (z "
1223 int i, j, k, p, r, nFaceCoeffs;
1224 int nummodesA = 0, nummodesB = 0;
1226 int order0 =
m_base[0]->GetNumModes();
1227 int order1 =
m_base[1]->GetNumModes();
1228 int order2 =
m_base[2]->GetNumModes();
1247 ASSERTL0(
false,
"fid must be between 0 and 4");
1258 nFaceCoeffs =
P * (2 * Q -
P + 1) / 2;
1262 nFaceCoeffs =
P * Q;
1266 if (maparray.size() != nFaceCoeffs)
1271 if (signarray.size() != nFaceCoeffs)
1277 fill(signarray.data(), signarray.data() + nFaceCoeffs, 1);
1287 int minPA =
min(nummodesA,
P);
1288 int minQB =
min(nummodesB, Q);
1290 for (j = 0; j < minPA; ++j)
1293 for (k = 0; k < minQB - j; ++k, ++cnt)
1295 maparray[idx++] = cnt;
1298 cnt += nummodesB - minQB;
1300 for (k = nummodesB - j; k < Q - j; ++k)
1302 signarray[idx] = 0.0;
1303 maparray[idx++] = maparray[0];
1306 for (j = nummodesA; j <
P; ++j)
1308 for (k = 0; k < Q - j; ++k)
1310 signarray[idx] = 0.0;
1311 maparray[idx++] = maparray[0];
1319 swap(maparray[0], maparray[Q]);
1320 for (i = 1; i < Q - 1; ++i)
1322 swap(maparray[i + 1], maparray[Q + i]);
1326 for (p = 0; p <
P; ++p)
1328 for (r = 0; r < Q - p; ++r, idx++)
1332 signarray[idx] = p % 2 ? -1 : 1;
1345 for (i = 0; i < Q; i++)
1347 for (j = 0; j <
P; j++)
1351 arrayindx[i *
P + j] = i *
P + j;
1355 arrayindx[i *
P + j] = j * Q + i;
1362 for (j = 0; j <
P; ++j)
1365 for (k = 0; k < Q; k++)
1367 maparray[arrayindx[j + k *
P]] = j + k * nummodesA;
1370 for (k = nummodesB; k < Q; ++k)
1372 signarray[arrayindx[j + k *
P]] = 0.0;
1373 maparray[arrayindx[j + k *
P]] = maparray[0];
1377 for (j = nummodesA; j <
P; ++j)
1379 for (k = 0; k < Q; ++k)
1381 signarray[arrayindx[j + k *
P]] = 0.0;
1382 maparray[arrayindx[j + k *
P]] = maparray[0];
1397 for (i = 3; i < Q; i += 2)
1399 for (j = 0; j <
P; j++)
1401 signarray[arrayindx[i *
P + j]] *= -1;
1405 for (i = 0; i <
P; i++)
1407 swap(maparray[i], maparray[i +
P]);
1408 swap(signarray[i], signarray[i +
P]);
1413 for (i = 0; i < Q; i++)
1415 for (j = 3; j <
P; j += 2)
1417 signarray[arrayindx[i *
P + j]] *= -1;
1421 for (i = 0; i < Q; i++)
1423 swap(maparray[i], maparray[i + Q]);
1424 swap(signarray[i], signarray[i + Q]);
1436 for (i = 0; i < Q; i++)
1438 for (j = 3; j <
P; j += 2)
1440 signarray[arrayindx[i *
P + j]] *= -1;
1444 for (i = 0; i < Q; i++)
1446 swap(maparray[i *
P], maparray[i *
P + 1]);
1447 swap(signarray[i *
P], signarray[i *
P + 1]);
1452 for (i = 3; i < Q; i += 2)
1454 for (j = 0; j <
P; j++)
1456 signarray[arrayindx[i *
P + j]] *= -1;
1460 for (i = 0; i <
P; i++)
1462 swap(maparray[i * Q], maparray[i * Q + 1]);
1463 swap(signarray[i * Q], signarray[i * Q + 1]);
1476 const int P =
m_base[0]->GetNumModes() - 1;
1477 const int Q =
m_base[1]->GetNumModes() - 1;
1478 const int R =
m_base[2]->GetNumModes() - 1;
1481 if (maparray.size() != nEdgeIntCoeffs)
1486 if (signarray.size() != nEdgeIntCoeffs)
1492 fill(signarray.data(), signarray.data() + nEdgeIntCoeffs, 1);
1502 for (i = 2; i <=
P; ++i)
1504 maparray[i - 2] =
GetMode(i, 0, 0);
1509 for (i = 2; i <= Q; ++i)
1511 maparray[i - 2] =
GetMode(1, i, 0);
1515 for (i = 2; i <=
P; ++i)
1517 maparray[i - 2] =
GetMode(i, 1, 0);
1522 for (i = 2; i <= Q; ++i)
1524 maparray[i - 2] =
GetMode(0, i, 0);
1528 for (i = 2; i <= R; ++i)
1530 maparray[i - 2] =
GetMode(0, 0, i);
1535 for (i = 1; i <= R - 1; ++i)
1537 maparray[i - 1] =
GetMode(1, 0, i);
1541 for (i = 1; i <= R - 1; ++i)
1543 maparray[i - 1] =
GetMode(1, 1, i);
1548 for (i = 1; i <= R - 1; ++i)
1550 maparray[i - 1] =
GetMode(0, 1, i);
1554 ASSERTL0(
false,
"Edge not defined.");
1560 for (i = 1; i < nEdgeIntCoeffs; i += 2)
1571 const int P =
m_base[0]->GetNumModes() - 1;
1572 const int Q =
m_base[1]->GetNumModes() - 1;
1573 const int R =
m_base[2]->GetNumModes() - 1;
1575 int p, q, r, idx = 0;
1580 if (maparray.size() != nFaceIntCoeffs)
1585 if (signarray.size() != nFaceIntCoeffs)
1591 fill(signarray.data(), signarray.data() + nFaceIntCoeffs, 1);
1602 for (i = 0; i < nummodesB; i++)
1604 for (j = 0; j < nummodesA; j++)
1608 arrayindx[i * nummodesA + j] = i * nummodesA + j;
1612 arrayindx[i * nummodesA + j] = j * nummodesB + i;
1621 for (q = 2; q <= Q; ++q)
1623 for (p = 2; p <=
P; ++p)
1625 maparray[arrayindx[(q - 2) * nummodesA + (p - 2)]] =
1631 for (p = 2; p <=
P; ++p)
1633 for (r = 1; r <= R - p; ++r)
1635 if ((
int)faceOrient == 7)
1637 signarray[idx] = p % 2 ? -1 : 1;
1639 maparray[idx++] =
GetMode(p, 0, r);
1644 for (q = 2; q <= Q; ++q)
1646 for (r = 1; r <= R - q; ++r)
1648 if ((
int)faceOrient == 7)
1650 signarray[idx] = q % 2 ? -1 : 1;
1652 maparray[idx++] =
GetMode(1, q, r);
1658 for (p = 2; p <=
P; ++p)
1660 for (r = 1; r <= R - p; ++r)
1662 if ((
int)faceOrient == 7)
1664 signarray[idx] = p % 2 ? -1 : 1;
1666 maparray[idx++] =
GetMode(p, 1, r);
1672 for (q = 2; q <= Q; ++q)
1674 for (r = 1; r <= R - q; ++r)
1676 if ((
int)faceOrient == 7)
1678 signarray[idx] = q % 2 ? -1 : 1;
1680 maparray[idx++] =
GetMode(0, q, r);
1685 ASSERTL0(
false,
"Face interior map not available.");
1695 if (faceOrient == 6 || faceOrient == 8 || faceOrient == 11 ||
1700 for (i = 1; i < nummodesB; i += 2)
1702 for (j = 0; j < nummodesA; j++)
1704 signarray[arrayindx[i * nummodesA + j]] *= -1;
1710 for (i = 0; i < nummodesB; i++)
1712 for (j = 1; j < nummodesA; j += 2)
1714 signarray[arrayindx[i * nummodesA + j]] *= -1;
1720 if (faceOrient == 7 || faceOrient == 8 || faceOrient == 10 ||
1725 for (i = 0; i < nummodesB; i++)
1727 for (j = 1; j < nummodesA; j += 2)
1729 signarray[arrayindx[i * nummodesA + j]] *= -1;
1735 for (i = 1; i < nummodesB; i += 2)
1737 for (j = 0; j < nummodesA; j++)
1739 signarray[arrayindx[i * nummodesA + j]] *= -1;
1786 const int Q =
m_base[1]->GetNumModes() - 1;
1787 const int R =
m_base[2]->GetNumModes() - 1;
1793 for (i = 0; i < I; ++i)
1799 cnt += (R + 1 - i) * (Q + 1) - l * (l + 1) / 2;
1803 l =
max(0, J - 1 - I);
1804 cnt += (R + 1 - I) * J - l * (l + 1) / 2;
1816 int qa =
m_base[0]->GetNumPoints();
1817 int qb =
m_base[1]->GetNumPoints();
1818 int qc =
m_base[2]->GetNumPoints();
1819 int nmodes_a =
m_base[0]->GetNumModes();
1820 int nmodes_b =
m_base[1]->GetNumModes();
1821 int nmodes_c =
m_base[2]->GetNumModes();
1833 int i, j, k, cnt = 0;
1836 OrthoExp.
FwdTrans(array, orthocoeffs);
1846 for (i = 0; i < nmodes_a; ++i)
1848 for (j = 0; j < nmodes_b; ++j)
1850 int maxij =
max(i, j);
1852 pow((1.0 * i) / (nmodes_a - 1), cutoff * nmodes_a),
1853 pow((1.0 * j) / (nmodes_b - 1), cutoff * nmodes_b));
1855 for (k = 0; k < nmodes_c - maxij; ++k)
1858 std::max(fac1, pow((1.0 * k) / (nmodes_c - 1),
1859 cutoff * nmodes_c));
1861 orthocoeffs[cnt] *= SvvDiffCoeff * fac;
1877 max_abc =
max(max_abc, 0);
1880 for (i = 0; i < nmodes_a; ++i)
1882 for (j = 0; j < nmodes_b; ++j)
1884 int maxij =
max(i, j);
1886 for (k = 0; k < nmodes_c - maxij; ++k)
1888 int maxijk =
max(maxij, k);
1910 int cutoff_a = (int)(SVVCutOff * nmodes_a);
1911 int cutoff_b = (int)(SVVCutOff * nmodes_b);
1912 int cutoff_c = (int)(SVVCutOff * nmodes_c);
1916 int nmodes =
min(
min(nmodes_a, nmodes_b), nmodes_c);
1919 for (i = 0; i < nmodes_a; ++i)
1921 for (j = 0; j < nmodes_b; ++j)
1923 int maxij =
max(i, j);
1924 for (k = 0; k < nmodes_c - maxij; ++k)
1926 if (j + k >= cutoff || i + k >= cutoff)
1930 exp(-(i + k - nmodes) * (i + k - nmodes) /
1931 ((
NekDouble)((i + k - cutoff + epsilon) *
1932 (i + k - cutoff + epsilon)))) *
1933 exp(-(j - nmodes) * (j - nmodes) /
1935 (j - cutoff + epsilon)))));
1939 orthocoeffs[cnt] *= 0.0;
1948 OrthoExp.
BwdTrans(orthocoeffs, array);
1955 int nquad0 =
m_base[0]->GetNumPoints();
1956 int nquad1 =
m_base[1]->GetNumPoints();
1957 int nquad2 =
m_base[2]->GetNumPoints();
1958 int nqtot = nquad0 * nquad1 * nquad2;
1959 int nmodes0 =
m_base[0]->GetNumModes();
1960 int nmodes1 =
m_base[1]->GetNumModes();
1961 int nmodes2 =
m_base[2]->GetNumModes();
1962 int numMax = nmodes0;
1983 bortho0, bortho1, bortho2);
1986 OrthoPyrExp->FwdTrans(phys_tmp, coeff);
1989 for (u = 0; u < numMin; ++u)
1991 for (i = 0; i < numMin; ++i)
1994 int maxui =
max(u, i);
1996 tmp2 = coeff_tmp1 + cnt, 1);
1997 cnt += nmodes2 - maxui;
2000 for (i = numMin; i < nmodes1; ++i)
2002 int maxui =
max(u, i);
2003 cnt += numMax - maxui;
2007 OrthoPyrExp->BwdTrans(coeff_tmp1, phys_tmp);
#define ASSERTL0(condition, msg)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed to...
#define IPRODUCTWRTBASE_DEF
#define IPRODUCTWRTBASE_M(r, i)
#define STDLEV2TEST(r, state)
#define STDLEV2UPDATE(r, state)
Describes the specification for a Basis.
BasisType GetBasisType() const
Return type of expansion basis.
int GetNumModes() const
Returns the order of the basis.
Defines a specification for a set of points.
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
NekDouble BaryTensorDeriv(const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs)
void PhysTensorDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2)
Calculate the 3D derivative in the local tensor/collapsed coordinate at the physical points.
void v_PhysDeriv(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Calculate the derivative of the physical points in a given direction.
The base class for all shapes.
int GetNcoeffs(void) const
This function returns the total number of coefficients used in the expansion.
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
int NumBndryCoeffs(void) const
void LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
Convert local cartesian coordinate xi into local collapsed coordinates eta.
const Array< OneD, const LibUtilities::BasisSharedPtr > & GetBase() const
This function gets the shared point to basis.
DNekMatSharedPtr CreateGeneralMatrix(const StdMatrixKey &mkey)
this function generates the mass matrix
NekDouble PhysEvaluate(const Array< OneD, const NekDouble > &coords, const Array< OneD, const NekDouble > &physvals)
This function evaluates the expansion at a single (arbitrary) point of the domain.
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space.
int GetTraceNcoeffs(const int i) const
This function returns the number of expansion coefficients belonging to the i-th trace.
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
void FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
Array< OneD, const NekDouble > GetStdFac(const StdFacKey &mkey)
int GetBasisNumModes(const int dir) const
This function returns the number of expansion modes in the dir direction.
Array< OneD, LibUtilities::BasisSharedPtr > m_base
std::vector< Array< OneD, const NekDouble > > m_weights
NekDouble GetConstFactor(const ConstFactorType &factor) const
bool ConstFactorExists(const ConstFactorType &factor) const
DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey) override
int v_NumBndryCoeffs() const override
NekDouble v_PhysEvaluateBasis(const Array< OneD, const NekDouble > &coords, int mode) final
void v_ReduceOrderCoeffs(int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
int v_NumDGBndryCoeffs() const override
void v_IProductWRTBaseKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const Array< OneD, NekDouble > &jac, const bool Deformed, bool CollDir0=false, bool CollDir1=false, bool CollDir2=false) override
Inner product of inarray over region with respect to the expansion basis (this)->m_base[0] and return...
void v_GetElmtTraceToTraceMap(const unsigned int fid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation faceOrient, int P, int Q) override
int v_GetTraceNcoeffs(const int i) const override
void v_LocCollapsedToLocCoord(const Array< OneD, const NekDouble > &eta, Array< OneD, NekDouble > &xi) override
void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey) override
int v_GetEdgeNcoeffs(const int i) const override
int v_GetNtraces() const override
void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_FillMode(const int mode, Array< OneD, NekDouble > &outarray) override
int v_GetNedges() const override
int v_CalcNumberOfCoefficients(const std::vector< unsigned int > &nummodes, int &modes_offset) override
int GetMode(int I, int J, int K)
Compute the mode number in the expansion for a particular tensorial combination.
int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false) override
int v_GetTraceNumPoints(const int i) const override
void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Backward transformation is evaluated at the quadrature points.
void v_GetBoundaryMap(Array< OneD, unsigned int > &outarray) override
void v_GetInteriorMap(Array< OneD, unsigned int > &outarray) override
void v_GetEdgeInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2) override
void v_LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta) override
DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey) override
int v_GetNverts() const override
void v_GetTraceInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2) override
void v_StdPhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2) override
Calculate the derivative of the physical points.
LibUtilities::ShapeType v_DetShapeType() const override
void v_GetTraceNumModes(const int fid, int &numModes0, int &numModes1, Orientation faceOrient=eDir1FwdDir1_Dir2FwdDir2) override
void v_GetTraceCoeffMap(const unsigned int fid, Array< OneD, unsigned int > &maparray) override
NekDouble v_PhysEvalFirstDeriv(const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs) override
void v_GetCoords(Array< OneD, NekDouble > &xi_x, Array< OneD, NekDouble > &xi_y, Array< OneD, NekDouble > &xi_z) override
const LibUtilities::BasisKey v_GetTraceBasisKey(const int i, const int k, bool UseGLL=false) const override
int v_GetTraceIntNcoeffs(const int i) const override
constexpr int getNumberOfBndCoefficients(int Na, int Nb, int Nc)
constexpr int getNumberOfCoefficients(int Na, int Nb, int Nc)
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
@ eOrtho_A
Principle Orthogonal Functions .
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eModifiedPyr_C
Principle Modified Functions.
@ eModified_A
Principle Modified Functions .
@ eOrthoPyr_C
Principle Orthogonal Functions .
static const NekDouble kNekZeroTol
LibUtilities::BasisKey EvaluateQuadFaceBasisKey(const int facedir, const LibUtilities::BasisSharedPtr &faceDirBasis)
@ eFactorSVVDGKerDiffCoeff
@ eFactorSVVPowerKerDiffCoeff
LibUtilities::BasisKey EvaluateTriFaceBasisKey(const int facedir, const LibUtilities::BasisSharedPtr &faceDirBasis, bool UseGLL)
const int kSVVDGFiltermodesmin
tinysimd::scalarT< double > vec_t
std::shared_ptr< StdPyrExp > StdPyrExpSharedPtr
const int kSVVDGFiltermodesmax
const NekDouble kSVVDGFilter[9][11]
@ eDir1BwdDir2_Dir2BwdDir1
@ eDir1BwdDir1_Dir2BwdDir2
@ eDir1BwdDir2_Dir2FwdDir1
@ eDir1FwdDir1_Dir2BwdDir2
@ eDir1BwdDir1_Dir2FwdDir2
@ eDir1FwdDir2_Dir2FwdDir1
@ eDir1FwdDir2_Dir2BwdDir1
std::shared_ptr< DNekMat > DNekMatSharedPtr
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
scalarT< T > max(scalarT< T > lhs, scalarT< T > rhs)
scalarT< T > min(scalarT< T > lhs, scalarT< T > rhs)