49 :
StdExpansion(Ba.GetNumModes() * Bb.GetNumModes(), 2, Ba, Bb),
102 ASSERTL1(
false,
"input dir is out of range");
130 if (
m_base[0]->Collocation() &&
m_base[1]->Collocation())
133 inarray, 1, outarray, 1);
145 m_base[1]->GetNumModes());
148 outarray, wsp,
true,
true);
166 bool doCheckCollDir0,
bool doCheckCollDir1)
168 int nquad0 =
m_base[0]->GetNumPoints();
169 int nquad1 =
m_base[1]->GetNumPoints();
170 int nmodes0 =
m_base[0]->GetNumModes();
171 int nmodes1 =
m_base[1]->GetNumModes();
173 bool colldir0 = doCheckCollDir0 ? (
m_base[0]->Collocation()) :
false;
174 bool colldir1 = doCheckCollDir1 ? (
m_base[1]->Collocation()) :
false;
176 if (colldir0 && colldir1)
182 Blas::Dgemm(
'N',
'T', nquad0, nquad1, nmodes1, 1.0, &inarray[0], nquad0,
183 base1.data(), nquad1, 0.0, &outarray[0], nquad0);
187 Blas::Dgemm(
'N',
'N', nquad0, nmodes1, nmodes0, 1.0, base0.data(),
188 nquad0, &inarray[0], nmodes0, 0.0, &outarray[0], nquad0);
192 ASSERTL1(wsp.size() >= nquad0 * nmodes1,
193 "Workspace size is not sufficient");
197 Blas::Dgemm(
'N',
'N', nquad0, nmodes1, nmodes0, 1.0, base0.data(),
198 nquad0, &inarray[0], nmodes0, 0.0, &wsp[0], nquad0);
199 Blas::Dgemm(
'N',
'T', nquad0, nquad1, nmodes1, 1.0, &wsp[0], nquad0,
200 base1.data(), nquad1, 0.0, &outarray[0], nquad0);
207 if ((
m_base[0]->Collocation()) && (
m_base[1]->Collocation()))
223 out = (*matsys) * in;
231 if ((
m_base[0]->Collocation()) && (
m_base[1]->Collocation()))
238 int npoints[2] = {
m_base[0]->GetNumPoints(),
m_base[1]->GetNumPoints()};
239 int nmodes[2] = {
m_base[0]->GetNumModes(),
m_base[1]->GetNumModes()};
241 fill(outarray.data(), outarray.data() +
m_ncoeffs, 0.0);
245 for (i = 0; i < 4; i++)
251 for (i = 0; i < npoints[0]; i++)
253 physEdge[0][i] = inarray[i];
254 physEdge[2][i] = inarray[npoints[0] * npoints[1] - 1 - i];
257 for (i = 0; i < npoints[1]; i++)
259 physEdge[1][i] = inarray[npoints[0] - 1 + i * npoints[0]];
261 inarray[(npoints[1] - 1) * npoints[0] - i * npoints[0]];
266 m_base[0]->GetBasisKey()),
268 m_base[1]->GetBasisKey())};
274 for (i = 0; i < 4; i++)
276 segexp[i % 2]->FwdTransBndConstrained(physEdge[i], coeffEdge[i]);
279 for (j = 0; j < nmodes[i % 2]; j++)
282 outarray[mapArray[j]] =
sign * coeffEdge[i][j];
302 int nInteriorDofs =
m_ncoeffs - nBoundaryDofs;
309 for (i = 0; i < nInteriorDofs; i++)
311 rhs[i] = tmp1[mapArray[i]];
314 Blas::Dgemv(
'N', nInteriorDofs, nInteriorDofs, 1.0,
315 &(matsys->GetPtr())[0], nInteriorDofs, rhs.data(), 1, 0.0,
318 for (i = 0; i < nInteriorDofs; i++)
320 outarray[mapArray[i]] = result[i];
357 if (
m_base[0]->Collocation() &&
m_base[1]->Collocation())
371 int nquad0 =
m_base[0]->GetNumPoints();
372 int nquad1 =
m_base[1]->GetNumPoints();
373 int order0 =
m_base[0]->GetNumModes();
375 if (multiplybyweights)
383 m_base[1]->GetBdata(), tmp, outarray, wsp,
390 m_base[1]->GetBdata(), inarray, outarray,
406 ASSERTL0((dir == 0) || (dir == 1),
"input dir is out of range");
408 int nquad0 =
m_base[0]->GetNumPoints();
409 int nquad1 =
m_base[1]->GetNumPoints();
410 int nqtot = nquad0 * nquad1;
411 int order0 =
m_base[0]->GetNumModes();
422 m_base[1]->GetDbdata(), tmp, outarray, wsp,
428 m_base[1]->GetBdata(), tmp, outarray, wsp,
448 bool doCheckCollDir0,
bool doCheckCollDir1)
450 int nquad0 =
m_base[0]->GetNumPoints();
451 int nquad1 =
m_base[1]->GetNumPoints();
452 int nmodes0 =
m_base[0]->GetNumModes();
453 int nmodes1 =
m_base[1]->GetNumModes();
455 bool colldir0 = doCheckCollDir0 ? (
m_base[0]->Collocation()) :
false;
456 bool colldir1 = doCheckCollDir1 ? (
m_base[1]->Collocation()) :
false;
458 if (colldir0 && colldir1)
464 Blas::Dgemm(
'N',
'N', nmodes0, nmodes1, nquad1, 1.0, inarray.data(),
465 nmodes0, base1.data(), nquad1, 0.0, outarray.data(),
470 Blas::Dgemm(
'T',
'N', nmodes0, nquad1, nquad0, 1.0, base0.data(),
471 nquad0, inarray.data(), nquad0, 0.0, outarray.data(),
476 ASSERTL1(wsp.size() >= nquad1 * nmodes0,
477 "Workspace size is not sufficient");
480 Blas::Dgemm(
'T',
'N', nmodes0, nquad1, nquad0, 1.0, base0.data(),
481 nquad0, inarray.data(), nquad0, 0.0, wsp.data(), nmodes0);
484 for (
int i = 0; i < nmodes0; ++i)
486 for (
int j = 0; j < nquad1; ++j)
488 wsp[j * nmodes0 + i] =
489 Blas::Ddot(nquad0, base0.data() + i * nquad0, 1,
490 inarray.data() + j * nquad0, 1);
494 Blas::Dgemm(
'N',
'N', nmodes0, nmodes1, nquad1, 1.0, wsp.data(),
495 nmodes0, base1.data(), nquad1, 0.0, outarray.data(),
527 int nquad0 =
m_base[0]->GetNumPoints();
528 int nquad1 =
m_base[1]->GetNumPoints();
531 int btmp0 =
m_base[0]->GetNumModes();
532 int mode0 = mode % btmp0;
533 int mode1 = mode / btmp0;
535 ASSERTL2(mode1 == (
int)floor((1.0 * mode) / btmp0),
536 "Integer Truncation not Equiv to Floor");
539 "calling argument mode is larger than total expansion order");
541 for (i = 0; i < nquad1; ++i)
544 &outarray[0] + i * nquad0, 1);
547 for (i = 0; i < nquad0; ++i)
550 &outarray[0] + i, nquad0, &outarray[0] + i, nquad0);
570 ASSERTL2((i >= 0) && (i <= 3),
"edge id is out of range");
572 if ((i == 0) || (i == 2))
584 ASSERTL2((i >= 0) && (i <= 4),
"edge id is out of range");
585 if ((i == 0) || (i == 2))
597 ASSERTL2((i >= 0) && (i <= 3),
"edge id is out of range");
599 if ((i == 0) || (i == 2))
610 const int i, [[maybe_unused]]
const int j,
611 [[maybe_unused]]
bool UseGLL)
const
613 ASSERTL2((i >= 0) && (i <= 3),
"edge id is out of range");
615 if ((i == 0) || (i == 2))
635 "BasisType is not a boundary interior form");
639 "BasisType is not a boundary interior form");
649 "BasisType is not a boundary interior form");
653 "BasisType is not a boundary interior form");
659 const std::vector<unsigned int> &nummodes,
int &modes_offset)
661 int nmodes = nummodes[modes_offset] * nummodes[modes_offset + 1];
669 bool returnval =
false;
694 for (i = 0; i < nq1; ++i)
696 Blas::Dcopy(nq0, z0.data(), 1, &coords_0[0] + i * nq0, 1);
697 Vmath::Fill(nq0, z1[i], &coords_1[0] + i * nq0, 1);
721 const int nm0 =
m_base[0]->GetNumModes();
722 const int nm1 =
m_base[1]->GetNumModes();
724 return StdExpansion::BaryEvaluateBasis<0>(coords[0], mode % nm1) *
725 StdExpansion::BaryEvaluateBasis<1>(coords[1], mode / nm0);
731 std::array<NekDouble, 3> &firstOrderDerivs)
744 int nummodes0, nummodes1;
745 int value1 = 0, value2 = 0;
751 nummodes0 =
m_base[0]->GetNumModes();
752 nummodes1 =
m_base[1]->GetNumModes();
764 value1 = 2 * nummodes0;
767 ASSERTL0(0,
"Mapping array is not defined for this expansion");
771 for (i = 0; i < value1; i++)
781 value2 = value1 + nummodes0 - 1;
787 ASSERTL0(0,
"Mapping array is not defined for this expansion");
791 for (i = 0; i < nummodes1 - 2; i++)
793 outarray[cnt++] = value1 + i * nummodes0;
794 outarray[cnt++] = value2 + i * nummodes0;
800 for (i = nummodes0 * (nummodes1 - 1); i <
GetNcoeffs(); i++)
811 int nummodes0, nummodes1;
818 nummodes0 =
m_base[0]->GetNumModes();
819 nummodes1 =
m_base[1]->GetNumModes();
827 startvalue = nummodes0;
830 startvalue = 2 * nummodes0;
833 ASSERTL0(0,
"Mapping array is not defined for this expansion");
846 ASSERTL0(0,
"Mapping array is not defined for this expansion");
850 for (i = 0; i < nummodes1 - 2; i++)
852 for (j = 0; j < nummodes0 - 2; j++)
854 outarray[cnt++] = startvalue + j;
856 startvalue += nummodes0;
864 if (useCoeffPacking ==
true)
866 switch (localVertexId)
877 localDOF =
m_base[0]->GetNumModes() - 1;
889 localDOF =
m_base[0]->GetNumModes() *
890 (
m_base[1]->GetNumModes() - 1);
894 localDOF =
m_base[0]->GetNumModes();
903 m_base[0]->GetNumModes() *
m_base[1]->GetNumModes() - 1;
907 localDOF =
m_base[0]->GetNumModes() + 1;
912 ASSERTL0(
false,
"eid must be between 0 and 3");
918 switch (localVertexId)
929 localDOF =
m_base[0]->GetNumModes() - 1;
942 m_base[0]->GetNumModes() *
m_base[1]->GetNumModes() - 1;
946 localDOF =
m_base[0]->GetNumModes() + 1;
954 localDOF =
m_base[0]->GetNumModes() *
955 (
m_base[1]->GetNumModes() - 1);
959 localDOF =
m_base[0]->GetNumModes();
964 ASSERTL0(
false,
"eid must be between 0 and 3");
978 ASSERTL1(traceid < 4,
"traceid must be between 0 and 3");
981 unsigned int order0 =
m_base[0]->GetNumModes();
982 unsigned int order1 =
m_base[1]->GetNumModes();
983 unsigned int numModes = (traceid % 2) ? order1 : order0;
985 if (maparray.size() != numModes)
998 for (i = 0; i < numModes; i++)
1006 for (i = 0; i < numModes; i++)
1008 maparray[i] = i * order0 + 1;
1014 for (i = 0; i < numModes; i++)
1016 maparray[i] = order0 + i;
1022 for (i = 0; i < numModes; i++)
1024 maparray[i] = i * order0;
1039 for (i = 0; i < numModes; i++)
1047 for (i = 0; i < numModes; i++)
1049 maparray[i] = (i + 1) * order0 - 1;
1055 for (i = 0; i < numModes; i++)
1057 maparray[i] = order0 * (order1 - 1) + i;
1063 for (i = 0; i < numModes; i++)
1065 maparray[i] = order0 * i;
1075 ASSERTL0(
false,
"Mapping not defined for this type of basis");
1084 const int nummodes0 =
m_base[0]->GetNumModes();
1085 const int nummodes1 =
m_base[1]->GetNumModes();
1089 if (maparray.size() != nEdgeIntCoeffs)
1094 if (signarray.size() != nEdgeIntCoeffs)
1100 fill(signarray.data(), signarray.data() + nEdgeIntCoeffs, 1);
1109 for (i = 0; i < nEdgeIntCoeffs; i++)
1111 maparray[i] = i + 2;
1117 for (i = 0; i < nEdgeIntCoeffs; i++)
1119 maparray[i] = (i + 2) * nummodes0 + 1;
1125 for (i = 0; i < nEdgeIntCoeffs; i++)
1127 maparray[i] = nummodes0 + i + 2;
1133 for (i = 0; i < nEdgeIntCoeffs; i++)
1135 maparray[i] = (i + 2) * nummodes0;
1140 ASSERTL0(
false,
"eid must be between 0 and 3");
1146 for (i = 1; i < nEdgeIntCoeffs; i += 2)
1158 for (i = 0; i < nEdgeIntCoeffs; i++)
1160 maparray[i] = i + 1;
1166 for (i = 0; i < nEdgeIntCoeffs; i++)
1168 maparray[i] = (i + 2) * nummodes0 - 1;
1174 for (i = 0; i < nEdgeIntCoeffs; i++)
1176 maparray[i] = nummodes0 * (nummodes1 - 1) + i + 1;
1182 for (i = 0; i < nEdgeIntCoeffs; i++)
1184 maparray[i] = nummodes0 * (i + 1);
1189 ASSERTL0(
false,
"eid must be between 0 and 3");
1194 reverse(maparray.data(), maparray.data() + nEdgeIntCoeffs);
1199 ASSERTL0(
false,
"Mapping not defined for this type of basis");
1220 int nq0 =
m_base[0]->GetNumPoints();
1221 int nq1 =
m_base[1]->GetNumPoints();
1244 for (i = 0; i < nq; ++i)
1246 for (j = 0; j < nq; ++j, ++cnt)
1249 coords[cnt][0] = -1.0 + 2 * j / (
NekDouble)(nq - 1);
1250 coords[cnt][1] = -1.0 + 2 * i / (
NekDouble)(nq - 1);
1254 for (i = 0; i < neq; ++i)
1258 I[0] =
m_base[0]->GetI(coll);
1259 I[1] =
m_base[1]->GetI(coll + 1);
1262 for (j = 0; j < nq1; ++j)
1268 Mat->GetRawPtr() + j * nq0 * neq + i, neq);
1280 for (i = 0; i < order1; ++i)
1282 (*Mat)(order0 *i + 1, i * order0 + 1) = 1.0;
1288 for (i = 0; i < order0; ++i)
1290 (*Mat)(order0 + i, order0 + i) = 1.0;
1304 (*Mat) = Imass * Iprod;
1312 int dir = (edge + 1) % 2;
1313 int nCoeffs =
m_base[dir]->GetNumModes();
1321 coords[0] = (edge == 0 || edge == 3) ? -1.0 : 1.0;
1328 Vmath::Vcopy(nCoeffs, m_Ix->GetPtr(), 1, Mat->GetPtr(), 1);
1354 int qa =
m_base[0]->GetNumPoints();
1355 int qb =
m_base[1]->GetNumPoints();
1356 int nmodes_a =
m_base[0]->GetNumModes();
1357 int nmodes_b =
m_base[1]->GetNumModes();
1358 int nmodes = min(nmodes_a, nmodes_b);
1371 OrthoExp.
FwdTrans(array, orthocoeffs);
1381 for (
int j = 0; j < nmodes_a; ++j)
1383 for (
int k = 0; k < nmodes_b; ++k)
1387 pow((1.0 * j) / (nmodes_a - 1), cutoff * nmodes_a),
1388 pow((1.0 * k) / (nmodes_b - 1), cutoff * nmodes_b));
1390 orthocoeffs[j * nmodes_b + k] *= SvvDiffCoeff * fac;
1401 max_ab = max(max_ab, 0);
1404 for (
int j = 0; j < nmodes_a; ++j)
1406 for (
int k = 0; k < nmodes_b; ++k)
1408 int maxjk = max(j, k);
1411 orthocoeffs[j * nmodes_b + k] *=
1421 min(nmodes_a, nmodes_b));
1424 for (
int j = 0; j < nmodes_a; ++j)
1426 for (
int k = 0; k < nmodes_b; ++k)
1428 if (j + k >= cutoff)
1430 orthocoeffs[j * nmodes_b + k] *=
1432 exp(-(j + k - nmodes) * (j + k - nmodes) /
1434 (j + k - cutoff + 1)))));
1438 orthocoeffs[j * nmodes_b + k] *= 0.0;
1445 OrthoExp.
BwdTrans(orthocoeffs, array);
1454 int qa =
m_base[0]->GetNumPoints();
1455 int qb =
m_base[1]->GetNumPoints();
1456 int nmodesA =
m_base[0]->GetNumModes();
1457 int nmodesB =
m_base[1]->GetNumModes();
1458 int P = nmodesA - 1;
1459 int Q = nmodesB - 1;
1470 int Pcut = cutoff *
P;
1471 int Qcut = cutoff * Q;
1475 OrthoExp.
FwdTrans(array, orthocoeffs);
1479 for (
int i = 0; i < nmodesA; ++i)
1481 for (
int j = 0; j < nmodesB; ++j)
1484 if (i > Pcut || j > Qcut)
1488 fac = max(fac1, fac2);
1489 fac = pow(fac, exponent);
1490 orthocoeffs[i * nmodesB + j] *= exp(-alpha * fac);
1496 OrthoExp.
BwdTrans(orthocoeffs, array);
1503 int n_coeffs = inarray.size();
1510 int nmodes0 =
m_base[0]->GetNumModes();
1511 int nmodes1 =
m_base[1]->GetNumModes();
1512 int numMax = nmodes0;
1532 for (
int i = 0; i < numMin + 1; ++i)
1534 Vmath::Vcopy(numMin, tmp = coeff + cnt, 1, tmp2 = coeff_tmp + cnt, 1);
1583 int nquad0 =
m_base[0]->GetNumPoints();
1584 int nquad1 =
m_base[1]->GetNumPoints();
1590 for (i = 0; i < nquad1; ++i)
1592 Vmath::Vmul(nquad0, inarray.data() + i * nquad0, 1, w0.data(), 1,
1593 outarray.data() + i * nquad0, 1);
1596 for (i = 0; i < nquad0; ++i)
1598 Vmath::Vmul(nquad1, outarray.data() + i, nquad0, w1.data(), 1,
1599 outarray.data() + i, nquad0);
1606 int np1 =
m_base[0]->GetNumPoints();
1607 int np2 =
m_base[1]->GetNumPoints();
1608 int np = max(np1, np2);
1615 for (
int i = 0; i < np - 1; ++i)
1618 for (
int j = 0; j < np - 1; ++j)
1620 conn[cnt++] = row + j;
1621 conn[cnt++] = row + j + 1;
1622 conn[cnt++] = rowp1 + j;
1624 conn[cnt++] = rowp1 + j + 1;
1625 conn[cnt++] = rowp1 + j;
1626 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
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.
void v_HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
NekDouble BaryTensorDeriv(const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs)
NekDouble Integral(const Array< OneD, const NekDouble > &inarray, const Array< OneD, const NekDouble > &w0, const Array< OneD, const NekDouble > &w1)
void BwdTrans_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0=true, bool doCheckCollDir1=true)
void v_LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
void IProductWRTBase_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0=true, bool doCheckCollDir1=true)
The base class for all shapes.
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.
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)
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)
This function performs the Forward transformation from physical space to coefficient space.
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.
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
int GetBasisNumModes(const int dir) const
This function returns the number of expansion modes in the dir direction.
Array< OneD, LibUtilities::BasisSharedPtr > m_base
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_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Transform a given function from physical quadrature space to coefficient space.
void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_ExponentialFilter(Array< OneD, NekDouble > &array, const NekDouble alpha, const NekDouble exponent, const NekDouble cutoff) override
void v_BwdTrans_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1) 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
void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) 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_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.
void v_GetInteriorMap(Array< OneD, unsigned int > &outarray) override
int v_GetNverts() const final
NekDouble v_Integral(const Array< OneD, const NekDouble > &inarray) override
Integrates the specified function over the domain.
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
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_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true) override
void v_IProductWRTDerivBase(const int dir, 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 > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1) override
void v_GetTraceInteriorToElementMap(const int eid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation edgeOrient=eForwards) 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=NullNekDouble1DArray) override
Calculate the derivative of the physical points.
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.
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 Dcopy(const int &n, const double *x, const int &incx, double *y, const int &incy)
BLAS level 1: Copy x to y.
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...
int getNumberOfCoefficients(int Na, int Nb)
BasisManagerT & BasisManager(void)
std::shared_ptr< Basis > BasisSharedPtr
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
@ P
Monomial polynomials .
@ 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
const int kSVVDGFiltermodesmax
const NekDouble kSVVDGFilter[9][11]
@ ePhysInterpToEquiSpaced
std::map< ConstFactorType, NekDouble > ConstFactorMap
std::shared_ptr< StdSegExp > StdSegExpSharedPtr
StdRegions::ConstFactorMap factors
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 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.