50 namespace MultiRegions
63 LocTraceToTraceMap::LocTraceToTraceMap(
68 const vector<bool> &LeftAdjacents)
73 m_expdim = locExpVector[0]->GetShapeDimension();
76 Setup(locExp, trace, elmtToTrace, LeftAdjacents);
79 LocTraceToTraceMap::~LocTraceToTraceMap()
91 void LocTraceToTraceMap::Setup(
96 const vector<bool> &LeftAdjacents)
116 const std::shared_ptr<LocalRegions::ExpansionVector> exp =
119 int cnt, n, e, phys_offset;
121 int nexp = exp->size();
122 m_nTracePts = trace->GetTotPoints();
129 m_nFwdLocTracePts = 0;
132 for (cnt = n = 0; n < nexp; ++n)
136 for (
int i = 0; i < elmt->GetNtraces(); ++i, ++cnt)
138 int nLocPts = elmt->GetTraceNumPoints(i);
139 m_nLocTracePts += nLocPts;
141 if (LeftAdjacents[cnt])
143 nFwdPts += elmtToTrace[n][i]->GetTotPoints();
144 nFwdCoeffs += elmtToTrace[n][i]->GetNcoeffs();
145 m_nFwdLocTracePts += nLocPts;
149 nBwdPts += elmtToTrace[n][i]->GetTotPoints();
150 nBwdCoeffs += elmtToTrace[n][i]->GetNcoeffs();
160 m_nTraceCoeffs[0] = nFwdCoeffs;
161 m_nTraceCoeffs[1] = nBwdCoeffs;
164 m_traceCoeffsToElmtMap[1] = m_traceCoeffsToElmtMap[0] + nFwdCoeffs;
166 m_traceCoeffsToElmtTrace[1] = m_traceCoeffsToElmtTrace[0] + nFwdCoeffs;
168 m_traceCoeffsToElmtSign[1] = m_traceCoeffsToElmtSign[0] + nFwdCoeffs;
171 map<TraceInterpPoints, vector<pair<int, int> >,
cmpop> TraceInterpMap;
173 vector<vector<int> > TraceOrder;
174 TraceOrder.resize(nexp);
181 for (cnt = n = 0; n < nexp; ++n)
184 ntrace = elmt->GetNtraces();
185 TraceOrder[n].resize(ntrace);
188 for (e = 0; e < ntrace; ++e, ++cnt)
201 fromPointsKey0 = elmt->GetBasis(0)->GetPointsKey();
213 int dir0 = elmt->GetGeom()->GetDir(e, 0);
215 fromPointsKey0 = elmt->GetBasis(dir0)->GetPointsKey();
219 toPointsKey0 = elmttrace->GetBasis(0)->GetPointsKey();
223 P[0] = elmttrace->GetBasisNumModes(0);
228 int dir0 = elmt->GetGeom()->GetDir(e, 0);
229 int dir1 = elmt->GetGeom()->GetDir(e, 1);
231 fromPointsKey0 = elmt->GetBasis(dir0)->GetPointsKey();
232 fromPointsKey1 = elmt->GetBasis(dir1)->GetPointsKey();
236 toPointsKey0 = elmttrace->GetBasis(0)->GetPointsKey();
237 toPointsKey1 = elmttrace->GetBasis(1)->GetPointsKey();
241 toPointsKey0 = elmttrace->GetBasis(1)->GetPointsKey();
242 toPointsKey1 = elmttrace->GetBasis(0)->GetPointsKey();
245 P[0] = elmttrace->GetBasisNumModes(0);
246 P[1] = elmttrace->GetBasisNumModes(1);
252 toPointsKey0, toPointsKey1);
254 pair<int, int> epf(n, e);
255 TraceInterpMap[fpoint].push_back(epf);
256 TraceOrder[n][e] = cnt;
263 elmt->GetTraceToElementMap(e, map,
sign, orient,
P[0],
P[1]);
265 int order_t = elmttrace->GetNcoeffs();
266 int t_offset = trace->GetCoeff_Offset(elmttrace->GetElmtId());
270 if (elmt->GetTraceExp(e)->GetRightAdjacentElementExp())
272 if (elmttrace->GetRightAdjacentElementExp()
273 ->GetGeom()->GetGlobalID() == elmt->GetGeom()
280 if (LeftAdjacents[cnt])
282 for (
int i = 0; i < order_t; ++i)
284 m_traceCoeffsToElmtMap[0][fwdcnt] = coeffoffset + map[i];
285 m_traceCoeffsToElmtTrace[0][fwdcnt] = t_offset + i;
286 m_traceCoeffsToElmtSign[0][fwdcnt++] = fac *
sign[i];
291 for (
int i = 0; i < order_t; ++i)
293 m_traceCoeffsToElmtMap[1][bwdcnt] = coeffoffset + map[i];
294 m_traceCoeffsToElmtTrace[1][bwdcnt] = t_offset + i;
295 m_traceCoeffsToElmtSign[1][bwdcnt++] = fac *
sign[i];
301 int nInterpType = TraceInterpMap.size();
304 for (
int i = 0; i < 2; ++i)
315 for (
int i = 0; i < 2; ++i)
323 int ntracepts, ntracepts1;
335 for (
auto it = TraceInterpMap.begin(); it != TraceInterpMap.end();
346 for (
int f = 0; f < it->second.size(); ++f, ++cnt2)
348 n = it->second[f].first;
349 e = it->second[f].second;
358 elmt->GetTracePhysMap(e, traceids);
360 ntracepts = elmt->GetTraceNumPoints(e);
361 ntracepts1 = elmttrace->GetTotPoints();
365 elmt->ReOrientTracePhysMap(orient, locTraceToTraceMap,
369 int offset = trace->GetPhys_Offset(elmtToTrace[n][e]->GetElmtId());
371 if (LeftAdjacents[TraceOrder[n][e]])
373 for (
int i = 0; i < ntracepts; ++i)
375 m_fieldToLocTraceMap[cntFwd + i] =
376 phys_offset + traceids[i];
379 for (
int i = 0; i < ntracepts1; ++i)
381 m_LocTraceToTraceMap[0][cntFwd1 + i] =
382 offset + locTraceToTraceMap[i];
386 cntFwd1 += ntracepts1;
391 for (
int i = 0; i < ntracepts; ++i)
393 m_fieldToLocTraceMap[m_nFwdLocTracePts + cntBwd + i] =
394 phys_offset + traceids[i];
397 for (
int i = 0; i < ntracepts1; ++i)
399 m_LocTraceToTraceMap[1][cntBwd1 + i] =
400 offset + locTraceToTraceMap[i];
404 cntBwd1 += ntracepts1;
408 m_interpNfaces[set][cnt1] += 1;
410 if ((fwdSet ==
false && set == 0) ||
411 (bwdSet ==
false && set == 1))
413 m_interpPoints[set][cnt1] = it->first;
425 if (fromPointsKey0 == toPointsKey0)
432 m_interpTraceI0[set][cnt1] =
434 [fromPointsKey0]->GetI(toPointsKey0);
451 m_interpEndPtI0[set][cnt1] =
456 m_interpTraceI0[set][cnt1]->
457 GetPtr().get() + tnp0 - 1, tnp0,
458 &m_interpEndPtI0[set][cnt1][0],1);
466 if (fromPointsKey0 == toPointsKey0)
468 if (fromPointsKey1 == toPointsKey1)
475 m_interpTraceI1[set][cnt1] =
477 [fromPointsKey1]->GetI(toPointsKey1);
492 m_interpEndPtI1[set][cnt1] =
496 m_interpTraceI1[set][cnt1]->GetPtr().get()+
498 &m_interpEndPtI1[set][cnt1][0], 1);
505 if (fromPointsKey1 == toPointsKey1)
508 m_interpTraceI0[set][cnt1] =
510 [fromPointsKey0]->GetI(toPointsKey0);
522 m_interpTrace[set][cnt1] =
526 m_interpEndPtI0[set][cnt1] =
530 m_interpTraceI0[set][cnt1]->
531 GetPtr().get()+ tnp0 - 1,tnp0,
532 &m_interpEndPtI0[set][cnt1][0],
540 m_interpTraceI0[set][cnt1] =
542 ->GetI(toPointsKey0);
543 m_interpTraceI1[set][cnt1] =
545 ->GetI(toPointsKey1);
557 m_interpTrace[set][cnt1] =
561 m_interpEndPtI0[set][cnt1] =
565 m_interpTraceI0[set][cnt1]->
568 &m_interpEndPtI0[set][cnt1][0],1);
588 TraceLocToElmtLocCoeffMap(locExp,trace);
589 FindElmtNeighbors(locExp,trace);
592 void LocTraceToTraceMap::CalcLocTracePhysToTraceIDMap(
599 CalcLocTracePhysToTraceIDMap_2D(tracelist);
602 CalcLocTracePhysToTraceIDMap_3D(tracelist);
606 "CalcLocTracePhysToTraceIDMap not coded");
610 void LocTraceToTraceMap::CalcLocTracePhysToTraceIDMap_2D(
613 std::shared_ptr<LocalRegions::ExpansionVector> traceExp= tracelist->GetExp();
614 int ntotTrace = (*traceExp).size();
620 m_nLocTracePts-m_nFwdLocTracePts,-1);
623 for(
int nt=0; nt<ntotTrace;nt++)
625 ntPnts = tracelist->GetTotPoints(nt);
626 noffset = tracelist->GetPhys_Offset(nt);
627 for(
int i=0;i<ntPnts;i++)
636 m_nLocTracePts-m_nFwdLocTracePts,0.0);
638 for(
int dir = 0; dir<2;dir++)
646 m_LocTraceToTraceMap[dir].get(),
649 for (
int i = 0; i < m_interpTrace[dir].size(); ++i)
651 if (m_interpNfaces[dir][i])
654 std::get<0>(m_interpPoints[dir][i]);
656 std::get<2>(m_interpPoints[dir][i]);
660 int nedges = m_interpNfaces[dir][i];
662 for(
int ne=0;ne<nedges;ne++)
664 Vmath::Fill(fnp,tmp[cnt1],&loctracePntsLR[dir][cnt],1);
673 for(
int nlr = 0; nlr<2;nlr++)
675 for(
int i=0;i<loctracePntsLR[nlr].size();i++)
677 m_LocTracephysToTraceIDMap[nlr][i] =
678 std::round(loctracePntsLR[nlr][i]);
680 m_LocTracephysToTraceIDMap[nlr][i]));
685 "m_LocTracephysToTraceIDMap may not be integer !!");
688 void LocTraceToTraceMap::CalcLocTracePhysToTraceIDMap_3D(
691 std::shared_ptr<LocalRegions::ExpansionVector> traceExp= tracelist->GetExp();
692 int ntotTrace = (*traceExp).size();
698 m_nLocTracePts-m_nFwdLocTracePts,-1);
701 for(
int nt=0; nt<ntotTrace;nt++)
703 ntPnts = tracelist->GetTotPoints(nt);
704 noffset = tracelist->GetPhys_Offset(nt);
705 for(
int i=0;i<ntPnts;i++)
714 m_nLocTracePts-m_nFwdLocTracePts,0.0);
716 for(
int dir = 0; dir<2;dir++)
725 m_LocTraceToTraceMap[dir].get(),
728 for (
int i = 0; i < m_interpTrace[dir].size(); ++i)
730 if (m_interpNfaces[dir][i])
733 std::get<0>(m_interpPoints[dir][i]);
735 std::get<1>(m_interpPoints[dir][i]);
737 std::get<2>(m_interpPoints[dir][i]);
739 std::get<3>(m_interpPoints[dir][i]);
746 int nfttl = fnp0 * fnp1;
748 for(
int ne=0;ne<m_interpNfaces[dir][i];ne++)
750 Vmath::Fill(nfttl,tmp[cnt1],&loctracePntsLR[dir][cnt],1);
759 for(
int nlr = 0; nlr<2;nlr++)
761 for(
int i=0;i<loctracePntsLR[nlr].size();i++)
763 m_LocTracephysToTraceIDMap[nlr][i] =
764 std::round(loctracePntsLR[nlr][i]);
766 m_LocTracephysToTraceIDMap[nlr][i]));
771 "m_LocTracephysToTraceIDMap may not be integer !!");
780 void LocTraceToTraceMap::TraceLocToElmtLocCoeffMap(
784 const std::shared_ptr<LocalRegions::ExpansionVector> exptrac =
786 size_t ntrace = exptrac->size();
794 for (
int lr = 0; lr < 2; ++lr)
800 for (
int i = 0; i < ntrace; ++i)
802 size_t ncoeff = trace->GetNcoeffs(i);
811 trace->GetCoeffsToElmt();
813 for (
int lr = 0; lr < 2; ++lr)
815 int ntotcoeffs = m_nTraceCoeffs[lr];
816 for (
int i = 0; i < ntotcoeffs; ++i)
818 int ncoeffField = m_traceCoeffsToElmtMap[lr][i];
819 int ncoeffTrace = m_traceCoeffsToElmtTrace[lr][i];
820 int sign = m_traceCoeffsToElmtSign[lr][i];
822 int ntraceelmt = trace_coeffToElmt[ncoeffTrace].first;
823 int ntracelocN = trace_coeffToElmt[ncoeffTrace].second;
825 int nfieldelmt = field_coeffToElmt[ncoeffField].first;
826 int nfieldlocN = field_coeffToElmt[ncoeffField].second;
828 LRAdjflag[lr][ntraceelmt] =
true;
829 LRAdjExpid[lr][ntraceelmt] = nfieldelmt;
831 elmtLRMap[lr][ntraceelmt][ntracelocN] = nfieldlocN;
832 elmtLRSign[lr][ntraceelmt][ntracelocN] =
sign;
835 m_leftRightAdjacentExpId = LRAdjExpid;
836 m_leftRightAdjacentExpFlag = LRAdjflag;
837 m_traceCoeffToLeftRightExpCoeffMap = elmtLRMap;
838 m_traceCoeffToLeftRightExpCoeffSign = elmtLRSign;
841 void LocTraceToTraceMap::FindElmtNeighbors(
845 const std::shared_ptr<LocalRegions::ExpansionVector> exptrac =
847 int ntrace = exptrac->size();
849 const std::shared_ptr<LocalRegions::ExpansionVector> exp =
851 int nexp = exp->size();
855 LRAdjExpid = m_leftRightAdjacentExpId ;
856 LRAdjflag = m_leftRightAdjacentExpFlag;
858 std::set< std::pair<int, int> > neighborSet;
860 for(
int nt = 0; nt < ntrace; nt++)
862 if(LRAdjflag[0][nt]&&LRAdjflag[1][nt])
864 ntmp0 = LRAdjExpid[0][nt];
865 ntmp1 = LRAdjExpid[1][nt];
867 ASSERTL0(ntmp0!=ntmp1,
" ntmp0==ntmp1, trace inside a element?? ");
869 std::set< std::pair<int, int> >::iterator it = neighborSet.begin();
870 neighborSet.insert(it, std::make_pair(ntmp0,ntmp1));
871 neighborSet.insert(it, std::make_pair(ntmp1,ntmp0));
876 for (std::set< std::pair<int, int> >::iterator it=neighborSet.begin();
877 it!=neighborSet.end(); ++it)
879 int ncurrent = it->first;
880 ElemIndex[ncurrent]++;
887 for(
int ne = 0; ne < nexp; ne++)
889 int neighb = ElemNeighbsNumb[ne];
894 for(
int ne = 0; ne < nexp; ne++)
898 for (std::set< std::pair<int, int> >::iterator it=neighborSet.begin();
899 it!=neighborSet.end(); ++it)
901 int ncurrent = it->first;
902 int neighbor = it->second;
903 ElemNeighbsId[ncurrent][ ElemIndex[ncurrent] ] = neighbor;
904 ElemIndex[ncurrent]++;
908 for(
int ne = 0; ne < nexp; ne++)
911 for(
int nb =0; nb<ElemNeighbsNumb[ne]; nb++)
913 int neighbId = ElemNeighbsId[ne][nb];
915 for(
int nc =0; nc<ElemIndex[ne]; nc++)
917 if(ElemNeighbsId[ne][nb]==tmpId[ne][nc])
924 tmpId[ne][ ElemIndex[ne] ] = neighbId;
929 ElemNeighbsNumb = ElemIndex;
930 for(
int ne = 0; ne < nexp; ne++)
932 int neighb = ElemNeighbsNumb[ne];
941 for(
int ne = 0; ne < nexp; ne++)
943 for(
int nb =0; nb<ElemNeighbsNumb[ne]; nb++)
945 ASSERTL0( (ElemNeighbsId[ne][nb]>=0)&&(ElemNeighbsId[ne][nb]<=nexp),
946 "Element id <0 or >number of total elements")
950 m_ElemNeighbsNumb = ElemNeighbsNumb;
951 m_ElemNeighbsId = ElemNeighbsId;
961 void LocTraceToTraceMap::LocTracesFromField(
967 Vmath::Gathr(
static_cast<int>(m_fieldToLocTraceMap.size()),
969 m_fieldToLocTraceMap,
981 void LocTraceToTraceMap::AddLocTracesToField(
985 size_t nfield = field.size();
989 m_fieldToLocTraceMap,
1001 void LocTraceToTraceMap::FwdLocTracesFromField(
1004 Vmath::Gathr(m_nFwdLocTracePts, field, m_fieldToLocTraceMap, faces);
1008 void LocTraceToTraceMap::InterpLocTracesToTrace(
1018 m_LocTraceToTraceMap[dir].get(),
1022 InterpLocEdgesToTrace(dir,loctraces,traces);
1025 InterpLocFacesToTrace(dir,loctraces,traces);
1028 NEKERROR(ErrorUtil::efatal,
"Not set up");
1041 void LocTraceToTraceMap::InterpLocEdgesToTrace(
1047 "option dir out of range, "
1048 " dir=0 is fwd, dir=1 is bwd");
1056 for (
int i = 0; i < m_interpTrace[dir].size(); ++i)
1059 if (m_interpNfaces[dir][i])
1063 std::get<0>(m_interpPoints[dir][i]);
1065 std::get<2>(m_interpPoints[dir][i]);
1069 int nedges = m_interpNfaces[dir][i];
1072 switch (m_interpTrace[dir][i])
1077 locedges.get() + cnt,
1087 fnp,1.0, I0->GetPtr().get(),
1088 tnp, locedges.get() + cnt,
1089 fnp, 0.0, tmp.get() + cnt1,
1097 for (
int k = 0; k < nedges; ++k)
1100 &locedges[cnt + k * fnp],
1102 &tmp[cnt1 + k * tnp],
1106 fnp, locedges.get() + cnt + k * fnp, 1, &I0[0], 1);
1112 "Invalid interpolation type for 2D elements");
1116 cnt += nedges * fnp;
1117 cnt1 += nedges * tnp;
1123 m_LocTraceToTraceMap[dir].get(),
1134 void LocTraceToTraceMap::RightIPTWLocEdgesToTraceInterpMat(
1140 "option dir out of range, "
1141 " dir=0 is fwd, dir=1 is bwd");
1151 Vmath::Gathr(
static_cast<int>(m_LocTraceToTraceMap[dir].size()),
1153 m_LocTraceToTraceMap[dir],
1156 for (
int i = 0; i < m_interpTrace[dir].size(); ++i)
1159 if (m_interpNfaces[dir][i])
1163 std::get<0>(m_interpPoints[dir][i]);
1165 std::get<2>(m_interpPoints[dir][i]);
1169 int nedges = m_interpNfaces[dir][i];
1172 switch (m_interpTrace[dir][i])
1179 locedges.get() + cnt,
1197 locedges.get() + cnt,
1205 for (
int k = 0; k < nedges; ++k)
1208 &tmp[cnt1 + k * tnp],
1210 &locedges[cnt + k * fnp],
1214 &I0[0], 1,locedges.get() + cnt + k * fnp, 1,
1215 locedges.get() + cnt + k * fnp, 1);
1221 "Invalid interpolation type for 2D elements");
1225 cnt += nedges * fnp;
1226 cnt1 += nedges * tnp;
1239 void LocTraceToTraceMap::InterpLocFacesToTrace(
1245 "option dir out of range, "
1246 " dir=0 is fwd, dir=1 is bwd");
1254 for (
int i = 0; i < m_interpTrace[dir].size(); ++i)
1257 if (m_interpNfaces[dir][i])
1261 std::get<0>(m_interpPoints[dir][i]);
1263 std::get<1>(m_interpPoints[dir][i]);
1265 std::get<2>(m_interpPoints[dir][i]);
1267 std::get<3>(m_interpPoints[dir][i]);
1273 int nfromfacepts = m_interpNfaces[dir][i] * fnp0 * fnp1;
1276 switch (m_interpTrace[dir][i])
1281 locfaces.get() + cnt,
1298 locfaces.get() + cnt,
1307 int nfaces = m_interpNfaces[dir][i];
1308 for (
int k = 0; k < fnp0; ++k)
1311 locfaces.get() + cnt + k,
1313 tmp.get() + cnt1 + k,
1319 tnp1 * m_interpNfaces[dir][i],
1326 tmp.get() + cnt1 + tnp0 - 1,
1333 for (
int j = 0; j < m_interpNfaces[dir][i]; ++j)
1341 locfaces.get() + cnt + j * fnp0 * fnp1,
1346 tmp.get() + cnt1 + j * tnp0 * tnp1,
1354 for (
int j = 0; j < m_interpNfaces[dir][i]; ++j)
1358 locfaces.get() + cnt + j * fnp0 * fnp1,
1360 tmp.get() + cnt1 + j * tnp0 * tnp1,
1364 for (
int k = 0; k < tnp0; ++k)
1366 tmp[cnt1 + k + (j + 1) * tnp0 * tnp1 - tnp0] =
1368 locfaces.get() + cnt +
1369 j * fnp0 * fnp1 + k,
1384 for (
int j = 0; j < m_interpNfaces[dir][i]; ++j)
1392 locfaces.get() + cnt + j * fnp0 * fnp1,
1397 wsp.get() + j * fnp0 * tnp1,
1403 tnp1 * m_interpNfaces[dir][i],
1419 for (
int j = 0; j < m_interpNfaces[dir][i]; ++j)
1427 locfaces.get() + cnt + j * fnp0 * fnp1,
1432 tmp.get() + cnt1 + j * tnp0 * tnp1,
1439 tnp1 * m_interpNfaces[dir][i],
1446 tmp.get() + cnt1 + tnp0 - 1,
1451 cnt += nfromfacepts;
1452 cnt1 += m_interpNfaces[dir][i] * tnp0 * tnp1;
1458 m_LocTraceToTraceMap[dir].get(),
1469 void LocTraceToTraceMap::RightIPTWLocFacesToTraceInterpMat(
1475 "option dir out of range, "
1476 " dir=0 is fwd, dir=1 is bwd");
1486 Vmath::Gathr(
static_cast<int>(m_LocTraceToTraceMap[dir].size()),
1488 m_LocTraceToTraceMap[dir],
1491 for (
int i = 0; i < m_interpTrace[dir].size(); ++i)
1494 if (m_interpNfaces[dir][i])
1498 std::get<0>(m_interpPoints[dir][i]);
1500 std::get<1>(m_interpPoints[dir][i]);
1502 std::get<2>(m_interpPoints[dir][i]);
1504 std::get<3>(m_interpPoints[dir][i]);
1511 int nfromfacepts = m_interpNfaces[dir][i] * fnp0 * fnp1;
1514 switch (m_interpTrace[dir][i])
1521 loctraces.get() + cnt,
1539 loctraces.get() + cnt,
1545 int nfaces = m_interpNfaces[dir][i];
1546 for (
int k = 0; k < fnp0; ++k)
1549 tmp.get() + cnt1 + k,
1551 loctraces.get() + cnt + k,
1555 for(
int k = 0; k< tnp1 * m_interpNfaces[dir][i]; k++)
1558 &I0[0],1,&loctraces[cnt],1,
1567 for (
int j = 0; j < m_interpNfaces[dir][i]; ++j)
1575 tmp.get() + cnt1 + j * tnp0 * tnp1,
1580 loctraces.get() + cnt + j * fnp0 * fnp1,
1588 for (
int j = 0; j < m_interpNfaces[dir][i]; ++j)
1591 tmp.get() + cnt1 + j * tnp0 * tnp1,
1593 loctraces.get() + cnt + j * fnp0 * fnp1,
1596 for(
int k = 0; k< fnp1; k++)
1599 &tmp[cnt1 + (j + 1) * tnp0 * tnp1 - tnp0],1,
1600 &loctraces[cnt+k*fnp0],1,
1601 &loctraces[cnt+k*fnp0],1);
1613 wsp{size_t(m_interpNfaces[dir][i] * fnp0 * tnp1)};
1618 tnp1 * m_interpNfaces[dir][i],
1628 for (
int j = 0; j < m_interpNfaces[dir][i]; ++j)
1636 wsp.get() + j * fnp0 * tnp1,
1641 loctraces.get() + cnt + j * fnp0 * fnp1,
1650 for (
int j = 0; j < m_interpNfaces[dir][i]; ++j)
1658 tmp.get() + cnt1 + j * tnp0 * tnp1,
1663 loctraces.get() + cnt + j * fnp0 * fnp1,
1668 for(
int k = 0; k< tnp1 * m_interpNfaces[dir][i]; k++)
1671 &I0[0],1,&loctraces[cnt],1,
1677 cnt += nfromfacepts;
1678 cnt1 += m_interpNfaces[dir][i] * tnp0 * tnp1;
1690 void LocTraceToTraceMap::AddTraceCoeffsToFieldCoeffs(
1693 int nvals = m_nTraceCoeffs[0] + m_nTraceCoeffs[1];
1694 for (
int i = 0; i < nvals; ++i)
1696 field[m_traceCoeffsToElmtMap[0][i]] +=
1697 m_traceCoeffsToElmtSign[0][i] *
1698 trace[m_traceCoeffsToElmtTrace[0][i]];
1710 void LocTraceToTraceMap::AddTraceCoeffsToFieldCoeffs(
1715 int nvals = m_nTraceCoeffs[dir];
1716 for (
int i = 0; i < nvals; ++i)
1718 field[m_traceCoeffsToElmtMap[dir][i]] +=
1719 m_traceCoeffsToElmtSign[dir][i] *
1720 trace[m_traceCoeffsToElmtTrace[dir][i]];
#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 sign(a, b)
return the sign(b)*a
Defines a specification for a set of points.
PointsType GetPointsType() const
unsigned int GetNumPoints() const
Base class for all multi-elemental spectral/hp expansions.
const Array< OneD, const std::pair< int, int > > & GetCoeffsToElmt() const
Get m_coeffs to elemental value map.
int GetCoeff_Offset(int n) const
Get the start offset position for a global list of m_coeffs correspoinding to element n.
const std::shared_ptr< LocalRegions::ExpansionVector > GetExp() const
This function returns the vector of elements in the expansion.
int GetPhys_Offset(int n) const
Get the start offset position for a global list of m_phys correspoinding to element n.
static void Dgemv(const char &trans, const int &m, const int &n, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = A x where A[m x n].
static double Ddot(const int &n, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: output = .
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where op(A)[m x k], op(B)[k x n], C[m x n] DGEMM perfo...
PointsManagerT & PointsManager(void)
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
@ eGaussRadauMAlpha1Beta0
Gauss Radau pinned at x=-1, .
std::shared_ptr< Expansion > ExpansionSharedPtr
std::vector< ExpansionSharedPtr > ExpansionVector
@ eInterpEndPtDir0InterpDir1
std::tuple< LibUtilities::PointsKey, LibUtilities::PointsKey, LibUtilities::PointsKey, LibUtilities::PointsKey > TraceInterpPoints
Map holding points distributions required for interpolation of local traces onto global trace in two ...
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
static const NekDouble kNekZeroTol
std::shared_ptr< StdExpansion > StdExpansionSharedPtr
@ eDir1FwdDir2_Dir2FwdDir1
The above copyright notice and this permission notice shall be included.
std::shared_ptr< DNekMat > DNekMatSharedPtr
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 Scatr(int n, const T *x, const int *y, T *z)
Scatter vector z[y[i]] = x[i].
void Gathr(int n, const T *sign, const T *x, const int *y, T *z)
Gather vector z[i] = sign[i]*x[y[i]].
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
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 > abs(scalarT< T > in)