35 #include <boost/core/ignore_unused.hpp>
47 StdPyrExp::StdPyrExp()
56 Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
59 Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
64 "order in 'a' direction is higher "
65 "than order in 'c' direction");
67 "order in 'b' direction is higher "
68 "than order in 'c' direction");
71 "Expected basis type in 'c' direction to be ModifiedPyr_C or "
107 int Qx =
m_base[0]->GetNumPoints();
108 int Qy =
m_base[1]->GetNumPoints();
109 int Qz =
m_base[2]->GetNumPoints();
117 eta_x =
m_base[0]->GetZ();
118 eta_y =
m_base[1]->GetZ();
119 eta_z =
m_base[2]->GetZ();
123 if (out_dxi1.size() > 0)
125 for (k = 0, n = 0; k < Qz; ++k)
128 for (j = 0; j < Qy; ++j)
130 for (i = 0; i < Qx; ++i, ++n)
132 out_dxi1[n] = fac * dEta_bar1[n];
138 if (out_dxi2.size() > 0)
140 for (k = 0, n = 0; k < Qz; ++k)
143 for (j = 0; j < Qy; ++j)
145 for (i = 0; i < Qx; ++i, ++n)
147 out_dxi2[n] = fac * dXi2[n];
153 if (out_dxi3.size() > 0)
155 for (k = 0, n = 0; k < Qz; ++k)
158 for (j = 0; j < Qy; ++j)
161 for (i = 0; i < Qx; ++i, ++n)
163 out_dxi3[n] = (1.0 + eta_x[i]) * fac * dEta_bar1[n] +
164 fac1 * fac * dXi2[n] + dEta3[n];
200 ASSERTL1(
false,
"input dir is out of range");
249 if (
m_base[0]->Collocation() &&
m_base[1]->Collocation() &&
254 inarray, 1, outarray, 1);
268 int nquad0 =
m_base[0]->GetNumPoints();
269 int nquad1 =
m_base[1]->GetNumPoints();
270 int nquad2 =
m_base[2]->GetNumPoints();
271 int order0 =
m_base[0]->GetNumModes();
272 int order1 =
m_base[1]->GetNumModes();
275 nquad2 * nquad1 * nquad0);
278 m_base[2]->GetBdata(), inarray, outarray, wsp,
true,
288 bool doCheckCollDir0,
bool doCheckCollDir1,
bool doCheckCollDir2)
290 boost::ignore_unused(doCheckCollDir0, doCheckCollDir1, doCheckCollDir2);
292 int nquad0 =
m_base[0]->GetNumPoints();
293 int nquad1 =
m_base[1]->GetNumPoints();
294 int nquad2 =
m_base[2]->GetNumPoints();
296 int order0 =
m_base[0]->GetNumModes();
297 int order1 =
m_base[1]->GetNumModes();
298 int order2 =
m_base[2]->GetNumModes();
303 int i, j, mode, mode1, cnt;
306 mode = mode1 = cnt = 0;
307 for (i = 0; i < order0; ++i)
309 for (j = 0; j < order1; ++j, ++cnt)
311 int ijmax = max(i, j);
313 base2.get() + mode * nquad2, nquad2,
314 inarray.get() + mode1, 1, 0.0, tmp.get() + cnt * nquad2,
316 mode += order2 - ijmax;
317 mode1 += order2 - ijmax;
320 for (j = order1; j < order2 - i; ++j)
322 int ijmax = max(i, j);
323 mode += order2 - ijmax;
335 Blas::Daxpy(nquad2, inarray[1], base2.get() + nquad2, 1,
336 &tmp[0] + nquad2, 1);
339 Blas::Daxpy(nquad2, inarray[1], base2.get() + nquad2, 1,
340 &tmp[0] + order1 * nquad2, 1);
343 Blas::Daxpy(nquad2, inarray[1], base2.get() + nquad2, 1,
344 &tmp[0] + order1 * nquad2 + nquad2, 1);
349 for (i = 0; i < order0; ++i)
351 Blas::Dgemm(
'N',
'T', nquad1, nquad2, order1, 1.0, base1.get(), nquad1,
352 tmp.get() + mode * nquad2, nquad2, 0.0,
353 tmp1.get() + i * nquad1 * nquad2, nquad1);
358 Blas::Dgemm(
'N',
'T', nquad0, nquad1 * nquad2, order0, 1.0, base0.get(),
359 nquad0, tmp1.get(), nquad1 * nquad2, 0.0, outarray.get(),
389 out = (*imatsys) * in;
414 if (
m_base[0]->Collocation() &&
m_base[1]->Collocation() &&
430 int nquad1 =
m_base[1]->GetNumPoints();
431 int nquad2 =
m_base[2]->GetNumPoints();
432 int order0 =
m_base[0]->GetNumModes();
433 int order1 =
m_base[1]->GetNumModes();
437 if (multiplybyweights)
445 tmp, outarray, wsp,
true,
true,
true);
451 inarray, outarray, wsp,
true,
true,
true);
461 bool doCheckCollDir0,
bool doCheckCollDir1,
bool doCheckCollDir2)
463 boost::ignore_unused(doCheckCollDir0, doCheckCollDir1, doCheckCollDir2);
465 int nquad0 =
m_base[0]->GetNumPoints();
466 int nquad1 =
m_base[1]->GetNumPoints();
467 int nquad2 =
m_base[2]->GetNumPoints();
469 int order0 =
m_base[0]->GetNumModes();
470 int order1 =
m_base[1]->GetNumModes();
471 int order2 =
m_base[2]->GetNumModes();
473 ASSERTL1(wsp.size() >= nquad1 * nquad2 * order0 + nquad2 * order0 * order1,
474 "Insufficient workspace size");
479 int i, j, mode, mode1, cnt;
482 Blas::Dgemm(
'T',
'N', nquad1 * nquad2, order0, nquad0, 1.0, inarray.get(),
483 nquad0, base0.get(), nquad0, 0.0, tmp1.get(), nquad1 * nquad2);
486 for (mode = i = 0; i < order0; ++i)
489 tmp1.get() + i * nquad1 * nquad2, nquad1, base1.get(),
490 nquad1, 0.0, tmp2.get() + mode * nquad2, nquad2);
495 mode = mode1 = cnt = 0;
496 for (i = 0; i < order0; ++i)
498 for (j = 0; j < order1; ++j, ++cnt)
500 int ijmax = max(i, j);
503 base2.get() + mode * nquad2, nquad2,
504 tmp2.get() + cnt * nquad2, 1, 0.0,
505 outarray.get() + mode1, 1);
506 mode += order2 - ijmax;
507 mode1 += order2 - ijmax;
511 for (j = order1; j < order2; ++j)
513 int ijmax = max(i, j);
514 mode += order2 - ijmax;
524 Blas::Ddot(nquad2, base2.get() + nquad2, 1, &tmp2[nquad2], 1);
527 outarray[1] +=
Blas::Ddot(nquad2, base2.get() + nquad2, 1,
528 &tmp2[nquad2 * order1], 1);
531 outarray[1] +=
Blas::Ddot(nquad2, base2.get() + nquad2, 1,
532 &tmp2[nquad2 * order1 + nquad2], 1);
554 int nquad0 =
m_base[0]->GetNumPoints();
555 int nquad1 =
m_base[1]->GetNumPoints();
556 int nquad2 =
m_base[2]->GetNumPoints();
557 int nqtot = nquad0 * nquad1 * nquad2;
564 int order0 =
m_base[0]->GetNumModes();
565 int order1 =
m_base[1]->GetNumModes();
568 nquad2 * order0 * order1);
575 for (i = 0; i < nquad0; ++i)
577 gfac0[i] = 0.5 * (1 + z0[i]);
581 for (i = 0; i < nquad1; ++i)
583 gfac1[i] = 0.5 * (1 + z1[i]);
587 for (i = 0; i < nquad2; ++i)
589 gfac2[i] = 2.0 / (1 - z2[i]);
593 const int nq01 = nquad0 * nquad1;
594 for (i = 0; i < nquad2; ++i)
596 Vmath::Smul(nq01, gfac2[i], &inarray[0] + i * nq01, 1,
597 &tmp0[0] + i * nq01, 1);
608 m_base[2]->GetBdata(), tmp0, outarray, wsp,
false,
true,
true);
615 m_base[2]->GetBdata(), tmp0, outarray, wsp,
true,
false,
true);
624 for (i = 0; i < nquad1 * nquad2; ++i)
626 Vmath::Vmul(nquad0, tmp0.get() + i * nquad0, 1, gfac0.get(), 1,
627 tmp0.get() + i * nquad0, 1);
631 m_base[2]->GetBdata(), tmp0, tmp3, wsp,
false,
true,
true);
634 for (i = 0; i < nquad2; ++i)
636 Vmath::Smul(nq01, gfac2[i], &inarray[0] + i * nq01, 1,
637 &tmp0[0] + i * nq01, 1);
639 for (i = 0; i < nquad1 * nquad2; ++i)
641 Vmath::Smul(nquad0, gfac1[i % nquad1], &tmp0[0] + i * nquad0, 1,
642 &tmp0[0] + i * nquad0, 1);
648 m_base[2]->GetBdata(), tmp0, tmp4, wsp,
true,
false,
true);
653 m_base[2]->GetDbdata(), tmp0, outarray, wsp,
true,
true,
false);
663 ASSERTL1(
false,
"input dir is out of range");
689 eta[1] = 2.0 * (1.0 + xi[1]) / d2 - 1.0;
690 eta[0] = 2.0 * (1.0 + xi[0]) / d2 - 1.0;
696 xi[0] = (1.0 + eta[0]) * (1.0 - eta[2]) * 0.5 - 1.0;
697 xi[1] = (1.0 + eta[1]) * (1.0 - eta[2]) * 0.5 - 1.0;
713 for (
int k = 0; k < Qz; ++k)
715 for (
int j = 0; j < Qy; ++j)
717 for (
int i = 0; i < Qx; ++i)
719 int s = i + Qx * (j + Qy * k);
722 xi_y[s] = (1.0 + eta_y[j]) * (1.0 - eta_z[k]) / 2.0 - 1.0;
723 xi_x[s] = (1.0 + etaBar_x[i]) * (1.0 - eta_z[k]) / 2.0 - 1.0;
739 int nummodes[3] = {
m_base[0]->GetNumModes(),
m_base[1]->GetNumModes(),
740 m_base[2]->GetNumModes()};
746 numModes0 = nummodes[0];
747 numModes1 = nummodes[1];
753 numModes0 = nummodes[0];
754 numModes1 = nummodes[2];
760 numModes0 = nummodes[1];
761 numModes1 = nummodes[2];
768 std::swap(numModes0, numModes1);
778 const int nm0 =
m_base[0]->GetNumModes();
779 const int nm1 =
m_base[1]->GetNumModes();
780 const int nm2 =
m_base[2]->GetNumModes();
782 int mode0 = 0, mode1 = 0, mode2 = 0, cnt = 0;
785 for (mode0 = 0; mode0 < nm0; ++mode0)
787 for (mode1 = 0; mode1 < nm1; ++mode1)
789 int maxpq = max(mode0, mode1);
790 for (mode2 = 0; mode2 < nm2 - maxpq; ++mode2, ++cnt)
810 for (
int j = nm1; j < nm2; ++j)
812 int ijmax = max(mode0, j);
813 mode2 += nm2 - ijmax;
819 return StdExpansion::BaryEvaluateBasis<2>(coll[2], 1);
823 return StdExpansion::BaryEvaluateBasis<0>(coll[0], mode0) *
824 StdExpansion::BaryEvaluateBasis<1>(coll[1], mode1) *
825 StdExpansion::BaryEvaluateBasis<2>(coll[2], mode2);
857 "BasisType is not a boundary interior form");
860 "BasisType is not a boundary interior form");
863 "BasisType is not a boundary interior form");
865 int P =
m_base[0]->GetNumModes();
866 int Q =
m_base[1]->GetNumModes();
867 int R =
m_base[2]->GetNumModes();
876 "BasisType is not a boundary interior form");
879 "BasisType is not a boundary interior form");
882 "BasisType is not a boundary interior form");
884 int P =
m_base[0]->GetNumModes() - 1;
885 int Q =
m_base[1]->GetNumModes() - 1;
886 int R =
m_base[2]->GetNumModes() - 1;
888 return (
P + 1) * (Q + 1)
889 + 2 * (R + 1) +
P * (1 + 2 * R -
P)
890 + 2 * (R + 1) + Q * (1 + 2 * R - Q);
895 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
901 else if (i == 1 || i == 3)
904 return Q + 1 + (
P * (1 + 2 * Q -
P)) / 2;
909 return Q + 1 + (
P * (1 + 2 * Q -
P)) / 2;
915 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
917 int P =
m_base[0]->GetNumModes() - 1;
918 int Q =
m_base[1]->GetNumModes() - 1;
919 int R =
m_base[2]->GetNumModes() - 1;
923 return (
P - 1) * (Q - 1);
925 else if (i == 1 || i == 3)
927 return (
P - 1) * (2 * (R - 1) - (
P - 1) - 1) / 2;
931 return (Q - 1) * (2 * (R - 1) - (Q - 1) - 1) / 2;
937 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
941 return m_base[0]->GetNumPoints() *
m_base[1]->GetNumPoints();
943 else if (i == 1 || i == 3)
945 return m_base[0]->GetNumPoints() *
m_base[2]->GetNumPoints();
949 return m_base[1]->GetNumPoints() *
m_base[2]->GetNumPoints();
955 ASSERTL2(i >= 0 && i <= 7,
"edge id is out of range");
957 if (i == 0 || i == 2)
961 else if (i == 1 || i == 3)
974 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
975 ASSERTL2(k >= 0 && k <= 1,
"basis key id is out of range");
983 m_base[k]->GetNumModes());
990 m_base[2 * k]->GetNumModes());
997 m_base[k + 1]->GetNumModes());
1006 const std::vector<unsigned int> &nummodes,
int &modes_offset)
1009 nummodes[modes_offset], nummodes[modes_offset + 1],
1010 nummodes[modes_offset + 2]);
1021 "Mapping not defined for this type of basis");
1025 if (useCoeffPacking ==
true)
1045 ASSERTL0(
false,
"local vertex id must be between 0 and 4");
1068 ASSERTL0(
false,
"local vertex id must be between 0 and 4");
1079 "BasisType is not a boundary interior form");
1082 "BasisType is not a boundary interior form");
1085 "BasisType is not a boundary interior form");
1087 int P =
m_base[0]->GetNumModes() - 1,
p;
1088 int Q =
m_base[1]->GetNumModes() - 1, q;
1089 int R =
m_base[2]->GetNumModes() - 1, r;
1093 if (outarray.size() != nIntCoeffs)
1101 for (
p = 2;
p <=
P; ++
p)
1103 for (q = 2; q <= Q; ++q)
1105 int maxpq = max(
p, q);
1106 for (r = 1; r <= R - maxpq; ++r)
1108 outarray[idx++] =
GetMode(
p, q, r);
1118 "BasisType is not a boundary interior form");
1121 "BasisType is not a boundary interior form");
1124 "BasisType is not a boundary interior form");
1126 int P =
m_base[0]->GetNumModes() - 1,
p;
1127 int Q =
m_base[1]->GetNumModes() - 1, q;
1128 int R =
m_base[2]->GetNumModes() - 1, r;
1133 if (maparray.size() != nBnd)
1139 for (
p = 0;
p <=
P; ++
p)
1144 for (q = 0; q <= Q; ++q)
1146 int maxpq = max(
p, q);
1147 for (r = 0; r <= R - maxpq; ++r)
1149 maparray[idx++] =
GetMode(
p, q, r);
1157 for (q = 0; q <= Q; ++q)
1161 for (r = 0; r <= R -
p; ++r)
1163 maparray[idx++] =
GetMode(
p, q, r);
1168 maparray[idx++] =
GetMode(
p, q, 0);
1179 "Method only implemented if BasisType is identical"
1180 "in x and y directions");
1183 "Method only implemented for Modified_A BasisType"
1184 "(x and y direction) and ModifiedPyr_C BasisType (z "
1187 int p, q, r,
P = 0, Q = 0, idx = 0;
1189 int order0 =
m_base[0]->GetNumModes();
1190 int order1 =
m_base[1]->GetNumModes();
1191 int order2 =
m_base[2]->GetNumModes();
1210 ASSERTL0(
false,
"fid must be between 0 and 4");
1213 if (maparray.size() !=
P * Q)
1224 for (q = 0; q < Q; ++q)
1226 for (
p = 0;
p <
P; ++
p)
1234 for (
p = 0;
p <
P; ++
p)
1236 for (r = 0; r < Q -
p; ++r)
1238 maparray[idx++] =
GetMode(
p, 0, r);
1244 maparray[idx++] =
GetMode(1, 0, 0);
1245 maparray[idx++] =
GetMode(0, 0, 1);
1246 for (r = 1; r < Q - 1; ++r)
1248 maparray[idx++] =
GetMode(1, 0, r);
1251 for (q = 1; q <
P; ++q)
1253 for (r = 0; r < Q - q; ++r)
1255 maparray[idx++] =
GetMode(1, q, r);
1261 maparray[idx++] =
GetMode(0, 1, 0);
1262 maparray[idx++] =
GetMode(0, 0, 1);
1263 for (r = 1; r < Q - 1; ++r)
1265 maparray[idx++] =
GetMode(0, 1, r);
1268 for (
p = 1;
p <
P; ++
p)
1270 for (r = 0; r < Q -
p; ++r)
1272 maparray[idx++] =
GetMode(
p, 1, r);
1278 for (q = 0; q <
P; ++q)
1280 for (r = 0; r < Q - q; ++r)
1282 maparray[idx++] =
GetMode(0, q, r);
1288 ASSERTL0(
false,
"Face to element map unavailable.");
1298 "Method only implemented if BasisType is identical"
1299 "in x and y directions");
1302 "Method only implemented for Modified_A BasisType"
1303 "(x and y direction) and ModifiedPyr_C BasisType (z "
1306 int i, j, k,
p, r, nFaceCoeffs;
1307 int nummodesA = 0, nummodesB = 0;
1309 int order0 =
m_base[0]->GetNumModes();
1310 int order1 =
m_base[1]->GetNumModes();
1311 int order2 =
m_base[2]->GetNumModes();
1330 ASSERTL0(
false,
"fid must be between 0 and 4");
1341 nFaceCoeffs =
P * (2 * Q -
P + 1) / 2;
1345 nFaceCoeffs =
P * Q;
1349 if (maparray.size() != nFaceCoeffs)
1354 if (signarray.size() != nFaceCoeffs)
1360 fill(signarray.get(), signarray.get() + nFaceCoeffs, 1);
1370 int minPA = min(nummodesA,
P);
1371 int minQB = min(nummodesB, Q);
1373 for (j = 0; j < minPA; ++j)
1376 for (k = 0; k < minQB - j; ++k, ++cnt)
1378 maparray[idx++] = cnt;
1381 cnt += nummodesB - minQB;
1383 for (k = nummodesB - j; k < Q - j; ++k)
1385 signarray[idx] = 0.0;
1386 maparray[idx++] = maparray[0];
1391 for (j = minPA; j < nummodesA; ++j)
1394 for (k = 0; k < minQB-j; ++k, ++cnt)
1396 maparray[idx++] = cnt;
1399 cnt += nummodesB-minQB;
1401 for (k = nummodesB-j; k < Q-j; ++k)
1403 signarray[idx] = 0.0;
1404 maparray[idx++] = maparray[0];
1408 for (j = nummodesA; j <
P; ++j)
1410 for (k = 0; k < Q - j; ++k)
1412 signarray[idx] = 0.0;
1413 maparray[idx++] = maparray[0];
1421 swap(maparray[0], maparray[Q]);
1422 for (i = 1; i < Q - 1; ++i)
1424 swap(maparray[i + 1], maparray[Q + i]);
1428 for (
p = 0;
p <
P; ++
p)
1430 for (r = 0; r < Q -
p; ++r, idx++)
1434 signarray[idx] =
p % 2 ? -1 : 1;
1447 for (i = 0; i < Q; i++)
1449 for (j = 0; j <
P; j++)
1453 arrayindx[i *
P + j] = i *
P + j;
1457 arrayindx[i *
P + j] = j * Q + i;
1464 for (j = 0; j <
P; ++j)
1467 for (k = 0; k < Q; k++)
1469 maparray[arrayindx[j + k *
P]] = j + k * nummodesA;
1472 for (k = nummodesB; k < Q; ++k)
1474 signarray[arrayindx[j + k *
P]] = 0.0;
1475 maparray[arrayindx[j + k *
P]] = maparray[0];
1479 for (j = nummodesA; j <
P; ++j)
1481 for (k = 0; k < Q; ++k)
1483 signarray[arrayindx[j + k *
P]] = 0.0;
1484 maparray[arrayindx[j + k *
P]] = maparray[0];
1499 for (i = 3; i < Q; i += 2)
1501 for (j = 0; j <
P; j++)
1503 signarray[arrayindx[i *
P + j]] *= -1;
1507 for (i = 0; i <
P; i++)
1509 swap(maparray[i], maparray[i +
P]);
1510 swap(signarray[i], signarray[i +
P]);
1515 for (i = 0; i < Q; i++)
1517 for (j = 3; j <
P; j += 2)
1519 signarray[arrayindx[i *
P + j]] *= -1;
1523 for (i = 0; i < Q; i++)
1525 swap(maparray[i], maparray[i + Q]);
1526 swap(signarray[i], signarray[i + Q]);
1538 for (i = 0; i < Q; i++)
1540 for (j = 3; j <
P; j += 2)
1542 signarray[arrayindx[i *
P + j]] *= -1;
1546 for (i = 0; i < Q; i++)
1548 swap(maparray[i *
P], maparray[i *
P + 1]);
1549 swap(signarray[i *
P], signarray[i *
P + 1]);
1554 for (i = 3; i < Q; i += 2)
1556 for (j = 0; j <
P; j++)
1558 signarray[arrayindx[i *
P + j]] *= -1;
1562 for (i = 0; i <
P; i++)
1564 swap(maparray[i * Q], maparray[i * Q + 1]);
1565 swap(signarray[i * Q], signarray[i * Q + 1]);
1578 const int P =
m_base[0]->GetNumModes() - 1;
1579 const int Q =
m_base[1]->GetNumModes() - 1;
1580 const int R =
m_base[2]->GetNumModes() - 1;
1583 if (maparray.size() != nEdgeIntCoeffs)
1588 if (signarray.size() != nEdgeIntCoeffs)
1594 fill(signarray.get(), signarray.get() + nEdgeIntCoeffs, 1);
1604 for (i = 2; i <=
P; ++i)
1606 maparray[i - 2] =
GetMode(i, 0, 0);
1611 for (i = 2; i <= Q; ++i)
1613 maparray[i - 2] =
GetMode(1, i, 0);
1617 for (i = 2; i <=
P; ++i)
1619 maparray[i - 2] =
GetMode(i, 1, 0);
1624 for (i = 2; i <= Q; ++i)
1626 maparray[i - 2] =
GetMode(0, i, 0);
1630 for (i = 2; i <= R; ++i)
1632 maparray[i - 2] =
GetMode(0, 0, i);
1637 for (i = 1; i <= R - 1; ++i)
1639 maparray[i - 1] =
GetMode(1, 0, i);
1643 for (i = 1; i <= R - 1; ++i)
1645 maparray[i - 1] =
GetMode(1, 1, i);
1650 for (i = 1; i <= R - 1; ++i)
1652 maparray[i - 1] =
GetMode(0, 1, i);
1656 ASSERTL0(
false,
"Edge not defined.");
1662 for (i = 1; i < nEdgeIntCoeffs; i += 2)
1673 const int P =
m_base[0]->GetNumModes() - 1;
1674 const int Q =
m_base[1]->GetNumModes() - 1;
1675 const int R =
m_base[2]->GetNumModes() - 1;
1677 int p, q, r, idx = 0;
1682 if (maparray.size() != nFaceIntCoeffs)
1687 if (signarray.size() != nFaceIntCoeffs)
1693 fill(signarray.get(), signarray.get() + nFaceIntCoeffs, 1);
1704 for (i = 0; i < nummodesB; i++)
1706 for (j = 0; j < nummodesA; j++)
1710 arrayindx[i * nummodesA + j] = i * nummodesA + j;
1714 arrayindx[i * nummodesA + j] = j * nummodesB + i;
1723 for (q = 2; q <= Q; ++q)
1725 for (
p = 2;
p <=
P; ++
p)
1727 maparray[arrayindx[(q - 2) * nummodesA + (
p - 2)]] =
1733 for (
p = 2;
p <=
P; ++
p)
1735 for (r = 1; r <= R -
p; ++r)
1737 if ((
int)faceOrient == 7)
1739 signarray[idx] =
p % 2 ? -1 : 1;
1741 maparray[idx++] =
GetMode(
p, 0, r);
1746 for (q = 2; q <= Q; ++q)
1748 for (r = 1; r <= R - q; ++r)
1750 if ((
int)faceOrient == 7)
1752 signarray[idx] = q % 2 ? -1 : 1;
1754 maparray[idx++] =
GetMode(1, q, r);
1760 for (
p = 2;
p <=
P; ++
p)
1762 for (r = 1; r <= R -
p; ++r)
1764 if ((
int)faceOrient == 7)
1766 signarray[idx] =
p % 2 ? -1 : 1;
1768 maparray[idx++] =
GetMode(
p, 1, r);
1774 for (q = 2; q <= Q; ++q)
1776 for (r = 1; r <= R - q; ++r)
1778 if ((
int)faceOrient == 7)
1780 signarray[idx] = q % 2 ? -1 : 1;
1782 maparray[idx++] =
GetMode(0, q, r);
1787 ASSERTL0(
false,
"Face interior map not available.");
1797 if (faceOrient == 6 || faceOrient == 8 || faceOrient == 11 ||
1802 for (i = 1; i < nummodesB; i += 2)
1804 for (j = 0; j < nummodesA; j++)
1806 signarray[arrayindx[i * nummodesA + j]] *= -1;
1812 for (i = 0; i < nummodesB; i++)
1814 for (j = 1; j < nummodesA; j += 2)
1816 signarray[arrayindx[i * nummodesA + j]] *= -1;
1822 if (faceOrient == 7 || faceOrient == 8 || faceOrient == 10 ||
1827 for (i = 0; i < nummodesB; i++)
1829 for (j = 1; j < nummodesA; j += 2)
1831 signarray[arrayindx[i * nummodesA + j]] *= -1;
1837 for (i = 1; i < nummodesB; i += 2)
1839 for (j = 0; j < nummodesA; j++)
1841 signarray[arrayindx[i * nummodesA + j]] *= -1;
1888 const int Q =
m_base[1]->GetNumModes() - 1;
1889 const int R =
m_base[2]->GetNumModes() - 1;
1895 for (i = 0; i < I; ++i)
1901 cnt += (R + 1 - i) * (Q + 1) - l * (l + 1) / 2;
1905 l = max(0, J - 1 - I);
1906 cnt += (R + 1 - I) * J - l * (l + 1) / 2;
1920 int nquad0 =
m_base[0]->GetNumPoints();
1921 int nquad1 =
m_base[1]->GetNumPoints();
1922 int nquad2 =
m_base[2]->GetNumPoints();
1931 for (i = 0; i < nquad1 * nquad2; ++i)
1933 Vmath::Vmul(nquad0, inarray.get() + i * nquad0, 1, w0.get(), 1,
1934 outarray.get() + i * nquad0, 1);
1938 for (j = 0; j < nquad2; ++j)
1940 for (i = 0; i < nquad1; ++i)
1943 &outarray[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1953 case LibUtilities::eGaussRadauMAlpha2Beta0:
1954 for (i = 0; i < nquad2; ++i)
1957 &outarray[0] + i * nquad0 * nquad1, 1);
1962 for (i = 0; i < nquad2; ++i)
1965 0.25 * (1 - z2[i]) * (1 - z2[i]) * w2[i],
1966 &outarray[0] + i * nquad0 * nquad1, 1);
1976 int qa =
m_base[0]->GetNumPoints();
1977 int qb =
m_base[1]->GetNumPoints();
1978 int qc =
m_base[2]->GetNumPoints();
1979 int nmodes_a =
m_base[0]->GetNumModes();
1980 int nmodes_b =
m_base[1]->GetNumModes();
1981 int nmodes_c =
m_base[2]->GetNumModes();
1993 int i, j, k, cnt = 0;
1996 OrthoExp.
FwdTrans(array, orthocoeffs);
2006 for (
int i = 0; i < nmodes_a; ++i)
2008 for (
int j = 0; j < nmodes_b; ++j)
2010 int maxij = max(i, j);
2012 pow((1.0 * i) / (nmodes_a - 1), cutoff * nmodes_a),
2013 pow((1.0 * j) / (nmodes_b - 1), cutoff * nmodes_b));
2015 for (
int k = 0; k < nmodes_c - maxij; ++k)
2018 std::max(fac1, pow((1.0 * k) / (nmodes_c - 1),
2019 cutoff * nmodes_c));
2021 orthocoeffs[cnt] *= SvvDiffCoeff * fac;
2037 max_abc = max(max_abc, 0);
2040 for (
int i = 0; i < nmodes_a; ++i)
2042 for (
int j = 0; j < nmodes_b; ++j)
2044 int maxij = max(i, j);
2046 for (
int k = 0; k < nmodes_c - maxij; ++k)
2048 int maxijk = max(maxij, k);
2070 int cutoff_a = (int)(SVVCutOff * nmodes_a);
2071 int cutoff_b = (int)(SVVCutOff * nmodes_b);
2072 int cutoff_c = (int)(SVVCutOff * nmodes_c);
2076 int nmodes = min(min(nmodes_a, nmodes_b), nmodes_c);
2077 NekDouble cutoff = min(min(cutoff_a, cutoff_b), cutoff_c);
2079 for (i = 0; i < nmodes_a; ++i)
2081 for (j = 0; j < nmodes_b; ++j)
2083 int maxij = max(i, j);
2084 for (k = 0; k < nmodes_c - maxij; ++k)
2086 if (j + k >= cutoff || i + k >= cutoff)
2090 exp(-(i + k - nmodes) * (i + k - nmodes) /
2091 ((
NekDouble)((i + k - cutoff + epsilon) *
2092 (i + k - cutoff + epsilon)))) *
2093 exp(-(j - nmodes) * (j - nmodes) /
2095 (j - cutoff + epsilon)))));
2099 orthocoeffs[cnt] *= 0.0;
2108 OrthoExp.
BwdTrans(orthocoeffs, array);
2115 int nquad0 =
m_base[0]->GetNumPoints();
2116 int nquad1 =
m_base[1]->GetNumPoints();
2117 int nquad2 =
m_base[2]->GetNumPoints();
2118 int nqtot = nquad0 * nquad1 * nquad2;
2119 int nmodes0 =
m_base[0]->GetNumModes();
2120 int nmodes1 =
m_base[1]->GetNumModes();
2121 int nmodes2 =
m_base[2]->GetNumModes();
2122 int numMax = nmodes0;
2143 bortho0, bortho1, bortho2);
2146 OrthoPyrExp->FwdTrans(phys_tmp, coeff);
2149 for (u = 0; u < numMin; ++u)
2151 for (i = 0; i < numMin; ++i)
2154 int maxui = max(u, i);
2156 tmp2 = coeff_tmp1 + cnt, 1);
2157 cnt += nmodes2 - maxui;
2160 for (i = numMin; i < nmodes1; ++i)
2162 int maxui = max(u, i);
2163 cnt += numMax - maxui;
2167 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)
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.
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.
DNekMatSharedPtr CreateGeneralMatrix(const StdMatrixKey &mkey)
this function generates the mass matrix
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.
Array< OneD, LibUtilities::BasisSharedPtr > m_base
NekDouble GetConstFactor(const ConstFactorType &factor) const
bool ConstFactorExists(const ConstFactorType &factor) const
virtual void v_GetInteriorMap(Array< OneD, unsigned int > &outarray)
void v_MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_GetCoords(Array< OneD, NekDouble > &xi_x, Array< OneD, NekDouble > &xi_y, Array< OneD, NekDouble > &xi_z)
virtual void v_GetTraceNumModes(const int fid, int &numModes0, int &numModes1, Orientation faceOrient=eDir1FwdDir1_Dir2FwdDir2)
virtual 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)
virtual int v_GetTraceNumPoints(const int i) const
virtual void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
NekDouble v_PhysEvaluateBasis(const Array< OneD, const NekDouble > &coords, int mode) final
virtual const LibUtilities::BasisKey v_GetTraceBasisKey(const int i, const int k) const
virtual void v_LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
virtual DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey)
virtual void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual int v_GetEdgeNcoeffs(const int i) const
virtual void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Backward transformation is evaluated at the quadrature points.
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
virtual void v_StdPhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2)
virtual int v_CalcNumberOfCoefficients(const std::vector< unsigned int > &nummodes, int &modes_offset)
virtual int v_GetNverts() const
virtual void v_PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2)
Calculate the derivative of the physical points.
virtual int v_GetTraceNcoeffs(const int i) const
virtual void v_GetBoundaryMap(Array< OneD, unsigned int > &outarray)
virtual int v_NumDGBndryCoeffs() const
virtual LibUtilities::ShapeType v_DetShapeType() const
int GetMode(int I, int J, int K)
Compute the mode number in the expansion for a particular tensorial combination.
virtual 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)
virtual int v_NumBndryCoeffs() const
virtual void v_FillMode(const int mode, Array< OneD, NekDouble > &outarray)
virtual int v_GetTraceIntNcoeffs(const int i) const
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey)
virtual void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Inner product of inarray over region with respect to the expansion basis m_base[0]->GetBdata(),...
virtual void v_GetTraceCoeffMap(const unsigned int fid, Array< OneD, unsigned int > &maparray)
virtual void v_ReduceOrderCoeffs(int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Forward transform from physical quadrature space stored in inarray and evaluate the expansion coeffic...
virtual void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual int v_GetNedges() const
virtual void v_GetTraceInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2)
virtual int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false)
virtual void v_GetEdgeInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2)
virtual void v_GetElmtTraceToTraceMap(const unsigned int fid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation faceOrient, int P, int Q)
virtual void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey)
virtual int v_GetNtraces() const
virtual void v_LocCollapsedToLocCoord(const Array< OneD, const NekDouble > &eta, Array< OneD, NekDouble > &xi)
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 = A x 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)
int getNumberOfCoefficients(int Na)
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 EvaluateTriFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
@ eFactorSVVDGKerDiffCoeff
@ eFactorSVVPowerKerDiffCoeff
const int kSVVDGFiltermodesmin
std::shared_ptr< StdPyrExp > StdPyrExpSharedPtr
const int kSVVDGFiltermodesmax
LibUtilities::BasisKey EvaluateQuadFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
const NekDouble kSVVDGFilter[9][11]
@ eDir1BwdDir2_Dir2BwdDir1
@ eDir1BwdDir1_Dir2BwdDir2
@ eDir1BwdDir2_Dir2FwdDir1
@ eDir1FwdDir1_Dir2BwdDir2
@ eDir1BwdDir1_Dir2FwdDir2
@ eDir1FwdDir2_Dir2FwdDir1
@ eDir1FwdDir2_Dir2BwdDir1
The above copyright notice and this permission notice shall be included.
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)