70 size_t nDim = pFields[0]->GetCoordim(0);
71 size_t nVariable = pFields.size();
72 size_t nTracePts = pFields[0]->GetTrace()->GetTotPoints();
75 for (
int i = 0; i < nDim; ++i)
81 for (
int i = 0; i < nVariable; ++i)
90 pFields[0]->GetTrace()->GetElmtNormalLength(lengthFwd, lengthBwd);
91 pFields[0]->PeriodicBwdCopy(lengthFwd, lengthBwd);
94 pFields[0]->GetTraceMap();
95 TraceMap->GetAssemblyCommDG()->PerformExchange(lengthFwd, lengthBwd);
97 Vmath::Vadd(nTracePts, lengthBwd, 1, lengthFwd, 1, lengthFwd, 1);
108 for (
int i = 1; i < nVariable; ++i)
110 pFields[i]->GetBwdWeight(tmpBwdWeight, tmpBwdWeightJump);
113 Vmath::Vabs(nTracePts, tmpBwdWeight, 1, tmpBwdWeight, 1);
115 for (
int j = 0; j < nTracePts; ++j)
117 norm += tmpBwdWeight[j];
120 "different BWD for different variable not coded yet");
130 size_t nCoeffs = pFields[0]->GetNcoeffs();
132 for (
int i = 0; i < nVariable; ++i)
140 for (
int nd = 0; nd < nDim; ++nd)
146 for (
int i = 0; i < nVariable; ++i)
155 const size_t nConvectiveFields,
167 for (
int i = 0; i < nConvectiveFields; ++i)
169 fields[i]->BwdTrans(
m_wspDiff[i], outarray[i]);
176 const size_t nConvectiveFields,
186 size_t nDim = fields[0]->GetCoordim(0);
187 size_t nPts = fields[0]->GetTotPoints();
188 size_t nCoeffs = fields[0]->GetNcoeffs();
189 size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
194 TensorOfArray3D<NekDouble> elmtFlux{nDim};
195 TensorOfArray3D<NekDouble> qfield{nDim};
197 for (
int j = 0; j < nDim; ++j)
199 qfield[j] = Array<OneD, Array<OneD, NekDouble>>{nConvectiveFields};
200 elmtFlux[j] = Array<OneD, Array<OneD, NekDouble>>{nConvectiveFields};
201 for (
int i = 0; i < nConvectiveFields; ++i)
203 qfield[j][i] = Array<OneD, NekDouble>{nPts, 0.0};
205 for (
int i = 0; i < nConvectiveFields; ++i)
207 elmtFlux[j][i] = Array<OneD, NekDouble>{nPts, 0.0};
212 Array<OneD, Array<OneD, NekDouble>> vFwd{nConvectiveFields};
213 Array<OneD, Array<OneD, NekDouble>> vBwd{nConvectiveFields};
217 for (
int i = 0; i < nConvectiveFields; ++i)
219 vFwd[i] = Array<OneD, NekDouble>{nTracePts, 0.0};
220 vBwd[i] = Array<OneD, NekDouble>{nTracePts, 0.0};
222 for (
int i = 0; i < nConvectiveFields; ++i)
224 fields[i]->GetFwdBwdTracePhys(inarray[i], vFwd[i], vBwd[i]);
229 for (
int i = 0; i < nConvectiveFields; ++i)
237 Array<OneD, int> nonZeroIndex;
243 Array<OneD, Array<OneD, NekDouble>> tmpFluxIprdct{nDim};
245 for (
int i = 0; i < nonZeroIndex.size(); ++i)
247 int j = nonZeroIndex[i];
248 for (
int k = 0; k < nDim; ++k)
250 tmpFluxIprdct[k] = elmtFlux[k][j];
252 fields[j]->IProductWRTDerivBase(tmpFluxIprdct, outarray[j]);
261 for (
int j = 0; j < nDim; ++j)
267 Array<OneD, Array<OneD, NekDouble>> Traceflux{nConvectiveFields};
268 for (
int j = 0; j < nConvectiveFields; ++j)
270 Traceflux[j] = Array<OneD, NekDouble>{nTracePts, 0.0};
278 for (
int i = 0; i < nonZeroIndex.size(); ++i)
280 int j = nonZeroIndex[i];
282 fields[j]->AddTraceIntegral(Traceflux[j], outarray[j]);
283 fields[j]->SetPhysState(
false);
287 elmtFlux, outarray, vFwd, vBwd);
290 for (
int i = 0; i < nonZeroIndex.size(); ++i)
292 int j = nonZeroIndex[i];
294 fields[j]->MultiplyByElmtInvMass(outarray[j], outarray[j]);
301 const std::size_t nConvectiveFields,
311 int nDim = fields[0]->GetCoordim(0);
312 int nPts = fields[0]->GetTotPoints();
313 int nCoeffs = fields[0]->GetNcoeffs();
314 int nTracePts = fields[0]->GetTrace()->GetTotPoints();
317 for (j = 0; j < nDim; ++j)
320 for (i = 0; i < nConvectiveFields; ++i)
330 for(i = 0; i < nonZeroIndex.size(); ++i)
332 int j = nonZeroIndex[i];
333 for (
int k = 0; k < nDim; ++k)
335 tmpFluxIprdct[k] = elmtFlux[k][j];
337 fields[j]->IProductWRTDerivBase(tmpFluxIprdct,outarray[j]);
342 for (
int j = 0; j < nConvectiveFields; ++j)
348 Traceflux,vFwd,vBwd,nonZeroIndex);
351 for (j = 0; j < nDim; ++j)
356 for(i = 0; i < nonZeroIndex.size(); ++i)
358 int j = nonZeroIndex[i];
360 fields[j]->AddTraceIntegral (Traceflux[j], outarray[j]);
361 fields[j]->SetPhysState (
false);
365 elmtFlux, outarray, vFwd, vBwd);
375 size_t nConvectiveFields = fields.size();
376 boost::ignore_unused(pFwd, pBwd);
378 size_t nDim = fields[0]->GetCoordim(0);
381 for (
int nd = 0; nd < 3; ++nd)
385 for (
int i = 0; i < nConvectiveFields; ++i)
387 for (
int nd = 0; nd < nDim; ++nd)
389 qtmp[nd] = qfield[nd][i];
391 fields[i]->PhysDeriv(inarray[i], qtmp[0], qtmp[1], qtmp[2]);
401 size_t nDim = fields[0]->GetCoordim(0);
402 size_t nPts = fields[0]->GetTotPoints();
430 boost::ignore_unused(VolumeFlux);
433 traceflux3D[0] = TraceFlux;
435 size_t nConvectiveFields = fields.size();
449 const std::size_t nConvectiveFields,
459 size_t nDim = fields[0]->GetCoordim(0);
460 size_t nPts = fields[0]->GetTotPoints();
461 size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
463 for (
int nd = 0; nd < nDim; ++nd)
467 for (
int j = 0; j < nConvectiveFields; ++j)
474 VolumeFlux, traceSymflux, pFwd, pBwd,
478 fields, nonZeroIndex, traceSymflux,
484 const std::size_t nConvectiveFields,
495 size_t nDim = fields[0]->GetCoordim(0);
496 size_t nPts = fields[0]->GetTotPoints();
497 size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
499 for (
int nd = 0; nd < nDim; ++nd)
503 for (
int j = 0; j < nConvectiveFields; ++j)
510 VolumeFlux, traceSymflux, pFwd, pBwd,
514 fields, nonZeroIndex, traceSymflux, outarray);
519 const std::size_t nConvectiveFields,
528 boost::ignore_unused(inarray, qfield, VolumeFlux, pFwd, pBwd);
529 size_t nDim = fields[0]->GetCoordim(0);
532 nonZeroIndex, SymmFlux);
536 const std::size_t nConvectiveFields,
const size_t nDim,
543 size_t nTracePts = solution_jump[nConvectiveFields - 1].size();
545 for (
int i = 0; i < nConvectiveFields; ++i)
548 solution_jump[i], 1);
554 for (
int i = 0; i < nConvectiveFields; ++i)
557 for (
int nd = 0; nd < nDim; ++nd)
559 tracelist->MultiplyByQuadratureMetric(traceSymflux[nd][i],
560 traceSymflux[nd][i]);
566 const std::size_t nConvectiveFields,
const size_t nDim,
const size_t nPts,
567 const size_t nTracePts,
573 boost::ignore_unused(nTracePts);
575 size_t nCoeffs = outarray[nConvectiveFields - 1].size();
578 for (
int i = 0; i < nDim; ++i)
583 for (
int j = 0; j < nonZeroIndex.size(); ++j)
585 nv = nonZeroIndex[j];
586 for (
int nd = 0; nd < nDim; ++nd)
590 fields[nv]->AddTraceQuadPhysToField(tracflux[nd][nv],
591 tracflux[nd][nv], tmpfield[nd]);
592 fields[nv]->DivideByQuadratureMetric(tmpfield[nd], tmpfield[nd]);
594 fields[nv]->IProductWRTDerivBase(tmpfield, tmpCoeff);
595 Vmath::Vadd(nCoeffs, tmpCoeff, 1, outarray[nv], 1, outarray[nv], 1);
600 const std::size_t nConvectiveFields,
const size_t nDim,
const size_t nPts,
601 const size_t nTracePts,
607 boost::ignore_unused(nTracePts);
609 size_t nCoeffs = outarray[nConvectiveFields - 1].size();
613 for (
int i = 0; i < nDim; ++i)
617 for (
int j = 0; j < nonZeroIndex.size(); ++j)
619 int nv = nonZeroIndex[j];
620 for (
int nd = 0; nd < nDim; ++nd)
624 fields[nv]->AddTraceQuadPhysToField(tracflux[nd][nv],
625 tracflux[nd][nv], tmpfield[nd]);
626 fields[nv]->DivideByQuadratureMetric(tmpfield[nd], tmpfield[nd]);
628 fields[nv]->IProductWRTDerivBase(tmpfield, tmpCoeff);
629 fields[nv]->BwdTrans(tmpCoeff, tmpPhysi);
630 Vmath::Vadd(nPts, tmpPhysi, 1, outarray[nv], 1, outarray[nv], 1);
639 std::shared_ptr<LocalRegions::ExpansionVector> traceExp =
641 size_t ntotTrac = (*traceExp).size();
642 int nTracPnt, noffset;
645 fields[0]->GetLocTraceToTraceMap();
648 locTraceToTraceMap->GetLeftRightAdjacentExpId();
650 locTraceToTraceMap->GetLeftRightAdjacentExpFlag();
652 std::shared_ptr<LocalRegions::ExpansionVector> fieldExp =
659 for (
int ntrace = 0; ntrace < ntotTrac; ++ntrace)
661 noffset = tracelist->GetPhys_Offset(ntrace);
662 nTracPnt = tracelist->GetTotPoints(ntrace);
664 factorFwdBwd[0] = 0.0;
665 factorFwdBwd[1] = 0.0;
667 for (
int nlr = 0; nlr < 2; ++nlr)
669 if (LRAdjflag[nlr][ntrace])
671 int numModes = fields[0]->GetNcoeffs(LRAdjExpid[nlr][ntrace]);
673 pow(
NekDouble(numModes), (1.0 / spaceDim));
674 factorFwdBwd[nlr] = 1.0 * numModesdir * (numModesdir + 1.0);
678 for (
int np = 0; np < nTracPnt; ++np)
680 factor[noffset + np] = std::max(factorFwdBwd[0], factorFwdBwd[1]);
689 boost::ignore_unused(fields);
694 const std::size_t nConvectiveFields,
const size_t nPts,
702 std::vector<NekDouble> vFwdTmp(nConvectiveFields),
703 vBwdTmp(nConvectiveFields), averTmp(nConvectiveFields) ;
704 for (
size_t p = 0;
p < nPts; ++
p)
707 for (
size_t f = 0; f < nConvectiveFields; ++f)
709 vFwdTmp[f] = vFwd[f][
p];
710 vBwdTmp[f] = vBwd[f][
p];
717 for (
size_t f = 0; f < nConvectiveFields; ++f)
719 aver[f][
p] = averTmp[f];
730 for (
size_t f = 0; f < nConvectiveFields; ++f)
732 for (
size_t p = 0;
p < nPts; ++
p)
739 jump[f][
p] = tmpF * Fweight + tmpB * Bweight;
756 size_t nDim = fields[0]->GetCoordim(0);
757 size_t nPts = fields[0]->GetTotPoints();
758 size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
759 size_t nConvectiveFields = fields.size();
761 boost::ignore_unused(inarray);
763 fields[0]->GetTraceMap();
769 for (
int nd = 0; nd < nDim; ++nd)
771 for (
int i = 0; i < nConvectiveFields; ++i)
787 if (fabs(PenaltyFactor2) > 1.0E-12)
797 for (
int nd = 0; nd < nDim; ++nd)
799 for (
int i = 0; i < nConvectiveFields; ++i)
805 fields[i]->GetFwdBwdTracePhys(qfield[nd][i], Fwd, Bwd,
true,
true,
810 for (
size_t p = 0;
p < nTracePts; ++
p)
828 ConsVarAveJump(nConvectiveFields, nTracePts, vFwd, vBwd, solution_Aver,
833 for (
size_t p = 0;
p < nTracePts; ++
p)
837 for (
size_t f = 0; f < nConvectiveFields; ++f)
839 NekDouble jumpTmp = solution_jump[f][
p] * PenaltyFactor;
840 for (
size_t d = 0; d < nDim; ++d)
857 const std::size_t nConvectiveFields,
const size_t nDim,
const size_t nPts,
858 const size_t nTracePts,
const NekDouble PenaltyFactor2,
869 for (
int nd1 = 0; nd1 < nDim; ++nd1)
875 for (
int nd = 0; nd < 3; ++nd)
879 for (
int nd2 = 0; nd2 < nDim; ++nd2)
881 qtmp[nd2] = elmt2ndDerv[nd2];
887 for (
int nd1 = 0; nd1 < nDim; ++nd1)
889 for (
int i = 0; i < nConvectiveFields; ++i)
891 fields[i]->PhysDeriv(qfield[nd1][i], qtmp[0], qtmp[1], qtmp[2]);
893 for (
int nd2 = nd1; nd2 < nDim; ++nd2)
896 fields[i]->GetFwdBwdTracePhys(elmt2ndDerv[nd2], Fwd, Bwd,
900 numDerivBwd[nd1][i], 1, numDerivBwd[nd1][i], 1);
903 numDerivFwd[nd1][i], 1, numDerivFwd[nd1][i], 1);
904 Vmath::Neg(nTracePts, numDerivFwd[nd1][i], 1);
909 numDerivBwd[nd2][i], 1, numDerivBwd[nd2][i],
912 numDerivFwd[nd2][i], 1, numDerivFwd[nd2][i],
914 Vmath::Neg(nTracePts, numDerivFwd[nd2][i], 1);
928 const int nConvectiveFields,
932 int nengy = nConvectiveFields-1;
936 size_t nBndRegions = fields[nengy]->
937 GetBndCondExpansions().size();
938 for (
size_t j = 0; j < nBndRegions; ++j)
940 if (fields[nengy]->GetBndConditions()[j]->
941 GetBoundaryConditionType() ==
947 size_t nBndEdges = fields[nengy]->
948 GetBndCondExpansions()[j]->GetExpSize();
949 for (
size_t e = 0; e < nBndEdges; ++e)
951 size_t nBndEdgePts = fields[nengy]->
952 GetBndCondExpansions()[j]->GetExp(e)->GetTotPoints();
954 std::size_t id2 = fields[0]->GetTrace()->
955 GetPhys_Offset(fields[0]->GetTraceMap()->
956 GetBndCondIDToGlobalTraceID(cnt++));
958 if (fields[0]->GetBndConditions()[j]->
959 GetUserDefined() ==
"WallAdiabatic")
#define ASSERTL0(condition, msg)
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
void AccumulateRegion(std::string, int iolevel=0)
Accumulate elapsed time for a region.
SOLVER_UTILS_EXPORT void DiffuseTraceFlux(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfields, TensorOfArray3D< NekDouble > &VolumeFlux, Array< OneD, Array< OneD, NekDouble > > &TraceFlux, const Array< OneD, Array< OneD, NekDouble >> &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble >> &pBwd=NullNekDoubleArrayOfArray, Array< OneD, int > &nonZeroIndex=NullInt1DArray)
Diffusion term Trace Flux.
SOLVER_UTILS_EXPORT void GetAVmu(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, NekDouble > &muvar, Array< OneD, NekDouble > &MuVarTrace)
Get the mu of artifical viscosity(AV)
SOLVER_UTILS_EXPORT void DiffuseVolumeFlux(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfields, TensorOfArray3D< NekDouble > &VolumeFlux, Array< OneD, int > &nonZeroIndex=NullInt1DArray)
Diffusion Volume FLux.
DiffusionFluxCons m_FunctorDiffusionfluxConsTrace
DiffusionArtificialDiffusion m_ArtificialDiffusionVector
SOLVER_UTILS_EXPORT void DiffuseCalcDerivative(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfields, const Array< OneD, Array< OneD, NekDouble >> &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble >> &pBwd=NullNekDoubleArrayOfArray)
SOLVER_UTILS_EXPORT void AddDiffusionSymmFluxToCoeff(const std::size_t nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, TensorOfArray3D< NekDouble > &qfield, TensorOfArray3D< NekDouble > &VolumeFlux, Array< OneD, Array< OneD, NekDouble > > &outarray, const Array< OneD, Array< OneD, NekDouble > > &pFwd, const Array< OneD, Array< OneD, NekDouble > > &pBwd)
Add symmetric flux to field in coeff space.
DiffusionFluxCons m_FunctorDiffusionfluxCons
SpecialBndTreat m_SpecialBndTreat
DiffusionSymmFluxCons m_FunctorSymmetricfluxCons
SOLVER_UTILS_EXPORT void ConsVarAveJump(const std::size_t nConvectiveFields, const size_t npnts, const Array< OneD, const Array< OneD, NekDouble > > &vFwd, const Array< OneD, const Array< OneD, NekDouble > > &vBwd, Array< OneD, Array< OneD, NekDouble > > &aver, Array< OneD, Array< OneD, NekDouble > > &jump)
Get the average and jump value of conservative variables on trace.
Array< OneD, NekDouble > m_traceNormDirctnElmtLengthRecip
static DiffusionSharedPtr create(std::string diffType)
virtual void v_Diffuse(const std::size_t nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const Array< OneD, Array< OneD, NekDouble >> &pFwd, const Array< OneD, Array< OneD, NekDouble >> &pBwd)
Array< OneD, NekDouble > m_tracBwdWeightAver
Array< OneD, NekDouble > m_traceNormDirctnElmtLength
void ApplyFluxBndConds(const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, Array< OneD, Array< OneD, NekDouble > > &flux)
aplly Neuman boundary conditions on flux Currently only consider WallAdiabatic
void GetPenaltyFactor(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, Array< OneD, NekDouble > &factor)
Get IP penalty factor based on order.
void ConsVarAve(const size_t nConvectiveFields, const T &Bweight, const std::vector< T > &vFwd, const std::vector< T > &vBwd, std::vector< T > &aver)
Calculate the average of conservative variables on traces.
virtual void v_DiffuseVolumeFlux(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfields, TensorOfArray3D< NekDouble > &VolumeFlux, Array< OneD, int > &nonZeroIndex)
Diffusion Volume Flux.
void GetPenaltyFactorConst(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, Array< OneD, NekDouble > &factor)
Get a constant IP penalty factor.
void AddSecondDerivToTrace(const std::size_t nConvectiveFields, const size_t nDim, const size_t nPts, const size_t nTracePts, const NekDouble PenaltyFactor2, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const TensorOfArray3D< NekDouble > &qfield, TensorOfArray3D< NekDouble > &numDerivFwd, TensorOfArray3D< NekDouble > &numDerivBwd)
Add second derivative term to trace jump (for DDG scheme)
Array< OneD, NekDouble > m_MuVarTrace
NekDouble m_IPSymmFluxCoeff
NekDouble m_IP2ndDervCoeff
virtual void v_InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
NekDouble m_IPPenaltyCoeff
void AddSymmFluxIntegralToCoeff(const std::size_t nConvectiveFields, const size_t nDim, const size_t nPts, const size_t nTracePts, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, const int > &nonZeroIndex, TensorOfArray3D< NekDouble > &tracflux, Array< OneD, Array< OneD, NekDouble >> &outarray)
Add symmetric flux integration to field (in coefficient space)
Array< OneD, Array< OneD, NekDouble > > m_traceJump
virtual void v_ConsVarAveJump(const std::size_t nConvectiveFields, const size_t npnts, const Array< OneD, const Array< OneD, NekDouble >> &vFwd, const Array< OneD, const Array< OneD, NekDouble >> &vBwd, Array< OneD, Array< OneD, NekDouble >> &aver, Array< OneD, Array< OneD, NekDouble >> &jump)
TensorOfArray3D< NekDouble > m_wspNumDerivBwd
Workspace for CallTraceNumFlux.
virtual void v_AddDiffusionSymmFluxToPhys(const std::size_t nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield, TensorOfArray3D< NekDouble > &VolumeFlux, Array< OneD, Array< OneD, NekDouble >> &outarray, const Array< OneD, Array< OneD, NekDouble >> &pFwd, const Array< OneD, Array< OneD, NekDouble >> &pBwd)
void DiffuseTraceSymmFlux(const std::size_t nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield, TensorOfArray3D< NekDouble > &VolumeFlux, TensorOfArray3D< NekDouble > &SymmFlux, const Array< OneD, Array< OneD, NekDouble >> &pFwd, const Array< OneD, Array< OneD, NekDouble >> &pBwd, Array< OneD, int > &nonZeroIndex)
Calculate symmetric flux on traces interface.
TensorOfArray3D< NekDouble > m_wspNumDerivFwd
LibUtilities::SessionReaderSharedPtr m_session
void CalcTraceSymFlux(const std::size_t nConvectiveFields, const size_t nDim, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &solution_Aver, Array< OneD, Array< OneD, NekDouble >> &solution_jump, Array< OneD, int > &nonZeroIndexsymm, Array< OneD, Array< OneD, Array< OneD, NekDouble >>> &traceSymflux)
Calculate symmetric flux on traces.
Array< OneD, Array< OneD, NekDouble > > m_traceAver
Array< OneD, NekDouble > m_tracBwdWeightJump
virtual void v_AddDiffusionSymmFluxToCoeff(const std::size_t nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield, TensorOfArray3D< NekDouble > &VolumeFlux, Array< OneD, Array< OneD, NekDouble >> &outarray, const Array< OneD, Array< OneD, NekDouble >> &pFwd, const Array< OneD, Array< OneD, NekDouble >> &pBwd)
virtual void v_DiffuseCalcDerivative(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield, const Array< OneD, Array< OneD, NekDouble >> &pFwd, const Array< OneD, Array< OneD, NekDouble >> &pBwd)
virtual void v_DiffuseCoeffs(const std::size_t nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const Array< OneD, Array< OneD, NekDouble >> &pFwd, const Array< OneD, Array< OneD, NekDouble >> &pBwd)
void CalcTraceNumFlux(const NekDouble PenaltyFactor2, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &inarray, const TensorOfArray3D< NekDouble > &qfield, const Array< OneD, Array< OneD, NekDouble >> &vFwd, const Array< OneD, Array< OneD, NekDouble >> &vBwd, const Array< OneD, NekDouble > &MuVarTrace, Array< OneD, int > &nonZeroIndexflux, TensorOfArray3D< NekDouble > &traceflux, Array< OneD, Array< OneD, NekDouble >> &solution_Aver, Array< OneD, Array< OneD, NekDouble >> &solution_jump)
Calculate numerical flux on traces.
void AddSymmFluxIntegralToPhys(const std::size_t nConvectiveFields, const size_t nDim, const size_t nPts, const size_t nTracePts, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, const int > &nonZeroIndex, TensorOfArray3D< NekDouble > &tracflux, Array< OneD, Array< OneD, NekDouble >> &outarray)
Add symmetric flux integration to field (in physical space)
virtual void v_DiffuseTraceFlux(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfields, TensorOfArray3D< NekDouble > &VolumeFlux, Array< OneD, Array< OneD, NekDouble >> &TraceFlux, const Array< OneD, Array< OneD, NekDouble >> &pFwd, const Array< OneD, Array< OneD, NekDouble >> &pBwd, Array< OneD, int > &nonZeroIndex)
std::string m_shockCaptureType
Array< OneD, Array< OneD, NekDouble > > m_wspDiff
Workspace for v_Diffusion.
Array< OneD, Array< OneD, NekDouble > > m_traceNormals
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< AssemblyMapDG > AssemblyMapDGSharedPtr
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
std::shared_ptr< LocTraceToTraceMap > LocTraceToTraceMapSharedPtr
DiffusionFactory & GetDiffusionFactory()
The above copyright notice and this permission notice shall be included.
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayOfArray
static Array< OneD, NekDouble > NullNekDouble1DArray
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 Vabs(int n, const T *x, const int incx, T *y, const int incy)
vabs: y = |x|
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 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 Vvtvm(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)
vvtvm (vector times vector plus vector): z = w*x - y
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Sdiv(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha/y.
void Zero(int n, T *x, const int incx)
Zero vector.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.