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);
649 int rows = MassMat.GetRows();
650 int cols = MassMat.GetColumns();
656 (*adr) = -lambda * MassMat + AdvMat;
662 if (!massVarcoeffs.empty())
713 int rows = LapMat.GetRows();
714 int cols = LapMat.GetColumns();
720 (*adr) = LapMat - lambda * MassMat + AdvMat;
726 if (!massVarcoeffs.empty())
730 if (!lapVarcoeffs.empty())
785 "Need to specify eFactorGJP to construct "
786 "a LinearAdvectionDiffusionReactionGJP matrix");
788 int rows = LapMat.GetRows();
789 int cols = LapMat.GetColumns();
796 LapMat - lambda * MassMat + AdvMat + gjpfactor * NDTraceMat;
940 "Matrix construction is not implemented for variable "
941 "coefficients at the moment");
952 "HybridDGHelmholtz matrix not set up "
953 "for non boundary-interior expansions");
981 StdRegions::VarCoeffMap::const_iterator x;
984 for (i = 0; i < coordim; ++i)
991 GetMF(i, coordim, varcoeffs);
1012 Mat = Mat + Dmat * invMass *
Transpose(Dmat);
1017 Mat = Mat + Dmat * invMass *
Transpose(Dmat);
1042 Mat = Mat + lambdaval * Mass;
1045 for (i = 0; i < nfaces; ++i)
1048 order_f = FaceExp->GetNcoeffs();
1055 "HDGHelmholtz needs setting up for variable P");
1075 for (j = 0; j < order_f; ++j)
1077 for (k = 0; k < order_f; ++k)
1079 Mat((*map)[j].index, (*map)[k].index) +=
1080 tau * (*map)[j].sign * (*map)[k].sign * eMass(j, k);
1120 for (i = 0; i < nfaces; ++i)
1130 for (j = 0; j < nface; ++j)
1134 face_lambda[j] = 1.0;
1139 FaceExp->BwdTrans(face_lambda, tmp);
1146 for (k = 0; k < ncoeffs; ++k)
1148 Umat(k, bndry_cnt) = Ulam[k];
1231 for (i = 0; i < nfaces; ++i)
1253 ASSERTL0(
false,
"Direction not known");
1259 StdRegions::VarCoeffMap::const_iterator x;
1266 GetMF(dir, coordim, varcoeffs);
1295 for (j = 0; j < nbndry; ++j)
1301 for (k = 0; k < ncoeffs; ++k)
1303 Ulam[k] = lamToU(k, j);
1321 &(Qmat.GetPtr())[0] + j * ncoeffs, 1);
1329 int order_f, nquad_f;
1375 for (i = 0; i < nfaces; ++i)
1381 for (i = 0; i < nbndry; ++i)
1389 for (f = 0; f < nfaces; ++f)
1391 order_f = FaceExp[f]->GetNcoeffs();
1392 nquad_f = FaceExp[f]->GetNumPoints(0) *
1393 FaceExp[f]->GetNumPoints(1);
1417 for (j = 0; j < order_f; ++j)
1420 (*map)[j].sign * (*LamToQ[0])((*map)[j].index, i);
1423 FaceExp[f]->BwdTrans(faceCoeffs, facePhys);
1439 0, f, FaceExp[f], normals, varcoeffs);
1441 Vmath::Vmul(nquad_f, ncdotMF, 1, facePhys, 1, work, 1);
1445 Vmath::Vmul(nquad_f, normals[0], 1, facePhys, 1, work,
1450 for (j = 0; j < order_f; ++j)
1453 (*map)[j].sign * (*LamToQ[1])((*map)[j].index, i);
1456 FaceExp[f]->BwdTrans(faceCoeffs, facePhys);
1472 1, f, FaceExp[f], normals, varcoeffs);
1474 Vmath::Vvtvp(nquad_f, ncdotMF, 1, facePhys, 1, work, 1,
1479 Vmath::Vvtvp(nquad_f, normals[1], 1, facePhys, 1, work,
1484 for (j = 0; j < order_f; ++j)
1487 (*map)[j].sign * (*LamToQ[2])((*map)[j].index, i);
1490 FaceExp[f]->BwdTrans(faceCoeffs, facePhys);
1506 2, f, FaceExp[f], normals, varcoeffs);
1508 Vmath::Vvtvp(nquad_f, ncdotMF, 1, facePhys, 1, work, 1,
1513 Vmath::Vvtvp(nquad_f, normals[2], 1, facePhys, 1, work,
1519 for (j = 0; j < order_f; ++j)
1522 (*map)[j].sign * LamToU((*map)[j].index, i) -
1526 FaceExp[f]->BwdTrans(faceCoeffs, facePhys);
1538 Vmath::Svtvp(nquad_f, -tau, facePhys, 1, work, 1, work, 1);
1541 FaceExp[f]->IProductWRTBase(work, faceCoeffs);
1545 for (j = 0; j < order_f; ++j)
1547 BndMat(cnt + j, i) = faceCoeffs[j];
1563 LapMat.GetRows(), LapMat.GetColumns());
1594 for (
int d = 0; d < ncoords; ++d)
1602 for (
int t = 0; t < ntraces; ++t)
1605 tracepts[t] = traceExp[t]->GetTotPoints();
1606 maxtpts = (maxtpts > tracepts[t]) ? maxtpts : tracepts[t];
1612 for (
int t = 0; t < ntraces; ++t)
1621 PhysDeriv(phys, Deriv[0], Deriv[1], Deriv[2]);
1623 for (
int t = 0; t < ntraces; ++t)
1630 traceExp[t]->GetBasis(0)->GetBasisKey();
1632 traceExp[t]->GetBasis(1)->GetBasisKey();
1634 (fromkey0 != tokey0) || (fromkey1 != tokey1);
1641 for (
int d = 0; d < ncoords; ++d)
1658 tmp = dphidn[t] + i * tracepts[t], 1,
1659 tmp1 = dphidn[t] + i * tracepts[t], 1);
1664 for (
int t = 0; t < ntraces; ++t)
1666 int nt = tracepts[t];
1672 (p == 1) ? 0.02 * h * h : 0.8 * pow(p + 1, -4.0) * h * h;
1679 dphidn[t] + j * nt, 1, val, 1);
1681 Mat(i, j) + scale * traceExp[t]->Integral(val);
1689 for (
int j = 0; j < i; ++j)
1691 Mat(i, j) = Mat(j, i);
1698 "This matrix type cannot be generated from this class");
1730 if (faceExp->GetRightAdjacentElementExp())
1732 if (faceExp->GetRightAdjacentElementExp()
1747 int order_e = (*map).size();
1748 int n_coeffs = FaceExp->GetNcoeffs();
1752 if (n_coeffs != order_e)
1754 FaceExp->FwdTrans(Fn, faceCoeffs);
1756 int NumModesElementMax = FaceExp->GetBasis(0)->GetNumModes();
1757 int NumModesElementMin =
m_base[0]->GetNumModes();
1759 FaceExp->ReduceOrderCoeffs(NumModesElementMin, faceCoeffs, faceCoeffs);
1762 FaceExp->DetShapeType(), *FaceExp);
1763 FaceExp->MassMatrixOp(faceCoeffs, faceCoeffs, masskey);
1766 int offset1 = 0, offset2 = 0;
1770 for (i = 0; i < NumModesElementMin; ++i)
1772 for (j = 0; j < NumModesElementMin; ++j)
1774 faceCoeffs[offset1 + j] = faceCoeffs[offset2 + j];
1776 offset1 += NumModesElementMin;
1777 offset2 += NumModesElementMax;
1781 for (i = NumModesElementMin; i < NumModesElementMax; ++i)
1783 for (j = NumModesElementMin; j < NumModesElementMax; ++j)
1785 faceCoeffs[i * NumModesElementMax + j] = 0.0;
1794 int offset1 = 0, offset2 = 0;
1796 for (i = 0; i < NumModesElementMin; ++i)
1798 for (j = 0; j < NumModesElementMin - i; ++j)
1800 faceCoeffs[offset1 + j] = faceCoeffs[offset2 + j];
1802 offset1 += NumModesElementMin - i;
1803 offset2 += NumModesElementMax - i;
1809 FaceExp->IProductWRTBase(Fn, faceCoeffs);
1814 for (i = 0; i < order_e; ++i)
1816 outarray[(*map)[i].index] -= (*map)[i].sign * faceCoeffs[i];
1821 for (i = 0; i < order_e; ++i)
1823 outarray[(*map)[i].index] += (*map)[i].sign * faceCoeffs[i];
1859 Out_d = InvMass * Coeffs;
1867 "Not set up for non boundary-interior expansions");
1868 ASSERTL1(inoutmat->GetRows() == inoutmat->GetColumns(),
1869 "Assuming that input matrix was square");
1874 int order_f = faceExp->GetNcoeffs();
1887 DNekScalMat &facemat = *faceExp->GetLocMatrix(mkey);
1904 int rows = inoutmat->GetRows();
1912 int nfvert = faceExp->GetNverts();
1919 GetLinStdExp()->GetTraceToElementMap(face, linmap, linsign,
1928 for (i = 0; i < nfvert; ++i)
1930 fmap = faceExp->GetVertexMap(i,
true);
1934 map[fmap] = linmap[i];
1945 for (i = 0; i < order_f; ++i)
1947 for (j = 0; j < nbndry; ++j)
1949 if (map[i] == bmap[j])
1955 ASSERTL1(j != nbndry,
"Did not find number in map");
1974 ASSERTL1((*map1).size() == (*map2).size(),
1975 "There is an error with the GetTraceToElementMap");
1977 for (i = 0; i < face; ++i)
1982 for (i = 0; i < (*map1).size(); ++i)
1986 for (j = 0; j < (*map2).size(); ++j)
1988 if ((*map1)[i].index == (*map2)[j].index)
1995 ASSERTL2(idx >= 0,
"Index not found");
1997 sign[i] = (*map2)[idx].sign;
2002 ASSERTL0(
false,
"Could not identify matrix type from dimension");
2005 for (i = 0; i < order_f; ++i)
2008 for (j = 0; j < order_f; ++j)
2011 (*inoutmat)(id1, id2) += facemat(i, j) *
sign[i] *
sign[j];
2022 int nVerts, vid1, vid2, vMap1, vMap2;
2029 DNekMat &VertexMat = (*vertexmatrix);
2031 for (vid1 = 0; vid1 < nVerts; ++vid1)
2035 for (vid2 = 0; vid2 < nVerts; ++vid2)
2038 VertexValue = (*r_bnd)(vMap1, vMap2);
2039 VertexMat.SetValue(vid1, vid2, VertexValue);
2043 return vertexmatrix;
2050 int eid, fid, vid, n, i;
2083 int nConnectedEdges = 3;
2084 int nConnectedFaces = 3;
2095 nBndCoeffs, nBndCoeffs, 0.0, storage);
2097 DNekMat &R = (*transformationmatrix);
2102 for (vid = 0; vid < nVerts; ++vid)
2112 int nedgemodesconnected =
2118 int nfacemodesconnected =
2127 for (eid = 0; eid < nConnectedEdges; ++eid)
2129 MatEdgeLocation[eid] =
2131 nmodes = MatEdgeLocation[eid].size();
2136 &edgemodearray[offset], 1);
2145 for (fid = 0; fid < nConnectedFaces; ++fid)
2147 MatFaceLocation[fid] =
2149 nmodes = MatFaceLocation[fid].size();
2154 &facemodearray[offset], 1);
2161 DNekMat &Sveft = (*vertexedgefacetransformmatrix);
2165 DNekMat &Svef = (*vertexedgefacecoupling);
2168 for (n = 0; n < nedgemodesconnected; ++n)
2171 VertexEdgeFaceValue = (*r_bnd)(
GetVertexMap(vid), edgemodearray[n]);
2174 Svef.SetValue(0, n, VertexEdgeFaceValue);
2178 for (n = 0; n < nfacemodesconnected; ++n)
2181 VertexEdgeFaceValue = (*r_bnd)(
GetVertexMap(vid), facemodearray[n]);
2184 Svef.SetValue(0, n + nedgemodesconnected, VertexEdgeFaceValue);
2198 DNekMat &Sefef = (*edgefacecoupling);
2203 for (m = 0; m < nedgemodesconnected; ++m)
2205 for (n = 0; n < nedgemodesconnected; ++n)
2208 EdgeEdgeValue = (*r_bnd)(edgemodearray[n], edgemodearray[m]);
2211 Sefef.SetValue(n, m, EdgeEdgeValue);
2216 for (n = 0; n < nfacemodesconnected; ++n)
2218 for (m = 0; m < nfacemodesconnected; ++m)
2221 FaceFaceValue = (*r_bnd)(facemodearray[n], facemodearray[m]);
2223 Sefef.SetValue(nedgemodesconnected + n, nedgemodesconnected + m,
2229 for (n = 0; n < nedgemodesconnected; ++n)
2231 for (m = 0; m < nfacemodesconnected; ++m)
2234 FaceFaceValue = (*r_bnd)(edgemodearray[n], facemodearray[m]);
2237 Sefef.SetValue(n, nedgemodesconnected + m, FaceFaceValue);
2239 FaceFaceValue = (*r_bnd)(facemodearray[m], edgemodearray[n]);
2242 Sefef.SetValue(nedgemodesconnected + m, n, FaceFaceValue);
2252 Sveft = -Svef * Sefef;
2256 for (n = 0; n < edgemodearray.size(); ++n)
2258 R.SetValue(
GetVertexMap(vid), edgemodearray[n], Sveft(0, n));
2262 for (n = 0; n < facemodearray.size(); ++n)
2265 Sveft(0, n + nedgemodesconnected));
2288 int efCol, efRow, nedgemodes;
2291 nConnectedFaces = 2;
2300 for (eid = 0; eid < nEdges; ++eid)
2311 DNekMat &Mef = (*efedgefacecoupling);
2317 DNekMat &Meff = (*effacefacecoupling);
2323 DNekMat &Meft = (*edgefacetransformmatrix);
2325 int nfacemodesconnected =
2337 Vmath::Vcopy(nedgemodes, &inedgearray[0], 1, &edgemodearray[0], 1);
2343 for (fid = 0; fid < nConnectedFaces; ++fid)
2345 MatFaceLocation[fid] =
2347 nmodes = MatFaceLocation[fid].size();
2352 &facemodearray[offset], 1);
2358 for (n = 0; n < nedgemodes; ++n)
2360 for (m = 0; m < nfacemodesconnected; ++m)
2363 EdgeFaceValue = (*r_bnd)(edgemodearray[n], facemodearray[m]);
2366 Mef.SetValue(n, m, EdgeFaceValue);
2371 for (n = 0; n < nfacemodesconnected; ++n)
2373 for (m = 0; m < nfacemodesconnected; ++m)
2376 FaceFaceValue = (*r_bnd)(facemodearray[n], facemodearray[m]);
2379 Meff.SetValue(n, m, FaceFaceValue);
2393 for (n = 0; n < Meft.GetRows(); ++n)
2395 for (m = 0; m < Meft.GetColumns(); ++m)
2397 R.SetValue(edgemodearray[n], facemodearray[m], Meft(n, m));
2402 for (i = 0; i < R.GetRows(); ++i)
2404 R.SetValue(i, i, 1.0);
2410 return transformationmatrix;
2431 int i, j, n, eid = 0, fid = 0;
2443 DNekMat &InvR = (*inversetransformationmatrix);
2451 int nedgemodestotal = 0;
2452 int nfacemodestotal = 0;
2454 for (eid = 0; eid < nEdges; ++eid)
2457 nedgemodestotal += nedgemodes;
2460 for (fid = 0; fid < nFaces; ++fid)
2463 nfacemodestotal += nfacemodes;
2472 for (eid = 0; eid < nEdges; ++eid)
2480 Vmath::Vcopy(nedgemodes, &edgearray[0], 1, &edgemodearray[offset],
2484 offset += nedgemodes;
2490 for (fid = 0; fid < nFaces; ++fid)
2498 Vmath::Vcopy(nfacemodes, &facearray[0], 1, &facemodearray[offset],
2502 offset += nfacemodes;
2506 for (i = 0; i < nVerts; ++i)
2508 for (j = 0; j < nedgemodestotal; ++j)
2513 for (j = 0; j < nfacemodestotal; ++j)
2517 for (n = 0; n < nedgemodestotal; ++n)
2519 MatrixValue = InvR.GetValue(
GetVertexMap(i), facemodearray[j]) +
2521 R(edgemodearray[n], facemodearray[j]);
2522 InvR.SetValue(
GetVertexMap(i), facemodearray[j], MatrixValue);
2528 for (i = 0; i < nedgemodestotal; ++i)
2530 for (j = 0; j < nfacemodestotal; ++j)
2532 InvR.SetValue(edgemodearray[i], facemodearray[j],
2533 -R(edgemodearray[i], facemodearray[j]));
2537 for (i = 0; i < nCoeffs; ++i)
2539 InvR.SetValue(i, i, 1.0);
2542 return inversetransformationmatrix;
2556 map<int, int> invmap;
2557 for (j = 0; j < nBndCoeffs; ++j)
2559 invmap[bmap[j]] = j;
2575 for (n = 0; n < nEdgeCoeffs; ++n)
2577 edgemaparray[n] = invmap[maparray[n]];
2580 return edgemaparray;
2596 map<int, int> reversemap;
2597 for (j = 0; j < bmap.size(); ++j)
2599 reversemap[bmap[j]] = j;
2615 fOrient = faceOrient;
2631 ASSERTL1(P1 <= locP1,
"Expect value of passed P1 to "
2632 "be lower or equal to face num modes");
2641 ASSERTL1(P2 <= locP2,
"Expect value of passed P2 to "
2642 "be lower or equal to face num modes");
2645 switch (
GetGeom3D()->GetFace(fid)->GetShapeType())
2649 if (((P1 - 3) > 0) && ((P2 - 3) > 0))
2656 for (n = 0; n < P1 - 3; ++n)
2658 for (
int m = 0; m < P2 - 3 - n; ++m, ++cnt)
2660 facemaparray[cnt] = reversemap[maparray[cnt1 + m]];
2662 cnt1 += locP2 - 3 - n;
2669 if (((P1 - 2) > 0) && ((P2 - 2) > 0))
2676 for (n = 0; n < P2 - 2; ++n)
2678 for (
int m = 0; m < P1 - 2; ++m, ++cnt)
2680 facemaparray[cnt] = reversemap[maparray[cnt1 + m]];
2689 ASSERTL0(
false,
"Invalid shape type.");
2694 return facemaparray;
2713 map<int, int> reversemap;
2714 for (j = 0; j < bmap.size(); ++j)
2716 reversemap[bmap[j]] = j;
2721 for (n = 0; n < nverts; ++n)
2724 vmap[n] = reversemap[id];
2730 for (
int eid = 0; eid < nedges; ++eid)
2744 for (n = 0; n < nEdgeCoeffs; ++n)
2746 edgemaparray[n] = reversemap[maparray[n]];
2748 emap[eid] = edgemaparray;
2754 for (
int fid = 0; fid < nfaces; ++fid)
2768 for (n = 0; n < nFaceCoeffs; ++n)
2770 facemaparray[n] = reversemap[maparray[n]];
2773 fmap[fid] = facemaparray;
2797 int nq0 = FaceExp->GetNumPoints(0);
2798 int nq1 = FaceExp->GetNumPoints(1);
2813 Vmath::Gathr(
static_cast<int>(faceids.size()), inarray, faceids, o_tmp);
2830 m_base[dir0]->GetPointsKey(),
m_base[dir1]->GetPointsKey(),
2831 o_tmp.data(), FaceExp->GetBasis(to_id0)->GetPointsKey(),
2832 FaceExp->GetBasis(to_id1)->GetPointsKey(), o_tmp2.data());
2861 if (idmap.size() != nq0 * nq1)
2872 for (
int i = 0; i < nq0 * nq1; ++i)
2879 for (
int j = 0; j < nq1; ++j)
2881 for (
int i = 0; i < nq0; ++i)
2883 idmap[j * nq0 + i] = nq0 - 1 - i + j * nq0;
2889 "Case not supposed to be used in this function");
2898 for (
int i = 0; i < nq0 * nq1; ++i)
2906 for (
int j = 0; j < nq1; j++)
2908 for (
int i = 0; i < nq0; ++i)
2910 idmap[j * nq0 + i] = nq0 - 1 - i + j * nq0;
2918 for (
int j = 0; j < nq1; j++)
2920 for (
int i = 0; i < nq0; ++i)
2922 idmap[j * nq0 + i] = nq0 * (nq1 - 1 - j) + i;
2930 for (
int j = 0; j < nq1; j++)
2932 for (
int i = 0; i < nq0; ++i)
2934 idmap[j * nq0 + i] = nq0 * nq1 - 1 - j * nq0 - i;
2942 for (
int i = 0; i < nq0; ++i)
2944 for (
int j = 0; j < nq1; ++j)
2946 idmap[i * nq1 + j] = i + j * nq0;
2954 for (
int i = 0; i < nq0; ++i)
2956 for (
int j = 0; j < nq1; ++j)
2958 idmap[i * nq1 + j] = nq0 - 1 - i + j * nq0;
2966 for (
int i = 0; i < nq0; ++i)
2968 for (
int j = 0; j < nq1; ++j)
2970 idmap[i * nq1 + j] = i + nq0 * (nq1 - 1) - j * nq0;
2978 for (
int i = 0; i < nq0; ++i)
2980 for (
int j = 0; j < nq1; ++j)
2982 idmap[i * nq1 + j] = nq0 * nq1 - 1 - i - j * nq0;
2988 ASSERTL0(
false,
"Unknow orientation");
3007 int nquad_f = FaceExp_f->GetNumPoints(0) * FaceExp_f->GetNumPoints(1);
3010 int nquad0 =
m_base[0]->GetNumPoints();
3011 int nquad1 =
m_base[1]->GetNumPoints();
3012 int nquad2 =
m_base[2]->GetNumPoints();
3013 int nqtot = nquad0 * nquad1 * nquad2;
3025 StdRegions::VarCoeffMap::const_iterator MFdir;
3030 for (
int k = 0; k < coordim; k++)
3032 MFdir = varcoeffs.find(MMFCoeffs[dir * 5 + k]);
3033 tmp = MFdir->second.GetValue();
3037 Vmath::Vvtvp(nquad_f, &tmp_f[0], 1, &normals[k][0], 1, &nFacecdotMF[0],
3038 1, &nFacecdotMF[0], 1);
3057 normal.
Mult(tn1, tn2);
3061 mag = 1.0 /
sqrt(mag);
3067 for (
int i = 0; i < nverts; ++i)
3078 h += fabs(normal.
dot(Dx));
3084 int dir0 = geom->
GetDir(traceid, 0);
3085 int dir1 = geom->
GetDir(traceid, 1);
3087 for (dirn = 0; dirn < 3; ++dirn)
3089 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
SpatialDomains::Geometry3D * GetGeom3D() const
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
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.
void GetTracePhysMap(const int edge, Array< OneD, int > &outarray)
void DropLocMatrix(const LocalRegions::MatrixKey &mkey)
SpatialDomains::Geometry * GetGeom() const
DNekMatSharedPtr BuildVertexMatrix(const DNekScalMatSharedPtr &r_bnd)
SpatialDomains::Geometry * m_geom
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
Base class for shape geometry information.
int GetGlobalID(void) const
Get the ID of this object.
PointGeom * GetVertex(int i) const
Returns vertex i of this object.
int GetDir(const int i, const int j=0) const
Returns the element coordinate direction corresponding to a given face coordinate direction.
int GetVertexEdgeMap(int i, int j) const
Returns the standard element edge IDs that are connected to a given vertex.
int GetNumVerts() const
Get the number of vertices of this object.
int GetVertexFaceMap(int i, int j) const
Returns the standard element face IDs that are connected to a given vertex.
Geometry1D * GetEdge(int i) const
Returns edge i of this object.
Geometry2D * GetFace(int i) const
Returns face i of this object.
int GetEdgeFaceMap(int i, int j) const
Returns the standard element edge IDs that are connected to a given face.
int GetEdgeNormalToFaceVert(int i, int j) const
Returns the standard lement edge IDs that are normal to a given face vertex.
StdRegions::Orientation GetEorient(const int i) const
Returns the orientation of edge i with respect to the ordering of edges in the standard element.
StdRegions::Orientation GetForient(const int i) const
Returns the orientation of face i with respect to the ordering of faces in the standard element.
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.
void DropLocStaticCondMatrix(const LocalRegions::MatrixKey &mkey)
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)
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.
const LibUtilities::BasisKey GetTraceBasisKey(const int i, int k=-1, bool UseGLL=false) const
This function returns the basis key belonging to the i-th trace.
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< StdExpansion > StdExpansionSharedPtr
@ eLinearAdvectionReaction
@ 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::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)