56 :
StdExpansion(Ba.GetNumModes() * Bb.GetNumModes(), 2, Ba, Bb),
90 int nquad0 =
m_base[0]->GetNumPoints();
91 int nquad1 =
m_base[1]->GetNumPoints();
93 if (
m_base[0]->Collocation() &&
m_base[1]->Collocation())
95 std::memcpy(outarray.data(), inarray.data(),
103 int nmodes0 =
m_base[0]->GetNumModes();
104 int nmodes1 =
m_base[1]->GetNumModes();
106 std::vector<vec_t, tinysimd::allocator<vec_t>> wsp0(nmodes1 * nquad0);
116#define BWDTRANS_DEF \
117 BwdTransQuadKernel( \
118 nmodes0, nmodes1, nquad0, nquad1, (const vec_t *)base0.data(), \
119 (const vec_t *)base1.data(), wsp0.data(), \
120 (const vec_t *)inarray.data(), (vec_t *)outarray.data())
124#define BWDTRANS_Q(r, i) \
126 BwdTransQuadKernel( \
127 NM(i), NM(i), NQ(i), NQ(i), (const vec_t *)base0.data(), \
128 (const vec_t *)base1.data(), wsp0.data(), \
129 (const vec_t *)inarray.data(), (vec_t *)outarray.data()); \
134#define BWDTRANS_M(r, i) \
139 BOOST_PP_FOR_##r((NM(i), NM_P1(i), BOOST_PP_MUL(2, NM(i))), \
140 STDLEV2TEST1, STDLEV2UPDATE1, BWDTRANS_Q) default \
150 if ((nmodes0 == nmodes1) && (nquad0 == nquad1))
172 if ((
m_base[0]->Collocation()) && (
m_base[1]->Collocation()))
179 int npoints[2] = {
m_base[0]->GetNumPoints(),
m_base[1]->GetNumPoints()};
180 int nmodes[2] = {
m_base[0]->GetNumModes(),
m_base[1]->GetNumModes()};
182 fill(outarray.data(), outarray.data() +
m_ncoeffs, 0.0);
186 for (i = 0; i < 4; i++)
192 for (i = 0; i < npoints[0]; i++)
194 physEdge[0][i] = inarray[i];
195 physEdge[2][i] = inarray[npoints[0] * npoints[1] - 1 - i];
198 for (i = 0; i < npoints[1]; i++)
200 physEdge[1][i] = inarray[npoints[0] - 1 + i * npoints[0]];
202 inarray[(npoints[1] - 1) * npoints[0] - i * npoints[0]];
207 m_base[0]->GetBasisKey()),
209 m_base[1]->GetBasisKey())};
215 for (i = 0; i < 4; i++)
217 segexp[i % 2]->FwdTransBndConstrained(physEdge[i], coeffEdge[i]);
220 for (j = 0; j < nmodes[i % 2]; j++)
223 outarray[mapArray[j]] =
sign * coeffEdge[i][j];
243 int nInteriorDofs =
m_ncoeffs - nBoundaryDofs;
250 for (i = 0; i < nInteriorDofs; i++)
252 rhs[i] = tmp1[mapArray[i]];
255 Blas::Dgemv(
'N', nInteriorDofs, nInteriorDofs, 1.0,
256 &(matsys->GetPtr())[0], nInteriorDofs, rhs.data(), 1, 0.0,
259 for (i = 0; i < nInteriorDofs; i++)
261 outarray[mapArray[i]] = result[i];
296 const bool Deformed,
const bool CollDir0,
const bool CollDir1)
298 int nquad0 =
m_base[0]->GetNumPoints();
299 int nquad1 =
m_base[1]->GetNumPoints();
300 int order0 =
m_base[0]->GetNumModes();
301 int order1 =
m_base[1]->GetNumModes();
303 std::vector<vec_t, tinysimd::allocator<vec_t>> wsp0(nquad1);
314#undef IPRODUCTWRTBASE_DEF
315#define IPRODUCTWRTBASE_DEF \
316 IProductQuadKernel<false, false, true>( \
317 order0, order1, nquad0, nquad1, (const vec_t *)inarray.data(), \
318 (const vec_t *)base0.data(), (const vec_t *)base1.data(), \
319 (const vec_t *)m_weights[0].data(), \
320 (const vec_t *)m_weights[1].data(), (const vec_t *)jac.data(), \
321 (vec_t *)wsp0.data(), (vec_t *)outarray.data(), 1.0, CollDir0, \
325#undef IPRODUCTWRTBASE_Q
326#define IPRODUCTWRTBASE_Q(r, i) \
328 IProductQuadKernel<false, false, true>( \
329 NM(i), NM(i), NQ(i), NQ(i), (const vec_t *)inarray.data(), \
330 (const vec_t *)base0.data(), (const vec_t *)base1.data(), \
331 (const vec_t *)m_weights[0].data(), \
332 (const vec_t *)m_weights[1].data(), (const vec_t *)jac.data(), \
333 (vec_t *)wsp0.data(), (vec_t *)outarray.data(), 1.0, CollDir0, \
338#undef IPRODUCTWRTBASE_M
339#define IPRODUCTWRTBASE_M(r, i) \
344 BOOST_PP_FOR_##r((NM(i), NM_P1(i), BOOST_PP_MUL(2, NM(i))), \
345 STDLEV2TEST1, STDLEV2UPDATE1, \
346 IPRODUCTWRTBASE_Q) default : IPRODUCTWRTBASE_DEF; \
354 if ((order0 == order1) && (nquad0 == nquad1))
373#undef IPRODUCTWRTBASE_DEF
374#define IPRODUCTWRTBASE_DEF \
375 IProductQuadKernel<false, false, false>( \
376 order0, order1, nquad0, nquad1, (const vec_t *)inarray.data(), \
377 (const vec_t *)base0.data(), (const vec_t *)base1.data(), \
378 (const vec_t *)m_weights[0].data(), \
379 (const vec_t *)m_weights[1].data(), (const vec_t *)jac.data(), \
380 (vec_t *)wsp0.data(), (vec_t *)outarray.data(), 1.0, CollDir0, \
384#undef IPRODUCTWRTBASE_Q
385#define IPRODUCTWRTBASE_Q(r, i) \
387 IProductQuadKernel<false, false, false>( \
388 NM(i), NM(i), NQ(i), NQ(i), (const vec_t *)inarray.data(), \
389 (const vec_t *)base0.data(), (const vec_t *)base1.data(), \
390 (const vec_t *)m_weights[0].data(), \
391 (const vec_t *)m_weights[1].data(), (const vec_t *)jac.data(), \
392 (vec_t *)wsp0.data(), (vec_t *)outarray.data(), 1.0, CollDir0, \
397#undef IPRODUCTWRTBASE_M
398#define IPRODUCTWRTBASE_M(r, i) \
403 BOOST_PP_FOR_##r((NM(i), NM_P1(i), BOOST_PP_MUL(2, NM(i))), \
404 STDLEV2TEST1, STDLEV2UPDATE1, \
405 IPRODUCTWRTBASE_Q) default : IPRODUCTWRTBASE_DEF; \
413 if ((order0 == order1) && (nquad0 == nquad1))
435 ASSERTL0((dir == 0) || (dir == 1),
"input dir is out of range");
441 inarray, outarray, one,
false,
442 m_base[0]->Collocation(),
false);
447 inarray, outarray, one,
false,
false,
448 m_base[1]->Collocation());
479 int nquad0 =
m_base[0]->GetNumPoints();
480 int nquad1 =
m_base[1]->GetNumPoints();
483 int btmp0 =
m_base[0]->GetNumModes();
484 int mode0 = mode % btmp0;
485 int mode1 = mode / btmp0;
487 ASSERTL2(mode1 == (
int)floor((1.0 * mode) / btmp0),
488 "Integer Truncation not Equiv to Floor");
491 "calling argument mode is larger than total expansion order");
493 for (i = 0; i < nquad1; ++i)
496 &outarray[0] + i * nquad0, 1);
499 for (i = 0; i < nquad0; ++i)
502 &outarray[0] + i, nquad0, &outarray[0] + i, nquad0);
522 ASSERTL2((i >= 0) && (i <= 3),
"edge id is out of range");
524 if ((i == 0) || (i == 2))
536 ASSERTL2((i >= 0) && (i <= 4),
"edge id is out of range");
537 if ((i == 0) || (i == 2))
549 ASSERTL2((i >= 0) && (i <= 3),
"edge id is out of range");
551 if ((i == 0) || (i == 2))
562 const int i, [[maybe_unused]]
const int j,
563 [[maybe_unused]]
bool UseGLL)
const
565 ASSERTL2((i >= 0) && (i <= 3),
"edge id is out of range");
567 if ((i == 0) || (i == 2))
613 "BasisType is not a boundary interior form");
617 "BasisType is not a boundary interior form");
627 "BasisType is not a boundary interior form");
631 "BasisType is not a boundary interior form");
637 const std::vector<unsigned int> &nummodes,
int &modes_offset)
639 int nmodes = nummodes[modes_offset] * nummodes[modes_offset + 1];
647 bool returnval =
false;
672 for (i = 0; i < nq1; ++i)
674 Vmath::Vcopy(nq0, z0.data(), 1, &coords_0[0] + i * nq0, 1);
675 Vmath::Fill(nq0, z1[i], &coords_1[0] + i * nq0, 1);
699 const int nm0 =
m_base[0]->GetNumModes();
700 const int nm1 =
m_base[1]->GetNumModes();
702 return StdExpansion::BaryEvaluateBasis<0>(coords[0], mode % nm1) *
703 StdExpansion::BaryEvaluateBasis<1>(coords[1], mode / nm0);
709 std::array<NekDouble, 3> &firstOrderDerivs)
722 int nummodes0, nummodes1;
723 int value1 = 0, value2 = 0;
729 nummodes0 =
m_base[0]->GetNumModes();
730 nummodes1 =
m_base[1]->GetNumModes();
742 value1 = 2 * nummodes0;
745 ASSERTL0(0,
"Mapping array is not defined for this expansion");
749 for (i = 0; i < value1; i++)
759 value2 = value1 + nummodes0 - 1;
765 ASSERTL0(0,
"Mapping array is not defined for this expansion");
769 for (i = 0; i < nummodes1 - 2; i++)
771 outarray[cnt++] = value1 + i * nummodes0;
772 outarray[cnt++] = value2 + i * nummodes0;
778 for (i = nummodes0 * (nummodes1 - 1); i <
GetNcoeffs(); i++)
789 int nummodes0, nummodes1;
796 nummodes0 =
m_base[0]->GetNumModes();
797 nummodes1 =
m_base[1]->GetNumModes();
805 startvalue = nummodes0;
808 startvalue = 2 * nummodes0;
811 ASSERTL0(0,
"Mapping array is not defined for this expansion");
824 ASSERTL0(0,
"Mapping array is not defined for this expansion");
828 for (i = 0; i < nummodes1 - 2; i++)
830 for (j = 0; j < nummodes0 - 2; j++)
832 outarray[cnt++] = startvalue + j;
834 startvalue += nummodes0;
842 if (useCoeffPacking ==
true)
844 switch (localVertexId)
855 localDOF =
m_base[0]->GetNumModes() - 1;
867 localDOF =
m_base[0]->GetNumModes() *
868 (
m_base[1]->GetNumModes() - 1);
872 localDOF =
m_base[0]->GetNumModes();
881 m_base[0]->GetNumModes() *
m_base[1]->GetNumModes() - 1;
885 localDOF =
m_base[0]->GetNumModes() + 1;
890 ASSERTL0(
false,
"eid must be between 0 and 3");
896 switch (localVertexId)
907 localDOF =
m_base[0]->GetNumModes() - 1;
920 m_base[0]->GetNumModes() *
m_base[1]->GetNumModes() - 1;
924 localDOF =
m_base[0]->GetNumModes() + 1;
932 localDOF =
m_base[0]->GetNumModes() *
933 (
m_base[1]->GetNumModes() - 1);
937 localDOF =
m_base[0]->GetNumModes();
942 ASSERTL0(
false,
"eid must be between 0 and 3");
956 ASSERTL1(traceid < 4,
"traceid must be between 0 and 3");
959 unsigned int order0 =
m_base[0]->GetNumModes();
960 unsigned int order1 =
m_base[1]->GetNumModes();
961 unsigned int numModes = (traceid % 2) ? order1 : order0;
963 if (maparray.size() != numModes)
976 for (i = 0; i < numModes; i++)
984 for (i = 0; i < numModes; i++)
986 maparray[i] = i * order0 + 1;
992 for (i = 0; i < numModes; i++)
994 maparray[i] = order0 + i;
1000 for (i = 0; i < numModes; i++)
1002 maparray[i] = i * order0;
1017 for (i = 0; i < numModes; i++)
1025 for (i = 0; i < numModes; i++)
1027 maparray[i] = (i + 1) * order0 - 1;
1033 for (i = 0; i < numModes; i++)
1035 maparray[i] = order0 * (order1 - 1) + i;
1041 for (i = 0; i < numModes; i++)
1043 maparray[i] = order0 * i;
1053 ASSERTL0(
false,
"Mapping not defined for this type of basis");
1062 const int nummodes0 =
m_base[0]->GetNumModes();
1063 const int nummodes1 =
m_base[1]->GetNumModes();
1067 if (maparray.size() != nEdgeIntCoeffs)
1072 if (signarray.size() != nEdgeIntCoeffs)
1078 fill(signarray.data(), signarray.data() + nEdgeIntCoeffs, 1);
1087 for (i = 0; i < nEdgeIntCoeffs; i++)
1089 maparray[i] = i + 2;
1095 for (i = 0; i < nEdgeIntCoeffs; i++)
1097 maparray[i] = (i + 2) * nummodes0 + 1;
1103 for (i = 0; i < nEdgeIntCoeffs; i++)
1105 maparray[i] = nummodes0 + i + 2;
1111 for (i = 0; i < nEdgeIntCoeffs; i++)
1113 maparray[i] = (i + 2) * nummodes0;
1118 ASSERTL0(
false,
"eid must be between 0 and 3");
1124 for (i = 1; i < nEdgeIntCoeffs; i += 2)
1136 for (i = 0; i < nEdgeIntCoeffs; i++)
1138 maparray[i] = i + 1;
1144 for (i = 0; i < nEdgeIntCoeffs; i++)
1146 maparray[i] = (i + 2) * nummodes0 - 1;
1152 for (i = 0; i < nEdgeIntCoeffs; i++)
1154 maparray[i] = nummodes0 * (nummodes1 - 1) + i + 1;
1160 for (i = 0; i < nEdgeIntCoeffs; i++)
1162 maparray[i] = nummodes0 * (i + 1);
1167 ASSERTL0(
false,
"eid must be between 0 and 3");
1172 reverse(maparray.data(), maparray.data() + nEdgeIntCoeffs);
1177 ASSERTL0(
false,
"Mapping not defined for this type of basis");
1198 int nq0 =
m_base[0]->GetNumPoints();
1199 int nq1 =
m_base[1]->GetNumPoints();
1222 for (i = 0; i < nq; ++i)
1224 for (j = 0; j < nq; ++j, ++cnt)
1227 coords[cnt][0] = -1.0 + 2 * j / (
NekDouble)(nq - 1);
1228 coords[cnt][1] = -1.0 + 2 * i / (
NekDouble)(nq - 1);
1232 for (i = 0; i < neq; ++i)
1236 I[0] =
m_base[0]->GetI(coll);
1237 I[1] =
m_base[1]->GetI(coll + 1);
1240 for (j = 0; j < nq1; ++j)
1246 Mat->GetRawPtr() + j * nq0 * neq + i, neq);
1253 int nq0 =
m_base[0]->GetNumPoints();
1254 int nq1 =
m_base[1]->GetNumPoints();
1283 for (
int i = 0; i < nq; ++i)
1285 for (
int j = 0; j < nq; ++j, ++cnt)
1288 coords[cnt][0] = z[j];
1289 coords[cnt][1] = z[i];
1293 for (
int i = 0; i < neq; ++i)
1297 I[0] =
m_base[0]->GetI(coll);
1298 I[1] =
m_base[1]->GetI(coll + 1);
1301 for (
int j = 0; j < nq1; ++j)
1307 Mat->GetRawPtr() + j * nq0 * neq + i, neq);
1314 int nm0 =
m_base[0]->GetNumPoints();
1315 int nm1 =
m_base[1]->GetNumPoints();
1325 neq =
max(nm0, nm1);
1330 m_base[0]->GetPointsKey());
1332 m_base[1]->GetPointsKey());
1355 for (
int j = 0; j < ncoeffs; ++j)
1358 Vmath::Smul(nqtot, val, qmode.data(), 1, ptr + j * nqtot, 1);
1361 for (
int i = 1; i < ncoeffs; ++i)
1366 for (
int j = 0; j < ncoeffs; ++j)
1369 Vmath::Svtvp(nqtot, val, qmode.data(), 1, ptr + j * nqtot,
1370 1, ptr + j * nqtot, 1);
1382 for (i = 0; i < order1; ++i)
1384 (*Mat)(order0 *i + 1, i * order0 + 1) = 1.0;
1390 for (i = 0; i < order0; ++i)
1392 (*Mat)(order0 + i, order0 + i) = 1.0;
1406 (*Mat) = Imass * Iprod;
1414 int dir = (edge + 1) % 2;
1415 int nCoeffs =
m_base[dir]->GetNumModes();
1423 coords[0] = (edge == 0 || edge == 3) ? -1.0 : 1.0;
1430 Vmath::Vcopy(nCoeffs, m_Ix->GetPtr(), 1, Mat->GetPtr(), 1);
1456 int qa =
m_base[0]->GetNumPoints();
1457 int qb =
m_base[1]->GetNumPoints();
1458 int nmodes_a =
m_base[0]->GetNumModes();
1459 int nmodes_b =
m_base[1]->GetNumModes();
1460 int nmodes =
min(nmodes_a, nmodes_b);
1473 OrthoExp.
FwdTrans(array, orthocoeffs);
1483 for (
int j = 0; j < nmodes_a; ++j)
1485 for (
int k = 0; k < nmodes_b; ++k)
1489 pow((1.0 * j) / (nmodes_a - 1), cutoff * nmodes_a),
1490 pow((1.0 * k) / (nmodes_b - 1), cutoff * nmodes_b));
1492 orthocoeffs[j * nmodes_b + k] *= SvvDiffCoeff * fac;
1503 max_ab =
max(max_ab, 0);
1506 for (
int j = 0; j < nmodes_a; ++j)
1508 for (
int k = 0; k < nmodes_b; ++k)
1510 int maxjk =
max(j, k);
1513 orthocoeffs[j * nmodes_b + k] *=
1523 min(nmodes_a, nmodes_b));
1526 for (
int j = 0; j < nmodes_a; ++j)
1528 for (
int k = 0; k < nmodes_b; ++k)
1530 if (j + k >= cutoff)
1532 orthocoeffs[j * nmodes_b + k] *=
1534 exp(-(j + k - nmodes) * (j + k - nmodes) /
1536 (j + k - cutoff + 1)))));
1540 orthocoeffs[j * nmodes_b + k] *= 0.0;
1547 OrthoExp.
BwdTrans(orthocoeffs, array);
1556 int qa =
m_base[0]->GetNumPoints();
1557 int qb =
m_base[1]->GetNumPoints();
1558 int nmodesA =
m_base[0]->GetNumModes();
1559 int nmodesB =
m_base[1]->GetNumModes();
1560 int P = nmodesA - 1;
1561 int Q = nmodesB - 1;
1572 int Pcut = cutoff *
P;
1573 int Qcut = cutoff * Q;
1577 OrthoExp.
FwdTrans(array, orthocoeffs);
1581 for (
int i = 0; i < nmodesA; ++i)
1583 for (
int j = 0; j < nmodesB; ++j)
1586 if (i > Pcut || j > Qcut)
1590 fac =
max(fac1, fac2);
1591 fac = pow(fac, exponent);
1592 orthocoeffs[i * nmodesB + j] *= exp(-alpha * fac);
1598 OrthoExp.
BwdTrans(orthocoeffs, array);
1605 int n_coeffs = inarray.size();
1612 int nmodes0 =
m_base[0]->GetNumModes();
1613 int nmodes1 =
m_base[1]->GetNumModes();
1614 int numMax = nmodes0;
1634 for (
int i = 0; i < numMin + 1; ++i)
1636 Vmath::Vcopy(numMin, tmp = coeff + cnt, 1, tmp2 = coeff_tmp + cnt, 1);
1682 int np1 =
m_base[0]->GetNumPoints();
1683 int np2 =
m_base[1]->GetNumPoints();
1684 int np =
max(np1, np2);
1691 for (
int i = 0; i < np - 1; ++i)
1694 for (
int j = 0; j < np - 1; ++j)
1696 conn[cnt++] = row + j;
1697 conn[cnt++] = row + j + 1;
1698 conn[cnt++] = rowp1 + j;
1700 conn[cnt++] = rowp1 + j + 1;
1701 conn[cnt++] = rowp1 + j;
1702 conn[cnt++] = row + j + 1;
#define ASSERTL0(condition, msg)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed to...
#define 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.
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.
NekDouble BaryTensorDeriv(const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs)
The base class for all shapes.
virtual void v_LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
const LibUtilities::BasisSharedPtr & GetBasis(int dir) const
This function gets the shared point to basis in the dir direction.
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)
DNekMatSharedPtr CreateGeneralMatrix(const StdMatrixKey &mkey)
this function generates the mass matrix
void IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
this function calculates the inner product of a given function f with the different modes of the expa...
void LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
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 GetInteriorMap(Array< OneD, unsigned int > &outarray)
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.
DNekMatSharedPtr GenMatrix(const StdMatrixKey &mkey)
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.
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
const ConstFactorMap & GetConstFactors() const
NekDouble GetConstFactor(const ConstFactorType &factor) const
bool ConstFactorExists(const ConstFactorType &factor) const
void v_ExponentialFilter(Array< OneD, NekDouble > &array, const NekDouble alpha, const NekDouble exponent, const NekDouble cutoff) override
int v_NumDGBndryCoeffs() const final
void v_FwdTransBndConstrained(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta) override
int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false) override
bool v_IsBoundaryInteriorExpansion() const override
int v_GetTraceNcoeffs(const int i) const final
int v_GetNtraces() const final
void v_ReduceOrderCoeffs(int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
int v_GetTraceNumPoints(const int i) const final
void v_HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
int v_NumBndryCoeffs() const final
void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey) override
void v_GetCoords(Array< OneD, NekDouble > &coords_0, Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2) override
NekDouble v_PhysEvaluateBasis(const Array< OneD, const NekDouble > &coords, int mode) override
This function evaluates the basis function mode mode at a point coords of the domain.
int v_CalcNumberOfCoefficients(const std::vector< unsigned int > &nummodes, int &modes_offset) override
void v_GetInteriorMap(Array< OneD, unsigned int > &outarray) override
int v_GetNverts() 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_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_WeakDerivMatrixOp(const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
void v_LocCollapsedToLocCoord(const Array< OneD, const NekDouble > &eta, Array< OneD, NekDouble > &xi) override
NekDouble v_PhysEvalFirstDeriv(const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs) override
void v_GetTraceCoeffMap(const unsigned int traceid, Array< OneD, unsigned int > &maparray) override
Get the map of the coefficient location to teh local trace coefficients.
const LibUtilities::BasisKey v_GetTraceBasisKey(const int i, const int j, bool UseGLL=false) const final
DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey) 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_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_GetTraceInteriorToElementMap(const int eid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation edgeOrient=eForwards) override
void v_GetBoundaryMap(Array< OneD, unsigned int > &outarray) override
DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey) override
int v_GetTraceIntNcoeffs(const int i) const final
StdQuadExp(const LibUtilities::BasisKey &Ba, const LibUtilities::BasisKey &Bb)
Constructor using BasisKey class for quadrature points and order definition.
void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
LibUtilities::ShapeType v_DetShapeType() const final
void v_FillMode(const int mode, Array< OneD, NekDouble > &array) override
Fill outarray with mode mode of expansion.
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...
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].
constexpr int getNumberOfCoefficients(int Na, int Nb)
BasisManagerT & BasisManager(void)
std::shared_ptr< Basis > BasisSharedPtr
PointsManagerT & PointsManager(void)
void InterpCoeff2D(const BasisKey &fbasis0, const BasisKey &fbasis1, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, const BasisKey &tbasis1, Array< OneD, NekDouble > &to)
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
@ eGaussGaussLegendre
1D Gauss-Gauss-Legendre quadrature points
@ eGauss_Lagrange
Lagrange Polynomials using the Gauss points.
@ eOrtho_A
Principle Orthogonal Functions .
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eModified_A
Principle Modified Functions .
@ eFourier
Fourier Expansion .
static const NekDouble kNekZeroTol
@ eFactorSVVDGKerDiffCoeff
@ eFactorSVVPowerKerDiffCoeff
const int kSVVDGFiltermodesmin
tinysimd::scalarT< double > vec_t
const int kSVVDGFiltermodesmax
const NekDouble kSVVDGFilter[9][11]
@ ePhysInterpToEquiSpaced
std::map< ConstFactorType, NekDouble > ConstFactorMap
std::shared_ptr< StdSegExp > StdSegExpSharedPtr
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 Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Zero(int n, T *x, const int incx)
Zero vector.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
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)