39#include <boost/algorithm/string/predicate.hpp>
57 std::size_t nDim = pFields[0]->GetCoordim(0);
58 std::size_t nTracePts = pFields[0]->GetTrace()->GetTotPoints();
61 if (pSession->DefinesSolverInfo(
"HOMOGENEOUS"))
82 m_session->LoadSolverInfo(
"EquationOfState", eosType,
"IdealGas");
91 std::size_t nElements = pFields[0]->GetExpSize();
93 for (std::size_t e = 0; e < nElements; e++)
96 std::size_t expDim = pFields[0]->GetShapeDimension();
103 for (std::size_t i = 0; i < exp3D->GetNtraces(); ++i)
106 h, exp3D->GetGeom3D()->GetEdge(i)->GetVertex(0)->dist(*(
107 exp3D->GetGeom3D()->GetEdge(i)->GetVertex(1))));
116 for (std::size_t i = 0; i < exp2D->GetNtraces(); ++i)
119 h, exp2D->GetGeom2D()->GetEdge(i)->GetVertex(0)->dist(*(
120 exp2D->GetGeom2D()->GetEdge(i)->GetVertex(1))));
129 h = std::min(h, exp1D->
GetGeom1D()->GetVertex(0)->dist(
130 *(exp1D->GetGeom1D()->GetVertex(1))));
135 ASSERTL0(
false,
"Dimension out of bound.")
143 std::size_t nPts = pFields[0]->GetTotPoints();
146 for (std::size_t e = 0; e < pFields[0]->GetExpSize(); e++)
148 std::size_t nElmtPoints = pFields[0]->GetExp(e)->GetTotPoints();
149 std::size_t physOffset = pFields[0]->GetPhys_Offset(e);
150 Vmath::Fill(nElmtPoints, hEle[e], tmp = hElePts + physOffset, 1);
155 pFields[0]->GetFwdBwdTracePhys(hElePts, Fwd, Bwd);
158 std::size_t nBndRegions = pFields[0]->GetBndCondExpansions().size();
160 for (std::size_t i = 0; i < nBndRegions; ++i)
163 std::size_t nBndEdges =
164 pFields[0]->GetBndCondExpansions()[i]->GetExpSize();
166 if (pFields[0]->GetBndConditions()[i]->GetBoundaryConditionType() ==
173 for (std::size_t e = 0; e < nBndEdges; ++e)
175 std::size_t nBndEdgePts = pFields[0]
176 ->GetBndCondExpansions()[i]
180 std::size_t id2 = pFields[0]->GetTrace()->GetPhys_Offset(
181 pFields[0]->GetTraceMap()->GetBndCondIDToGlobalTraceID(cnt++));
209 const std::size_t nConvectiveFields,
216 std::size_t nCoeffs = fields[0]->GetNcoeffs();
218 for (std::size_t i = 0; i < nConvectiveFields; ++i)
223 for (std::size_t i = 0; i < nConvectiveFields; ++i)
225 fields[i]->BwdTrans(tmp2[i], outarray[i]);
230 const std::size_t nConvectiveFields,
238 if (fields[0]->GetGraph()->GetMovement()->GetMoveFlag())
244 std::size_t nDim = fields[0]->GetCoordim(0);
245 std::size_t nPts = fields[0]->GetTotPoints();
246 std::size_t nCoeffs = fields[0]->GetNcoeffs();
247 std::size_t nScalars = inarray.size();
248 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
256 for (std::size_t i = 0; i < nScalars; ++i)
271 for (std::size_t i = 0; i < nScalars + 1; ++i)
277 for (std::size_t i = 0; i < nConvectiveFields; ++i)
292 for (std::size_t i = 0; i < nConvectiveFields; ++i)
296 for (std::size_t j = 0; j < nDim; ++j)
300 fields[i]->IProductWRTDerivBase(tmpIn, tmpOut);
304 fields[i]->AddTraceIntegral(viscousFlux[i], tmpOut);
305 fields[i]->SetPhysState(
false);
306 if (!fields[0]->GetGraph()->GetMovement()->GetMoveFlag())
308 fields[i]->MultiplyByElmtInvMass(tmpOut, outarray[i]);
320 std::size_t nDim = fields[0]->GetCoordim(0);
321 std::size_t nCoeffs = fields[0]->GetNcoeffs();
322 std::size_t nScalars = inarray.size();
323 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
324 std::size_t nConvectiveFields = fields.size();
334 for (std::size_t i = 0; i < nScalars; ++i)
342 for (std::size_t j = 0; j < nDim; ++j)
344 for (std::size_t i = 0; i < nScalars; ++i)
346 fields[i]->IProductWRTDerivBase(j, inarray[i], tmp1);
348 fields[i]->AddTraceIntegral(numericalFluxO1[j][i], tmp1);
349 fields[i]->SetPhysState(
false);
350 fields[i]->MultiplyByElmtInvMass(tmp1, tmp1);
351 fields[i]->BwdTrans(tmp1, qfields[j][i]);
357 for (std::size_t i = 0; i < nScalars; ++i)
397 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
398 std::size_t nScalars = inarray.size();
402 for (std::size_t i = 0; i < nScalars; ++i)
404 numflux[i] = {pFwd[i]};
408 if (fields[0]->GetBndCondExpansions().size())
410 ApplyBCsO1(fields, inarray, pFwd, pBwd, numflux);
416 for (std::size_t i = 0; i < nScalars; ++i)
419 numericalFluxO1[j][i], 1);
435 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
436 std::size_t nScalars = inarray.size();
445 for (std::size_t i = 0; i < nScalars; ++i)
451 for (std::size_t i = 0; i < nScalars - 1; ++i)
456 std::size_t nBndRegions = fields[i + 1]->GetBndCondExpansions().size();
457 for (std::size_t j = 0; j < nBndRegions; ++j)
460 ->GetBndConditions()[j]
466 std::size_t nBndEdges =
467 fields[i + 1]->GetBndCondExpansions()[j]->GetExpSize();
468 for (std::size_t e = 0; e < nBndEdges; ++e)
470 std::size_t nBndEdgePts = fields[i + 1]
471 ->GetBndCondExpansions()[j]
476 fields[i + 1]->GetBndCondExpansions()[j]->GetPhys_Offset(e);
478 std::size_t id2 = fields[0]->GetTrace()->GetPhys_Offset(
479 fields[0]->GetTraceMap()->GetBndCondIDToGlobalTraceID(
483 fields[i]->GetBndConditions()[j]->GetUserDefined(),
486 fields[i]->GetBndConditions()[j]->GetUserDefined(),
489 fields[i]->GetBndConditions()[j]->GetUserDefined(),
493 for (
int pt = 0; pt < nBndEdgePts; ++pt)
500 else if (boost::iequals(
501 fields[i]->GetBndConditions()[j]->GetUserDefined(),
504 fields[i]->GetBndConditions()[j]->GetUserDefined(),
513 for (std::size_t k = 0; k < nScalars - 1; ++k)
517 ->GetBndCondExpansions()[j]
518 ->UpdatePhys())[id1],
521 ->GetBndCondExpansions()[j]
522 ->UpdatePhys())[id1],
523 1, &scalarVariables[k][id2], 1);
525 1, &scalarVariables[k][id2], 1,
526 &tmp1[0], 1, &tmp1[0], 1);
528 Vmath::Smul(nBndEdgePts, -1.0, &tmp1[0], 1, &tmp1[0],
532 for (std::size_t k = 0; k < nScalars - 1; ++k)
536 &scalarVariables[k][id2], 1,
537 &scalarVariables[k][id2], 1);
542 ->GetBndConditions()[j]
543 ->GetBoundaryConditionType() ==
549 ->GetBndCondExpansions()[j]
550 ->UpdatePhys())[id1],
553 ->GetBndCondExpansions()[j]
554 ->UpdatePhys())[id1],
555 1, &scalarVariables[i][id2], 1);
560 ->GetBndConditions()[j]
561 ->GetBoundaryConditionType() ==
569 else if ((fields[i]->GetBndConditions()[j])
570 ->GetBoundaryConditionType() ==
573 Vmath::Vcopy(nBndEdgePts, &pFwd[i][id2], 1, &fluxO1[i][id2],
578 Vmath::Vmul(nBndEdgePts, &scalarVariables[i][id2], 1,
579 &scalarVariables[i][id2], 1, &tmp1[id2], 1);
581 Vmath::Smul(nBndEdgePts, 0.5, &tmp1[id2], 1, &tmp1[id2], 1);
583 Vmath::Vadd(nBndEdgePts, &tmp2[id2], 1, &tmp1[id2], 1,
591 std::size_t nBndRegions = fields[nScalars]->GetBndCondExpansions().size();
592 for (std::size_t j = 0; j < nBndRegions; ++j)
595 ->GetBndConditions()[j]
601 std::size_t nBndEdges =
602 fields[nScalars]->GetBndCondExpansions()[j]->GetExpSize();
603 for (std::size_t e = 0; e < nBndEdges; ++e)
605 std::size_t nBndEdgePts = fields[nScalars]
606 ->GetBndCondExpansions()[j]
611 fields[nScalars]->GetBndCondExpansions()[j]->GetPhys_Offset(e);
613 std::size_t id2 = fields[0]->GetTrace()->GetPhys_Offset(
614 fields[0]->GetTraceMap()->GetBndCondIDToGlobalTraceID(cnt++));
618 fields[nScalars]->GetBndConditions()[j]->GetUserDefined(),
622 &scalarVariables[nScalars - 1][id2], 1);
626 else if (fields[nScalars]
627 ->GetBndConditions()[j]
628 ->GetBoundaryConditionType() ==
633 for (std::size_t n = 0; n < nBndEdgePts; ++n)
636 ->GetBndCondExpansions()[j]
637 ->GetPhys()[id1 + n];
638 ene = fields[nScalars]
639 ->GetBndCondExpansions()[j]
640 ->GetPhys()[id1 + n] /
643 scalarVariables[nScalars - 1][id2 + n] =
644 m_eos->GetTemperature(rho, ene);
650 ->GetBndConditions()[j]
651 ->GetBoundaryConditionType() ==
654 fields[nScalars]->GetBndConditions()[j]->GetUserDefined(),
657 fields[nScalars]->GetBndConditions()[j]->GetUserDefined(),
660 Vmath::Vcopy(nBndEdgePts, &scalarVariables[nScalars - 1][id2],
661 1, &fluxO1[nScalars - 1][id2], 1);
665 else if (((fields[nScalars]->GetBndConditions()[j])
666 ->GetBoundaryConditionType() ==
668 boost::iequals(fields[nScalars]
669 ->GetBndConditions()[j]
672 boost::iequals(fields[nScalars]
673 ->GetBndConditions()[j]
678 &fluxO1[nScalars - 1][id2], 1);
695 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
696 std::size_t nVariables = fields.size();
700 for (std::size_t i = 0; i < nVariables - 1; ++i)
716 std::size_t nDim = fields[0]->GetCoordim(0);
717 for (std::size_t i = 1; i < nVariables; ++i)
719 for (std::size_t j = 0; j < nDim; ++j)
722 fields[i]->GetFwdBwdTracePhys(qfield[j][i], qFwd, qBwd);
733 qfluxtemp, 1, qfluxtemp, 1);
736 if (fields[0]->GetBndCondExpansions().size())
738 ApplyBCsO2(fields, i, j, qfield[j][i], qFwd, qBwd, qfluxtemp);
742 Vmath::Vadd(nTracePts, qfluxtemp, 1, qflux[i], 1, qflux[i], 1);
753 const std::size_t var,
const std::size_t dir,
760 std::size_t nBndRegions = fields[var]->GetBndCondExpansions().size();
762 for (std::size_t i = 0; i < nBndRegions; ++i)
765 std::size_t nBndEdges =
766 fields[var]->GetBndCondExpansions()[i]->GetExpSize();
768 if (fields[var]->GetBndConditions()[i]->GetBoundaryConditionType() ==
775 for (std::size_t e = 0; e < nBndEdges; ++e)
777 std::size_t nBndEdgePts = fields[var]
778 ->GetBndCondExpansions()[i]
782 std::size_t id2 = fields[0]->GetTrace()->GetPhys_Offset(
783 fields[0]->GetTraceMap()->GetBndCondIDToGlobalTraceID(cnt++));
788 ->GetBndConditions()[i]
789 ->GetBoundaryConditionType() ==
792 fields[var]->GetBndConditions()[i]->GetUserDefined(),
795 fields[var]->GetBndConditions()[i]->GetUserDefined(),
799 &qFwd[id2], 1, &penaltyflux[id2], 1);
803 else if ((fields[var]->GetBndConditions()[i])
804 ->GetBoundaryConditionType() ==
807 ASSERTL0(
false,
"Neumann bcs not implemented for LDGNS");
809 else if (boost::iequals(
810 fields[var]->GetBndConditions()[i]->GetUserDefined(),
813 fields[var]->GetBndConditions()[i]->GetUserDefined(),
824 &qFwd[id2], 1, &penaltyflux[id2], 1);
#define ASSERTL0(condition, msg)
void v_DiffuseCoeffs(const std::size_t nConvective, 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) override
Array< OneD, Array< OneD, NekDouble > > m_homoDerivs
void v_Diffuse(const std::size_t nConvective, 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) override
Calculate weak DG Diffusion in the LDG form for the Navier-Stokes (NS) equations:
EquationOfStateSharedPtr m_eos
Equation of system for computing temperature.
void NumericalFluxO1(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, TensorOfArray3D< NekDouble > &numericalFluxO1, const Array< OneD, Array< OneD, NekDouble > > &pFwd, const Array< OneD, Array< OneD, NekDouble > > &pBwd)
Builds the numerical flux for the 1st order derivatives.
LibUtilities::SessionReaderSharedPtr m_session
Array< OneD, Array< OneD, NekDouble > > m_traceVel
void NumericalFluxO2(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, TensorOfArray3D< NekDouble > &qfield, Array< OneD, Array< OneD, NekDouble > > &qflux, const Array< OneD, Array< OneD, NekDouble > > &pFwd, const Array< OneD, Array< OneD, NekDouble > > &pBwd)
Build the numerical flux for the 2nd order derivatives.
NekDouble m_C11
Penalty coefficient for LDGNS.
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) override
Diffusion term Trace Flux.
void v_InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields) override
void v_DiffuseCalcDerivative(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, TensorOfArray3D< NekDouble > &qfields, const Array< OneD, Array< OneD, NekDouble > > &pFwd, const Array< OneD, Array< OneD, NekDouble > > &pBwd) override
Diffusion Flux, calculate the physical derivatives.
TensorOfArray3D< NekDouble > m_viscTensor
void ApplyBCsO2(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const std::size_t var, const std::size_t dir, const Array< OneD, const NekDouble > &qfield, const Array< OneD, const NekDouble > &qFwd, const Array< OneD, const NekDouble > &qBwd, Array< OneD, NekDouble > &penaltyflux)
Imposes appropriate bcs for the 2nd order derivatives.
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) override
Diffusion Volume Flux.
Array< OneD, NekDouble > m_traceOneOverH
h scaling for penalty term
void ApplyBCsO1(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, const Array< OneD, Array< OneD, NekDouble > > &pFwd, const Array< OneD, Array< OneD, NekDouble > > &pBwd, Array< OneD, Array< OneD, NekDouble > > &flux01)
Imposes appropriate bcs for the 1st order derivatives.
static DiffusionSharedPtr create(std::string diffType)
Array< OneD, Array< OneD, NekDouble > > m_traceNormals
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
SpatialDomains::Geometry1DSharedPtr GetGeom1D() const
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)
Array< OneD, Array< OneD, NekDouble > > m_gridVelocityTrace
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.
DiffusionFluxVecCBNS m_fluxVectorNS
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.
DiffusionFluxPenaltyNS m_fluxPenaltyNS
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< Expansion2D > Expansion2DSharedPtr
std::shared_ptr< Expansion1D > Expansion1DSharedPtr
std::shared_ptr< Expansion3D > Expansion3DSharedPtr
DiffusionFactory & GetDiffusionFactory()
EquationOfStateFactory & GetEquationOfStateFactory()
Declaration of the equation of state factory singleton.
void Svtsvtp(int n, const T alpha, const T *x, int incx, const T beta, const T *y, int incy, T *z, int incz)
Svtsvtp (scalar times vector plus scalar times vector):
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 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 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/x.
void Vdiv(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 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)