51 : StdExpansion(),
Expansion(pGeom), StdExpansion2D()
61 "Geometric information is not set up");
96 "Need to specify eFactorGJP to construct "
97 "a HelmholtzGJP matrix");
101 factor /= MassMat.Scale();
103 int ntot = MassMat.GetRows() * MassMat.GetColumns();
106 MassMat.GetRawPtr(), 1, &NDTraceMat->GetPtr()[0], 1);
109 MassMat.Scale(), NDTraceMat);
181 int rows = deriv0.GetRows();
182 int cols = deriv1.GetColumns();
187 df[2 * dir][0] * deriv0 + df[2 * dir + 1][0] * deriv1;
253 int rows = derivxi.GetRows();
254 int cols = deriveta.GetColumns();
259 (*WeakDirDeriv) = derivxi + deriveta;
271 (*WeakDirDeriv) = (*WeakDirDeriv) + (*DiveMassmat);
316 int rows = lap00.GetRows();
317 int cols = lap00.GetColumns();
322 (*lap) = gmat[0][0] * lap00 +
323 gmat[1][0] * (lap01 +
Transpose(lap01)) +
348 int rows = LapMat.GetRows();
349 int cols = LapMat.GetColumns();
355 (*helm) = LapMat + factor * MassMat;
371 "Need to specify eFactorGJP to construct "
372 "a HelmholtzGJP matrix");
376 factor /= HelmMat.Scale();
378 int ntot = HelmMat.GetRows() * HelmMat.GetColumns();
381 HelmMat.GetRawPtr(), 1, &NDTraceMat->GetPtr()[0], 1);
384 HelmMat.Scale(), NDTraceMat);
432 int rows = LapMat.GetRows();
433 int cols = LapMat.GetColumns();
439 (*adr) = LapMat - lambda * MassMat + AdvMat;
445 if (!massVarcoeffs.empty())
449 if (!lapVarcoeffs.empty())
504 "Need to specify eFactorGJP to construct "
505 "a LinearAdvectionDiffusionReactionGJP matrix");
507 int rows = LapMat.GetRows();
508 int cols = LapMat.GetColumns();
515 LapMat - lambda * MassMat + AdvMat + gjpfactor * NDTraceMat;
593 int rows = stdiprod0.GetRows();
594 int cols = stdiprod1.GetColumns();
599 df[2 * dir][0] * stdiprod0 + df[2 * dir + 1][0] * stdiprod1;
624 "Matrix only setup for quad elements currently");
630 coords[0] = (edge == 0 || edge == 3) ? -1.0 : 1.0;
632 m_Ix =
m_base[(edge + 1) % 2]->GetI(coords);
680 for (
int i = 0; i < nedges; ++i)
686 if (edgeExp->GetRightAdjacentElementExp())
688 if (edgeExp->GetRightAdjacentElementExp()
690 ->GetGlobalID() ==
GetGeom()->GetGlobalID())
702 int nquad_e = min(EdgeExp->GetNumPoints(0),
int(normals[0].size()));
704 int nEdgePts = EdgeExp->GetTotPoints();
706 Vmath::Vmul(nquad_e, normals[0], 1, Fx, 1, edgePhys, 1);
707 Vmath::Vvtvp(nquad_e, normals[1], 1, Fy, 1, edgePhys, 1, edgePhys, 1);
713 if (locExp->GetRightAdjacentElementExp()->GetGeom()->GetGlobalID() ==
734 for (i = 0; i < nedges; ++i)
740 if (edgeExp->GetRightAdjacentElementExp())
742 if (edgeExp->GetRightAdjacentElementExp()
744 ->GetGlobalID() ==
GetGeom()->GetGlobalID())
758 int order_e = map->size();
760 int n_coeffs = EdgeExp->GetNcoeffs();
763 if (n_coeffs != order_e)
765 EdgeExp->FwdTrans(Fn, edgeCoeffs);
777 EdgeExp->GetBasis(0)->GetNumModes(),
778 EdgeExp->GetBasis(0)->GetPointsKey());
780 EdgeExp->GetBasis(0)->GetNumModes(),
781 EdgeExp->GetBasis(0)->GetPointsKey());
785 for (i = order_e; i < n_coeffs; i++)
794 EdgeExp->MassMatrixOp(edgeCoeffs, edgeCoeffs, masskey);
798 EdgeExp->IProductWRTBase(Fn, edgeCoeffs);
812 for (i = 0; i < order_e; ++i)
814 outarray[(*map)[i].index] += (*map)[i].sign * edgeCoeffs[i];
819 int nCoeffs0, nCoeffs1;
833 nCoeffs1 =
m_base[1]->GetNumModes();
835 for (i = 0; i < order_e; ++i)
837 for (j = 0; j < nCoeffs1; j++)
839 outarray[(*map)[i].index + j * order_e] +=
840 mat_gauss->GetPtr()[j] * (*map)[i].sign *
848 nCoeffs0 =
m_base[0]->GetNumModes();
850 for (i = 0; i < order_e; ++i)
852 for (j = 0; j < nCoeffs0; j++)
854 outarray[(*map)[i].index - j] +=
855 mat_gauss->GetPtr()[order_e - 1 - j] *
856 (*map)[i].sign * edgeCoeffs[i];
863 nCoeffs1 =
m_base[1]->GetNumModes();
865 for (i = 0; i < order_e; ++i)
867 for (j = 0; j < nCoeffs1; j++)
869 outarray[(*map)[i].index - j * order_e] +=
870 mat_gauss->GetPtr()[order_e - 1 - j] *
871 (*map)[i].sign * edgeCoeffs[i];
878 nCoeffs0 =
m_base[0]->GetNumModes();
880 for (i = 0; i < order_e; ++i)
882 for (j = 0; j < nCoeffs0; j++)
884 outarray[(*map)[i].index + j] +=
885 mat_gauss->GetPtr()[j] * (*map)[i].sign *
892 ASSERTL0(
false,
"edge value (< 3) is out of range");
905 for (i = 0; i < nedges; ++i)
907 EdgeExp[i]->SetCoeffsToOrientation(
924 int order_e, nquad_e;
928 for (e = 0; e < nedges; ++e)
930 order_e = EdgeExp[e]->GetNcoeffs();
931 nquad_e = EdgeExp[e]->GetNumPoints(0);
938 for (i = 0; i < order_e; ++i)
940 edgeCoeffs[i] = inarray[i + cnt];
944 EdgeExp[e]->BwdTrans(edgeCoeffs, edgePhys);
966 Vmath::Vmul(nquad_e, ncdotMF_e, 1, edgePhys, 1, edgePhys, 1);
970 Vmath::Vmul(nquad_e, normals[dir], 1, edgePhys, 1, edgePhys, 1);
986 for (e = 0; e < nedges; ++e)
988 nquad_e = EdgeExp[e]->GetNumPoints(0);
994 EdgeExp[e]->BwdTrans(edgeCoeffs[e], edgePhys);
996 Vmath::Vmul(nquad_e, normals[dir], 1, edgePhys, 1, edgePhys, 1);
1012 int order_e = EdgeExp->GetNcoeffs();
1013 int nquad_e = EdgeExp->GetNumPoints(0);
1023 StdRegions::VarCoeffMap::const_iterator x;
1026 if ((x = varcoeffs.find(VarCoeff[0])) != varcoeffs.end())
1031 Vmath::Vmul(nquad_e, work, 1, edgePhys, 1, edgePhys, 1);
1034 EdgeExp->IProductWRTBase(edgePhys, coeff);
1037 for (i = 0; i < order_e; ++i)
1039 outarray[map[i]] +=
sign[i] * coeff[i];
1051 ASSERTL0(&inarray[0] != &outarray[0],
1052 "Input and output arrays use the same memory");
1059 for (e = 0; e < nedges; ++e)
1061 order_e = EdgeExp[e]->GetNcoeffs();
1065 Vmath::Vcopy(order_e, tmp = inarray + cnt, 1, edgeCoeffs, 1);
1066 EdgeExp[e]->BwdTrans(edgeCoeffs, edgePhys);
1083 int nquad_e = EdgeExp[edge]->GetNumPoints(0);
1084 int order_e = EdgeExp[edge]->GetNcoeffs();
1113 StdRegions::VarCoeffMap::const_iterator x;
1115 if ((x = varcoeffs.find(VarCoeff[0])) != varcoeffs.end())
1119 x->second.GetValue(), work);
1120 Vmath::Vmul(nquad_e, work, 1, edgePhys, 1, edgePhys, 1);
1126 EdgeExp[edge]->IProductWRTBase(edgePhys, outcoeff);
1128 for (i = 0; i < order_e; ++i)
1130 outarray[emap[i]] +=
sign[i] * tau * outcoeff[i];
1140 for (n = 0; n < coordim; ++n)
1155 Vmath::Vmul(nquad_e, ncdotMF_e, 1, edgePhys, 1, inval, 1);
1159 Vmath::Vmul(nquad_e, normals[n], 1, edgePhys, 1, inval, 1);
1173 EdgeExp[edge]->IProductWRTBase(inval, outcoeff);
1176 for (i = 0; i < ncoeffs; ++i)
1179 for (j = 0; j < order_e; ++j)
1181 tmpcoeff[i] += (*invMass)(i, emap[j]) *
sign[j] * outcoeff[j];
1189 GetMF(n, coordim, varcoeffs);
1199 Coeffs = Coeffs + Dmat * Tmpcoeff;
1203 if (varcoeffs.find(VarCoeff[n]) != varcoeffs.end())
1209 Coeffs = Coeffs + Dmat * Tmpcoeff;
1214 Coeffs = Coeffs + Dmat * Tmpcoeff;
1240 for (
unsigned int i = 0; i < EdgeExp->GetNcoeffs(); ++i)
1242 edgetmp[i] = tmp[emap[i]];
1246 EdgeExp->BwdTrans(edgetmp, outarray);
1266 "HybridDGHelmholtz matrix not set up "
1267 "for non boundary-interior expansions");
1290 DNekMat LocMat(ncoeffs, ncoeffs);
1301 StdRegions::VarCoeffMap::const_iterator x;
1303 for (i = 0; i < coordim; ++i)
1311 GetMF(i, shapedim, varcoeffs);
1332 Mat = Mat + Dmat * invMass *
Transpose(Dmat);
1345 Mat = Mat + DmatL * invMass *
Transpose(DmatR);
1350 Mat = Mat + Dmat * invMass *
Transpose(Dmat);
1356 Mat = Mat + lambdaval * Mass;
1359 for (i = 0; i < nedges; ++i)
1362 order_e = EdgeExp->GetNcoeffs();
1364 int nq = EdgeExp->GetNumPoints(0);
1383 for (j = 0; j < order_e; ++j)
1385 for (k = 0; k < order_e; ++k)
1387 Mat(emap[j], emap[k]) =
1388 Mat(emap[j], emap[k]) +
1426 for (i = 0; i < nedges; ++i)
1434 for (j = 0; j < nbndry; ++j)
1451 for (k = 0; k < ncoeffs; ++k)
1453 Umat(k, j) = Ulam[k];
1499 for (i = 0; i < nedges; ++i)
1521 ASSERTL0(
false,
"Direction not known");
1530 GetMF(dir, shapedim, varcoeffs);
1566 for (j = 0; j < nbndry; ++j)
1572 for (k = 0; k < ncoeffs; ++k)
1574 Ulam[k] = lamToU(k, j);
1592 &(Qmat.GetPtr())[0] + j * ncoeffs, 1);
1600 int order_e, nquad_e;
1605 StdRegions::VarCoeffMap::const_iterator x;
1654 for (i = 0; i < nedges; ++i)
1660 for (i = 0; i < nbndry; ++i)
1668 for (e = 0; e < nedges; ++e)
1670 order_e = EdgeExp[e]->GetNcoeffs();
1671 nquad_e = EdgeExp[e]->GetNumPoints(0);
1688 for (j = 0; j < order_e; ++j)
1690 edgeCoeffs[j] =
sign[j] * (*LamToQ[0])(emap[j], i);
1693 EdgeExp[e]->BwdTrans(edgeCoeffs, edgePhys);
1706 0, e, EdgeExp[e], normals, varcoeffs);
1707 Vmath::Vmul(nquad_e, ncdotMF, 1, edgePhys, 1, work, 1);
1711 Vmath::Vmul(nquad_e, normals[0], 1, edgePhys, 1, work,
1716 for (j = 0; j < order_e; ++j)
1718 edgeCoeffs[j] =
sign[j] * (*LamToQ[1])(emap[j], i);
1721 EdgeExp[e]->BwdTrans(edgeCoeffs, edgePhys);
1736 1, e, EdgeExp[e], normals, varcoeffs);
1737 Vmath::Vvtvp(nquad_e, ncdotMF, 1, edgePhys, 1, work, 1,
1742 Vmath::Vvtvp(nquad_e, normals[1], 1, edgePhys, 1, work,
1749 for (j = 0; j < order_e; ++j)
1751 edgeCoeffs[j] =
sign[j] * (*LamToQ[2])(emap[j], i);
1754 EdgeExp[e]->BwdTrans(edgeCoeffs, edgePhys);
1765 Vmath::Vvtvp(nquad_e, normals[2], 1, edgePhys, 1, work,
1771 for (j = 0; j < order_e; ++j)
1774 sign[j] * LamToU(emap[j], i) - lam[cnt + j];
1777 EdgeExp[e]->BwdTrans(edgeCoeffs, edgePhys);
1780 if ((x = varcoeffs.find(VarCoeff[0])) != varcoeffs.end())
1783 e, EdgeExp[e], x->second.GetValue(), varcoeff_work);
1784 Vmath::Vmul(nquad_e, varcoeff_work, 1, edgePhys, 1,
1788 Vmath::Svtvp(nquad_e, -tau, edgePhys, 1, work, 1, work, 1);
1790 EdgeExp[e]->IProductWRTBase(work, edgeCoeffs);
1792 EdgeExp[e]->SetCoeffsToOrientation(edgedir, edgeCoeffs,
1795 for (j = 0; j < order_e; ++j)
1797 BndMat(cnt + j, i) = edgeCoeffs[j];
1813 LapMat.GetRows(), LapMat.GetColumns());
1843 for (
int d = 0;
d < ncoords; ++
d)
1851 for (
int t = 0; t < ntraces; ++t)
1854 tracepts[t] = traceExp[t]->GetTotPoints();
1855 maxtpts = (maxtpts > tracepts[t]) ? maxtpts : tracepts[t];
1861 for (
int t = 0; t < ntraces; ++t)
1870 PhysDeriv(phys, Deriv[0], Deriv[1], Deriv[2]);
1872 for (
int t = 0; t < ntraces; ++t)
1878 traceExp[t]->GetBasis(0)->GetBasisKey();
1879 bool DoInterp = (fromkey != tokey);
1883 for (
int d = 0;
d < ncoords; ++
d)
1899 tmp = dphidn[t] + i * tracepts[t], 1,
1900 tmp1 = dphidn[t] + i * tracepts[t], 1);
1905 for (
int t = 0; t < ntraces; ++t)
1907 int nt = tracepts[t];
1913 (
p == 1) ? 0.02 * h * h : 0.8 * pow(
p + 1, -4.0) * h * h;
1920 dphidn[t] + j * nt, 1, val, 1);
1922 Mat(i, j) + scale * traceExp[t]->Integral(val);
1930 for (
int j = 0; j < i; ++j)
1932 Mat(i, j) = Mat(j, i);
1939 "This matrix type cannot be generated from this class");
1976 Out_d = InvMass * Coeffs;
1991 "Not set up for non boundary-interior expansions");
1992 ASSERTL1(inoutmat->GetRows() == inoutmat->GetColumns(),
1993 "Assuming that input matrix was square");
1997 int order_e = edgeExp->GetNcoeffs();
2008 DNekScalMat &edgemat = *edgeExp->GetLocMatrix(mkey);
2022 int rows = inoutmat->GetRows();
2037 for (i = 0; i < order_e; ++i)
2039 for (j = 0; j < nbndry; ++j)
2041 if (map[i] == bmap[j])
2047 ASSERTL1(j != nbndry,
"Did not find number in map");
2057 for (i = 0; i < edge; ++i)
2062 for (i = 0; i < order_e; ++i)
2069 switch (edgeExp->GetBasis(0)->GetBasisType())
2072 reverse(map.get(), map.get() + order_e);
2075 reverse(map.get(), map.get() + order_e);
2079 swap(map[0], map[1]);
2080 for (i = 3; i < order_e; i += 2)
2088 "Edge boundary type not valid for this method");
2094 ASSERTL0(
false,
"Could not identify matrix type from dimension");
2097 for (i = 0; i < order_e; ++i)
2100 for (j = 0; j < order_e; ++j)
2103 (*inoutmat)(id1, id2) += edgemat(i, j) *
sign[i] *
sign[j];
2121 "Not set up for non boundary-interior expansions");
2124 int order_e = edgeExp->GetNcoeffs();
2135 DNekScalMat &edgemat = *edgeExp->GetLocMatrix(mkey);
2141 for (i = 0; i < order_e; ++i)
2143 vEdgeCoeffs[i] = incoeffs[map[i]] *
sign[i];
2146 vEdgeCoeffs = edgemat * vEdgeCoeffs;
2148 for (i = 0; i < order_e; ++i)
2150 coeffs[map[i]] += vEdgeCoeffs[i] *
sign[i];
2160 int nVerts, vid1, vid2, vMap1, vMap2;
2167 DNekMat &VertexMat = (*m_vertexmatrix);
2169 for (vid1 = 0; vid1 < nVerts; ++vid1)
2173 for (vid2 = 0; vid2 < nVerts; ++vid2)
2176 VertexValue = (*r_bnd)(vMap1, vMap2);
2177 VertexMat.SetValue(vid1, vid2, VertexValue);
2181 return m_vertexmatrix;
2201 map<int, int> invmap;
2202 for (j = 0; j < nBndCoeffs; ++j)
2204 invmap[bmap[j]] = j;
2220 for (n = 0; n < nEdgeCoeffs; ++n)
2222 edgemaparray[n] = invmap[maparray[n]];
2225 return edgemaparray;
2235 [[maybe_unused]]
const int nq1)
2237 if (idmap.size() != nq0)
2245 for (
int i = 0; i < nq0; ++i)
2253 for (
int i = 0; i < nq0; ++i)
2255 idmap[i] = nq0 - 1 - i;
2260 ASSERTL0(
false,
"Unknown orientation");
2271 int nquad_e = EdgeExp_e->GetNumPoints(0);
2273 int nquad0 =
m_base[0]->GetNumPoints();
2274 int nquad1 =
m_base[1]->GetNumPoints();
2275 int nqtot = nquad0 * nquad1;
2287 StdRegions::VarCoeffMap::const_iterator MFdir;
2292 for (
int k = 0; k < coordim; k++)
2294 MFdir = varcoeffs.find(MMFCoeffs[dir * 5 + k]);
2295 tmp = MFdir->second.GetValue();
2299 Vmath::Vvtvp(nquad_e, &tmp_e[0], 1, &normals[k][0], 1, &ncdotMF[0], 1,
2314 Vmath::Vmul(nq, &vec[0][0], 1, &normals[0][0], 1, &Fn[0], 1);
2315 Vmath::Vvtvp(nq, &vec[1][0], 1, &normals[1][0], 1, &Fn[0], 1, &Fn[0], 1);
2316 Vmath::Vvtvp(nq, &vec[2][0], 1, &normals[2][0], 1, &Fn[0], 1, &Fn[0], 1);
2318 return StdExpansion::Integral(Fn);
2325 int nverts = geom->GetNumVerts();
2333 *geom->
GetVertex((traceid + (nverts - 1)) % nverts);
2345 h =
sqrt(h1 * h1 - d1 * d1 / lenDx);
2350 h1 = ev1.
dist(vadj1);
2351 Dx1.
Sub(vadj1, ev1);
2354 h = (h +
sqrt(h1 * h1 - d1 * d1 / lenDx)) * 0.5;
2356 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.
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
DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
std::vector< bool > m_requireNeg
void v_AddRobinTraceContribution(const int traceid, const Array< OneD, const NekDouble > &primCoeffs, const Array< OneD, NekDouble > &incoeffs, Array< OneD, NekDouble > &coeffs) override
void v_SetUpPhysNormals(const int edge) override
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)
DNekMatSharedPtr v_BuildVertexMatrix(const DNekScalMatSharedPtr &r_bnd) override
NekDouble v_VectorFlux(const Array< OneD, Array< OneD, NekDouble > > &vec) override
DNekScalMatSharedPtr CreateMatrix(const MatrixKey &mkey)
Array< OneD, unsigned int > GetTraceInverseBoundaryMap(int eid)
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)
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
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)
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
static VarCoeffMap NullVarCoeffMap
std::map< StdRegions::VarCoeffType, VarCoeffEntry > VarCoeffMap
std::vector< double > d(NPUPPER *NPUPPER)
StdRegions::ConstFactorMap factors
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)