35#include <boost/core/ignore_unused.hpp>
55 : StdExpansion(),
Expansion(pGeom), StdExpansion2D()
65 "Geometric information is not set up");
100 "Need to specify eFactorGJP to construct "
101 "a HelmholtzGJP matrix");
105 factor /= MassMat.Scale();
107 int ntot = MassMat.GetRows() * MassMat.GetColumns();
110 MassMat.GetRawPtr(), 1, &NDTraceMat->GetPtr()[0], 1);
113 MassMat.Scale(), NDTraceMat);
179 int rows = deriv0.GetRows();
180 int cols = deriv1.GetColumns();
185 df[2 * dir][0] * deriv0 + df[2 * dir + 1][0] * deriv1;
251 int rows = derivxi.GetRows();
252 int cols = deriveta.GetColumns();
257 (*WeakDirDeriv) = derivxi + deriveta;
269 (*WeakDirDeriv) = (*WeakDirDeriv) + (*DiveMassmat);
314 int rows = lap00.GetRows();
315 int cols = lap00.GetColumns();
320 (*lap) = gmat[0][0] * lap00 +
321 gmat[1][0] * (lap01 +
Transpose(lap01)) +
346 int rows = LapMat.GetRows();
347 int cols = LapMat.GetColumns();
353 (*helm) = LapMat + factor * MassMat;
369 "Need to specify eFactorGJP to construct "
370 "a HelmholtzGJP matrix");
374 factor /= HelmMat.Scale();
376 int ntot = HelmMat.GetRows() * HelmMat.GetColumns();
379 HelmMat.GetRawPtr(), 1, &NDTraceMat->GetPtr()[0], 1);
382 HelmMat.Scale(), NDTraceMat);
421 int rows = LapMat.GetRows();
422 int cols = LapMat.GetColumns();
428 (*adr) = LapMat - lambda * MassMat + AdvMat;
498 "Need to specify eFactorGJP to construct "
499 "a LinearAdvectionDiffusionReactionGJP matrix");
501 int rows = LapMat.GetRows();
502 int cols = LapMat.GetColumns();
509 LapMat - lambda * MassMat + AdvMat + gjpfactor * NDTraceMat;
596 int rows = stdiprod0.GetRows();
597 int cols = stdiprod1.GetColumns();
602 df[2 * dir][0] * stdiprod0 + df[2 * dir + 1][0] * stdiprod1;
627 "Matrix only setup for quad elements currently");
633 coords[0] = (edge == 0 || edge == 3) ? -1.0 : 1.0;
635 m_Ix =
m_base[(edge + 1) % 2]->GetI(coords);
683 for (
int i = 0; i < nedges; ++i)
689 if (edgeExp->GetRightAdjacentElementExp())
691 if (edgeExp->GetRightAdjacentElementExp()
693 ->GetGlobalID() ==
GetGeom()->GetGlobalID())
705 int nquad_e = min(EdgeExp->GetNumPoints(0),
int(normals[0].size()));
707 int nEdgePts = EdgeExp->GetTotPoints();
709 Vmath::Vmul(nquad_e, normals[0], 1, Fx, 1, edgePhys, 1);
710 Vmath::Vvtvp(nquad_e, normals[1], 1, Fy, 1, edgePhys, 1, edgePhys, 1);
716 if (locExp->GetRightAdjacentElementExp()->GetGeom()->GetGlobalID() ==
737 for (i = 0; i < nedges; ++i)
743 if (edgeExp->GetRightAdjacentElementExp())
745 if (edgeExp->GetRightAdjacentElementExp()
747 ->GetGlobalID() ==
GetGeom()->GetGlobalID())
761 int order_e = map->size();
763 int n_coeffs = EdgeExp->GetNcoeffs();
766 if (n_coeffs != order_e)
768 EdgeExp->FwdTrans(Fn, edgeCoeffs);
780 EdgeExp->GetBasis(0)->GetNumModes(),
781 EdgeExp->GetBasis(0)->GetPointsKey());
783 EdgeExp->GetBasis(0)->GetNumModes(),
784 EdgeExp->GetBasis(0)->GetPointsKey());
788 for (i = order_e; i < n_coeffs; i++)
797 EdgeExp->MassMatrixOp(edgeCoeffs, edgeCoeffs, masskey);
801 EdgeExp->IProductWRTBase(Fn, edgeCoeffs);
815 for (i = 0; i < order_e; ++i)
817 outarray[(*map)[i].index] += (*map)[i].sign * edgeCoeffs[i];
822 int nCoeffs0, nCoeffs1;
836 nCoeffs1 =
m_base[1]->GetNumModes();
838 for (i = 0; i < order_e; ++i)
840 for (j = 0; j < nCoeffs1; j++)
842 outarray[(*map)[i].index + j * order_e] +=
843 mat_gauss->GetPtr()[j] * (*map)[i].sign *
851 nCoeffs0 =
m_base[0]->GetNumModes();
853 for (i = 0; i < order_e; ++i)
855 for (j = 0; j < nCoeffs0; j++)
857 outarray[(*map)[i].index - j] +=
858 mat_gauss->GetPtr()[order_e - 1 - j] *
859 (*map)[i].sign * edgeCoeffs[i];
866 nCoeffs1 =
m_base[1]->GetNumModes();
868 for (i = 0; i < order_e; ++i)
870 for (j = 0; j < nCoeffs1; j++)
872 outarray[(*map)[i].index - j * order_e] +=
873 mat_gauss->GetPtr()[order_e - 1 - j] *
874 (*map)[i].sign * edgeCoeffs[i];
881 nCoeffs0 =
m_base[0]->GetNumModes();
883 for (i = 0; i < order_e; ++i)
885 for (j = 0; j < nCoeffs0; j++)
887 outarray[(*map)[i].index + j] +=
888 mat_gauss->GetPtr()[j] * (*map)[i].sign *
895 ASSERTL0(
false,
"edge value (< 3) is out of range");
908 for (i = 0; i < nedges; ++i)
910 EdgeExp[i]->SetCoeffsToOrientation(
927 int order_e, nquad_e;
931 for (e = 0; e < nedges; ++e)
933 order_e = EdgeExp[e]->GetNcoeffs();
934 nquad_e = EdgeExp[e]->GetNumPoints(0);
941 for (i = 0; i < order_e; ++i)
943 edgeCoeffs[i] = inarray[i + cnt];
947 EdgeExp[e]->BwdTrans(edgeCoeffs, edgePhys);
969 Vmath::Vmul(nquad_e, ncdotMF_e, 1, edgePhys, 1, edgePhys, 1);
973 Vmath::Vmul(nquad_e, normals[dir], 1, edgePhys, 1, edgePhys, 1);
989 for (e = 0; e < nedges; ++e)
991 nquad_e = EdgeExp[e]->GetNumPoints(0);
997 EdgeExp[e]->BwdTrans(edgeCoeffs[e], edgePhys);
999 Vmath::Vmul(nquad_e, normals[dir], 1, edgePhys, 1, edgePhys, 1);
1015 int order_e = EdgeExp->GetNcoeffs();
1016 int nquad_e = EdgeExp->GetNumPoints(0);
1026 StdRegions::VarCoeffMap::const_iterator x;
1029 if ((x = varcoeffs.find(VarCoeff[0])) != varcoeffs.end())
1034 Vmath::Vmul(nquad_e, work, 1, edgePhys, 1, edgePhys, 1);
1037 EdgeExp->IProductWRTBase(edgePhys, coeff);
1040 for (i = 0; i < order_e; ++i)
1042 outarray[map[i]] +=
sign[i] * coeff[i];
1054 ASSERTL0(&inarray[0] != &outarray[0],
1055 "Input and output arrays use the same memory");
1062 for (e = 0; e < nedges; ++e)
1064 order_e = EdgeExp[e]->GetNcoeffs();
1068 Vmath::Vcopy(order_e, tmp = inarray + cnt, 1, edgeCoeffs, 1);
1069 EdgeExp[e]->BwdTrans(edgeCoeffs, edgePhys);
1086 int nquad_e = EdgeExp[edge]->GetNumPoints(0);
1087 int order_e = EdgeExp[edge]->GetNcoeffs();
1116 StdRegions::VarCoeffMap::const_iterator x;
1118 if ((x = varcoeffs.find(VarCoeff[0])) != varcoeffs.end())
1122 x->second.GetValue(), work);
1123 Vmath::Vmul(nquad_e, work, 1, edgePhys, 1, edgePhys, 1);
1129 EdgeExp[edge]->IProductWRTBase(edgePhys, outcoeff);
1131 for (i = 0; i < order_e; ++i)
1133 outarray[emap[i]] +=
sign[i] * tau * outcoeff[i];
1143 for (n = 0; n < coordim; ++n)
1158 Vmath::Vmul(nquad_e, ncdotMF_e, 1, edgePhys, 1, inval, 1);
1162 Vmath::Vmul(nquad_e, normals[n], 1, edgePhys, 1, inval, 1);
1176 EdgeExp[edge]->IProductWRTBase(inval, outcoeff);
1179 for (i = 0; i < ncoeffs; ++i)
1182 for (j = 0; j < order_e; ++j)
1184 tmpcoeff[i] += (*invMass)(i, emap[j]) *
sign[j] * outcoeff[j];
1192 GetMF(n, coordim, varcoeffs);
1202 Coeffs = Coeffs + Dmat * Tmpcoeff;
1206 if (varcoeffs.find(VarCoeff[n]) != varcoeffs.end())
1212 Coeffs = Coeffs + Dmat * Tmpcoeff;
1217 Coeffs = Coeffs + Dmat * Tmpcoeff;
1243 for (
unsigned int i = 0; i < EdgeExp->GetNcoeffs(); ++i)
1245 edgetmp[i] = tmp[emap[i]];
1249 EdgeExp->BwdTrans(edgetmp, outarray);
1269 "HybridDGHelmholtz matrix not set up "
1270 "for non boundary-interior expansions");
1293 DNekMat LocMat(ncoeffs, ncoeffs);
1304 StdRegions::VarCoeffMap::const_iterator x;
1306 for (i = 0; i < coordim; ++i)
1314 GetMF(i, shapedim, varcoeffs);
1335 Mat = Mat + Dmat * invMass *
Transpose(Dmat);
1348 Mat = Mat + DmatL * invMass *
Transpose(DmatR);
1353 Mat = Mat + Dmat * invMass *
Transpose(Dmat);
1359 Mat = Mat + lambdaval * Mass;
1362 for (i = 0; i < nedges; ++i)
1365 order_e = EdgeExp->GetNcoeffs();
1367 int nq = EdgeExp->GetNumPoints(0);
1386 for (j = 0; j < order_e; ++j)
1388 for (k = 0; k < order_e; ++k)
1390 Mat(emap[j], emap[k]) =
1391 Mat(emap[j], emap[k]) +
1429 for (i = 0; i < nedges; ++i)
1437 for (j = 0; j < nbndry; ++j)
1454 for (k = 0; k < ncoeffs; ++k)
1456 Umat(k, j) = Ulam[k];
1502 for (i = 0; i < nedges; ++i)
1524 ASSERTL0(
false,
"Direction not known");
1533 GetMF(dir, shapedim, varcoeffs);
1569 for (j = 0; j < nbndry; ++j)
1575 for (k = 0; k < ncoeffs; ++k)
1577 Ulam[k] = lamToU(k, j);
1595 &(Qmat.GetPtr())[0] + j * ncoeffs, 1);
1603 int order_e, nquad_e;
1608 StdRegions::VarCoeffMap::const_iterator x;
1657 for (i = 0; i < nedges; ++i)
1663 for (i = 0; i < nbndry; ++i)
1671 for (e = 0; e < nedges; ++e)
1673 order_e = EdgeExp[e]->GetNcoeffs();
1674 nquad_e = EdgeExp[e]->GetNumPoints(0);
1691 for (j = 0; j < order_e; ++j)
1693 edgeCoeffs[j] =
sign[j] * (*LamToQ[0])(emap[j], i);
1696 EdgeExp[e]->BwdTrans(edgeCoeffs, edgePhys);
1709 0, e, EdgeExp[e], normals, varcoeffs);
1710 Vmath::Vmul(nquad_e, ncdotMF, 1, edgePhys, 1, work, 1);
1714 Vmath::Vmul(nquad_e, normals[0], 1, edgePhys, 1, work,
1719 for (j = 0; j < order_e; ++j)
1721 edgeCoeffs[j] =
sign[j] * (*LamToQ[1])(emap[j], i);
1724 EdgeExp[e]->BwdTrans(edgeCoeffs, edgePhys);
1739 1, e, EdgeExp[e], normals, varcoeffs);
1740 Vmath::Vvtvp(nquad_e, ncdotMF, 1, edgePhys, 1, work, 1,
1745 Vmath::Vvtvp(nquad_e, normals[1], 1, edgePhys, 1, work,
1752 for (j = 0; j < order_e; ++j)
1754 edgeCoeffs[j] =
sign[j] * (*LamToQ[2])(emap[j], i);
1757 EdgeExp[e]->BwdTrans(edgeCoeffs, edgePhys);
1768 Vmath::Vvtvp(nquad_e, normals[2], 1, edgePhys, 1, work,
1774 for (j = 0; j < order_e; ++j)
1777 sign[j] * LamToU(emap[j], i) - lam[cnt + j];
1780 EdgeExp[e]->BwdTrans(edgeCoeffs, edgePhys);
1783 if ((x = varcoeffs.find(VarCoeff[0])) != varcoeffs.end())
1786 e, EdgeExp[e], x->second.GetValue(), varcoeff_work);
1787 Vmath::Vmul(nquad_e, varcoeff_work, 1, edgePhys, 1,
1791 Vmath::Svtvp(nquad_e, -tau, edgePhys, 1, work, 1, work, 1);
1793 EdgeExp[e]->IProductWRTBase(work, edgeCoeffs);
1795 EdgeExp[e]->SetCoeffsToOrientation(edgedir, edgeCoeffs,
1798 for (j = 0; j < order_e; ++j)
1800 BndMat(cnt + j, i) = edgeCoeffs[j];
1816 LapMat.GetRows(), LapMat.GetColumns());
1846 for (
int d = 0;
d < ncoords; ++
d)
1854 for (
int t = 0; t < ntraces; ++t)
1857 tracepts[t] = traceExp[t]->GetTotPoints();
1858 maxtpts = (maxtpts > tracepts[t]) ? maxtpts : tracepts[t];
1864 for (
int t = 0; t < ntraces; ++t)
1873 PhysDeriv(phys, Deriv[0], Deriv[1], Deriv[2]);
1875 for (
int t = 0; t < ntraces; ++t)
1881 traceExp[t]->GetBasis(0)->GetBasisKey();
1882 bool DoInterp = (fromkey != tokey);
1886 for (
int d = 0;
d < ncoords; ++
d)
1902 tmp = dphidn[t] + i * tracepts[t], 1,
1903 tmp1 = dphidn[t] + i * tracepts[t], 1);
1908 for (
int t = 0; t < ntraces; ++t)
1910 int nt = tracepts[t];
1916 (
p == 1) ? 0.02 * h * h : 0.8 * pow(
p + 1, -4.0) * h * h;
1923 dphidn[t] + j * nt, 1, val, 1);
1925 Mat(i, j) + scale * traceExp[t]->Integral(val);
1933 for (
int j = 0; j < i; ++j)
1935 Mat(i, j) = Mat(j, i);
1942 "This matrix type cannot be generated from this class");
1979 Out_d = InvMass * Coeffs;
1994 "Not set up for non boundary-interior expansions");
1995 ASSERTL1(inoutmat->GetRows() == inoutmat->GetColumns(),
1996 "Assuming that input matrix was square");
2000 int order_e = edgeExp->GetNcoeffs();
2011 DNekScalMat &edgemat = *edgeExp->GetLocMatrix(mkey);
2025 int rows = inoutmat->GetRows();
2040 for (i = 0; i < order_e; ++i)
2042 for (j = 0; j < nbndry; ++j)
2044 if (map[i] == bmap[j])
2050 ASSERTL1(j != nbndry,
"Did not find number in map");
2060 for (i = 0; i < edge; ++i)
2065 for (i = 0; i < order_e; ++i)
2072 switch (edgeExp->GetBasis(0)->GetBasisType())
2075 reverse(map.get(), map.get() + order_e);
2078 reverse(map.get(), map.get() + order_e);
2082 swap(map[0], map[1]);
2083 for (i = 3; i < order_e; i += 2)
2091 "Edge boundary type not valid for this method");
2097 ASSERTL0(
false,
"Could not identify matrix type from dimension");
2100 for (i = 0; i < order_e; ++i)
2103 for (j = 0; j < order_e; ++j)
2106 (*inoutmat)(id1, id2) += edgemat(i, j) *
sign[i] *
sign[j];
2124 "Not set up for non boundary-interior expansions");
2127 int order_e = edgeExp->GetNcoeffs();
2138 DNekScalMat &edgemat = *edgeExp->GetLocMatrix(mkey);
2144 for (i = 0; i < order_e; ++i)
2146 vEdgeCoeffs[i] = incoeffs[map[i]] *
sign[i];
2149 vEdgeCoeffs = edgemat * vEdgeCoeffs;
2151 for (i = 0; i < order_e; ++i)
2153 coeffs[map[i]] += vEdgeCoeffs[i] *
sign[i];
2163 int nVerts, vid1, vid2, vMap1, vMap2;
2170 DNekMat &VertexMat = (*m_vertexmatrix);
2172 for (vid1 = 0; vid1 < nVerts; ++vid1)
2176 for (vid2 = 0; vid2 < nVerts; ++vid2)
2179 VertexValue = (*r_bnd)(vMap1, vMap2);
2180 VertexMat.SetValue(vid1, vid2, VertexValue);
2184 return m_vertexmatrix;
2204 map<int, int> invmap;
2205 for (j = 0; j < nBndCoeffs; ++j)
2207 invmap[bmap[j]] = j;
2223 for (n = 0; n < nEdgeCoeffs; ++n)
2225 edgemaparray[n] = invmap[maparray[n]];
2228 return edgemaparray;
2240 boost::ignore_unused(nq1);
2242 if (idmap.size() != nq0)
2250 for (
int i = 0; i < nq0; ++i)
2258 for (
int i = 0; i < nq0; ++i)
2260 idmap[i] = nq0 - 1 - i;
2265 ASSERTL0(
false,
"Unknown orientation");
2276 int nquad_e = EdgeExp_e->GetNumPoints(0);
2278 int nquad0 =
m_base[0]->GetNumPoints();
2279 int nquad1 =
m_base[1]->GetNumPoints();
2280 int nqtot = nquad0 * nquad1;
2292 StdRegions::VarCoeffMap::const_iterator MFdir;
2297 for (
int k = 0; k < coordim; k++)
2299 MFdir = varcoeffs.find(MMFCoeffs[dir * 5 + k]);
2300 tmp = MFdir->second.GetValue();
2304 Vmath::Vvtvp(nquad_e, &tmp_e[0], 1, &normals[k][0], 1, &ncdotMF[0], 1,
2319 Vmath::Vmul(nq, &vec[0][0], 1, &normals[0][0], 1, &Fn[0], 1);
2320 Vmath::Vvtvp(nq, &vec[1][0], 1, &normals[1][0], 1, &Fn[0], 1, &Fn[0], 1);
2321 Vmath::Vvtvp(nq, &vec[2][0], 1, &normals[2][0], 1, &Fn[0], 1, &Fn[0], 1);
2323 return StdExpansion::Integral(Fn);
2330 int nverts = geom->GetNumVerts();
2338 *geom->
GetVertex((traceid + (nverts - 1)) % nverts);
2350 h =
sqrt(h1 * h1 - d1 * d1 / lenDx);
2355 h1 = ev1.
dist(vadj1);
2356 Dx1.
Sub(vadj1, ev1);
2359 h = (h +
sqrt(h1 * h1 - d1 * d1 / lenDx)) * 0.5;
2361 int dirn = (geom->GetDir(traceid) == 0) ? 1 : 0;
#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.
virtual void v_AddEdgeNormBoundaryInt(const int edge, const ExpansionSharedPtr &EdgeExp, const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray) override
virtual DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
std::vector< bool > m_requireNeg
virtual void v_AddRobinTraceContribution(const int traceid, const Array< OneD, const NekDouble > &primCoeffs, const Array< OneD, NekDouble > &incoeffs, Array< OneD, NekDouble > &coeffs) override
virtual void v_SetUpPhysNormals(const int edge) override
virtual void v_AddRobinMassMatrix(const int edgeid, const Array< OneD, const NekDouble > &primCoeffs, DNekMatSharedPtr &inoutmat) override
Array< OneD, NekDouble > GetnEdgecdotMF(const int dir, const int edge, ExpansionSharedPtr &EdgeExp_e, const Array< OneD, const Array< OneD, NekDouble > > &normals, const StdRegions::VarCoeffMap &varcoeffs)
void SetTraceToGeomOrientation(Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, NekDouble > &inout)
virtual DNekMatSharedPtr v_BuildVertexMatrix(const DNekScalMatSharedPtr &r_bnd) override
virtual NekDouble v_VectorFlux(const Array< OneD, Array< OneD, NekDouble > > &vec) override
DNekScalMatSharedPtr CreateMatrix(const MatrixKey &mkey)
Array< OneD, unsigned int > GetTraceInverseBoundaryMap(int eid)
virtual void v_ReOrientTracePhysMap(const StdRegions::Orientation orient, Array< OneD, int > &idmap, const int nq0, const int nq1) override
Expansion2D(SpatialDomains::Geometry2DSharedPtr pGeom)
void AddNormTraceInt(const int dir, Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, Array< OneD, NekDouble > > &edgeCoeffs, Array< OneD, NekDouble > &outarray)
SpatialDomains::Geometry2DSharedPtr GetGeom2D() const
void AddHDGHelmholtzEdgeTerms(const NekDouble tau, const int edge, Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, NekDouble > &edgePhys, const StdRegions::VarCoeffMap &dirForcing, Array< OneD, NekDouble > &outarray)
virtual void v_DGDeriv(const int dir, const Array< OneD, const NekDouble > &incoeffs, Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, Array< OneD, NekDouble > > &edgeCoeffs, Array< OneD, NekDouble > &out_d) override
virtual void v_TraceNormLen(const int traceid, NekDouble &h, NekDouble &p) override
void GetPhysEdgeVarCoeffsFromElement(const int edge, ExpansionSharedPtr &EdgeExp, const Array< OneD, const NekDouble > &varcoeff, Array< OneD, NekDouble > &outarray)
void AddEdgeBoundaryInt(const int edge, ExpansionSharedPtr &EdgeExp, Array< OneD, NekDouble > &edgePhys, Array< OneD, NekDouble > &outarray, const StdRegions::VarCoeffMap &varcoeffs=StdRegions::NullVarCoeffMap)
void AddHDGHelmholtzTraceTerms(const NekDouble tau, const Array< OneD, const NekDouble > &inarray, Array< OneD, ExpansionSharedPtr > &EdgeExp, const StdRegions::VarCoeffMap &dirForcing, Array< OneD, NekDouble > &outarray)
virtual void v_GenTraceExp(const int traceid, ExpansionSharedPtr &exp) override
SpatialDomains::GeometrySharedPtr GetGeom() const
SpatialDomains::GeometrySharedPtr m_geom
void DropLocMatrix(const LocalRegions::MatrixKey &mkey)
ExpansionSharedPtr GetLeftAdjacentElementExp() const
DNekMatSharedPtr BuildVertexMatrix(const DNekScalMatSharedPtr &r_bnd)
void ComputeGmatcdotMF(const Array< TwoD, const NekDouble > &df, const Array< OneD, const NekDouble > &direction, Array< OneD, Array< OneD, NekDouble > > &dfdir)
virtual void v_ComputeTraceNormal(const int id)
Array< OneD, NekDouble > GetMFMag(const int dir, const StdRegions::VarCoeffMap &varcoeffs)
int GetLeftAdjacentElementTrace() const
void GetTracePhysVals(const int trace, const StdRegions::StdExpansionSharedPtr &TraceExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, StdRegions::Orientation orient=StdRegions::eNoOrientation)
std::map< int, ExpansionWeakPtr > m_traceExp
void AddEdgeNormBoundaryInt(const int edge, const std::shared_ptr< Expansion > &EdgeExp, const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray)
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
virtual StdRegions::Orientation v_GetTraceOrient(int trace)
ExpansionSharedPtr GetTraceExp(const int traceid)
StdRegions::Orientation GetTraceOrient(int trace)
IndexMapValuesSharedPtr GetIndexMap(const IndexMapKey &ikey)
DNekScalMatSharedPtr GetLocMatrix(const LocalRegions::MatrixKey &mkey)
Array< OneD, NekDouble > GetMFDiv(const int dir, const StdRegions::VarCoeffMap &varcoeffs)
void TraceNormLen(const int traceid, NekDouble &h, NekDouble &p)
const NormalVector & GetTraceNormal(const int id)
Array< OneD, NekDouble > GetMF(const int dir, const int shapedim, const StdRegions::VarCoeffMap &varcoeffs)
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
PointGeomSharedPtr GetVertex(int i) const
Returns vertex i of this object.
void Sub(PointGeom &a, PointGeom &b)
NekDouble dot(PointGeom &a)
retun the dot product between this and input a
NekDouble dist(PointGeom &a)
return distance between this and input a
void GetBoundaryMap(Array< OneD, unsigned int > &outarray)
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.
int NumBndryCoeffs(void) const
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
const LibUtilities::PointsKeyVector GetPointsKeys() const
int NumDGBndryCoeffs(void) const
DNekScalBlkMatSharedPtr GetLocStaticCondMatrix(const LocalRegions::MatrixKey &mkey)
const LibUtilities::BasisKey GetTraceBasisKey(const int i, int k=-1) const
This function returns the basis key belonging to the i-th trace.
int GetVertexMap(const int localVertexId, bool useCoeffPacking=false)
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...
int GetNtraces() const
Returns the number of trace elements connected to this element.
int GetNverts() const
This function returns the number of vertices of the expansion 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 GetTraceInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eForwards)
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)
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, DNekMat, StdMatrixKey::opLess > m_stdMatrixManager
int GetBasisNumModes(const int dir) const
This function returns the number of expansion modes in the dir direction.
void PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1=NullNekDouble1DArray, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray)
Array< OneD, LibUtilities::BasisSharedPtr > m_base
bool IsBoundaryInteriorExpansion() const
LibUtilities::ShapeType GetShapeType() const
const VarCoeffMap & GetVarCoeffs() const
MatrixType GetMatrixType() const
bool HasVarCoeff(const StdRegions::VarCoeffType &coeff) const
const ConstFactorMap & GetConstFactors() const
const Array< OneD, const NekDouble > & GetVarCoeff(const StdRegions::VarCoeffType &coeff) const
NekDouble GetConstFactor(const ConstFactorType &factor) const
bool ConstFactorExists(const ConstFactorType &factor) const
const VarCoeffMap GetVarCoeffAsMap(const VarCoeffType &coeff) const
void Interp1D(const BasisKey &fbasis0, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, Array< OneD, NekDouble > &to)
this function interpolates a 1D function evaluated at the quadrature points of the basis fbasis0 to ...
void InterpCoeff1D(const BasisKey &fbasis0, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, Array< OneD, NekDouble > &to)
std::vector< PointsKey > PointsKeyVector
@ eGauss_Lagrange
Lagrange Polynomials using the Gauss points.
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eModified_A
Principle Modified Functions .
std::shared_ptr< Expansion > ExpansionSharedPtr
std::shared_ptr< IndexMapValues > IndexMapValuesSharedPtr
std::shared_ptr< Expansion1D > Expansion1DSharedPtr
@ eNoGeomType
No type defined.
@ eDeformed
Geometry is curved or has non-constant factors.
std::shared_ptr< Geometry2D > Geometry2DSharedPtr
std::shared_ptr< Geometry > GeometrySharedPtr
@ eLinearAdvectionDiffusionReaction
@ eLinearAdvectionDiffusionReactionGJP
@ eInvLaplacianWithUnityMean
std::map< ConstFactorType, NekDouble > ConstFactorMap
static ConstFactorMap NullConstFactorMap
std::map< StdRegions::VarCoeffType, VarCoeffEntry > VarCoeffMap
std::vector< double > d(NPUPPER *NPUPPER)
StdRegions::ConstFactorMap factors
The above copyright notice and this permission notice shall be included.
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
std::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
static Array< OneD, NekDouble > NullNekDouble1DArray
NekMatrix< InnerMatrixType, BlockMatrixTag > Transpose(NekMatrix< InnerMatrixType, BlockMatrixTag > &rhs)
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 Neg(int n, T *x, const int incx)
Negate x = -x.
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 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)
scalarT< T > sqrt(scalarT< T > in)