57 :
StdExpansion(Ba.GetNumModes() * Bb.GetNumModes() * Bc.GetNumModes(), 3,
59 StdExpansion3D(Ba.GetNumModes() * Bb.GetNumModes() * Bc.GetNumModes(), Ba,
120 int nquad0 =
m_base[0]->GetNumPoints();
121 int nquad1 =
m_base[1]->GetNumPoints();
122 int nquad2 =
m_base[2]->GetNumPoints();
124 if (
m_base[0]->Collocation() &&
m_base[1]->Collocation() &&
127 std::memcpy(outarray.data(), inarray.data(),
128 nquad0 * nquad1 * nquad2 *
sizeof(
NekDouble));
136 int nmodes0 =
m_base[0]->GetNumModes();
137 int nmodes1 =
m_base[1]->GetNumModes();
138 int nmodes2 =
m_base[2]->GetNumModes();
140 std::vector<vec_t, tinysimd::allocator<vec_t>> wsp0(nmodes1 * nmodes2 *
142 wsp1(nquad1 * nquad0 * nmodes2);
152#define BWDTRANS_DEF \
153 BwdTransHexKernel(nmodes0, nmodes1, nmodes2, nquad0, nquad1, nquad2, \
154 (const vec_t *)base0.data(), \
155 (const vec_t *)base1.data(), \
156 (const vec_t *)base2.data(), wsp0.data(), wsp1.data(), \
157 (const vec_t *)inarray.data(), (vec_t *)outarray.data())
161#define BWDTRANS_Q(r, i) \
164 NM(i), NM(i), NM(i), NQ(i), NQ(i), NQ(i), \
165 (const vec_t *)base0.data(), (const vec_t *)base1.data(), \
166 (const vec_t *)base2.data(), wsp0.data(), wsp1.data(), \
167 (const vec_t *)inarray.data(), (vec_t *)outarray.data()); \
172#define BWDTRANS_M(r, i) \
177 BOOST_PP_FOR_##r((NM(i), NM_P1(i), BOOST_PP_MUL(2, NM(i))), \
178 STDLEV2TEST1, STDLEV2UPDATE1, BWDTRANS_Q) default \
188 if ((nmodes0 == nmodes1) && (nmodes1 == nmodes2) &&
189 (nquad0 == nquad1) && (nquad1 == nquad2))
239 const bool Deformed, [[maybe_unused]]
bool CollDir0,
240 [[maybe_unused]]
bool CollDir1, [[maybe_unused]]
bool CollDir2)
242 int nquad0 =
m_base[0]->GetNumPoints();
243 int nquad1 =
m_base[1]->GetNumPoints();
244 int nquad2 =
m_base[2]->GetNumPoints();
246 int order0 =
m_base[0]->GetNumModes();
247 int order1 =
m_base[1]->GetNumModes();
248 int order2 =
m_base[2]->GetNumModes();
250 std::vector<vec_t, tinysimd::allocator<vec_t>> wsp0(nquad1 * nquad2),
262#undef IPRODUCTWRTBASE_DEF
263#define IPRODUCTWRTBASE_DEF \
264 IProductHexKernel<false, false, true>( \
265 order0, order1, order2, nquad0, nquad1, nquad2, \
266 (const vec_t *)inarray.data(), (const vec_t *)base0.data(), \
267 (const vec_t *)base1.data(), (const vec_t *)base2.data(), \
268 (const vec_t *)m_weights[0].data(), \
269 (const vec_t *)m_weights[1].data(), \
270 (const vec_t *)m_weights[2].data(), (const vec_t *)jac.data(), \
271 (vec_t *)wsp0.data(), (vec_t *)wsp1.data(), (vec_t *)outarray.data(), \
272 1.0, CollDir0, CollDir1, CollDir2)
275#undef IPRODUCTWRTBASE_Q
276#define IPRODUCTWRTBASE_Q(r, i) \
278 IProductHexKernel<false, false, true>( \
279 NM(i), NM(i), NM(i), NQ(i), NQ(i), NQ(i), \
280 (const vec_t *)inarray.data(), (const vec_t *)base0.data(), \
281 (const vec_t *)base1.data(), (const vec_t *)base2.data(), \
282 (const vec_t *)m_weights[0].data(), \
283 (const vec_t *)m_weights[1].data(), \
284 (const vec_t *)m_weights[2].data(), (const vec_t *)jac.data(), \
285 (vec_t *)wsp0.data(), (vec_t *)wsp1.data(), \
286 (vec_t *)outarray.data(), 1.0, CollDir0, CollDir1, CollDir2); \
290#undef IPRODUCTWRTBASE_M
291#define IPRODUCTWRTBASE_M(r, i) \
296 BOOST_PP_FOR_##r((NM(i), NM_P1(i), BOOST_PP_MUL(2, NM(i))), \
297 STDLEV2TEST1, STDLEV2UPDATE1, \
298 IPRODUCTWRTBASE_Q) default : IPRODUCTWRTBASE_DEF; \
306 if ((order0 == order1) && (order1 == order2) && (nquad0 == nquad1) &&
326#undef IPRODUCTWRTBASE_DEF
327#define IPRODUCTWRTBASE_DEF \
328 IProductHexKernel<false, false, false>( \
329 order0, order1, order2, nquad0, nquad1, nquad2, \
330 (const vec_t *)inarray.data(), (const vec_t *)base0.data(), \
331 (const vec_t *)base1.data(), (const vec_t *)base2.data(), \
332 (const vec_t *)m_weights[0].data(), \
333 (const vec_t *)m_weights[1].data(), \
334 (const vec_t *)m_weights[2].data(), (const vec_t *)jac.data(), \
335 (vec_t *)wsp0.data(), (vec_t *)wsp1.data(), (vec_t *)outarray.data(), \
336 1.0, CollDir0, CollDir1, CollDir2)
339#undef IPRODUCTWRTBASE_Q
340#define IPRODUCTWRTBASE_Q(r, i) \
342 IProductHexKernel<false, false, false>( \
343 NM(i), NM(i), NM(i), NQ(i), NQ(i), NQ(i), \
344 (const vec_t *)inarray.data(), (const vec_t *)base0.data(), \
345 (const vec_t *)base1.data(), (const vec_t *)base2.data(), \
346 (const vec_t *)m_weights[0].data(), \
347 (const vec_t *)m_weights[1].data(), \
348 (const vec_t *)m_weights[2].data(), (const vec_t *)jac.data(), \
349 (vec_t *)wsp0.data(), (vec_t *)wsp1.data(), \
350 (vec_t *)outarray.data(), 1.0, CollDir0, CollDir1, CollDir2); \
354#undef IPRODUCTWRTBASE_M
355#define IPRODUCTWRTBASE_M(r, i) \
360 BOOST_PP_FOR_##r((NM(i), NM_P1(i), BOOST_PP_MUL(2, NM(i))), \
361 STDLEV2TEST1, STDLEV2UPDATE1, \
362 IPRODUCTWRTBASE_Q) default : IPRODUCTWRTBASE_DEF; \
370 if ((order0 == order1) && (order1 == order2) && (nquad0 == nquad1) &&
393 ASSERTL0((dir == 0) || (dir == 1) || (dir == 2),
394 "input dir is out of range");
403 m_base[2]->GetBdata(), inarray, outarray, one,
false,
false,
409 m_base[2]->GetBdata(), inarray, outarray, one,
false,
410 m_base[0]->Collocation(),
false,
m_base[2]->Collocation());
415 m_base[2]->GetDbdata(), inarray, outarray, one,
false,
416 m_base[0]->Collocation(),
m_base[1]->Collocation(),
false);
442 int nquad0 =
m_base[0]->GetNumPoints();
443 int nquad1 =
m_base[1]->GetNumPoints();
444 int nquad2 =
m_base[2]->GetNumPoints();
450 int btmp0 =
m_base[0]->GetNumModes();
451 int btmp1 =
m_base[1]->GetNumModes();
452 int mode2 = mode / (btmp0 * btmp1);
453 int mode1 = (mode - mode2 * btmp0 * btmp1) / btmp0;
454 int mode0 = (mode - mode2 * btmp0 * btmp1) % btmp0;
456 ASSERTL2(mode == mode2 * btmp0 * btmp1 + mode1 * btmp0 + mode0,
457 "Mode lookup failed.");
459 "Calling argument mode is larger than total expansion "
462 for (
int i = 0; i < nquad1 * nquad2; ++i)
465 &outarray[0] + i * nquad0, 1);
468 for (
int j = 0; j < nquad2; ++j)
470 for (
int i = 0; i < nquad0; ++i)
473 &outarray[0] + i + j * nquad0 * nquad1, nquad0,
474 &outarray[0] + i + j * nquad0 * nquad1, nquad0);
478 for (
int i = 0; i < nquad2; i++)
480 Blas::Dscal(nquad0 * nquad1, base2[mode2 * nquad2 + i],
481 &outarray[0] + i * nquad0 * nquad1, 1);
495 const int nm0 =
m_base[0]->GetNumModes();
496 const int nm1 =
m_base[1]->GetNumModes();
497 const int mode2 = mode / (nm0 * nm1);
498 const int mode1 = (mode - mode2 * nm0 * nm1) / nm0;
499 const int mode0 = (mode - mode2 * nm0 * nm1) % nm0;
501 return StdExpansion::BaryEvaluateBasis<0>(coords[0], mode0) *
502 StdExpansion::BaryEvaluateBasis<1>(coords[1], mode1) *
503 StdExpansion::BaryEvaluateBasis<2>(coords[2], mode2);
530 "BasisType is not a boundary interior form");
533 "BasisType is not a boundary interior form");
536 "BasisType is not a boundary interior form");
538 int nmodes0 =
m_base[0]->GetNumModes();
539 int nmodes1 =
m_base[1]->GetNumModes();
540 int nmodes2 =
m_base[2]->GetNumModes();
542 return (2 * (nmodes0 * nmodes1 + nmodes0 * nmodes2 + nmodes1 * nmodes2) -
543 4 * (nmodes0 + nmodes1 + nmodes2) + 8);
550 "BasisType is not a boundary interior form");
553 "BasisType is not a boundary interior form");
556 "BasisType is not a boundary interior form");
558 int nmodes0 =
m_base[0]->GetNumModes();
559 int nmodes1 =
m_base[1]->GetNumModes();
560 int nmodes2 =
m_base[2]->GetNumModes();
562 return 2 * (nmodes0 * nmodes1 + nmodes0 * nmodes2 + nmodes1 * nmodes2);
567 ASSERTL2((i >= 0) && (i <= 5),
"face id is out of range");
568 if ((i == 0) || (i == 5))
572 else if ((i == 1) || (i == 3))
584 ASSERTL2((i >= 0) && (i <= 5),
"face id is out of range");
585 if ((i == 0) || (i == 5))
589 else if ((i == 1) || (i == 3))
601 ASSERTL2(i >= 0 && i <= 5,
"face id is out of range");
603 if (i == 0 || i == 5)
605 return m_base[0]->GetNumPoints() *
m_base[1]->GetNumPoints();
607 else if (i == 1 || i == 3)
609 return m_base[0]->GetNumPoints() *
m_base[2]->GetNumPoints();
613 return m_base[1]->GetNumPoints() *
m_base[2]->GetNumPoints();
620 ASSERTL2(i >= 0 && i <= 5,
"face id is out of range");
621 ASSERTL2(j == 0 || j == 1,
"face direction is out of range");
623 if (i == 0 || i == 5)
625 return m_base[j]->GetPointsKey();
627 else if (i == 1 || i == 3)
629 return m_base[2 * j]->GetPointsKey();
633 return m_base[j + 1]->GetPointsKey();
638 const std::vector<unsigned int> &nummodes,
int &modes_offset)
640 int nmodes = nummodes[modes_offset] * nummodes[modes_offset + 1] *
641 nummodes[modes_offset + 2];
648 const int i,
const int k, [[maybe_unused]]
bool UseGLL)
const
650 ASSERTL2(i >= 0 && i <= 5,
"face id is out of range");
651 ASSERTL2(k >= 0 && k <= 1,
"basis key id is out of range");
686 for (
int k = 0; k < Qz; ++k)
688 for (
int j = 0; j < Qy; ++j)
690 for (
int i = 0; i < Qx; ++i)
692 int s = i + Qx * (j + Qy * k);
704 int nummodes[3] = {
m_base[0]->GetNumModes(),
m_base[1]->GetNumModes(),
705 m_base[2]->GetNumModes()};
711 numModes0 = nummodes[0];
712 numModes1 = nummodes[1];
718 numModes0 = nummodes[0];
719 numModes1 = nummodes[2];
725 numModes0 = nummodes[1];
726 numModes1 = nummodes[2];
731 ASSERTL0(
false,
"fid out of range");
738 std::swap(numModes0, numModes1);
753 "BasisType is not a boundary interior form");
756 "BasisType is not a boundary interior form");
759 "BasisType is not a boundary interior form");
761 ASSERTL1((localVertexId >= 0) && (localVertexId < 8),
762 "local vertex id must be between 0 and 7");
769 int nummodes[3] = {
m_base[0]->GetNumModes(),
m_base[1]->GetNumModes(),
770 m_base[2]->GetNumModes()};
772 if (useCoeffPacking ==
true)
774 if (localVertexId > 3)
786 switch (localVertexId % 4)
833 if ((localVertexId % 4) % 3 > 0)
845 if (localVertexId % 4 > 1)
858 if (localVertexId > 3)
871 return r * nummodes[0] * nummodes[1] + q * nummodes[0] + p;
881 "BasisType is not a boundary interior form");
884 "BasisType is not a boundary interior form");
887 "BasisType is not a boundary interior form");
890 int nummodes[3] = {
m_base[0]->GetNumModes(),
m_base[1]->GetNumModes(),
891 m_base[2]->GetNumModes()};
895 if (outarray.size() != nIntCoeffs)
908 for (i = 0; i < 3; i++)
913 IntIdx[i][1] = nummodes[i];
918 IntIdx[i][1] = nummodes[i] - 1;
922 for (r = IntIdx[2][0]; r < IntIdx[2][1]; r++)
924 for (q = IntIdx[1][0]; q < IntIdx[1][1]; q++)
926 for (p = IntIdx[0][0]; p < IntIdx[0][1]; p++)
929 r * nummodes[0] * nummodes[1] + q * nummodes[0] + p;
942 "BasisType is not a boundary interior form");
945 "BasisType is not a boundary interior form");
948 "BasisType is not a boundary interior form");
951 int nummodes[3] = {
m_base[0]->GetNumModes(),
m_base[1]->GetNumModes(),
952 m_base[2]->GetNumModes()};
956 if (outarray.size() != nBndCoeffs)
970 for (i = 0; i < 3; i++)
978 IntIdx[i][1] = nummodes[i];
982 BndIdx[i][1] = nummodes[i] - 1;
984 IntIdx[i][1] = nummodes[i] - 1;
988 for (i = 0; i < 2; i++)
991 for (q = 0; q < nummodes[1]; q++)
993 for (p = 0; p < nummodes[0]; p++)
996 r * nummodes[0] * nummodes[1] + q * nummodes[0] + p;
1001 for (r = IntIdx[2][0]; r < IntIdx[2][1]; r++)
1003 for (i = 0; i < 2; i++)
1006 for (p = 0; p < nummodes[0]; p++)
1009 r * nummodes[0] * nummodes[1] + q * nummodes[0] + p;
1013 for (q = IntIdx[1][0]; q < IntIdx[1][1]; q++)
1015 for (i = 0; i < 2; i++)
1019 r * nummodes[0] * nummodes[1] + q * nummodes[0] + p;
1024 sort(outarray.data(), outarray.data() + nBndCoeffs);
1030 std::array<NekDouble, 3> &firstOrderDerivs)
1042 int nummodesA = 0, nummodesB = 0;
1046 "Method only implemented if BasisType is indentical in "
1050 "Method only implemented for Modified_A or "
1051 "GLL_Lagrange BasisType");
1053 const int nummodes0 =
m_base[0]->GetNumModes();
1054 const int nummodes1 =
m_base[1]->GetNumModes();
1055 const int nummodes2 =
m_base[2]->GetNumModes();
1061 nummodesA = nummodes0;
1062 nummodesB = nummodes1;
1066 nummodesA = nummodes0;
1067 nummodesB = nummodes2;
1071 nummodesA = nummodes1;
1072 nummodesB = nummodes2;
1075 ASSERTL0(
false,
"fid must be between 0 and 5");
1078 int nFaceCoeffs = nummodesA * nummodesB;
1080 if (maparray.size() != nFaceCoeffs)
1097 offset = nummodes0 * nummodes1;
1101 offset = (nummodes2 - 1) * nummodes0 * nummodes1;
1119 offset = nummodes0 * (nummodes1 - 1);
1120 jump1 = nummodes0 * nummodes1;
1126 jump1 = nummodes0 * nummodes1;
1137 offset = nummodes0 - 1;
1138 jump1 = nummodes0 * nummodes1;
1145 jump1 = nummodes0 * nummodes1;
1150 ASSERTL0(
false,
"fid must be between 0 and 5");
1153 for (i = 0; i < nummodesB; i++)
1155 for (j = 0; j < nummodesA; j++)
1157 maparray[i * nummodesA + j] = i * jump1 + j * jump2 + offset;
1168 int nummodesA = 0, nummodesB = 0;
1172 "Method only implemented if BasisType is indentical in "
1176 "Method only implemented for Modified_A or "
1177 "GLL_Lagrange BasisType");
1179 const int nummodes0 =
m_base[0]->GetNumModes();
1180 const int nummodes1 =
m_base[1]->GetNumModes();
1181 const int nummodes2 =
m_base[2]->GetNumModes();
1187 nummodesA = nummodes0;
1188 nummodesB = nummodes1;
1192 nummodesA = nummodes0;
1193 nummodesB = nummodes2;
1197 nummodesA = nummodes1;
1198 nummodesB = nummodes2;
1201 ASSERTL0(
false,
"fid must be between 0 and 5");
1213 if (modified ==
false)
1215 ASSERTL1((
P == nummodesA) || (Q == nummodesB),
1216 "Different trace space face dimention "
1217 "and element face dimention not possible for "
1218 "GLL-Lagrange bases");
1221 int nFaceCoeffs =
P * Q;
1223 if (maparray.size() != nFaceCoeffs)
1229 for (i = 0; i < nFaceCoeffs; ++i)
1234 if (signarray.size() != nFaceCoeffs)
1240 fill(signarray.data(), signarray.data() + nFaceCoeffs, 1);
1245 for (i = 0; i < Q; i++)
1247 for (j = 0; j <
P; j++)
1251 arrayindx[i *
P + j] = i *
P + j;
1255 arrayindx[i *
P + j] = j * Q + i;
1262 for (i = 0; i < nummodesB; i++)
1264 for (j = nummodesA; j <
P; j++)
1266 signarray[arrayindx[i *
P + j]] = 0.0;
1267 maparray[arrayindx[i *
P + j]] = maparray[0];
1271 for (i = nummodesB; i < Q; i++)
1273 for (j = 0; j <
P; j++)
1275 signarray[arrayindx[i *
P + j]] = 0.0;
1276 maparray[arrayindx[i *
P + j]] = maparray[0];
1282 for (i = 0; i < Q; i++)
1286 for (j = 0; j <
P; j++)
1288 maparray[arrayindx[i *
P + j]] = i * nummodesA + j;
1292 for (j = nummodesA; j <
P; j++)
1294 signarray[arrayindx[i *
P + j]] = 0.0;
1295 maparray[arrayindx[i *
P + j]] = maparray[0];
1300 for (i = nummodesB; i < Q; i++)
1302 for (j = 0; j <
P; j++)
1304 signarray[arrayindx[i *
P + j]] = 0.0;
1305 maparray[arrayindx[i *
P + j]] = maparray[0];
1319 for (i = 3; i < Q; i += 2)
1321 for (j = 0; j <
P; j++)
1323 signarray[arrayindx[i *
P + j]] *= -1;
1327 for (i = 0; i <
P; i++)
1329 swap(maparray[i], maparray[i +
P]);
1330 swap(signarray[i], signarray[i +
P]);
1335 for (i = 0; i <
P; i++)
1337 for (j = 0; j < Q / 2; j++)
1339 swap(maparray[i + j *
P],
1340 maparray[i +
P * Q -
P - j *
P]);
1341 swap(signarray[i + j *
P],
1342 signarray[i +
P * Q -
P - j *
P]);
1351 for (i = 0; i < Q; i++)
1353 for (j = 3; j <
P; j += 2)
1355 signarray[arrayindx[i *
P + j]] *= -1;
1359 for (i = 0; i < Q; i++)
1361 swap(maparray[i], maparray[i + Q]);
1362 swap(signarray[i], signarray[i + Q]);
1367 for (i = 0; i <
P; i++)
1369 for (j = 0; j < Q / 2; j++)
1371 swap(maparray[i * Q + j], maparray[i * Q + Q - 1 - j]);
1372 swap(signarray[i * Q + j],
1373 signarray[i * Q + Q - 1 - j]);
1389 for (i = 0; i < Q; i++)
1391 for (j = 3; j <
P; j += 2)
1393 signarray[arrayindx[i *
P + j]] *= -1;
1397 for (i = 0; i < Q; i++)
1399 swap(maparray[i *
P], maparray[i *
P + 1]);
1400 swap(signarray[i *
P], signarray[i *
P + 1]);
1405 for (i = 0; i < Q; i++)
1407 for (j = 0; j <
P / 2; j++)
1409 swap(maparray[i *
P + j], maparray[i *
P +
P - 1 - j]);
1410 swap(signarray[i *
P + j],
1411 signarray[i *
P +
P - 1 - j]);
1420 for (i = 3; i < Q; i += 2)
1422 for (j = 0; j <
P; j++)
1424 signarray[arrayindx[i *
P + j]] *= -1;
1428 for (i = 0; i <
P; i++)
1430 swap(maparray[i * Q], maparray[i * Q + 1]);
1431 swap(signarray[i * Q], signarray[i * Q + 1]);
1436 for (i = 0; i < Q; i++)
1438 for (j = 0; j <
P / 2; j++)
1440 swap(maparray[i + j * Q],
1441 maparray[i +
P * Q - Q - j * Q]);
1442 swap(signarray[i + j * Q],
1443 signarray[i +
P * Q - Q - j * Q]);
1463 "BasisType is not a boundary interior form");
1466 "BasisType is not a boundary interior form");
1469 "BasisType is not a boundary interior form");
1472 "local edge id must be between 0 and 11");
1476 if (maparray.size() != nEdgeIntCoeffs)
1481 if (signarray.size() != nEdgeIntCoeffs)
1487 fill(signarray.data(), signarray.data() + nEdgeIntCoeffs, 1);
1490 int nummodes[3] = {
m_base[0]->GetNumModes(),
m_base[1]->GetNumModes(),
1491 m_base[2]->GetNumModes()};
1496 bool reverseOrdering =
false;
1497 bool signChange =
false;
1499 int IdxRange[3][2] = {{0, 0}, {0, 0}, {0, 0}};
1519 IdxRange[2][0] = nummodes[2] - 1;
1520 IdxRange[2][1] = nummodes[2];
1537 IdxRange[2][1] = nummodes[2] - 1;
1541 reverseOrdering =
true;
1547 IdxRange[2][1] = nummodes[2];
1576 IdxRange[1][0] = nummodes[1] - 1;
1577 IdxRange[1][1] = nummodes[1];
1592 IdxRange[1][1] = nummodes[1] - 1;
1596 reverseOrdering =
true;
1602 IdxRange[1][1] = nummodes[1];
1617 IdxRange[1][1] = nummodes[1] - 1;
1621 reverseOrdering =
true;
1627 IdxRange[1][1] = nummodes[1];
1656 IdxRange[0][0] = nummodes[0] - 1;
1657 IdxRange[0][1] = nummodes[0];
1672 IdxRange[0][1] = nummodes[0] - 1;
1676 reverseOrdering =
true;
1682 IdxRange[0][1] = nummodes[0];
1697 IdxRange[0][1] = nummodes[0] - 1;
1701 reverseOrdering =
true;
1707 IdxRange[0][1] = nummodes[0];
1720 for (
int r = IdxRange[2][0]; r < IdxRange[2][1]; r++)
1722 for (
int q = IdxRange[1][0]; q < IdxRange[1][1]; q++)
1724 for (
int p = IdxRange[0][0]; p < IdxRange[0][1]; p++)
1727 r * nummodes[0] * nummodes[1] + q * nummodes[0] + p;
1732 if (reverseOrdering)
1734 reverse(maparray.data(), maparray.data() + nEdgeIntCoeffs);
1739 for (
int p = 1; p < nEdgeIntCoeffs; p += 2)
1756 "BasisType is not a boundary interior form");
1759 "BasisType is not a boundary interior form");
1762 "BasisType is not a boundary interior form");
1764 ASSERTL1((fid >= 0) && (fid < 6),
"local face id must be between 0 and 5");
1768 if (maparray.size() != nFaceIntCoeffs)
1773 if (signarray.size() != nFaceIntCoeffs)
1779 fill(signarray.data(), signarray.data() + nFaceIntCoeffs, 1);
1782 int nummodes[3] = {
m_base[0]->GetNumModes(),
m_base[1]->GetNumModes(),
1783 m_base[2]->GetNumModes()};
1798 nummodesA = nummodes[0];
1799 nummodesB = nummodes[1];
1805 nummodesA = nummodes[0];
1806 nummodesB = nummodes[2];
1812 nummodesA = nummodes[1];
1813 nummodesB = nummodes[2];
1821 for (
int i = 0; i < (nummodesB - 2); i++)
1823 for (
int j = 0; j < (nummodesA - 2); j++)
1827 arrayindx[i * (nummodesA - 2) + j] = i * (nummodesA - 2) + j;
1831 arrayindx[i * (nummodesA - 2) + j] = j * (nummodesB - 2) + i;
1858 IdxRange[2][0] = nummodes[2] - 1;
1859 IdxRange[2][1] = nummodes[2];
1876 IdxRange[2][0] = nummodes[2] - 2;
1883 IdxRange[2][1] = nummodes[2] - 1;
1890 IdxRange[2][1] = nummodes[2];
1895 for (
int i = 3; i < nummodes[2]; i += 2)
1919 IdxRange[1][0] = nummodes[1] - 1;
1920 IdxRange[1][1] = nummodes[1];
1938 IdxRange[1][0] = nummodes[1] - 2;
1945 IdxRange[1][1] = nummodes[1] - 1;
1952 IdxRange[1][1] = nummodes[1];
1957 for (
int i = 3; i < nummodes[1]; i += 2)
1971 IdxRange[1][0] = nummodes[1] - 2;
1978 IdxRange[1][1] = nummodes[1] - 1;
1985 IdxRange[1][1] = nummodes[1];
1990 for (
int i = 3; i < nummodes[1]; i += 2)
2012 IdxRange[0][0] = nummodes[0] - 1;
2013 IdxRange[0][1] = nummodes[0];
2030 IdxRange[0][0] = nummodes[0] - 2;
2037 IdxRange[0][1] = nummodes[0] - 1;
2044 IdxRange[0][1] = nummodes[0];
2049 for (
int i = 3; i < nummodes[0]; i += 2)
2060 for (
int r = IdxRange[2][0]; r != IdxRange[2][1]; r += Incr[2])
2062 for (
int q = IdxRange[1][0]; q != IdxRange[1][1]; q += Incr[1])
2064 for (
int p = IdxRange[0][0]; p != IdxRange[0][1]; p += Incr[0])
2066 maparray[arrayindx[cnt]] =
2067 r * nummodes[0] * nummodes[1] + q * nummodes[0] + p;
2068 signarray[arrayindx[cnt++]] = sign0[p] * sign1[q] * sign2[r];
2076 ASSERTL2((i >= 0) && (i <= 11),
"edge id is out of range");
2078 if ((i == 0) || (i == 2) || (i == 8) || (i == 10))
2082 else if ((i == 1) || (i == 3) || (i == 9) || (i == 11))
2103 int nq0 =
m_base[0]->GetNumPoints();
2104 int nq1 =
m_base[1]->GetNumPoints();
2105 int nq2 =
m_base[2]->GetNumPoints();
2115 nq =
max(nq0,
max(nq1, nq2));
2129 for (
int i = 0; i < nq; ++i)
2131 for (
int j = 0; j < nq; ++j)
2133 for (
int k = 0; k < nq; ++k, ++cnt)
2136 coords[cnt][0] = -1.0 + 2 * k / (
NekDouble)(nq - 1);
2137 coords[cnt][1] = -1.0 + 2 * j / (
NekDouble)(nq - 1);
2138 coords[cnt][2] = -1.0 + 2 * i / (
NekDouble)(nq - 1);
2143 for (
int i = 0; i < neq; ++i)
2147 I[0] =
m_base[0]->GetI(coll);
2148 I[1] =
m_base[1]->GetI(coll + 1);
2149 I[2] =
m_base[2]->GetI(coll + 2);
2153 for (
int k = 0; k < nq2; ++k)
2155 for (
int j = 0; j < nq1; ++j)
2158 fac = (I[1]->GetPtr())[j] * (I[2]->GetPtr())[k];
2162 Mat->GetRawPtr() + k * nq0 * nq1 * neq +
2226 int qa =
m_base[0]->GetNumPoints();
2227 int qb =
m_base[1]->GetNumPoints();
2228 int qc =
m_base[2]->GetNumPoints();
2229 int nmodes_a =
m_base[0]->GetNumModes();
2230 int nmodes_b =
m_base[1]->GetNumModes();
2231 int nmodes_c =
m_base[2]->GetNumModes();
2246 OrthoExp.
FwdTrans(array, orthocoeffs);
2256 for (
int i = 0; i < nmodes_a; ++i)
2258 for (
int j = 0; j < nmodes_b; ++j)
2261 pow((1.0 * i) / (nmodes_a - 1), cutoff * nmodes_a),
2262 pow((1.0 * j) / (nmodes_b - 1), cutoff * nmodes_b));
2264 for (
int k = 0; k < nmodes_c; ++k)
2267 std::max(fac1, pow((1.0 * k) / (nmodes_c - 1),
2268 cutoff * nmodes_c));
2270 orthocoeffs[cnt] *= SvvDiffCoeff * fac;
2286 max_abc =
max(max_abc, 0);
2289 for (
int i = 0; i < nmodes_a; ++i)
2291 for (
int j = 0; j < nmodes_b; ++j)
2293 int maxij =
max(i, j);
2295 for (
int k = 0; k < nmodes_c; ++k)
2297 int maxijk =
max(maxij, k);
2311 min(nmodes_a, nmodes_b));
2314 int nmodes =
max(nmodes_a, nmodes_b);
2315 nmodes =
max(nmodes, nmodes_c);
2318 for (
int j = cutoff; j < nmodes; ++j)
2320 fac[j] = fabs((j - nmodes) / ((
NekDouble)(j - cutoff + 1.0)));
2324 for (
int i = 0; i < nmodes_a; ++i)
2326 for (
int j = 0; j < nmodes_b; ++j)
2328 for (
int k = 0; k < nmodes_c; ++k)
2330 if ((i >= cutoff) || (j >= cutoff) || (k >= cutoff))
2332 orthocoeffs[i * nmodes_a * nmodes_b + j * nmodes_c +
2334 (SvvDiffCoeff * exp(-(fac[i] + fac[j] + fac[k])));
2338 orthocoeffs[i * nmodes_a * nmodes_b + j * nmodes_c +
2347 OrthoExp.
BwdTrans(orthocoeffs, array);
2356 int qa =
m_base[0]->GetNumPoints();
2357 int qb =
m_base[1]->GetNumPoints();
2358 int qc =
m_base[2]->GetNumPoints();
2359 int nmodesA =
m_base[0]->GetNumModes();
2360 int nmodesB =
m_base[1]->GetNumModes();
2361 int nmodesC =
m_base[2]->GetNumModes();
2362 int P = nmodesA - 1;
2363 int Q = nmodesB - 1;
2364 int R = nmodesC - 1;
2377 int Pcut = cutoff *
P;
2378 int Qcut = cutoff * Q;
2379 int Rcut = cutoff * R;
2383 OrthoExp.
FwdTrans(array, orthocoeffs);
2388 for (
int i = 0; i < nmodesA; ++i)
2390 for (
int j = 0; j < nmodesB; ++j)
2392 for (
int k = 0; k < nmodesC; ++k, ++index)
2395 if (i > Pcut || j > Qcut || k > Rcut)
2400 fac =
max(
max(fac1, fac2), fac3);
2401 fac = pow(fac, exponent);
2402 orthocoeffs[index] *= exp(-alpha * fac);
2409 OrthoExp.
BwdTrans(orthocoeffs, array);
2415 int np0 =
m_base[0]->GetNumPoints();
2416 int np1 =
m_base[1]->GetNumPoints();
2417 int np2 =
m_base[2]->GetNumPoints();
2418 int np =
max(np0,
max(np1, np2));
2426 for (
int i = 0; i < np - 1; ++i)
2428 for (
int j = 0; j < np - 1; ++j)
2431 for (
int k = 0; k < np - 1; ++k)
2433 conn[cnt++] = plane + row + k;
2434 conn[cnt++] = plane + row + k + 1;
2435 conn[cnt++] = plane + rowp1 + k;
2437 conn[cnt++] = plane + rowp1 + k + 1;
2438 conn[cnt++] = plane + rowp1 + k;
2439 conn[cnt++] = plane + row + k + 1;
#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.
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.
int GetEdgeNcoeffs(const int i) const
This function returns the number of expansion coefficients belonging to the i-th edge.
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.
The base class for all shapes.
virtual void v_LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
int GetNcoeffs(void) const
This function returns the total number of coefficients used in the expansion.
void WeakDerivMatrixOp_MatFree(const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
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.
virtual void v_HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
DNekMatSharedPtr CreateGeneralMatrix(const StdMatrixKey &mkey)
this function generates the mass matrix
void LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space.
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.
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
void MassMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
Class representing a hexehedral element in reference space.
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_MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
void v_ExponentialFilter(Array< OneD, NekDouble > &array, const NekDouble alpha, const NekDouble exponent, const NekDouble cutoff) override
int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false) override
void v_LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta) override
int v_CalcNumberOfCoefficients(const std::vector< unsigned int > &nummodes, int &modes_offset) override
LibUtilities::PointsKey v_GetTracePointsKey(const int i, const int j) const override
NekDouble v_PhysEvaluateBasis(const Array< OneD, const NekDouble > &coords, int mode) final
void v_GetTraceInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2) override
DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey) override
int v_GetEdgeNcoeffs(const int i) const override
StdHexExp(const LibUtilities::BasisKey &Ba, const LibUtilities::BasisKey &Bb, const LibUtilities::BasisKey &Bc)
int v_GetTraceNumPoints(const int i) const override
NekDouble v_PhysEvalFirstDeriv(const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs) override
void v_GetTraceCoeffMap(const unsigned int fid, Array< OneD, unsigned int > &maparray) override
LibUtilities::ShapeType v_DetShapeType() const override
void v_GetTraceNumModes(const int fid, int &numModes0, int &numModes1, Orientation faceOrient=eDir1FwdDir1_Dir2FwdDir2) override
void v_LocCollapsedToLocCoord(const Array< OneD, const NekDouble > &eta, Array< OneD, NekDouble > &xi) override
void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
int v_NumBndryCoeffs() const override
int v_GetNedges() const override
int v_GetNtraces() const override
void v_HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
int v_GetNverts() const override
bool v_IsBoundaryInteriorExpansion() const override
void v_GetInteriorMap(Array< OneD, unsigned int > &outarray) override
void v_GetBoundaryMap(Array< OneD, unsigned int > &outarray) override
void v_FillMode(const int mode, Array< OneD, NekDouble > &outarray) override
void v_GetSimplexEquiSpacedConnectivity(Array< OneD, int > &conn, bool standard=true) override
void v_WeakDerivMatrixOp(const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
int v_GetTraceIntNcoeffs(const int i) const 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
Differentiation Methods.
void v_GetElmtTraceToTraceMap(const unsigned int fid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation faceOrient, int P, int Q) override
void v_GetEdgeInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2) override
void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey) override
const LibUtilities::BasisKey v_GetTraceBasisKey(const int i, const int k, bool useGLL=false) const override
void v_GetCoords(Array< OneD, NekDouble > &coords_x, Array< OneD, NekDouble > &coords_y, Array< OneD, NekDouble > &coords_z) override
DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey) override
void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
int v_GetTraceNcoeffs(const int i) const override
MatrixType GetMatrixType() const
NekDouble GetConstFactor(const ConstFactorType &factor) const
bool ConstFactorExists(const ConstFactorType &factor) const
static void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
constexpr int getNumberOfCoefficients(int Na, int Nb, int Nc)
@ eOrtho_A
Principle Orthogonal Functions .
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eModified_A
Principle Modified Functions .
static const NekDouble kNekZeroTol
LibUtilities::BasisKey EvaluateQuadFaceBasisKey(const int facedir, const LibUtilities::BasisSharedPtr &faceDirBasis)
@ eFactorSVVDGKerDiffCoeff
@ eFactorSVVPowerKerDiffCoeff
const int kSVVDGFiltermodesmin
tinysimd::scalarT< double > vec_t
const int kSVVDGFiltermodesmax
const NekDouble kSVVDGFilter[9][11]
@ ePhysInterpToEquiSpaced
@ eDir1BwdDir2_Dir2BwdDir1
@ eDir1FwdDir1_Dir2FwdDir2
@ 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 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)