55 :
StdExpansion(LibUtilities::StdTriData::getNumberOfCoefficients(
56 Ba.GetNumModes(), Bb.GetNumModes()),
59 Ba.GetNumModes(), Bb.GetNumModes()),
63 "order in 'a' direction is higher than order "
95 int nquad0 =
m_base[0]->GetNumPoints();
96 int nquad1 =
m_base[1]->GetNumPoints();
106 if (out_d0.size() > 0)
110 for (i = 0; i < nquad1; ++i)
112 Blas::Dscal(nquad0, wsp[i], &out_d0[0] + i * nquad0, 1);
116 if (out_d1.size() > 0)
122 for (i = 0; i < nquad1; ++i)
124 Vmath::Vvtvp(nquad0, &wsp[0], 1, &out_d0[0] + i * nquad0, 1,
125 &out_d1[0] + i * nquad0, 1,
126 &out_d1[0] + i * nquad0, 1);
130 else if (out_d1.size() > 0)
135 for (i = 0; i < nquad1; ++i)
137 Blas::Dscal(nquad0, wsp[i], &diff0[0] + i * nquad0, 1);
143 for (i = 0; i < nquad1; ++i)
145 Vmath::Vvtvp(nquad0, &wsp[0], 1, &diff0[0] + i * nquad0, 1,
146 &out_d1[0] + i * nquad0, 1, &out_d1[0] + i * nquad0,
166 "Basis[1] is not of general tensor type");
171 int nquad0 =
m_base[0]->GetNumPoints();
172 int nquad1 =
m_base[1]->GetNumPoints();
173 int nmodes0 =
m_base[0]->GetNumModes();
174 int nmodes1 =
m_base[1]->GetNumModes();
176 std::vector<vec_t, tinysimd::allocator<vec_t>> wsp0(nmodes0);
187#define BWDTRANS_DEF \
188 BwdTransTriKernel(nmodes0, nmodes1, nquad0, nquad1, isModified, \
189 (const vec_t *)base0.data(), \
190 (const vec_t *)base1.data(), wsp0.data(), \
191 (const vec_t *)inarray.data(), (vec_t *)outarray.data())
195#define BWDTRANS_Q(r, i) \
197 BwdTransTriKernel(NM(i), NM(i), NQ(i), NQ_M1(i), isModified, \
198 (const vec_t *)base0.data(), \
199 (const vec_t *)base1.data(), wsp0.data(), \
200 (const vec_t *)inarray.data(), \
201 (vec_t *)outarray.data()); \
206#define BWDTRANS_M(r, i) \
211 BOOST_PP_FOR_##r((NM(i), NM_P1(i), BOOST_PP_MUL(2, NM(i))), \
212 STDLEV2TEST1, STDLEV2UPDATE1, BWDTRANS_Q) default \
222 if ((nmodes0 == nmodes1) && (nquad0 == nquad1 + 1))
244 int npoints[2] = {
m_base[0]->GetNumPoints(),
m_base[1]->GetNumPoints()};
245 int nmodes[2] = {
m_base[0]->GetNumModes(),
m_base[1]->GetNumModes()};
247 fill(outarray.data(), outarray.data() +
m_ncoeffs, 0.0);
251 for (i = 0; i < 3; i++)
257 for (i = 0; i < npoints[0]; i++)
259 physEdge[0][i] = inarray[i];
262 for (i = 0; i < npoints[1]; i++)
264 physEdge[1][i] = inarray[npoints[0] - 1 + i * npoints[0]];
266 inarray[(npoints[1] - 1) * npoints[0] - i * npoints[0]];
271 m_base[0]->GetBasisKey()),
273 m_base[1]->GetBasisKey())};
279 for (i = 0; i < 3; i++)
281 segexp[i != 0]->FwdTransBndConstrained(physEdge[i], coeffEdge[i]);
284 for (j = 0; j < nmodes[i != 0]; j++)
287 outarray[mapArray[j]] =
sign * coeffEdge[i][j];
307 int nInteriorDofs =
m_ncoeffs - nBoundaryDofs;
314 for (i = 0; i < nInteriorDofs; i++)
316 rhs[i] = tmp1[mapArray[i]];
319 Blas::Dgemv(
'N', nInteriorDofs, nInteriorDofs, 1.0, &(matsys->GetPtr())[0],
320 nInteriorDofs, rhs.data(), 1, 0.0, result.data(), 1);
322 for (i = 0; i < nInteriorDofs; i++)
324 outarray[mapArray[i]] = result[i];
354 const bool Deformed, [[maybe_unused]]
const bool CollDir0,
355 [[maybe_unused]]
const bool CollDir1)
357 int nquad0 =
m_base[0]->GetNumPoints();
358 int nquad1 =
m_base[1]->GetNumPoints();
359 int order0 =
m_base[0]->GetNumModes();
360 int order1 =
m_base[1]->GetNumModes();
362 const bool isModified =
365 std::vector<vec_t, tinysimd::allocator<vec_t>> wsp0(nquad1);
376#undef IPRODUCTWRTBASE_DEF
377#define IPRODUCTWRTBASE_DEF \
378 IProductTriKernel<false, false, true>( \
379 order0, order1, nquad0, nquad1, isModified, \
380 (const vec_t *)inarray.data(), (const vec_t *)base0.data(), \
381 (const vec_t *)base1.data(), (const vec_t *)m_weights[0].data(), \
382 (const vec_t *)m_weights[1].data(), (const vec_t *)jac.data(), \
383 (vec_t *)wsp0.data(), (vec_t *)outarray.data())
386#undef IPRODUCTWRTBASE_Q
387#define IPRODUCTWRTBASE_Q(r, i) \
389 IProductTriKernel<false, false, true>( \
390 NM(i), NM(i), NQ(i), NQ_M1(i), isModified, \
391 (const vec_t *)inarray.data(), (const vec_t *)base0.data(), \
392 (const vec_t *)base1.data(), (const vec_t *)m_weights[0].data(), \
393 (const vec_t *)m_weights[1].data(), (const vec_t *)jac.data(), \
394 (vec_t *)wsp0.data(), (vec_t *)outarray.data()); \
398#undef IPRODUCTWRTBASE_M
399#define IPRODUCTWRTBASE_M(r, i) \
404 BOOST_PP_FOR_##r((NM(i), NM_P1(i), BOOST_PP_MUL(2, NM(i))), \
405 STDLEV2TEST1, STDLEV2UPDATE1, \
406 IPRODUCTWRTBASE_Q) default : IPRODUCTWRTBASE_DEF; \
414 if ((order0 == order1) && (nquad0 == nquad1 + 1))
433#undef IPRODUCTWRTBASE_DEF
434#define IPRODUCTWRTBASE_DEF \
435 IProductTriKernel<false, false, false>( \
436 order0, order1, nquad0, nquad1, isModified, \
437 (const vec_t *)inarray.data(), (const vec_t *)base0.data(), \
438 (const vec_t *)base1.data(), (const vec_t *)m_weights[0].data(), \
439 (const vec_t *)m_weights[1].data(), (const vec_t *)jac.data(), \
440 (vec_t *)wsp0.data(), (vec_t *)outarray.data())
443#undef IPRODUCTWRTBASE_Q
444#define IPRODUCTWRTBASE_Q(r, i) \
446 IProductTriKernel<false, false, false>( \
447 NM(i), NM(i), NQ(i), NQ_M1(i), isModified, \
448 (const vec_t *)inarray.data(), (const vec_t *)base0.data(), \
449 (const vec_t *)base1.data(), (const vec_t *)m_weights[0].data(), \
450 (const vec_t *)m_weights[1].data(), (const vec_t *)jac.data(), \
451 (vec_t *)wsp0.data(), (vec_t *)outarray.data()); \
455#undef IPRODUCTWRTBASE_M
456#define IPRODUCTWRTBASE_M(r, i) \
461 BOOST_PP_FOR_##r((NM(i), NM_P1(i), BOOST_PP_MUL(2, NM(i))), \
462 STDLEV2TEST1, STDLEV2UPDATE1, \
463 IPRODUCTWRTBASE_Q) default : IPRODUCTWRTBASE_DEF; \
471 if ((order0 == order1) && (nquad0 == nquad1 + 1))
493 int nquad0 =
m_base[0]->GetNumPoints();
494 int nquad1 =
m_base[1]->GetNumPoints();
495 int nqtot = nquad0 * nquad1;
501 for (
int i = 0; i < nquad1; ++i)
503 Vmath::Smul(nquad0, gfac[i], &inarray[0] + i * nquad0, 1,
504 &tmpQuad[0] + i * nquad0, 1);
512 m_base[1]->GetBdata(), tmpQuad, outarray,
522 for (
int i = 0; i < nquad1; ++i)
524 Vmath::Vmul(nquad0, &gfac[0], 1, &tmpQuad[0] + i * nquad0, 1,
525 &tmpQuad[0] + i * nquad0, 1);
529 m_base[1]->GetBdata(), tmpQuad, tmpCoeff,
533 m_base[1]->GetDbdata(), inarray, outarray,
542 ASSERTL1(
false,
"input dir is out of range");
567 eta[0] = 2. * (1. + xi[0]) / d1 - 1.0;
574 xi[0] = (1.0 + eta[0]) * (1.0 - eta[1]) * 0.5 - 1.0;
581 int nquad0 =
m_base[0]->GetNumPoints();
582 int nquad1 =
m_base[1]->GetNumPoints();
583 int order0 =
m_base[0]->GetNumModes();
584 int order1 =
m_base[1]->GetNumModes();
590 "total expansion order");
593 for (i = 0; i < order0; ++i, m += order1 - i)
609 for (i = 0; i < nquad1; ++i)
612 1, &outarray[0] + i * nquad0, 1);
616 for (i = 0; i < nquad0; ++i)
619 &outarray[0] + i, nquad0, &outarray[0] + i, nquad0);
631 const int nm1 =
m_base[1]->GetNumModes();
632 const double c = 1 + 2 * nm1;
633 const int mode0 = floor(0.5 * (c -
sqrt(c * c - 8 * mode)));
638 return StdExpansion::BaryEvaluateBasis<1>(coll[1], 1);
642 return StdExpansion::BaryEvaluateBasis<0>(coll[0], mode0) *
643 StdExpansion::BaryEvaluateBasis<1>(coll[1], mode);
650 std::array<NekDouble, 3> &firstOrderDerivs)
657 if ((1 - coll[1]) < 1e-5)
664 I[0] =
GetBase()[0]->GetI(coll);
665 I[1] =
GetBase()[1]->GetI(coll + 1);
679 temp = firstOrderDerivs[0];
682 firstOrderDerivs[0] = firstOrderDerivs[0] * fac0;
685 NekDouble fac1 = fac0 * (coll[0] + 1) / 2;
688 firstOrderDerivs[1] += fac1 * temp;
711 "BasisType is not a boundary interior form");
713 "BasisType is not a boundary interior form");
721 "BasisType is not a boundary interior form");
723 "BasisType is not a boundary interior form");
730 ASSERTL2(i >= 0 && i <= 2,
"edge id is out of range");
744 ASSERTL2(i >= 0 && i <= 2,
"edge id is out of range");
758 ASSERTL2((i >= 0) && (i <= 2),
"edge id is out of range");
771 const std::vector<unsigned int> &nummodes,
int &modes_offset)
774 nummodes[modes_offset], nummodes[modes_offset + 1]);
790 for (i = 0; i < nq1; ++i)
792 for (j = 0; j < nq0; ++j)
794 coords_0[i * nq0 + j] = (1 + z0[j]) * (1 - z1[i]) / 2.0 - 1.0;
796 Vmath::Fill(nq0, z1[i], &coords_1[0] + i * nq0, 1);
807 const int i, [[maybe_unused]]
const int j,
808 [[maybe_unused]]
bool UseGLL)
const
810 ASSERTL2(i >= 0 && i <= 2,
"edge id is out of range");
825 return m_base[dir]->GetBasisKey();
831 "Unexpected points distribution " +
834 " in StdTriExp::v_GetTraceBasisKey");
847 m_base[dir]->GetNumModes(),
848 m_base[dir]->GetPointsKey());
861 m_base[dir]->GetNumModes(),
865 case LibUtilities::eGaussRadauMAlpha1Beta0:
875 m_base[dir]->GetNumModes(),
898 m_base[dir]->GetNumModes(),
912 m_base[dir]->GetNumModes(),
919 "Unexpected points distribution " +
922 " in StdTriExp::v_GetTraceBasisKey");
935 m_base[dir]->GetNumModes(),
936 m_base[dir]->GetPointsKey());
942 "Unexpected points distribution " +
945 " in StdTriExp::v_GetTraceBasisKey");
958 m_base[dir]->GetNumModes(),
959 m_base[dir]->GetPointsKey());
972 m_base[dir]->GetNumModes(),
976 case LibUtilities::eGaussRadauMAlpha1Beta0:
986 m_base[dir]->GetNumModes(),
993 "Unexpected points distribution " +
996 " in StdTriExp::v_GetTraceBasisKey");
1004 "Information not available to set edge key");
1018 "Mapping not defined for this type of basis");
1021 if (useCoeffPacking ==
true)
1023 switch (localVertexId)
1037 localDOF =
m_base[1]->GetNumModes();
1042 ASSERTL0(
false,
"eid must be between 0 and 2");
1049 switch (localVertexId)
1058 localDOF =
m_base[1]->GetNumModes();
1068 ASSERTL0(
false,
"eid must be between 0 and 2");
1081 "Expansion not of a proper type");
1085 int nummodes0, nummodes1;
1092 nummodes0 =
m_base[0]->GetNumModes();
1093 nummodes1 =
m_base[1]->GetNumModes();
1095 startvalue = 2 * nummodes1;
1097 for (i = 0; i < nummodes0 - 2; i++)
1099 for (j = 0; j < nummodes1 - 3 - i; j++)
1101 outarray[cnt++] = startvalue + j;
1103 startvalue += nummodes1 - 2 - i;
1111 "Expansion not of expected type");
1114 int nummodes0, nummodes1;
1122 nummodes0 =
m_base[0]->GetNumModes();
1123 nummodes1 =
m_base[1]->GetNumModes();
1125 value = 2 * nummodes1 - 1;
1126 for (i = 0; i < value; i++)
1132 for (i = 0; i < nummodes0 - 2; i++)
1134 outarray[cnt++] = value;
1135 value += nummodes1 - 2 - i;
1145 "Mapping not defined for this type of basis");
1147 ASSERTL1(eid < 3,
"eid must be between 0 and 2");
1150 int order0 =
m_base[0]->GetNumModes();
1151 int order1 =
m_base[1]->GetNumModes();
1152 int numModes = (eid == 0) ? order0 : order1;
1154 if (maparray.size() != numModes)
1164 for (i = 0; i < numModes; cnt += order1 - i, ++i)
1172 maparray[0] = order1;
1174 for (i = 2; i < numModes; i++)
1176 maparray[i] = order1 - 1 + i;
1182 for (i = 0; i < numModes; i++)
1189 ASSERTL0(
false,
"eid must be between 0 and 2");
1200 "Mapping not defined for this type of basis");
1202 const int nummodes1 =
m_base[1]->GetNumModes();
1205 if (maparray.size() != nEdgeIntCoeffs)
1210 if (signarray.size() != nEdgeIntCoeffs)
1216 fill(signarray.data(), signarray.data() + nEdgeIntCoeffs, 1);
1223 int cnt = 2 * nummodes1 - 1;
1224 for (i = 0; i < nEdgeIntCoeffs; cnt += nummodes1 - 2 - i, ++i)
1232 for (i = 0; i < nEdgeIntCoeffs; i++)
1234 maparray[i] = nummodes1 + 1 + i;
1240 for (i = 0; i < nEdgeIntCoeffs; i++)
1242 maparray[i] = 2 + i;
1248 ASSERTL0(
false,
"eid must be between 0 and 2");
1255 for (i = 1; i < nEdgeIntCoeffs; i += 2)
1279 nq0 =
m_base[0]->GetNumPoints();
1280 nq1 =
m_base[1]->GetNumPoints();
1301 for (
int i = 0; i < nq; ++i)
1303 for (
int j = 0; j < nq - i; ++j, ++cnt)
1306 coords[cnt][0] = -1.0 + 2 * j / (
NekDouble)(nq - 1);
1307 coords[cnt][1] = -1.0 + 2 * i / (
NekDouble)(nq - 1);
1311 for (
int i = 0; i < neq - 1; ++i)
1315 I[0] =
m_base[0]->GetI(coll);
1316 I[1] =
m_base[1]->GetI(coll + 1);
1319 for (
int j = 0; j < nq1; ++j)
1325 Mat->GetRawPtr() + j * nq0 * neq + i, neq);
1332 I[1] =
m_base[1]->GetI(coll + 1);
1335 for (
int j = 0; j < nq1; ++j)
1340 Mat->GetRawPtr() + j * nq0 * neq + neq - 1, neq);
1349 nq0 =
m_base[0]->GetNumPoints();
1350 nq1 =
m_base[1]->GetNumPoints();
1385 I[0] =
m_base[0]->GetI(coll);
1386 I[1] =
m_base[1]->GetI(coll + 1);
1389 for (
int j = 0; j < nq1; ++j)
1395 Mat->GetRawPtr() + j * nq0 * neq + row, neq);
1400 for (
int i = 0; i < nq - 2; ++i)
1402 coords[0] = x[3 + i];
1403 coords[1] = y[3 + i];
1406 I[0] =
m_base[0]->GetI(coll);
1407 I[1] =
m_base[1]->GetI(coll + 1);
1410 for (
int j = 0; j < nq1; ++j)
1416 Mat->GetRawPtr() + j * nq0 * neq + row, neq);
1426 I[0] =
m_base[0]->GetI(coll);
1427 I[1] =
m_base[1]->GetI(coll + 1);
1430 for (
int j = 0; j < nq1; ++j)
1436 Mat->GetRawPtr() + j * nq0 * neq + row, neq);
1442 for (
int i = 0; i < nq - 2; ++i)
1446 coords[0] = x[3 * (nq - 1) - i - 1];
1447 coords[1] = y[3 * (nq - 1) - i - 1];
1451 I[0] =
m_base[0]->GetI(coll);
1452 I[1] =
m_base[1]->GetI(coll + 1);
1455 for (
int j = 0; j < nq1; ++j)
1461 Mat->GetRawPtr() + j * nq0 * neq + row, neq);
1465 for (
int j = 0; j < nq - 3 - i; ++j)
1467 coords[0] = x[3 * (nq - 1) + cnt];
1468 coords[1] = y[3 * (nq - 1) + cnt];
1471 I[0] =
m_base[0]->GetI(coll);
1472 I[1] =
m_base[1]->GetI(coll + 1);
1475 for (
int j = 0; j < nq1; ++j)
1481 Mat->GetRawPtr() + j * nq0 * neq + row,
1489 coords[0] = x[3 + (nq - 2) + i];
1490 coords[1] = y[3 + (nq - 2) + i];
1493 I[0] =
m_base[0]->GetI(coll);
1494 I[1] =
m_base[1]->GetI(coll + 1);
1497 for (
int j = 0; j < nq1; ++j)
1503 Mat->GetRawPtr() + j * nq0 * neq + row, neq);
1511 I[1] =
m_base[1]->GetI(coll + 1);
1514 for (
int j = 0; j < nq1; ++j)
1519 Mat->GetRawPtr() + j * nq0 * neq + neq - 1, neq);
1526 int nm0 =
m_base[0]->GetNumPoints();
1527 int nm1 =
m_base[1]->GetNumPoints();
1537 neq =
max(nm0, nm1);
1542 m_base[0]->GetPointsKey());
1544 m_base[1]->GetPointsKey());
1567 for (
int j = 0; j < ncoeffs; ++j)
1570 Vmath::Smul(nqtot, val, qmode.data(), 1, ptr + j * nqtot, 1);
1573 for (
int i = 1; i < ncoeffs; ++i)
1578 for (
int j = 0; j < ncoeffs; ++j)
1581 Vmath::Svtvp(nqtot, val, qmode.data(), 1, ptr + j * nqtot,
1582 1, ptr + j * nqtot, 1);
1646 int qa =
m_base[0]->GetNumPoints();
1647 int qb =
m_base[1]->GetNumPoints();
1648 int nmodes_a =
m_base[0]->GetNumModes();
1649 int nmodes_b =
m_base[1]->GetNumModes();
1662 OrthoExp.
FwdTrans(array, orthocoeffs);
1673 for (
int j = 0; j < nmodes_a; ++j)
1675 for (
int k = 0; k < nmodes_b - j; ++k, ++cnt)
1678 pow((1.0 * j) / (nmodes_a - 1), cutoff * nmodes_a),
1679 pow((1.0 * k) / (nmodes_b - 1), cutoff * nmodes_b));
1681 orthocoeffs[cnt] *= (SvvDiffCoeff * fac);
1692 max_ab =
max(max_ab, 0);
1696 for (
int j = 0; j < nmodes_a; ++j)
1698 for (
int k = 0; k < nmodes_b - j; ++k, ++cnt)
1700 int maxjk =
max(j, k);
1703 orthocoeffs[cnt] *= SvvDiffCoeff *
kSVVDGFilter[max_ab][maxjk];
1712 min(nmodes_a, nmodes_b));
1715 int nmodes =
min(nmodes_a, nmodes_b);
1720 for (
int j = 0; j < nmodes_a; ++j)
1722 for (
int k = 0; k < nmodes_b - j; ++k)
1724 if (j + k >= cutoff)
1728 exp(-(j + k - nmodes) * (j + k - nmodes) /
1729 ((
NekDouble)((j + k - cutoff + epsilon) *
1730 (j + k - cutoff + epsilon)))));
1734 orthocoeffs[cnt] *= 0.0;
1742 OrthoExp.
BwdTrans(orthocoeffs, array);
1749 int n_coeffs = inarray.size();
1750 int nquad0 =
m_base[0]->GetNumPoints();
1751 int nquad1 =
m_base[1]->GetNumPoints();
1756 int nqtot = nquad0 * nquad1;
1759 int nmodes0 =
m_base[0]->GetNumModes();
1760 int nmodes1 =
m_base[1]->GetNumModes();
1761 int numMin2 = nmodes0;
1782 m_TriExp->BwdTrans(inarray, phys_tmp);
1783 m_OrthoTriExp->FwdTrans(phys_tmp, coeff);
1785 for (i = 0; i < n_coeffs; i++)
1790 numMin += numMin2 - 1;
1795 m_OrthoTriExp->BwdTrans(coeff, phys_tmp);
1796 m_TriExp->FwdTrans(phys_tmp, outarray);
1806 int np1 =
m_base[0]->GetNumPoints();
1807 int np2 =
m_base[1]->GetNumPoints();
1808 int np =
max(np1, np2);
1815 for (
int i = 0; i < np - 1; ++i)
1818 for (
int j = 0; j < np - i - 2; ++j)
1820 conn[cnt++] = row + j;
1821 conn[cnt++] = row + j + 1;
1822 conn[cnt++] = rowp1 + j;
1824 conn[cnt++] = rowp1 + j + 1;
1825 conn[cnt++] = rowp1 + j;
1826 conn[cnt++] = row + j + 1;
1829 conn[cnt++] = row + np - i - 2;
1830 conn[cnt++] = row + np - i - 1;
1831 conn[cnt++] = rowp1 + np - i - 2;
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
#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 sign(a, b)
return the sign(b)*a
#define IPRODUCTWRTBASE_DEF
#define IPRODUCTWRTBASE_M(r, i)
#define STDLEV2TEST(r, state)
#define STDLEV2UPDATE(r, state)
Describes the specification for a 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 PhysTensorDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray_d0, Array< OneD, NekDouble > &outarray_d1)
Calculate the 2D derivative in the local tensor/collapsed coordinate at the physical points.
void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Calculate the inner product of inarray with respect to the basis B=base0*base1 and put into outarray.
NekDouble BaryTensorDeriv(const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs)
void v_PhysDeriv(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Calculate the derivative of the physical points in a given direction.
The base class for all shapes.
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.
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
void FillMode(const int mode, Array< OneD, NekDouble > &outarray)
This function fills the array outarray with the mode-th mode of 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
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.
void MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
virtual void v_HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
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
void LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
NekDouble PhysEvaluate(const Array< OneD, const NekDouble > &coords, const Array< OneD, const NekDouble > &physvals)
This function evaluates the expansion at a single (arbitrary) point of the domain.
void GetTraceToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation traceOrient=eForwards, int P=-1, int Q=-1)
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)
LibUtilities::NekManager< StdMatrixKey, DNekBlkMat, StdMatrixKey::opLess > m_stdStaticCondMatrixManager
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
Array< OneD, const NekDouble > GetStdFac(const StdFacKey &mkey)
int GetBasisNumModes(const int dir) const
This function returns the number of expansion modes in the dir direction.
Array< OneD, LibUtilities::BasisSharedPtr > m_base
std::vector< Array< OneD, const NekDouble > > m_weights
void MassMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
MatrixType GetMatrixType() const
NekDouble GetConstFactor(const ConstFactorType &factor) const
bool ConstFactorExists(const ConstFactorType &factor) const
void v_WeakDerivMatrixOp(const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
int v_GetTraceNumPoints(const int i) const override
void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Backward tranform for triangular elements.
void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_LocCollapsedToLocCoord(const Array< OneD, const NekDouble > &eta, Array< OneD, NekDouble > &xi) override
void v_GetCoords(Array< OneD, NekDouble > &coords_x, Array< OneD, NekDouble > &coords_y, Array< OneD, NekDouble > &coords_z) override
int v_CalcNumberOfCoefficients(const std::vector< unsigned int > &nummodes, int &modes_offset) override
const LibUtilities::BasisKey v_GetTraceBasisKey(const int i, const int j, bool UseGLL=false) const override
void v_GetSimplexEquiSpacedConnectivity(Array< OneD, int > &conn, bool standard=true) override
void v_MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
void v_GetBoundaryMap(Array< OneD, unsigned int > &outarray) override
int v_GetNtraces() const final
void v_StdPhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray) override
Calculate the derivative of the physical points.
void v_GetTraceInteriorToElementMap(const int eid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation edgeOrient=eForwards) override
int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false) override
DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey) override
DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey) override
int v_GetTraceNcoeffs(const int i) const override
void v_GetTraceCoeffMap(const unsigned int traceid, Array< OneD, unsigned int > &maparray) override
bool v_IsBoundaryInteriorExpansion() const override
void v_FillMode(const int mode, Array< OneD, NekDouble > &outarray) override
void v_ReduceOrderCoeffs(int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_FwdTransBndConstrained(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
LibUtilities::ShapeType v_DetShapeType() const override
int v_GetTraceIntNcoeffs(const int i) const override
int v_NumDGBndryCoeffs() const override
void v_LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta) override
NekDouble v_PhysEvaluateBasis(const Array< OneD, const NekDouble > &coords, int mode) final
void v_HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
NekDouble v_PhysEvalFirstDeriv(const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs) override
void v_GetInteriorMap(Array< OneD, unsigned int > &outarray) override
int v_GetNverts() const final
void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
void v_IProductWRTBaseKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const Array< OneD, NekDouble > &jac, const bool Deformed, const bool CollDir0=false, const bool CollDir1=false) override
Inner product of inarray over region with respect to the expansion basis (this)->m_base[0] and return...
void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey) override
int v_NumBndryCoeffs() 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.
constexpr int getNumberOfCoefficients(int Na, int Nb)
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
const std::string kPointsTypeStr[]
PointsManagerT & PointsManager(void)
@ eGaussRadauMLegendre
1D Gauss-Radau-Legendre quadrature points, pinned at x=-1
@ eGaussLegendreWithMP
1D Gauss-Legendre quadrature points with additional x=-1 and x=1 end points
@ eNodalTriElec
2D Nodal Electrostatic Points on a Triangle
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
@ eGaussLegendreWithM
1D Gauss-Legendre quadrature points with additional x=-1 point
@ ePolyEvenlySpaced
1D Evenly-spaced points using Lagrange polynomial
@ eModified_B
Principle Modified Functions .
@ eOrtho_A
Principle Orthogonal Functions .
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eOrtho_B
Principle Orthogonal Functions .
@ eModified_A
Principle Modified Functions .
static const NekDouble kNekZeroTol
@ eFactorSVVDGKerDiffCoeff
@ eFactorSVVPowerKerDiffCoeff
const int kSVVDGFiltermodesmin
tinysimd::scalarT< double > vec_t
const int kSVVDGFiltermodesmax
const NekDouble kSVVDGFilter[9][11]
@ ePhysInterpToEquiSpaced
std::shared_ptr< StdTriExp > StdTriExpSharedPtr
std::map< ConstFactorType, NekDouble > ConstFactorMap
std::shared_ptr< StdSegExp > StdSegExpSharedPtr
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 Svtvp(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Svtvp (scalar times vector plus vector): z = alpha*x + y.
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*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 Sdiv(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha/x.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
void Sadd(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Add vector y = alpha + x.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
scalarT< T > max(scalarT< T > lhs, scalarT< T > rhs)
scalarT< T > min(scalarT< T > lhs, scalarT< T > rhs)
scalarT< T > sqrt(scalarT< T > in)