56 int nquad_f = FaceExp->GetNumPoints(0) * FaceExp->GetNumPoints(1);
57 int order_f = FaceExp->GetNcoeffs();
91 if ((x = varcoeffs.find(VarCoeff[0])) != varcoeffs.end())
93 GetPhysFaceVarCoeffsFromElement(face,FaceExp,x->second,varcoeff_work);
94 Vmath::Vmul(nquad_f,varcoeff_work,1,FaceExp->GetPhys(),1,FaceExp->UpdatePhys(),1);
101 FaceExp->IProductWRTBase(facePhys, outcoeff);
103 for (i = 0; i < order_f; ++i)
105 outarray[(*map)[i].index] += (*map)[i].sign * tau * outcoeff[i];
114 for (n = 0; n < coordim; ++n)
129 Vmath::Vmul(nquad_f, ncdotMF_f, 1, facePhys, 1, inval, 1);
133 Vmath::Vmul(nquad_f, normals[n], 1, facePhys, 1, inval, 1);
137 const NekDouble *data = invMass.GetRawPtr();
150 FaceExp->IProductWRTBase(inval, outcoeff);
153 for (i = 0; i < ncoeffs; ++i)
156 for (j = 0; j < order_f; ++j)
158 tmpcoeff[i] += scale * data[i + (*map)[j].index * ncoeffs] *
159 (*map)[j].sign * outcoeff[j];
167 GetMF(n, coordim, varcoeffs);
177 Coeffs = Coeffs + Dmat * Tmpcoeff;
182 Coeffs = Coeffs + Dmat * Tmpcoeff;
219 for (
unsigned int i = 0; i < FaceExp->GetNcoeffs(); ++i)
221 facetmp[i] = tmp[emap[i]];
225 FaceExp->BwdTrans(facetmp, outarray);
239 int order_f, nquad_f;
243 for (f = 0; f < nfaces; ++f)
245 order_f = FaceExp[f]->GetNcoeffs();
246 nquad_f = FaceExp[f]->GetNumPoints(0) * FaceExp[f]->GetNumPoints(1);
253 for (i = 0; i < order_f; ++i)
255 faceCoeffs[i] = inarray[i + cnt];
259 FaceExp[f]->BwdTrans(faceCoeffs, facePhys);
276 StdRegions::VarCoeffMap::const_iterator x;
282 Vmath::Vmul(nquad_f, ncdotMF_f, 1, facePhys, 1, facePhys, 1);
286 Vmath::Vmul(nquad_f, normals[dir], 1, facePhys, 1, facePhys, 1);
303 for (f = 0; f < nfaces; ++f)
305 nquad_f = FaceExp[f]->GetNumPoints(0) * FaceExp[f]->GetNumPoints(1);
311 FaceExp[f]->BwdTrans(faceCoeffs[f], facePhys);
313 Vmath::Vmul(nquad_f, normals[dir], 1, facePhys, 1, facePhys, 1);
328 int order_f = FaceExp->GetNcoeffs();
336 FaceExp->IProductWRTBase(facePhys, coeff);
339 for (i = 0; i < order_f; ++i)
341 outarray[(*map)[i].index] += (*map)[i].sign * coeff[i];
367 ASSERTL1((*map1).size() == (*map2).size(),
368 "There is an error with the GetTraceToElementMap");
370 for (j = 0; j < (*map1).size(); ++j)
373 for (k = 0; k < (*map2).size(); ++k)
376 if ((*map1)[j].index == (*map2)[k].index && k != j)
380 if ((*map1)[j].
sign != (*map2)[k].
sign)
400 for (i = 0; i < nfaces; ++i)
413 "Geometric information is not set up");
500 int rows = deriv0.GetRows();
501 int cols = deriv1.GetColumns();
505 (*WeakDeriv) = df[3 * dir][0] * deriv0 +
506 df[3 * dir + 1][0] * deriv1 +
507 df[3 * dir + 2][0] * deriv2;
561 int rows = lap00.GetRows();
562 int cols = lap00.GetColumns();
567 (*lap) = gmat[0][0] * lap00 + gmat[4][0] * lap11 +
569 gmat[3][0] * (lap01 +
Transpose(lap01)) +
570 gmat[6][0] * (lap02 +
Transpose(lap02)) +
587 int rows = LapMat.GetRows();
588 int cols = LapMat.GetColumns();
594 (*helm) = LapMat + factor * MassMat;
610 "Need to specify eFactorGJP to construct "
611 "a HelmholtzGJP matrix");
615 factor /= HelmMat.Scale();
617 int ntot = HelmMat.GetRows() * HelmMat.GetColumns();
620 HelmMat.GetRawPtr(), 1, &NDTraceMat->GetPtr()[0], 1);
623 HelmMat.Scale(), NDTraceMat);
671 int rows = LapMat.GetRows();
672 int cols = LapMat.GetColumns();
678 (*adr) = LapMat - lambda * MassMat + AdvMat;
737 "Need to specify eFactorGJP to construct "
738 "a LinearAdvectionDiffusionReactionGJP matrix");
740 int rows = LapMat.GetRows();
741 int cols = LapMat.GetColumns();
748 LapMat - lambda * MassMat + AdvMat + gjpfactor * NDTraceMat;
880 "Matrix construction is not implemented for variable "
881 "coefficients at the moment");
892 "HybridDGHelmholtz matrix not set up "
893 "for non boundary-interior expansions");
921 StdRegions::VarCoeffMap::const_iterator x;
924 for (i = 0; i < coordim; ++i)
931 GetMF(i, coordim, varcoeffs);
952 Mat = Mat + Dmat * invMass *
Transpose(Dmat);
957 Mat = Mat + Dmat * invMass *
Transpose(Dmat);
982 Mat = Mat + lambdaval * Mass;
985 for (i = 0; i < nfaces; ++i)
988 order_f = FaceExp->GetNcoeffs();
1013 for (j = 0; j < order_f; ++j)
1015 for (k = 0; k < order_f; ++k)
1017 Mat((*map)[j].index, (*map)[k].index) +=
1018 tau * (*map)[j].sign * (*map)[k].sign *
eMass(j, k);
1058 for (i = 0; i < nfaces; ++i)
1068 for (j = 0; j < nface; ++j)
1072 face_lambda[j] = 1.0;
1077 FaceExp->BwdTrans(face_lambda, tmp);
1084 for (k = 0; k < ncoeffs; ++k)
1086 Umat(k, bndry_cnt) = Ulam[k];
1169 for (i = 0; i < nfaces; ++i)
1191 ASSERTL0(
false,
"Direction not known");
1197 StdRegions::VarCoeffMap::const_iterator x;
1204 GetMF(dir, coordim, varcoeffs);
1233 for (j = 0; j < nbndry; ++j)
1239 for (k = 0; k < ncoeffs; ++k)
1241 Ulam[k] = lamToU(k, j);
1259 &(Qmat.GetPtr())[0] + j * ncoeffs, 1);
1267 int order_f, nquad_f;
1313 for (i = 0; i < nfaces; ++i)
1319 for (i = 0; i < nbndry; ++i)
1327 for (f = 0; f < nfaces; ++f)
1329 order_f = FaceExp[f]->GetNcoeffs();
1330 nquad_f = FaceExp[f]->GetNumPoints(0) *
1331 FaceExp[f]->GetNumPoints(1);
1355 for (j = 0; j < order_f; ++j)
1358 (*map)[j].sign * (*LamToQ[0])((*map)[j].index, i);
1361 FaceExp[f]->BwdTrans(faceCoeffs, facePhys);
1377 0, f, FaceExp[f], normals, varcoeffs);
1379 Vmath::Vmul(nquad_f, ncdotMF, 1, facePhys, 1, work, 1);
1383 Vmath::Vmul(nquad_f, normals[0], 1, facePhys, 1, work,
1388 for (j = 0; j < order_f; ++j)
1391 (*map)[j].sign * (*LamToQ[1])((*map)[j].index, i);
1394 FaceExp[f]->BwdTrans(faceCoeffs, facePhys);
1410 1, f, FaceExp[f], normals, varcoeffs);
1412 Vmath::Vvtvp(nquad_f, ncdotMF, 1, facePhys, 1, work, 1,
1417 Vmath::Vvtvp(nquad_f, normals[1], 1, facePhys, 1, work,
1422 for (j = 0; j < order_f; ++j)
1425 (*map)[j].sign * (*LamToQ[2])((*map)[j].index, i);
1428 FaceExp[f]->BwdTrans(faceCoeffs, facePhys);
1444 2, f, FaceExp[f], normals, varcoeffs);
1446 Vmath::Vvtvp(nquad_f, ncdotMF, 1, facePhys, 1, work, 1,
1451 Vmath::Vvtvp(nquad_f, normals[2], 1, facePhys, 1, work,
1457 for (j = 0; j < order_f; ++j)
1460 (*map)[j].sign * LamToU((*map)[j].index, i) -
1464 FaceExp[f]->BwdTrans(faceCoeffs, facePhys);
1476 Vmath::Svtvp(nquad_f, -tau, facePhys, 1, work, 1, work, 1);
1479 FaceExp[f]->IProductWRTBase(work, faceCoeffs);
1483 for (j = 0; j < order_f; ++j)
1485 BndMat(cnt + j, i) = faceCoeffs[j];
1501 LapMat.GetRows(), LapMat.GetColumns());
1532 for (
int d = 0;
d < ncoords; ++
d)
1540 for (
int t = 0; t < ntraces; ++t)
1543 tracepts[t] = traceExp[t]->GetTotPoints();
1544 maxtpts = (maxtpts > tracepts[t]) ? maxtpts : tracepts[t];
1550 for (
int t = 0; t < ntraces; ++t)
1559 PhysDeriv(phys, Deriv[0], Deriv[1], Deriv[2]);
1561 for (
int t = 0; t < ntraces; ++t)
1568 traceExp[t]->GetBasis(0)->GetBasisKey();
1570 traceExp[t]->GetBasis(1)->GetBasisKey();
1572 (fromkey0 != tokey0) || (fromkey1 != tokey1);
1579 for (
int d = 0;
d < ncoords; ++
d)
1596 tmp = dphidn[t] + i * tracepts[t], 1,
1597 tmp1 = dphidn[t] + i * tracepts[t], 1);
1602 for (
int t = 0; t < ntraces; ++t)
1604 int nt = tracepts[t];
1610 (
p == 1) ? 0.02 * h * h : 0.8 * pow(
p + 1, -4.0) * h * h;
1617 dphidn[t] + j * nt, 1, val, 1);
1619 Mat(i, j) + scale * traceExp[t]->Integral(val);
1627 for (
int j = 0; j < i; ++j)
1629 Mat(i, j) = Mat(j, i);
1636 "This matrix type cannot be generated from this class");
1668 if (faceExp->GetRightAdjacentElementExp())
1670 if (faceExp->GetRightAdjacentElementExp()
1672 ->GetGlobalID() ==
GetGeom()->GetGlobalID())
1685 int order_e = (*map).size();
1686 int n_coeffs = FaceExp->GetNcoeffs();
1690 if (n_coeffs != order_e)
1692 FaceExp->FwdTrans(Fn, faceCoeffs);
1694 int NumModesElementMax = FaceExp->GetBasis(0)->GetNumModes();
1695 int NumModesElementMin =
m_base[0]->GetNumModes();
1697 FaceExp->ReduceOrderCoeffs(NumModesElementMin, faceCoeffs, faceCoeffs);
1700 FaceExp->DetShapeType(), *FaceExp);
1701 FaceExp->MassMatrixOp(faceCoeffs, faceCoeffs, masskey);
1704 int offset1 = 0, offset2 = 0;
1708 for (i = 0; i < NumModesElementMin; ++i)
1710 for (j = 0; j < NumModesElementMin; ++j)
1712 faceCoeffs[offset1 + j] = faceCoeffs[offset2 + j];
1714 offset1 += NumModesElementMin;
1715 offset2 += NumModesElementMax;
1719 for (i = NumModesElementMin; i < NumModesElementMax; ++i)
1721 for (j = NumModesElementMin; j < NumModesElementMax; ++j)
1723 faceCoeffs[i * NumModesElementMax + j] = 0.0;
1732 int offset1 = 0, offset2 = 0;
1734 for (i = 0; i < NumModesElementMin; ++i)
1736 for (j = 0; j < NumModesElementMin - i; ++j)
1738 faceCoeffs[offset1 + j] = faceCoeffs[offset2 + j];
1740 offset1 += NumModesElementMin - i;
1741 offset2 += NumModesElementMax - i;
1747 FaceExp->IProductWRTBase(Fn, faceCoeffs);
1752 for (i = 0; i < order_e; ++i)
1754 outarray[(*map)[i].index] -= (*map)[i].sign * faceCoeffs[i];
1759 for (i = 0; i < order_e; ++i)
1761 outarray[(*map)[i].index] += (*map)[i].sign * faceCoeffs[i];
1797 Out_d = InvMass * Coeffs;
1805 "Not set up for non boundary-interior expansions");
1806 ASSERTL1(inoutmat->GetRows() == inoutmat->GetColumns(),
1807 "Assuming that input matrix was square");
1812 int order_f = faceExp->GetNcoeffs();
1825 DNekScalMat &facemat = *faceExp->GetLocMatrix(mkey);
1842 int rows = inoutmat->GetRows();
1850 int nfvert = faceExp->GetNverts();
1857 GetLinStdExp()->GetTraceToElementMap(face, linmap, linsign,
1866 for (i = 0; i < nfvert; ++i)
1868 fmap = faceExp->GetVertexMap(i,
true);
1872 map[fmap] = linmap[i];
1883 for (i = 0; i < order_f; ++i)
1885 for (j = 0; j < nbndry; ++j)
1887 if (map[i] == bmap[j])
1893 ASSERTL1(j != nbndry,
"Did not find number in map");
1912 ASSERTL1((*map1).size() == (*map2).size(),
1913 "There is an error with the GetTraceToElementMap");
1915 for (i = 0; i < face; ++i)
1920 for (i = 0; i < (*map1).size(); ++i)
1924 for (j = 0; j < (*map2).size(); ++j)
1926 if ((*map1)[i].index == (*map2)[j].index)
1933 ASSERTL2(idx >= 0,
"Index not found");
1935 sign[i] = (*map2)[idx].sign;
1940 ASSERTL0(
false,
"Could not identify matrix type from dimension");
1943 for (i = 0; i < order_f; ++i)
1946 for (j = 0; j < order_f; ++j)
1949 (*inoutmat)(id1, id2) += facemat(i, j) *
sign[i] *
sign[j];
1960 int nVerts, vid1, vid2, vMap1, vMap2;
1967 DNekMat &VertexMat = (*vertexmatrix);
1969 for (vid1 = 0; vid1 < nVerts; ++vid1)
1973 for (vid2 = 0; vid2 < nVerts; ++vid2)
1976 VertexValue = (*r_bnd)(vMap1, vMap2);
1977 VertexMat.SetValue(vid1, vid2, VertexValue);
1981 return vertexmatrix;
1988 int eid, fid, vid, n, i;
2021 int nConnectedEdges = 3;
2022 int nConnectedFaces = 3;
2033 nBndCoeffs, nBndCoeffs, 0.0, storage);
2035 DNekMat &R = (*transformationmatrix);
2040 for (vid = 0; vid < nVerts; ++vid)
2050 int nedgemodesconnected =
2056 int nfacemodesconnected =
2065 for (eid = 0; eid < nConnectedEdges; ++eid)
2067 MatEdgeLocation[eid] =
2069 nmodes = MatEdgeLocation[eid].size();
2074 &edgemodearray[offset], 1);
2083 for (fid = 0; fid < nConnectedFaces; ++fid)
2085 MatFaceLocation[fid] =
2087 nmodes = MatFaceLocation[fid].size();
2092 &facemodearray[offset], 1);
2099 DNekMat &Sveft = (*vertexedgefacetransformmatrix);
2103 DNekMat &Svef = (*vertexedgefacecoupling);
2106 for (n = 0; n < nedgemodesconnected; ++n)
2109 VertexEdgeFaceValue = (*r_bnd)(
GetVertexMap(vid), edgemodearray[n]);
2112 Svef.SetValue(0, n, VertexEdgeFaceValue);
2116 for (n = 0; n < nfacemodesconnected; ++n)
2119 VertexEdgeFaceValue = (*r_bnd)(
GetVertexMap(vid), facemodearray[n]);
2122 Svef.SetValue(0, n + nedgemodesconnected, VertexEdgeFaceValue);
2136 DNekMat &Sefef = (*edgefacecoupling);
2141 for (m = 0; m < nedgemodesconnected; ++m)
2143 for (n = 0; n < nedgemodesconnected; ++n)
2146 EdgeEdgeValue = (*r_bnd)(edgemodearray[n], edgemodearray[m]);
2149 Sefef.SetValue(n, m, EdgeEdgeValue);
2154 for (n = 0; n < nfacemodesconnected; ++n)
2156 for (m = 0; m < nfacemodesconnected; ++m)
2159 FaceFaceValue = (*r_bnd)(facemodearray[n], facemodearray[m]);
2161 Sefef.SetValue(nedgemodesconnected + n, nedgemodesconnected + m,
2167 for (n = 0; n < nedgemodesconnected; ++n)
2169 for (m = 0; m < nfacemodesconnected; ++m)
2172 FaceFaceValue = (*r_bnd)(edgemodearray[n], facemodearray[m]);
2175 Sefef.SetValue(n, nedgemodesconnected + m, FaceFaceValue);
2177 FaceFaceValue = (*r_bnd)(facemodearray[m], edgemodearray[n]);
2180 Sefef.SetValue(nedgemodesconnected + m, n, FaceFaceValue);
2190 Sveft = -Svef * Sefef;
2194 for (n = 0; n < edgemodearray.size(); ++n)
2196 R.SetValue(
GetVertexMap(vid), edgemodearray[n], Sveft(0, n));
2200 for (n = 0; n < facemodearray.size(); ++n)
2203 Sveft(0, n + nedgemodesconnected));
2226 int efCol, efRow, nedgemodes;
2229 nConnectedFaces = 2;
2238 for (eid = 0; eid < nEdges; ++eid)
2249 DNekMat &Mef = (*efedgefacecoupling);
2255 DNekMat &Meff = (*effacefacecoupling);
2261 DNekMat &Meft = (*edgefacetransformmatrix);
2263 int nfacemodesconnected =
2275 Vmath::Vcopy(nedgemodes, &inedgearray[0], 1, &edgemodearray[0], 1);
2281 for (fid = 0; fid < nConnectedFaces; ++fid)
2283 MatFaceLocation[fid] =
2285 nmodes = MatFaceLocation[fid].size();
2290 &facemodearray[offset], 1);
2296 for (n = 0; n < nedgemodes; ++n)
2298 for (m = 0; m < nfacemodesconnected; ++m)
2301 EdgeFaceValue = (*r_bnd)(edgemodearray[n], facemodearray[m]);
2304 Mef.SetValue(n, m, EdgeFaceValue);
2309 for (n = 0; n < nfacemodesconnected; ++n)
2311 for (m = 0; m < nfacemodesconnected; ++m)
2314 FaceFaceValue = (*r_bnd)(facemodearray[n], facemodearray[m]);
2317 Meff.SetValue(n, m, FaceFaceValue);
2331 for (n = 0; n < Meft.GetRows(); ++n)
2333 for (m = 0; m < Meft.GetColumns(); ++m)
2335 R.SetValue(edgemodearray[n], facemodearray[m], Meft(n, m));
2340 for (i = 0; i < R.GetRows(); ++i)
2342 R.SetValue(i, i, 1.0);
2348 return transformationmatrix;
2369 int i, j, n, eid = 0, fid = 0;
2381 DNekMat &InvR = (*inversetransformationmatrix);
2389 int nedgemodestotal = 0;
2390 int nfacemodestotal = 0;
2392 for (eid = 0; eid < nEdges; ++eid)
2395 nedgemodestotal += nedgemodes;
2398 for (fid = 0; fid < nFaces; ++fid)
2401 nfacemodestotal += nfacemodes;
2410 for (eid = 0; eid < nEdges; ++eid)
2418 Vmath::Vcopy(nedgemodes, &edgearray[0], 1, &edgemodearray[offset],
2422 offset += nedgemodes;
2428 for (fid = 0; fid < nFaces; ++fid)
2436 Vmath::Vcopy(nfacemodes, &facearray[0], 1, &facemodearray[offset],
2440 offset += nfacemodes;
2444 for (i = 0; i < nVerts; ++i)
2446 for (j = 0; j < nedgemodestotal; ++j)
2451 for (j = 0; j < nfacemodestotal; ++j)
2455 for (n = 0; n < nedgemodestotal; ++n)
2457 MatrixValue = InvR.GetValue(
GetVertexMap(i), facemodearray[j]) +
2459 R(edgemodearray[n], facemodearray[j]);
2460 InvR.SetValue(
GetVertexMap(i), facemodearray[j], MatrixValue);
2466 for (i = 0; i < nedgemodestotal; ++i)
2468 for (j = 0; j < nfacemodestotal; ++j)
2470 InvR.SetValue(edgemodearray[i], facemodearray[j],
2471 -R(edgemodearray[i], facemodearray[j]));
2475 for (i = 0; i < nCoeffs; ++i)
2477 InvR.SetValue(i, i, 1.0);
2480 return inversetransformationmatrix;
2494 map<int, int> invmap;
2495 for (j = 0; j < nBndCoeffs; ++j)
2497 invmap[bmap[j]] = j;
2513 for (n = 0; n < nEdgeCoeffs; ++n)
2515 edgemaparray[n] = invmap[maparray[n]];
2518 return edgemaparray;
2534 map<int, int> reversemap;
2535 for (j = 0; j < bmap.size(); ++j)
2537 reversemap[bmap[j]] = j;
2553 fOrient = faceOrient;
2569 ASSERTL1(P1 <= locP1,
"Expect value of passed P1 to "
2570 "be lower or equal to face num modes");
2579 ASSERTL1(P2 <= locP2,
"Expect value of passed P2 to "
2580 "be lower or equal to face num modes");
2583 switch (
GetGeom3D()->GetFace(fid)->GetShapeType())
2587 if (((P1 - 3) > 0) && ((P2 - 3) > 0))
2594 for (n = 0; n < P1 - 3; ++n)
2596 for (
int m = 0; m < P2 - 3 - n; ++m, ++cnt)
2598 facemaparray[cnt] = reversemap[maparray[cnt1 + m]];
2600 cnt1 += locP2 - 3 - n;
2607 if (((P1 - 2) > 0) && ((P2 - 2) > 0))
2614 for (n = 0; n < P2 - 2; ++n)
2616 for (
int m = 0; m < P1 - 2; ++m, ++cnt)
2618 facemaparray[cnt] = reversemap[maparray[cnt1 + m]];
2627 ASSERTL0(
false,
"Invalid shape type.");
2632 return facemaparray;
2651 map<int, int> reversemap;
2652 for (j = 0; j < bmap.size(); ++j)
2654 reversemap[bmap[j]] = j;
2659 for (n = 0; n < nverts; ++n)
2662 vmap[n] = reversemap[id];
2668 for (
int eid = 0; eid < nedges; ++eid)
2682 for (n = 0; n < nEdgeCoeffs; ++n)
2684 edgemaparray[n] = reversemap[maparray[n]];
2686 emap[eid] = edgemaparray;
2692 for (
int fid = 0; fid < nfaces; ++fid)
2706 for (n = 0; n < nFaceCoeffs; ++n)
2708 facemaparray[n] = reversemap[maparray[n]];
2711 fmap[fid] = facemaparray;
2717 return m_geom->GetForient(face);
2735 int nq0 = FaceExp->GetNumPoints(0);
2736 int nq1 = FaceExp->GetNumPoints(1);
2739 int dir0 =
GetGeom3D()->GetDir(face, 0);
2740 int dir1 =
GetGeom3D()->GetDir(face, 1);
2751 Vmath::Gathr(
static_cast<int>(faceids.size()), inarray, faceids, o_tmp);
2768 m_base[dir0]->GetPointsKey(),
m_base[dir1]->GetPointsKey(), o_tmp.get(),
2769 FaceExp->GetBasis(to_id0)->GetPointsKey(),
2770 FaceExp->GetBasis(to_id1)->GetPointsKey(), o_tmp2.get());
2780 if (faceGeom->GetNumVerts() == 3)
2784 m_geom->GetFace(traceid));
2790 m_geom->GetFace(traceid));
2799 if (idmap.size() != nq0 * nq1)
2810 for (
int i = 0; i < nq0 * nq1; ++i)
2817 for (
int j = 0; j < nq1; ++j)
2819 for (
int i = 0; i < nq0; ++i)
2821 idmap[j * nq0 + i] = nq0 - 1 - i + j * nq0;
2827 "Case not supposed to be used in this function");
2836 for (
int i = 0; i < nq0 * nq1; ++i)
2844 for (
int j = 0; j < nq1; j++)
2846 for (
int i = 0; i < nq0; ++i)
2848 idmap[j * nq0 + i] = nq0 - 1 - i + j * nq0;
2856 for (
int j = 0; j < nq1; j++)
2858 for (
int i = 0; i < nq0; ++i)
2860 idmap[j * nq0 + i] = nq0 * (nq1 - 1 - j) + i;
2868 for (
int j = 0; j < nq1; j++)
2870 for (
int i = 0; i < nq0; ++i)
2872 idmap[j * nq0 + i] = nq0 * nq1 - 1 - j * nq0 - i;
2880 for (
int i = 0; i < nq0; ++i)
2882 for (
int j = 0; j < nq1; ++j)
2884 idmap[i * nq1 + j] = i + j * nq0;
2892 for (
int i = 0; i < nq0; ++i)
2894 for (
int j = 0; j < nq1; ++j)
2896 idmap[i * nq1 + j] = nq0 - 1 - i + j * nq0;
2904 for (
int i = 0; i < nq0; ++i)
2906 for (
int j = 0; j < nq1; ++j)
2908 idmap[i * nq1 + j] = i + nq0 * (nq1 - 1) - j * nq0;
2916 for (
int i = 0; i < nq0; ++i)
2918 for (
int j = 0; j < nq1; ++j)
2920 idmap[i * nq1 + j] = nq0 * nq1 - 1 - i - j * nq0;
2926 ASSERTL0(
false,
"Unknow orientation");
2945 int nquad_f = FaceExp_f->GetNumPoints(0) * FaceExp_f->GetNumPoints(1);
2948 int nquad0 =
m_base[0]->GetNumPoints();
2949 int nquad1 =
m_base[1]->GetNumPoints();
2950 int nquad2 =
m_base[2]->GetNumPoints();
2951 int nqtot = nquad0 * nquad1 * nquad2;
2963 StdRegions::VarCoeffMap::const_iterator MFdir;
2968 for (
int k = 0; k < coordim; k++)
2970 MFdir = varcoeffs.find(MMFCoeffs[dir * 5 + k]);
2971 tmp = MFdir->second.GetValue();
2975 Vmath::Vvtvp(nquad_f, &tmp_f[0], 1, &normals[k][0], 1, &nFacecdotMF[0],
2976 1, &nFacecdotMF[0], 1);
2986 int nverts = geom->GetFace(traceid)->GetNumVerts();
2989 tn1.
Sub(*(geom->GetFace(traceid)->GetVertex(1)),
2990 *(geom->GetFace(traceid)->GetVertex(0)));
2992 tn2.
Sub(*(geom->GetFace(traceid)->GetVertex(nverts - 1)),
2993 *(geom->GetFace(traceid)->GetVertex(0)));
2995 normal.
Mult(tn1, tn2);
2999 mag = 1.0 /
sqrt(mag);
3005 for (
int i = 0; i < nverts; ++i)
3008 int edgid = geom->GetEdgeNormalToFaceVert(traceid, i);
3011 Dx.
Sub(*(geom->GetEdge(edgid)->GetVertex(0)),
3012 *(geom->GetEdge(edgid)->GetVertex(1)));
3016 h += fabs(normal.
dot(Dx));
3022 int dir0 = geom->GetDir(traceid, 0);
3023 int dir1 = geom->GetDir(traceid, 1);
3025 for (dirn = 0; dirn < 3; ++dirn)
3027 if ((dirn != dir0) && (dirn != dir1))
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed to...
#define sign(a, b)
return the sign(b)*a
Describes the specification for a Basis.
DNekMatSharedPtr v_BuildTransformationMatrix(const DNekScalMatSharedPtr &r_bnd, const StdRegions::MatrixType matrixType) override
void v_AddRobinMassMatrix(const int face, const Array< OneD, const NekDouble > &primCoeffs, DNekMatSharedPtr &inoutmat) override
void SetTraceToGeomOrientation(Array< OneD, NekDouble > &inout)
Align trace orientation with the geometry orientation.
void v_DGDeriv(const int dir, const Array< OneD, const NekDouble > &incoeffs, Array< OneD, ExpansionSharedPtr > &FaceExp, Array< OneD, Array< OneD, NekDouble > > &faceCoeffs, Array< OneD, NekDouble > &out_d) override
Evaluate coefficients of weak deriviative in the direction dir given the input coefficicents incoeffs...
StdRegions::Orientation v_GetTraceOrient(int face) override
void AddNormTraceInt(const int dir, Array< OneD, ExpansionSharedPtr > &FaceExp, Array< OneD, Array< OneD, NekDouble > > &faceCoeffs, Array< OneD, NekDouble > &outarray)
DNekScalMatSharedPtr CreateMatrix(const MatrixKey &mkey)
Array< OneD, unsigned int > GetTraceInverseBoundaryMap(int fid, StdRegions::Orientation faceOrient=StdRegions::eNoOrientation, int P1=-1, int P2=-1)
std::vector< bool > m_requireNeg
void GetInverseBoundaryMaps(Array< OneD, unsigned int > &vmap, Array< OneD, Array< OneD, unsigned int > > &emap, Array< OneD, Array< OneD, unsigned int > > &fmap)
Array< OneD, NekDouble > GetnFacecdotMF(const int dir, const int face, ExpansionSharedPtr &FaceExp_f, const Array< OneD, const Array< OneD, NekDouble > > &normals, const StdRegions::VarCoeffMap &varcoeffs)
DNekMatSharedPtr v_BuildInverseTransformationMatrix(const DNekScalMatSharedPtr &transformationmatrix) override
Build inverse and inverse transposed transformation matrix: and .
void AddFaceBoundaryInt(const int face, ExpansionSharedPtr &FaceExp, Array< OneD, NekDouble > &facePhys, Array< OneD, NekDouble > &outarray, const StdRegions::VarCoeffMap &varcoeffs=StdRegions::NullVarCoeffMap)
void GetPhysFaceVarCoeffsFromElement(const int face, ExpansionSharedPtr &FaceExp, const Array< OneD, const NekDouble > &varcoeff, Array< OneD, NekDouble > &outarray)
void v_TraceNormLen(const int traceid, NekDouble &h, NekDouble &p) override
void v_ReOrientTracePhysMap(const StdRegions::Orientation orient, Array< OneD, int > &idmap, const int nq0, const int nq1) override
void v_NormVectorIProductWRTBase(const Array< OneD, const Array< OneD, NekDouble > > &Fvec, Array< OneD, NekDouble > &outarray) override
Array< OneD, unsigned int > GetEdgeInverseBoundaryMap(int eid)
DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
SpatialDomains::Geometry3DSharedPtr GetGeom3D() const
void v_GenTraceExp(const int traceid, ExpansionSharedPtr &exp) override
void v_AddFaceNormBoundaryInt(const int face, const ExpansionSharedPtr &FaceExp, const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray) override
void AddHDGHelmholtzFaceTerms(const NekDouble tau, const int edge, Array< OneD, NekDouble > &facePhys, const StdRegions::VarCoeffMap &dirForcing, Array< OneD, NekDouble > &outarray)
DNekMatSharedPtr v_BuildVertexMatrix(const DNekScalMatSharedPtr &r_bnd) override
void v_GetTracePhysVals(const int face, const StdRegions::StdExpansionSharedPtr &FaceExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, StdRegions::Orientation orient) override
Extract the physical values along face face from inarray into outarray following the local face orien...
void SetFaceToGeomOrientation(const int face, Array< OneD, NekDouble > &inout)
Align face orientation with the geometry orientation.
SpatialDomains::GeometrySharedPtr GetGeom() const
SpatialDomains::GeometrySharedPtr m_geom
void GetTracePhysMap(const int edge, Array< OneD, int > &outarray)
void DropLocMatrix(const LocalRegions::MatrixKey &mkey)
DNekMatSharedPtr BuildVertexMatrix(const DNekScalMatSharedPtr &r_bnd)
Array< OneD, NekDouble > GetMFMag(const int dir, const StdRegions::VarCoeffMap &varcoeffs)
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
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
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)
DNekMatSharedPtr BuildTransformationMatrix(const DNekScalMatSharedPtr &r_bnd, const StdRegions::MatrixType matrixType)
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
boost::call_traits< DataType >::const_reference x() const
boost::call_traits< DataType >::const_reference z() const
boost::call_traits< DataType >::const_reference y() const
void Sub(PointGeom &a, PointGeom &b)
void Mult(PointGeom &a, PointGeom &b)
_this = a x b
NekDouble dot(PointGeom &a)
retun the dot product between this and input a
void UpdatePosition(NekDouble x, NekDouble y, NekDouble z)
int GetEdgeNcoeffs(const int i) const
This function returns the number of expansion coefficients belonging to the i-th edge.
int GetNedges() const
return the number of edges in 3D expansion
void GetEdgeInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation traceOrient=eForwards)
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 GetTraceNumPoints(const int i) const
This function returns the number of quadrature points belonging to the i-th trace.
int NumBndryCoeffs(void) const
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
const LibUtilities::PointsKeyVector GetPointsKeys() const
int GetTraceIntNcoeffs(const int i) 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 NormVectorIProductWRTBase(const Array< OneD, const NekDouble > &Fx, Array< OneD, NekDouble > &outarray)
std::shared_ptr< StdExpansion > GetLinStdExp(void) const
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 GetTraceNumModes(const int tid, int &numModes0, int &numModes1, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2)
void FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Forward transformation from physical space to coefficient space.
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
int getNumberOfCoefficients(int Na, int Nb)
int getNumberOfCoefficients(int Na, int Nb)
void Interp2D(const BasisKey &fbasis0, const BasisKey &fbasis1, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, const BasisKey &tbasis1, Array< OneD, NekDouble > &to)
this function interpolates a 2D function evaluated at the quadrature points of the 2D basis,...
std::vector< PointsKey > PointsKeyVector
std::shared_ptr< Expansion > ExpansionSharedPtr
std::shared_ptr< IndexMapValues > IndexMapValuesSharedPtr
@ eNoGeomType
No type defined.
@ eDeformed
Geometry is curved or has non-constant factors.
std::shared_ptr< Geometry > GeometrySharedPtr
std::shared_ptr< Geometry3D > Geometry3DSharedPtr
std::shared_ptr< StdExpansion > StdExpansionSharedPtr
@ eLinearAdvectionDiffusionReaction
@ eLinearAdvectionDiffusionReactionGJP
@ eInvLaplacianWithUnityMean
static ConstFactorMap NullConstFactorMap
@ eDir1BwdDir2_Dir2BwdDir1
@ eDir1FwdDir1_Dir2FwdDir2
@ eDir1BwdDir1_Dir2BwdDir2
@ eDir1BwdDir2_Dir2FwdDir1
@ eDir1FwdDir1_Dir2BwdDir2
@ eDir1BwdDir1_Dir2FwdDir2
@ eDir1FwdDir2_Dir2FwdDir1
@ eDir1FwdDir2_Dir2BwdDir1
static VarCoeffMap NullVarCoeffMap
std::map< StdRegions::VarCoeffType, VarCoeffEntry > VarCoeffMap
std::vector< double > d(NPUPPER *NPUPPER)
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
std::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
static DNekMatSharedPtr NullDNekMatSharedPtr
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 Gathr(I n, const T *x, const I *y, T *z)
Gather vector z[i] = x[y[i]].
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 Scatr(int n, const T *x, const int *y, T *z)
Scatter vector z[y[i]] = x[i].
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)