46 :
StdExpansion(LibUtilities::StdPyrData::getNumberOfCoefficients(
47 Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
50 Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
55 "order in 'a' direction is higher "
56 "than order in 'c' direction");
58 "order in 'b' direction is higher "
59 "than order in 'c' direction");
62 "Expected basis type in 'c' direction to be ModifiedPyr_C or "
89 int Qx =
m_base[0]->GetNumPoints();
90 int Qy =
m_base[1]->GetNumPoints();
91 int Qz =
m_base[2]->GetNumPoints();
100 eta_y =
m_base[1]->GetZ();
101 eta_z =
m_base[2]->GetZ();
105 if (out_dxi1.size() > 0)
107 for (k = 0, n = 0; k < Qz; ++k)
110 for (j = 0; j < Qy; ++j)
112 for (i = 0; i < Qx; ++i, ++n)
114 out_dxi1[n] = fac * dEta_bar1[n];
120 if (out_dxi2.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_dxi2[n] = fac * dXi2[n];
135 if (out_dxi3.size() > 0)
137 for (k = 0, n = 0; k < Qz; ++k)
140 for (j = 0; j < Qy; ++j)
143 for (i = 0; i < Qx; ++i, ++n)
145 out_dxi3[n] = (1.0 + eta_x[i]) * fac * dEta_bar1[n] +
146 fac1 * fac * dXi2[n] + dEta3[n];
182 ASSERTL1(
false,
"input dir is out of range");
224 if (
m_base[0]->Collocation() &&
m_base[1]->Collocation() &&
229 inarray, 1, outarray, 1);
243 int nquad0 =
m_base[0]->GetNumPoints();
244 int nquad1 =
m_base[1]->GetNumPoints();
245 int nquad2 =
m_base[2]->GetNumPoints();
246 int order0 =
m_base[0]->GetNumModes();
247 int order1 =
m_base[1]->GetNumModes();
250 nquad2 * nquad1 * nquad0);
253 m_base[2]->GetBdata(), inarray, outarray, wsp,
true,
263 [[maybe_unused]]
bool doCheckCollDir0,
264 [[maybe_unused]]
bool doCheckCollDir1,
265 [[maybe_unused]]
bool doCheckCollDir2)
267 int nquad0 =
m_base[0]->GetNumPoints();
268 int nquad1 =
m_base[1]->GetNumPoints();
269 int nquad2 =
m_base[2]->GetNumPoints();
271 int order0 =
m_base[0]->GetNumModes();
272 int order1 =
m_base[1]->GetNumModes();
273 int order2 =
m_base[2]->GetNumModes();
278 int i, j, mode, mode1, cnt;
281 mode = mode1 = cnt = 0;
282 for (i = 0; i < order0; ++i)
284 for (j = 0; j < order1; ++j, ++cnt)
286 int ijmax =
max(i, j);
288 base2.data() + mode * nquad2, nquad2,
289 inarray.data() + mode1, 1, 0.0,
290 tmp.data() + cnt * nquad2, 1);
291 mode += order2 - ijmax;
292 mode1 += order2 - ijmax;
295 for (j = order1; j < order2; ++j)
309 Blas::Daxpy(nquad2, inarray[1], base2.data() + nquad2, 1,
310 &tmp[0] + nquad2, 1);
313 Blas::Daxpy(nquad2, inarray[1], base2.data() + nquad2, 1,
314 &tmp[0] + order1 * nquad2, 1);
317 Blas::Daxpy(nquad2, inarray[1], base2.data() + nquad2, 1,
318 &tmp[0] + order1 * nquad2 + nquad2, 1);
323 for (i = 0; i < order0; ++i)
325 Blas::Dgemm(
'N',
'T', nquad1, nquad2, order1, 1.0, base1.data(), nquad1,
326 tmp.data() + mode * nquad2, nquad2, 0.0,
327 tmp1.data() + i * nquad1 * nquad2, nquad1);
332 Blas::Dgemm(
'N',
'T', nquad0, nquad1 * nquad2, order0, 1.0, base0.data(),
333 nquad0, tmp1.data(), nquad1 * nquad2, 0.0, outarray.data(),
363 out = (*imatsys) * in;
388 if (
m_base[0]->Collocation() &&
m_base[1]->Collocation() &&
404 int nquad1 =
m_base[1]->GetNumPoints();
405 int nquad2 =
m_base[2]->GetNumPoints();
406 int order0 =
m_base[0]->GetNumModes();
407 int order1 =
m_base[1]->GetNumModes();
411 if (multiplybyweights)
419 tmp, outarray, wsp,
true,
true,
true);
425 inarray, outarray, wsp,
true,
true,
true);
435 [[maybe_unused]]
bool doCheckCollDir0,
436 [[maybe_unused]]
bool doCheckCollDir1,
437 [[maybe_unused]]
bool doCheckCollDir2)
439 int nquad0 =
m_base[0]->GetNumPoints();
440 int nquad1 =
m_base[1]->GetNumPoints();
441 int nquad2 =
m_base[2]->GetNumPoints();
443 int order0 =
m_base[0]->GetNumModes();
444 int order1 =
m_base[1]->GetNumModes();
445 int order2 =
m_base[2]->GetNumModes();
447 ASSERTL1(wsp.size() >= nquad1 * nquad2 * order0 + nquad2 * order0 * order1,
448 "Insufficient workspace size");
453 int i, j, mode, mode1, cnt;
456 Blas::Dgemm(
'T',
'N', nquad1 * nquad2, order0, nquad0, 1.0, inarray.data(),
457 nquad0, base0.data(), nquad0, 0.0, tmp1.data(),
461 for (mode = i = 0; i < order0; ++i)
464 tmp1.data() + i * nquad1 * nquad2, nquad1, base1.data(),
465 nquad1, 0.0, tmp2.data() + mode * nquad2, nquad2);
470 mode = mode1 = cnt = 0;
471 for (i = 0; i < order0; ++i)
473 for (j = 0; j < order1; ++j, ++cnt)
475 int ijmax =
max(i, j);
478 base2.data() + mode * nquad2, nquad2,
479 tmp2.data() + cnt * nquad2, 1, 0.0,
480 outarray.data() + mode1, 1);
481 mode += order2 - ijmax;
482 mode1 += order2 - ijmax;
486 for (j = order1; j < order2; ++j)
498 Blas::Ddot(nquad2, base2.data() + nquad2, 1, &tmp2[nquad2], 1);
501 outarray[1] +=
Blas::Ddot(nquad2, base2.data() + nquad2, 1,
502 &tmp2[nquad2 * order1], 1);
505 outarray[1] +=
Blas::Ddot(nquad2, base2.data() + nquad2, 1,
506 &tmp2[nquad2 * order1 + nquad2], 1);
528 int nquad0 =
m_base[0]->GetNumPoints();
529 int nquad1 =
m_base[1]->GetNumPoints();
530 int nquad2 =
m_base[2]->GetNumPoints();
531 int nqtot = nquad0 * nquad1 * nquad2;
538 int order0 =
m_base[0]->GetNumModes();
539 int order1 =
m_base[1]->GetNumModes();
542 nquad2 * order0 * order1);
549 for (i = 0; i < nquad0; ++i)
551 gfac0[i] = 0.5 * (1 + z0[i]);
555 for (i = 0; i < nquad1; ++i)
557 gfac1[i] = 0.5 * (1 + z1[i]);
561 for (i = 0; i < nquad2; ++i)
563 gfac2[i] = 2.0 / (1 - z2[i]);
567 const int nq01 = nquad0 * nquad1;
568 for (i = 0; i < nquad2; ++i)
570 Vmath::Smul(nq01, gfac2[i], &inarray[0] + i * nq01, 1,
571 &tmp0[0] + i * nq01, 1);
582 m_base[2]->GetBdata(), tmp0, outarray, wsp,
false,
true,
true);
589 m_base[2]->GetBdata(), tmp0, outarray, wsp,
true,
false,
true);
598 for (i = 0; i < nquad1 * nquad2; ++i)
600 Vmath::Vmul(nquad0, tmp0.data() + i * nquad0, 1, gfac0.data(),
601 1, tmp0.data() + i * nquad0, 1);
605 m_base[2]->GetBdata(), tmp0, tmp3, wsp,
false,
true,
true);
608 for (i = 0; i < nquad2; ++i)
610 Vmath::Smul(nq01, gfac2[i], &inarray[0] + i * nq01, 1,
611 &tmp0[0] + i * nq01, 1);
613 for (i = 0; i < nquad1 * nquad2; ++i)
615 Vmath::Smul(nquad0, gfac1[i % nquad1], &tmp0[0] + i * nquad0, 1,
616 &tmp0[0] + i * nquad0, 1);
622 m_base[2]->GetBdata(), tmp0, tmp4, wsp,
true,
false,
true);
627 m_base[2]->GetDbdata(), tmp0, outarray, wsp,
true,
true,
false);
637 ASSERTL1(
false,
"input dir is out of range");
663 eta[1] = 2.0 * (1.0 + xi[1]) / d2 - 1.0;
664 eta[0] = 2.0 * (1.0 + xi[0]) / d2 - 1.0;
670 xi[0] = (1.0 + eta[0]) * (1.0 - eta[2]) * 0.5 - 1.0;
671 xi[1] = (1.0 + eta[1]) * (1.0 - eta[2]) * 0.5 - 1.0;
687 for (
int k = 0; k < Qz; ++k)
689 for (
int j = 0; j < Qy; ++j)
691 for (
int i = 0; i < Qx; ++i)
693 int s = i + Qx * (j + Qy * k);
696 xi_y[s] = (1.0 + eta_y[j]) * (1.0 - eta_z[k]) / 2.0 - 1.0;
697 xi_x[s] = (1.0 + etaBar_x[i]) * (1.0 - eta_z[k]) / 2.0 - 1.0;
709 const int nm0 =
m_base[0]->GetNumModes();
710 const int nm1 =
m_base[1]->GetNumModes();
711 const int nm2 =
m_base[2]->GetNumModes();
713 int mode0 = 0, mode1 = 0, mode2 = 0, cnt = 0;
716 for (mode0 = 0; mode0 < nm0; ++mode0)
718 for (mode1 = 0; mode1 < nm1; ++mode1)
720 int maxpq =
max(mode0, mode1);
721 for (mode2 = 0; mode2 < nm2 - maxpq; ++mode2, ++cnt)
741 for (
int j = nm1; j < nm2; ++j)
743 int ijmax =
max(mode0, j);
744 mode2 += nm2 - ijmax;
750 return StdExpansion::BaryEvaluateBasis<2>(coll[2], 1);
754 return StdExpansion::BaryEvaluateBasis<0>(coll[0], mode0) *
755 StdExpansion::BaryEvaluateBasis<1>(coll[1], mode1) *
756 StdExpansion::BaryEvaluateBasis<2>(coll[2], mode2);
763 std::array<NekDouble, 3> &firstOrderDerivs)
770 if ((1 - coll[2]) < 1e-5)
774 EphysDeriv2(totPoints);
775 PhysDeriv(inarray, EphysDeriv0, EphysDeriv1, EphysDeriv2);
778 I[0] =
GetBase()[0]->GetI(coll);
779 I[1] =
GetBase()[1]->GetI(coll + 1);
780 I[2] =
GetBase()[2]->GetI(coll + 2);
788 std::array<NekDouble, 3> interDeriv;
793 firstOrderDerivs[0] = fac * interDeriv[0];
794 firstOrderDerivs[1] = fac * interDeriv[1];
795 firstOrderDerivs[2] = ((1.0 + coll[0]) / (1.0 - coll[2])) * interDeriv[0] +
796 ((1.0 + coll[1]) / (1.0 - coll[2])) * interDeriv[1] +
812 int nummodes[3] = {
m_base[0]->GetNumModes(),
m_base[1]->GetNumModes(),
813 m_base[2]->GetNumModes()};
819 numModes0 = nummodes[0];
820 numModes1 = nummodes[1];
826 numModes0 = nummodes[0];
827 numModes1 = nummodes[2];
833 numModes0 = nummodes[1];
834 numModes1 = nummodes[2];
841 std::swap(numModes0, numModes1);
873 "BasisType is not a boundary interior form");
876 "BasisType is not a boundary interior form");
879 "BasisType is not a boundary interior form");
881 int P =
m_base[0]->GetNumModes();
882 int Q =
m_base[1]->GetNumModes();
883 int R =
m_base[2]->GetNumModes();
892 "BasisType is not a boundary interior form");
895 "BasisType is not a boundary interior form");
898 "BasisType is not a boundary interior form");
900 int P =
m_base[0]->GetNumModes() - 1;
901 int Q =
m_base[1]->GetNumModes() - 1;
902 int R =
m_base[2]->GetNumModes() - 1;
904 return (
P + 1) * (Q + 1)
905 + 2 * (R + 1) +
P * (1 + 2 * R -
P)
906 + 2 * (R + 1) + Q * (1 + 2 * R - Q);
911 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
917 else if (i == 1 || i == 3)
920 return Q + 1 + (
P * (1 + 2 * Q -
P)) / 2;
925 return Q + 1 + (
P * (1 + 2 * Q -
P)) / 2;
931 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
933 int P =
m_base[0]->GetNumModes() - 1;
934 int Q =
m_base[1]->GetNumModes() - 1;
935 int R =
m_base[2]->GetNumModes() - 1;
939 return (
P - 1) * (Q - 1);
941 else if (i == 1 || i == 3)
943 return (
P - 1) * (2 * (R - 1) - (
P - 1) - 1) / 2;
947 return (Q - 1) * (2 * (R - 1) - (Q - 1) - 1) / 2;
953 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
957 return m_base[0]->GetNumPoints() *
m_base[1]->GetNumPoints();
959 else if (i == 1 || i == 3)
961 return m_base[0]->GetNumPoints() *
m_base[2]->GetNumPoints();
965 return m_base[1]->GetNumPoints() *
m_base[2]->GetNumPoints();
971 ASSERTL2(i >= 0 && i <= 7,
"edge id is out of range");
973 if (i == 0 || i == 2)
977 else if (i == 1 || i == 3)
991 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
992 ASSERTL2(k >= 0 && k <= 1,
"basis key id is out of range");
1017 const std::vector<unsigned int> &nummodes,
int &modes_offset)
1020 nummodes[modes_offset], nummodes[modes_offset + 1],
1021 nummodes[modes_offset + 2]);
1032 "Mapping not defined for this type of basis");
1036 if (useCoeffPacking ==
true)
1056 ASSERTL0(
false,
"local vertex id must be between 0 and 4");
1079 ASSERTL0(
false,
"local vertex id must be between 0 and 4");
1090 "BasisType is not a boundary interior form");
1093 "BasisType is not a boundary interior form");
1096 "BasisType is not a boundary interior form");
1098 int P =
m_base[0]->GetNumModes() - 1, p;
1099 int Q =
m_base[1]->GetNumModes() - 1, q;
1100 int R =
m_base[2]->GetNumModes() - 1, r;
1104 if (outarray.size() != nIntCoeffs)
1112 for (p = 2; p <=
P; ++p)
1114 for (q = 2; q <= Q; ++q)
1116 int maxpq =
max(p, q);
1117 for (r = 1; r <= R - maxpq; ++r)
1119 outarray[idx++] =
GetMode(p, q, r);
1129 "BasisType is not a boundary interior form");
1132 "BasisType is not a boundary interior form");
1135 "BasisType is not a boundary interior form");
1137 int P =
m_base[0]->GetNumModes() - 1, p;
1138 int Q =
m_base[1]->GetNumModes() - 1, q;
1139 int R =
m_base[2]->GetNumModes() - 1, r;
1144 if (maparray.size() != nBnd)
1150 for (p = 0; p <=
P; ++p)
1155 for (q = 0; q <= Q; ++q)
1157 int maxpq =
max(p, q);
1158 for (r = 0; r <= R - maxpq; ++r)
1160 maparray[idx++] =
GetMode(p, q, r);
1168 for (q = 0; q <= Q; ++q)
1172 for (r = 0; r <= R - p; ++r)
1174 maparray[idx++] =
GetMode(p, q, r);
1179 maparray[idx++] =
GetMode(p, q, 0);
1190 "Method only implemented if BasisType is identical"
1191 "in x and y directions");
1194 "Method only implemented for Modified_A BasisType"
1195 "(x and y direction) and ModifiedPyr_C BasisType (z "
1198 int p, q, r,
P = 0, Q = 0, idx = 0;
1200 int order0 =
m_base[0]->GetNumModes();
1201 int order1 =
m_base[1]->GetNumModes();
1202 int order2 =
m_base[2]->GetNumModes();
1221 ASSERTL0(
false,
"fid must be between 0 and 4");
1224 if (maparray.size() !=
P * Q)
1235 for (q = 0; q < Q; ++q)
1237 for (p = 0; p <
P; ++p)
1239 maparray[q *
P + p] =
GetMode(p, q, 0);
1245 for (p = 0; p <
P; ++p)
1247 for (r = 0; r < Q - p; ++r)
1249 maparray[idx++] =
GetMode(p, 0, r);
1255 maparray[idx++] =
GetMode(1, 0, 0);
1256 maparray[idx++] =
GetMode(0, 0, 1);
1257 for (r = 1; r < Q - 1; ++r)
1259 maparray[idx++] =
GetMode(1, 0, r);
1262 for (q = 1; q <
P; ++q)
1264 for (r = 0; r < Q - q; ++r)
1266 maparray[idx++] =
GetMode(1, q, r);
1272 maparray[idx++] =
GetMode(0, 1, 0);
1273 maparray[idx++] =
GetMode(0, 0, 1);
1274 for (r = 1; r < Q - 1; ++r)
1276 maparray[idx++] =
GetMode(0, 1, r);
1279 for (p = 1; p <
P; ++p)
1281 for (r = 0; r < Q - p; ++r)
1283 maparray[idx++] =
GetMode(p, 1, r);
1289 for (q = 0; q <
P; ++q)
1291 for (r = 0; r < Q - q; ++r)
1293 maparray[idx++] =
GetMode(0, q, r);
1299 ASSERTL0(
false,
"Face to element map unavailable.");
1309 "Method only implemented if BasisType is identical"
1310 "in x and y directions");
1313 "Method only implemented for Modified_A BasisType"
1314 "(x and y direction) and ModifiedPyr_C BasisType (z "
1317 int i, j, k, p, r, nFaceCoeffs;
1318 int nummodesA = 0, nummodesB = 0;
1320 int order0 =
m_base[0]->GetNumModes();
1321 int order1 =
m_base[1]->GetNumModes();
1322 int order2 =
m_base[2]->GetNumModes();
1341 ASSERTL0(
false,
"fid must be between 0 and 4");
1352 nFaceCoeffs =
P * (2 * Q -
P + 1) / 2;
1356 nFaceCoeffs =
P * Q;
1360 if (maparray.size() != nFaceCoeffs)
1365 if (signarray.size() != nFaceCoeffs)
1371 fill(signarray.data(), signarray.data() + nFaceCoeffs, 1);
1381 int minPA =
min(nummodesA,
P);
1382 int minQB =
min(nummodesB, Q);
1384 for (j = 0; j < minPA; ++j)
1387 for (k = 0; k < minQB - j; ++k, ++cnt)
1389 maparray[idx++] = cnt;
1392 cnt += nummodesB - minQB;
1394 for (k = nummodesB - j; k < Q - j; ++k)
1396 signarray[idx] = 0.0;
1397 maparray[idx++] = maparray[0];
1402 for (j = minPA; j < nummodesA; ++j)
1405 for (k = 0; k < minQB-j; ++k, ++cnt)
1407 maparray[idx++] = cnt;
1410 cnt += nummodesB-minQB;
1412 for (k = nummodesB-j; k < Q-j; ++k)
1414 signarray[idx] = 0.0;
1415 maparray[idx++] = maparray[0];
1419 for (j = nummodesA; j <
P; ++j)
1421 for (k = 0; k < Q - j; ++k)
1423 signarray[idx] = 0.0;
1424 maparray[idx++] = maparray[0];
1432 swap(maparray[0], maparray[Q]);
1433 for (i = 1; i < Q - 1; ++i)
1435 swap(maparray[i + 1], maparray[Q + i]);
1439 for (p = 0; p <
P; ++p)
1441 for (r = 0; r < Q - p; ++r, idx++)
1445 signarray[idx] = p % 2 ? -1 : 1;
1458 for (i = 0; i < Q; i++)
1460 for (j = 0; j <
P; j++)
1464 arrayindx[i *
P + j] = i *
P + j;
1468 arrayindx[i *
P + j] = j * Q + i;
1475 for (j = 0; j <
P; ++j)
1478 for (k = 0; k < Q; k++)
1480 maparray[arrayindx[j + k *
P]] = j + k * nummodesA;
1483 for (k = nummodesB; k < Q; ++k)
1485 signarray[arrayindx[j + k *
P]] = 0.0;
1486 maparray[arrayindx[j + k *
P]] = maparray[0];
1490 for (j = nummodesA; j <
P; ++j)
1492 for (k = 0; k < Q; ++k)
1494 signarray[arrayindx[j + k *
P]] = 0.0;
1495 maparray[arrayindx[j + k *
P]] = maparray[0];
1510 for (i = 3; i < Q; i += 2)
1512 for (j = 0; j <
P; j++)
1514 signarray[arrayindx[i *
P + j]] *= -1;
1518 for (i = 0; i <
P; i++)
1520 swap(maparray[i], maparray[i +
P]);
1521 swap(signarray[i], signarray[i +
P]);
1526 for (i = 0; i < Q; i++)
1528 for (j = 3; j <
P; j += 2)
1530 signarray[arrayindx[i *
P + j]] *= -1;
1534 for (i = 0; i < Q; i++)
1536 swap(maparray[i], maparray[i + Q]);
1537 swap(signarray[i], signarray[i + Q]);
1549 for (i = 0; i < Q; i++)
1551 for (j = 3; j <
P; j += 2)
1553 signarray[arrayindx[i *
P + j]] *= -1;
1557 for (i = 0; i < Q; i++)
1559 swap(maparray[i *
P], maparray[i *
P + 1]);
1560 swap(signarray[i *
P], signarray[i *
P + 1]);
1565 for (i = 3; i < Q; i += 2)
1567 for (j = 0; j <
P; j++)
1569 signarray[arrayindx[i *
P + j]] *= -1;
1573 for (i = 0; i <
P; i++)
1575 swap(maparray[i * Q], maparray[i * Q + 1]);
1576 swap(signarray[i * Q], signarray[i * Q + 1]);
1589 const int P =
m_base[0]->GetNumModes() - 1;
1590 const int Q =
m_base[1]->GetNumModes() - 1;
1591 const int R =
m_base[2]->GetNumModes() - 1;
1594 if (maparray.size() != nEdgeIntCoeffs)
1599 if (signarray.size() != nEdgeIntCoeffs)
1605 fill(signarray.data(), signarray.data() + nEdgeIntCoeffs, 1);
1615 for (i = 2; i <=
P; ++i)
1617 maparray[i - 2] =
GetMode(i, 0, 0);
1622 for (i = 2; i <= Q; ++i)
1624 maparray[i - 2] =
GetMode(1, i, 0);
1628 for (i = 2; i <=
P; ++i)
1630 maparray[i - 2] =
GetMode(i, 1, 0);
1635 for (i = 2; i <= Q; ++i)
1637 maparray[i - 2] =
GetMode(0, i, 0);
1641 for (i = 2; i <= R; ++i)
1643 maparray[i - 2] =
GetMode(0, 0, i);
1648 for (i = 1; i <= R - 1; ++i)
1650 maparray[i - 1] =
GetMode(1, 0, i);
1654 for (i = 1; i <= R - 1; ++i)
1656 maparray[i - 1] =
GetMode(1, 1, i);
1661 for (i = 1; i <= R - 1; ++i)
1663 maparray[i - 1] =
GetMode(0, 1, i);
1667 ASSERTL0(
false,
"Edge not defined.");
1673 for (i = 1; i < nEdgeIntCoeffs; i += 2)
1684 const int P =
m_base[0]->GetNumModes() - 1;
1685 const int Q =
m_base[1]->GetNumModes() - 1;
1686 const int R =
m_base[2]->GetNumModes() - 1;
1688 int p, q, r, idx = 0;
1693 if (maparray.size() != nFaceIntCoeffs)
1698 if (signarray.size() != nFaceIntCoeffs)
1704 fill(signarray.data(), signarray.data() + nFaceIntCoeffs, 1);
1715 for (i = 0; i < nummodesB; i++)
1717 for (j = 0; j < nummodesA; j++)
1721 arrayindx[i * nummodesA + j] = i * nummodesA + j;
1725 arrayindx[i * nummodesA + j] = j * nummodesB + i;
1734 for (q = 2; q <= Q; ++q)
1736 for (p = 2; p <=
P; ++p)
1738 maparray[arrayindx[(q - 2) * nummodesA + (p - 2)]] =
1744 for (p = 2; p <=
P; ++p)
1746 for (r = 1; r <= R - p; ++r)
1748 if ((
int)faceOrient == 7)
1750 signarray[idx] = p % 2 ? -1 : 1;
1752 maparray[idx++] =
GetMode(p, 0, r);
1757 for (q = 2; q <= Q; ++q)
1759 for (r = 1; r <= R - q; ++r)
1761 if ((
int)faceOrient == 7)
1763 signarray[idx] = q % 2 ? -1 : 1;
1765 maparray[idx++] =
GetMode(1, q, r);
1771 for (p = 2; p <=
P; ++p)
1773 for (r = 1; r <= R - p; ++r)
1775 if ((
int)faceOrient == 7)
1777 signarray[idx] = p % 2 ? -1 : 1;
1779 maparray[idx++] =
GetMode(p, 1, r);
1785 for (q = 2; q <= Q; ++q)
1787 for (r = 1; r <= R - q; ++r)
1789 if ((
int)faceOrient == 7)
1791 signarray[idx] = q % 2 ? -1 : 1;
1793 maparray[idx++] =
GetMode(0, q, r);
1798 ASSERTL0(
false,
"Face interior map not available.");
1808 if (faceOrient == 6 || faceOrient == 8 || faceOrient == 11 ||
1813 for (i = 1; i < nummodesB; i += 2)
1815 for (j = 0; j < nummodesA; j++)
1817 signarray[arrayindx[i * nummodesA + j]] *= -1;
1823 for (i = 0; i < nummodesB; i++)
1825 for (j = 1; j < nummodesA; j += 2)
1827 signarray[arrayindx[i * nummodesA + j]] *= -1;
1833 if (faceOrient == 7 || faceOrient == 8 || faceOrient == 10 ||
1838 for (i = 0; i < nummodesB; i++)
1840 for (j = 1; j < nummodesA; j += 2)
1842 signarray[arrayindx[i * nummodesA + j]] *= -1;
1848 for (i = 1; i < nummodesB; i += 2)
1850 for (j = 0; j < nummodesA; j++)
1852 signarray[arrayindx[i * nummodesA + j]] *= -1;
1899 const int Q =
m_base[1]->GetNumModes() - 1;
1900 const int R =
m_base[2]->GetNumModes() - 1;
1906 for (i = 0; i < I; ++i)
1912 cnt += (R + 1 - i) * (Q + 1) - l * (l + 1) / 2;
1916 l =
max(0, J - 1 - I);
1917 cnt += (R + 1 - I) * J - l * (l + 1) / 2;
1931 int nquad0 =
m_base[0]->GetNumPoints();
1932 int nquad1 =
m_base[1]->GetNumPoints();
1933 int nquad2 =
m_base[2]->GetNumPoints();
1942 for (i = 0; i < nquad1 * nquad2; ++i)
1944 Vmath::Vmul(nquad0, inarray.data() + i * nquad0, 1, w0.data(), 1,
1945 outarray.data() + i * nquad0, 1);
1949 for (j = 0; j < nquad2; ++j)
1951 for (i = 0; i < nquad1; ++i)
1954 &outarray[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1964 case LibUtilities::eGaussRadauMAlpha2Beta0:
1965 for (i = 0; i < nquad2; ++i)
1968 &outarray[0] + i * nquad0 * nquad1, 1);
1973 for (i = 0; i < nquad2; ++i)
1976 0.25 * (1 - z2[i]) * (1 - z2[i]) * w2[i],
1977 &outarray[0] + i * nquad0 * nquad1, 1);
1987 int qa =
m_base[0]->GetNumPoints();
1988 int qb =
m_base[1]->GetNumPoints();
1989 int qc =
m_base[2]->GetNumPoints();
1990 int nmodes_a =
m_base[0]->GetNumModes();
1991 int nmodes_b =
m_base[1]->GetNumModes();
1992 int nmodes_c =
m_base[2]->GetNumModes();
2004 int i, j, k, cnt = 0;
2007 OrthoExp.
FwdTrans(array, orthocoeffs);
2017 for (i = 0; i < nmodes_a; ++i)
2019 for (j = 0; j < nmodes_b; ++j)
2021 int maxij =
max(i, j);
2023 pow((1.0 * i) / (nmodes_a - 1), cutoff * nmodes_a),
2024 pow((1.0 * j) / (nmodes_b - 1), cutoff * nmodes_b));
2026 for (k = 0; k < nmodes_c - maxij; ++k)
2029 std::max(fac1, pow((1.0 * k) / (nmodes_c - 1),
2030 cutoff * nmodes_c));
2032 orthocoeffs[cnt] *= SvvDiffCoeff * fac;
2048 max_abc =
max(max_abc, 0);
2051 for (i = 0; i < nmodes_a; ++i)
2053 for (j = 0; j < nmodes_b; ++j)
2055 int maxij =
max(i, j);
2057 for (k = 0; k < nmodes_c - maxij; ++k)
2059 int maxijk =
max(maxij, k);
2081 int cutoff_a = (int)(SVVCutOff * nmodes_a);
2082 int cutoff_b = (int)(SVVCutOff * nmodes_b);
2083 int cutoff_c = (int)(SVVCutOff * nmodes_c);
2087 int nmodes =
min(
min(nmodes_a, nmodes_b), nmodes_c);
2090 for (i = 0; i < nmodes_a; ++i)
2092 for (j = 0; j < nmodes_b; ++j)
2094 int maxij =
max(i, j);
2095 for (k = 0; k < nmodes_c - maxij; ++k)
2097 if (j + k >= cutoff || i + k >= cutoff)
2101 exp(-(i + k - nmodes) * (i + k - nmodes) /
2102 ((
NekDouble)((i + k - cutoff + epsilon) *
2103 (i + k - cutoff + epsilon)))) *
2104 exp(-(j - nmodes) * (j - nmodes) /
2106 (j - cutoff + epsilon)))));
2110 orthocoeffs[cnt] *= 0.0;
2119 OrthoExp.
BwdTrans(orthocoeffs, array);
2126 int nquad0 =
m_base[0]->GetNumPoints();
2127 int nquad1 =
m_base[1]->GetNumPoints();
2128 int nquad2 =
m_base[2]->GetNumPoints();
2129 int nqtot = nquad0 * nquad1 * nquad2;
2130 int nmodes0 =
m_base[0]->GetNumModes();
2131 int nmodes1 =
m_base[1]->GetNumModes();
2132 int nmodes2 =
m_base[2]->GetNumModes();
2133 int numMax = nmodes0;
2154 bortho0, bortho1, bortho2);
2157 OrthoPyrExp->FwdTrans(phys_tmp, coeff);
2160 for (u = 0; u < numMin; ++u)
2162 for (i = 0; i < numMin; ++i)
2165 int maxui =
max(u, i);
2167 tmp2 = coeff_tmp1 + cnt, 1);
2168 cnt += nmodes2 - maxui;
2171 for (i = numMin; i < nmodes1; ++i)
2173 int maxui =
max(u, i);
2174 cnt += numMax - maxui;
2178 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...
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.
void IProductWRTBase_SumFacKernel(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, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
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 > &outarray_d1, Array< OneD, NekDouble > &outarray_d2, Array< OneD, NekDouble > &outarray_d3)
Calculate the 3D derivative in the local tensor/collapsed coordinate at the physical points.
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
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
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.
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion 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)
This function performs the Forward transformation from physical space to coefficient space.
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.
void PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1=NullNekDouble1DArray, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray)
Array< OneD, LibUtilities::BasisSharedPtr > m_base
NekDouble GetConstFactor(const ConstFactorType &factor) const
bool ConstFactorExists(const ConstFactorType &factor) const
void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
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_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Forward transform from physical quadrature space stored in inarray and evaluate the expansion coeffic...
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
void v_BwdTrans_SumFacKernel(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, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2) 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
void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true) 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_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Inner product of inarray over region with respect to the expansion basis m_base[0]->GetBdata(),...
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_MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_GetTraceInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2) override
void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_IProductWRTBase_SumFacKernel(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, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2) 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
LibUtilities::ShapeType v_DetShapeType() const override
void v_PhysDeriv(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.
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
static void Dgemv(const char &trans, const int &m, const int &n, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = alpha A x plus beta y where A[m x n].
static void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
static double Ddot(const int &n, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: output = .
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where op(A)[m x k], op(B)[k x n], C[m x n] DGEMM perfo...
static void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
int getNumberOfCoefficients(int Na, int Nb, int Nc)
int getNumberOfBndCoefficients(int Na, int Nb, int Nc)
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
@ P
Monomial polynomials .
@ 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
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
static Array< OneD, NekDouble > NullNekDouble1DArray
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)