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;
684 if (!massVarcoeffs.empty())
688 if (!lapVarcoeffs.empty())
743 "Need to specify eFactorGJP to construct "
744 "a LinearAdvectionDiffusionReactionGJP matrix");
746 int rows = LapMat.GetRows();
747 int cols = LapMat.GetColumns();
754 LapMat - lambda * MassMat + AdvMat + gjpfactor * NDTraceMat;
886 "Matrix construction is not implemented for variable "
887 "coefficients at the moment");
898 "HybridDGHelmholtz matrix not set up "
899 "for non boundary-interior expansions");
927 StdRegions::VarCoeffMap::const_iterator x;
930 for (i = 0; i < coordim; ++i)
937 GetMF(i, coordim, varcoeffs);
958 Mat = Mat + Dmat * invMass *
Transpose(Dmat);
963 Mat = Mat + Dmat * invMass *
Transpose(Dmat);
988 Mat = Mat + lambdaval * Mass;
991 for (i = 0; i < nfaces; ++i)
994 order_f = FaceExp->GetNcoeffs();
1019 for (j = 0; j < order_f; ++j)
1021 for (k = 0; k < order_f; ++k)
1023 Mat((*map)[j].index, (*map)[k].index) +=
1024 tau * (*map)[j].sign * (*map)[k].sign *
eMass(j, k);
1064 for (i = 0; i < nfaces; ++i)
1074 for (j = 0; j < nface; ++j)
1078 face_lambda[j] = 1.0;
1083 FaceExp->BwdTrans(face_lambda, tmp);
1090 for (k = 0; k < ncoeffs; ++k)
1092 Umat(k, bndry_cnt) = Ulam[k];
1175 for (i = 0; i < nfaces; ++i)
1197 ASSERTL0(
false,
"Direction not known");
1203 StdRegions::VarCoeffMap::const_iterator x;
1210 GetMF(dir, coordim, varcoeffs);
1239 for (j = 0; j < nbndry; ++j)
1245 for (k = 0; k < ncoeffs; ++k)
1247 Ulam[k] = lamToU(k, j);
1265 &(Qmat.GetPtr())[0] + j * ncoeffs, 1);
1273 int order_f, nquad_f;
1319 for (i = 0; i < nfaces; ++i)
1325 for (i = 0; i < nbndry; ++i)
1333 for (f = 0; f < nfaces; ++f)
1335 order_f = FaceExp[f]->GetNcoeffs();
1336 nquad_f = FaceExp[f]->GetNumPoints(0) *
1337 FaceExp[f]->GetNumPoints(1);
1361 for (j = 0; j < order_f; ++j)
1364 (*map)[j].sign * (*LamToQ[0])((*map)[j].index, i);
1367 FaceExp[f]->BwdTrans(faceCoeffs, facePhys);
1383 0, f, FaceExp[f], normals, varcoeffs);
1385 Vmath::Vmul(nquad_f, ncdotMF, 1, facePhys, 1, work, 1);
1389 Vmath::Vmul(nquad_f, normals[0], 1, facePhys, 1, work,
1394 for (j = 0; j < order_f; ++j)
1397 (*map)[j].sign * (*LamToQ[1])((*map)[j].index, i);
1400 FaceExp[f]->BwdTrans(faceCoeffs, facePhys);
1416 1, f, FaceExp[f], normals, varcoeffs);
1418 Vmath::Vvtvp(nquad_f, ncdotMF, 1, facePhys, 1, work, 1,
1423 Vmath::Vvtvp(nquad_f, normals[1], 1, facePhys, 1, work,
1428 for (j = 0; j < order_f; ++j)
1431 (*map)[j].sign * (*LamToQ[2])((*map)[j].index, i);
1434 FaceExp[f]->BwdTrans(faceCoeffs, facePhys);
1450 2, f, FaceExp[f], normals, varcoeffs);
1452 Vmath::Vvtvp(nquad_f, ncdotMF, 1, facePhys, 1, work, 1,
1457 Vmath::Vvtvp(nquad_f, normals[2], 1, facePhys, 1, work,
1463 for (j = 0; j < order_f; ++j)
1466 (*map)[j].sign * LamToU((*map)[j].index, i) -
1470 FaceExp[f]->BwdTrans(faceCoeffs, facePhys);
1482 Vmath::Svtvp(nquad_f, -tau, facePhys, 1, work, 1, work, 1);
1485 FaceExp[f]->IProductWRTBase(work, faceCoeffs);
1489 for (j = 0; j < order_f; ++j)
1491 BndMat(cnt + j, i) = faceCoeffs[j];
1507 LapMat.GetRows(), LapMat.GetColumns());
1538 for (
int d = 0;
d < ncoords; ++
d)
1546 for (
int t = 0; t < ntraces; ++t)
1549 tracepts[t] = traceExp[t]->GetTotPoints();
1550 maxtpts = (maxtpts > tracepts[t]) ? maxtpts : tracepts[t];
1556 for (
int t = 0; t < ntraces; ++t)
1565 PhysDeriv(phys, Deriv[0], Deriv[1], Deriv[2]);
1567 for (
int t = 0; t < ntraces; ++t)
1574 traceExp[t]->GetBasis(0)->GetBasisKey();
1576 traceExp[t]->GetBasis(1)->GetBasisKey();
1578 (fromkey0 != tokey0) || (fromkey1 != tokey1);
1585 for (
int d = 0;
d < ncoords; ++
d)
1602 tmp = dphidn[t] + i * tracepts[t], 1,
1603 tmp1 = dphidn[t] + i * tracepts[t], 1);
1608 for (
int t = 0; t < ntraces; ++t)
1610 int nt = tracepts[t];
1616 (
p == 1) ? 0.02 * h * h : 0.8 * pow(
p + 1, -4.0) * h * h;
1623 dphidn[t] + j * nt, 1, val, 1);
1625 Mat(i, j) + scale * traceExp[t]->Integral(val);
1633 for (
int j = 0; j < i; ++j)
1635 Mat(i, j) = Mat(j, i);
1642 "This matrix type cannot be generated from this class");
1674 if (faceExp->GetRightAdjacentElementExp())
1676 if (faceExp->GetRightAdjacentElementExp()
1678 ->GetGlobalID() ==
GetGeom()->GetGlobalID())
1691 int order_e = (*map).size();
1692 int n_coeffs = FaceExp->GetNcoeffs();
1696 if (n_coeffs != order_e)
1698 FaceExp->FwdTrans(Fn, faceCoeffs);
1700 int NumModesElementMax = FaceExp->GetBasis(0)->GetNumModes();
1701 int NumModesElementMin =
m_base[0]->GetNumModes();
1703 FaceExp->ReduceOrderCoeffs(NumModesElementMin, faceCoeffs, faceCoeffs);
1706 FaceExp->DetShapeType(), *FaceExp);
1707 FaceExp->MassMatrixOp(faceCoeffs, faceCoeffs, masskey);
1710 int offset1 = 0, offset2 = 0;
1714 for (i = 0; i < NumModesElementMin; ++i)
1716 for (j = 0; j < NumModesElementMin; ++j)
1718 faceCoeffs[offset1 + j] = faceCoeffs[offset2 + j];
1720 offset1 += NumModesElementMin;
1721 offset2 += NumModesElementMax;
1725 for (i = NumModesElementMin; i < NumModesElementMax; ++i)
1727 for (j = NumModesElementMin; j < NumModesElementMax; ++j)
1729 faceCoeffs[i * NumModesElementMax + j] = 0.0;
1738 int offset1 = 0, offset2 = 0;
1740 for (i = 0; i < NumModesElementMin; ++i)
1742 for (j = 0; j < NumModesElementMin - i; ++j)
1744 faceCoeffs[offset1 + j] = faceCoeffs[offset2 + j];
1746 offset1 += NumModesElementMin - i;
1747 offset2 += NumModesElementMax - i;
1753 FaceExp->IProductWRTBase(Fn, faceCoeffs);
1758 for (i = 0; i < order_e; ++i)
1760 outarray[(*map)[i].index] -= (*map)[i].sign * faceCoeffs[i];
1765 for (i = 0; i < order_e; ++i)
1767 outarray[(*map)[i].index] += (*map)[i].sign * faceCoeffs[i];
1803 Out_d = InvMass * Coeffs;
1811 "Not set up for non boundary-interior expansions");
1812 ASSERTL1(inoutmat->GetRows() == inoutmat->GetColumns(),
1813 "Assuming that input matrix was square");
1818 int order_f = faceExp->GetNcoeffs();
1831 DNekScalMat &facemat = *faceExp->GetLocMatrix(mkey);
1848 int rows = inoutmat->GetRows();
1856 int nfvert = faceExp->GetNverts();
1863 GetLinStdExp()->GetTraceToElementMap(face, linmap, linsign,
1872 for (i = 0; i < nfvert; ++i)
1874 fmap = faceExp->GetVertexMap(i,
true);
1878 map[fmap] = linmap[i];
1889 for (i = 0; i < order_f; ++i)
1891 for (j = 0; j < nbndry; ++j)
1893 if (map[i] == bmap[j])
1899 ASSERTL1(j != nbndry,
"Did not find number in map");
1918 ASSERTL1((*map1).size() == (*map2).size(),
1919 "There is an error with the GetTraceToElementMap");
1921 for (i = 0; i < face; ++i)
1926 for (i = 0; i < (*map1).size(); ++i)
1930 for (j = 0; j < (*map2).size(); ++j)
1932 if ((*map1)[i].index == (*map2)[j].index)
1939 ASSERTL2(idx >= 0,
"Index not found");
1941 sign[i] = (*map2)[idx].sign;
1946 ASSERTL0(
false,
"Could not identify matrix type from dimension");
1949 for (i = 0; i < order_f; ++i)
1952 for (j = 0; j < order_f; ++j)
1955 (*inoutmat)(id1, id2) += facemat(i, j) *
sign[i] *
sign[j];
1966 int nVerts, vid1, vid2, vMap1, vMap2;
1973 DNekMat &VertexMat = (*vertexmatrix);
1975 for (vid1 = 0; vid1 < nVerts; ++vid1)
1979 for (vid2 = 0; vid2 < nVerts; ++vid2)
1982 VertexValue = (*r_bnd)(vMap1, vMap2);
1983 VertexMat.SetValue(vid1, vid2, VertexValue);
1987 return vertexmatrix;
1994 int eid, fid, vid, n, i;
2027 int nConnectedEdges = 3;
2028 int nConnectedFaces = 3;
2039 nBndCoeffs, nBndCoeffs, 0.0, storage);
2041 DNekMat &R = (*transformationmatrix);
2046 for (vid = 0; vid < nVerts; ++vid)
2056 int nedgemodesconnected =
2062 int nfacemodesconnected =
2071 for (eid = 0; eid < nConnectedEdges; ++eid)
2073 MatEdgeLocation[eid] =
2075 nmodes = MatEdgeLocation[eid].size();
2080 &edgemodearray[offset], 1);
2089 for (fid = 0; fid < nConnectedFaces; ++fid)
2091 MatFaceLocation[fid] =
2093 nmodes = MatFaceLocation[fid].size();
2098 &facemodearray[offset], 1);
2105 DNekMat &Sveft = (*vertexedgefacetransformmatrix);
2109 DNekMat &Svef = (*vertexedgefacecoupling);
2112 for (n = 0; n < nedgemodesconnected; ++n)
2115 VertexEdgeFaceValue = (*r_bnd)(
GetVertexMap(vid), edgemodearray[n]);
2118 Svef.SetValue(0, n, VertexEdgeFaceValue);
2122 for (n = 0; n < nfacemodesconnected; ++n)
2125 VertexEdgeFaceValue = (*r_bnd)(
GetVertexMap(vid), facemodearray[n]);
2128 Svef.SetValue(0, n + nedgemodesconnected, VertexEdgeFaceValue);
2142 DNekMat &Sefef = (*edgefacecoupling);
2147 for (m = 0; m < nedgemodesconnected; ++m)
2149 for (n = 0; n < nedgemodesconnected; ++n)
2152 EdgeEdgeValue = (*r_bnd)(edgemodearray[n], edgemodearray[m]);
2155 Sefef.SetValue(n, m, EdgeEdgeValue);
2160 for (n = 0; n < nfacemodesconnected; ++n)
2162 for (m = 0; m < nfacemodesconnected; ++m)
2165 FaceFaceValue = (*r_bnd)(facemodearray[n], facemodearray[m]);
2167 Sefef.SetValue(nedgemodesconnected + n, nedgemodesconnected + m,
2173 for (n = 0; n < nedgemodesconnected; ++n)
2175 for (m = 0; m < nfacemodesconnected; ++m)
2178 FaceFaceValue = (*r_bnd)(edgemodearray[n], facemodearray[m]);
2181 Sefef.SetValue(n, nedgemodesconnected + m, FaceFaceValue);
2183 FaceFaceValue = (*r_bnd)(facemodearray[m], edgemodearray[n]);
2186 Sefef.SetValue(nedgemodesconnected + m, n, FaceFaceValue);
2196 Sveft = -Svef * Sefef;
2200 for (n = 0; n < edgemodearray.size(); ++n)
2202 R.SetValue(
GetVertexMap(vid), edgemodearray[n], Sveft(0, n));
2206 for (n = 0; n < facemodearray.size(); ++n)
2209 Sveft(0, n + nedgemodesconnected));
2232 int efCol, efRow, nedgemodes;
2235 nConnectedFaces = 2;
2244 for (eid = 0; eid < nEdges; ++eid)
2255 DNekMat &Mef = (*efedgefacecoupling);
2261 DNekMat &Meff = (*effacefacecoupling);
2267 DNekMat &Meft = (*edgefacetransformmatrix);
2269 int nfacemodesconnected =
2281 Vmath::Vcopy(nedgemodes, &inedgearray[0], 1, &edgemodearray[0], 1);
2287 for (fid = 0; fid < nConnectedFaces; ++fid)
2289 MatFaceLocation[fid] =
2291 nmodes = MatFaceLocation[fid].size();
2296 &facemodearray[offset], 1);
2302 for (n = 0; n < nedgemodes; ++n)
2304 for (m = 0; m < nfacemodesconnected; ++m)
2307 EdgeFaceValue = (*r_bnd)(edgemodearray[n], facemodearray[m]);
2310 Mef.SetValue(n, m, EdgeFaceValue);
2315 for (n = 0; n < nfacemodesconnected; ++n)
2317 for (m = 0; m < nfacemodesconnected; ++m)
2320 FaceFaceValue = (*r_bnd)(facemodearray[n], facemodearray[m]);
2323 Meff.SetValue(n, m, FaceFaceValue);
2337 for (n = 0; n < Meft.GetRows(); ++n)
2339 for (m = 0; m < Meft.GetColumns(); ++m)
2341 R.SetValue(edgemodearray[n], facemodearray[m], Meft(n, m));
2346 for (i = 0; i < R.GetRows(); ++i)
2348 R.SetValue(i, i, 1.0);
2354 return transformationmatrix;
2375 int i, j, n, eid = 0, fid = 0;
2387 DNekMat &InvR = (*inversetransformationmatrix);
2395 int nedgemodestotal = 0;
2396 int nfacemodestotal = 0;
2398 for (eid = 0; eid < nEdges; ++eid)
2401 nedgemodestotal += nedgemodes;
2404 for (fid = 0; fid < nFaces; ++fid)
2407 nfacemodestotal += nfacemodes;
2416 for (eid = 0; eid < nEdges; ++eid)
2424 Vmath::Vcopy(nedgemodes, &edgearray[0], 1, &edgemodearray[offset],
2428 offset += nedgemodes;
2434 for (fid = 0; fid < nFaces; ++fid)
2442 Vmath::Vcopy(nfacemodes, &facearray[0], 1, &facemodearray[offset],
2446 offset += nfacemodes;
2450 for (i = 0; i < nVerts; ++i)
2452 for (j = 0; j < nedgemodestotal; ++j)
2457 for (j = 0; j < nfacemodestotal; ++j)
2461 for (n = 0; n < nedgemodestotal; ++n)
2463 MatrixValue = InvR.GetValue(
GetVertexMap(i), facemodearray[j]) +
2465 R(edgemodearray[n], facemodearray[j]);
2466 InvR.SetValue(
GetVertexMap(i), facemodearray[j], MatrixValue);
2472 for (i = 0; i < nedgemodestotal; ++i)
2474 for (j = 0; j < nfacemodestotal; ++j)
2476 InvR.SetValue(edgemodearray[i], facemodearray[j],
2477 -R(edgemodearray[i], facemodearray[j]));
2481 for (i = 0; i < nCoeffs; ++i)
2483 InvR.SetValue(i, i, 1.0);
2486 return inversetransformationmatrix;
2500 map<int, int> invmap;
2501 for (j = 0; j < nBndCoeffs; ++j)
2503 invmap[bmap[j]] = j;
2519 for (n = 0; n < nEdgeCoeffs; ++n)
2521 edgemaparray[n] = invmap[maparray[n]];
2524 return edgemaparray;
2540 map<int, int> reversemap;
2541 for (j = 0; j < bmap.size(); ++j)
2543 reversemap[bmap[j]] = j;
2559 fOrient = faceOrient;
2575 ASSERTL1(P1 <= locP1,
"Expect value of passed P1 to "
2576 "be lower or equal to face num modes");
2585 ASSERTL1(P2 <= locP2,
"Expect value of passed P2 to "
2586 "be lower or equal to face num modes");
2589 switch (
GetGeom3D()->GetFace(fid)->GetShapeType())
2593 if (((P1 - 3) > 0) && ((P2 - 3) > 0))
2600 for (n = 0; n < P1 - 3; ++n)
2602 for (
int m = 0; m < P2 - 3 - n; ++m, ++cnt)
2604 facemaparray[cnt] = reversemap[maparray[cnt1 + m]];
2606 cnt1 += locP2 - 3 - n;
2613 if (((P1 - 2) > 0) && ((P2 - 2) > 0))
2620 for (n = 0; n < P2 - 2; ++n)
2622 for (
int m = 0; m < P1 - 2; ++m, ++cnt)
2624 facemaparray[cnt] = reversemap[maparray[cnt1 + m]];
2633 ASSERTL0(
false,
"Invalid shape type.");
2638 return facemaparray;
2657 map<int, int> reversemap;
2658 for (j = 0; j < bmap.size(); ++j)
2660 reversemap[bmap[j]] = j;
2665 for (n = 0; n < nverts; ++n)
2668 vmap[n] = reversemap[id];
2674 for (
int eid = 0; eid < nedges; ++eid)
2688 for (n = 0; n < nEdgeCoeffs; ++n)
2690 edgemaparray[n] = reversemap[maparray[n]];
2692 emap[eid] = edgemaparray;
2698 for (
int fid = 0; fid < nfaces; ++fid)
2712 for (n = 0; n < nFaceCoeffs; ++n)
2714 facemaparray[n] = reversemap[maparray[n]];
2717 fmap[fid] = facemaparray;
2723 return m_geom->GetForient(face);
2741 int nq0 = FaceExp->GetNumPoints(0);
2742 int nq1 = FaceExp->GetNumPoints(1);
2745 int dir0 =
GetGeom3D()->GetDir(face, 0);
2746 int dir1 =
GetGeom3D()->GetDir(face, 1);
2757 Vmath::Gathr(
static_cast<int>(faceids.size()), inarray, faceids, o_tmp);
2774 m_base[dir0]->GetPointsKey(),
m_base[dir1]->GetPointsKey(), o_tmp.get(),
2775 FaceExp->GetBasis(to_id0)->GetPointsKey(),
2776 FaceExp->GetBasis(to_id1)->GetPointsKey(), o_tmp2.get());
2786 if (faceGeom->GetNumVerts() == 3)
2790 m_geom->GetFace(traceid));
2796 m_geom->GetFace(traceid));
2805 if (idmap.size() != nq0 * nq1)
2816 for (
int i = 0; i < nq0 * nq1; ++i)
2823 for (
int j = 0; j < nq1; ++j)
2825 for (
int i = 0; i < nq0; ++i)
2827 idmap[j * nq0 + i] = nq0 - 1 - i + j * nq0;
2833 "Case not supposed to be used in this function");
2842 for (
int i = 0; i < nq0 * nq1; ++i)
2850 for (
int j = 0; j < nq1; j++)
2852 for (
int i = 0; i < nq0; ++i)
2854 idmap[j * nq0 + i] = nq0 - 1 - i + j * nq0;
2862 for (
int j = 0; j < nq1; j++)
2864 for (
int i = 0; i < nq0; ++i)
2866 idmap[j * nq0 + i] = nq0 * (nq1 - 1 - j) + i;
2874 for (
int j = 0; j < nq1; j++)
2876 for (
int i = 0; i < nq0; ++i)
2878 idmap[j * nq0 + i] = nq0 * nq1 - 1 - j * nq0 - i;
2886 for (
int i = 0; i < nq0; ++i)
2888 for (
int j = 0; j < nq1; ++j)
2890 idmap[i * nq1 + j] = i + j * nq0;
2898 for (
int i = 0; i < nq0; ++i)
2900 for (
int j = 0; j < nq1; ++j)
2902 idmap[i * nq1 + j] = nq0 - 1 - i + j * nq0;
2910 for (
int i = 0; i < nq0; ++i)
2912 for (
int j = 0; j < nq1; ++j)
2914 idmap[i * nq1 + j] = i + nq0 * (nq1 - 1) - j * nq0;
2922 for (
int i = 0; i < nq0; ++i)
2924 for (
int j = 0; j < nq1; ++j)
2926 idmap[i * nq1 + j] = nq0 * nq1 - 1 - i - j * nq0;
2932 ASSERTL0(
false,
"Unknow orientation");
2951 int nquad_f = FaceExp_f->GetNumPoints(0) * FaceExp_f->GetNumPoints(1);
2954 int nquad0 =
m_base[0]->GetNumPoints();
2955 int nquad1 =
m_base[1]->GetNumPoints();
2956 int nquad2 =
m_base[2]->GetNumPoints();
2957 int nqtot = nquad0 * nquad1 * nquad2;
2969 StdRegions::VarCoeffMap::const_iterator MFdir;
2974 for (
int k = 0; k < coordim; k++)
2976 MFdir = varcoeffs.find(MMFCoeffs[dir * 5 + k]);
2977 tmp = MFdir->second.GetValue();
2981 Vmath::Vvtvp(nquad_f, &tmp_f[0], 1, &normals[k][0], 1, &nFacecdotMF[0],
2982 1, &nFacecdotMF[0], 1);
2992 int nverts = geom->GetFace(traceid)->GetNumVerts();
2995 tn1.
Sub(*(geom->GetFace(traceid)->GetVertex(1)),
2996 *(geom->GetFace(traceid)->GetVertex(0)));
2998 tn2.
Sub(*(geom->GetFace(traceid)->GetVertex(nverts - 1)),
2999 *(geom->GetFace(traceid)->GetVertex(0)));
3001 normal.
Mult(tn1, tn2);
3005 mag = 1.0 /
sqrt(mag);
3011 for (
int i = 0; i < nverts; ++i)
3014 int edgid = geom->GetEdgeNormalToFaceVert(traceid, i);
3017 Dx.
Sub(*(geom->GetEdge(edgid)->GetVertex(0)),
3018 *(geom->GetEdge(edgid)->GetVertex(1)));
3022 h += fabs(normal.
dot(Dx));
3028 int dir0 = geom->GetDir(traceid, 0);
3029 int dir1 = geom->GetDir(traceid, 1);
3031 for (dirn = 0; dirn < 3; ++dirn)
3033 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)