39 #include <boost/core/ignore_unused.hpp> 40 #include <boost/algorithm/string/predicate.hpp> 61 std::size_t nDim = pFields[0]->GetCoordim(0);
62 std::size_t nTracePts = pFields[0]->GetTrace()->GetTotPoints();
65 if (pSession->DefinesSolverInfo(
"HOMOGENEOUS"))
83 m_session->LoadSolverInfo(
"EquationOfState",
95 std::size_t nElements = pFields[0]->GetExpSize();
97 for (std::size_t e = 0; e < nElements; e++)
100 std::size_t expDim = pFields[0]->GetShapeDimension();
107 for(std::size_t i = 0; i < exp3D->GetNedges(); ++i)
109 h = std::min(h, exp3D->GetGeom3D()->GetEdge(i)->GetVertex(0)->
110 dist(*(exp3D->GetGeom3D()->GetEdge(i)->GetVertex(1))));
119 for(std::size_t i = 0; i < exp2D->GetNedges(); ++i)
121 h = std::min(h, exp2D->GetGeom2D()->GetEdge(i)->GetVertex(0)->
122 dist(*(exp2D->GetGeom2D()->GetEdge(i)->GetVertex(1))));
131 h = std::min(h, exp1D->
GetGeom1D()->GetVertex(0)->
132 dist(*(exp1D->GetGeom1D()->GetVertex(1))));
138 ASSERTL0(
false,
"Dimension out of bound.")
146 std::size_t nPts = pFields[0]->GetTotPoints();
149 for (std::size_t e = 0; e < pFields[0]->GetExpSize(); e++)
151 std::size_t nElmtPoints = pFields[0]->GetExp(e)->GetTotPoints();
152 std::size_t physOffset = pFields[0]->GetPhys_Offset(e);
154 tmp = hElePts + physOffset, 1);
159 pFields[0]->GetFwdBwdTracePhys(hElePts, Fwd, Bwd);
162 std::size_t nBndRegions = pFields[0]->GetBndCondExpansions().num_elements();
164 for (std::size_t i = 0; i < nBndRegions; ++i)
167 std::size_t nBndEdges = pFields[0]->
168 GetBndCondExpansions()[i]->GetExpSize();
170 if (pFields[0]->GetBndConditions()[i]->GetBoundaryConditionType()
177 for (std::size_t e = 0; e < nBndEdges; ++e)
179 std::size_t nBndEdgePts = pFields[0]->
180 GetBndCondExpansions()[i]->GetExp(e)->GetTotPoints();
182 std::size_t id2 = pFields[0]->GetTrace()->
183 GetPhys_Offset(pFields[0]->GetTraceMap()->
184 GetBndCondTraceToGlobalTraceMap(cnt++));
212 const std::size_t nConvectiveFields,
219 std::size_t nDim = fields[0]->GetCoordim(0);
220 std::size_t nPts = fields[0]->GetTotPoints();
221 std::size_t nCoeffs = fields[0]->GetNcoeffs();
222 std::size_t nScalars = inarray.num_elements();
223 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
238 for (std::size_t i = 0; i < nScalars; ++i)
248 for (std::size_t j = 0; j < nDim; ++j)
250 for (std::size_t i = 0; i < nScalars; ++i)
252 fields[i]->IProductWRTDerivBase (j, inarray[i], tmp1);
254 fields[i]->AddTraceIntegral (numericalFluxO1[j][i],
256 fields[i]->SetPhysState (
false);
257 fields[i]->MultiplyByElmtInvMass(tmp1, tmp1);
258 fields[i]->BwdTrans (tmp1, derivativesO1[j][i]);
265 for (std::size_t i = 0; i < nScalars; ++i)
277 for (std::size_t i = 0; i < nScalars+1; ++i)
284 for (std::size_t i = 0; i < nConvectiveFields; ++i)
295 for (std::size_t i = 0; i < nConvectiveFields; ++i)
299 for (std::size_t j = 0; j < nDim; ++j)
301 fields[i]->IProductWRTDerivBase(j,
m_viscTensor[j][i], tmp1);
302 Vmath::Vadd(nCoeffs, tmp1, 1, tmp2[i], 1, tmp2[i], 1);
307 fields[i]->AddTraceIntegral (viscousFlux[i], tmp2[i]);
308 fields[i]->SetPhysState (
false);
309 fields[i]->MultiplyByElmtInvMass(tmp2[i], tmp2[i]);
310 fields[i]->BwdTrans (tmp2[i], outarray[i]);
326 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
327 std::size_t nScalars = inarray.num_elements();
331 for (std::size_t i = 0; i < nScalars; ++i)
333 numflux[i] = {pFwd[i]};
337 if (fields[0]->GetBndCondExpansions().num_elements())
339 ApplyBCsO1(fields, inarray, pFwd, pBwd, numflux);
345 for (std::size_t i = 0; i < nScalars; ++i)
348 numericalFluxO1[j][i], 1);
364 boost::ignore_unused(pBwd);
366 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
367 std::size_t nScalars = inarray.num_elements();
376 for (std::size_t i = 0; i < nScalars; ++i)
382 for (std::size_t i = 0; i < nScalars-1; ++i)
387 std::size_t nBndRegions = fields[i+1]->
388 GetBndCondExpansions().num_elements();
389 for (std::size_t j = 0; j < nBndRegions; ++j)
391 if (fields[i+1]->GetBndConditions()[j]->
397 std::size_t nBndEdges = fields[i+1]->
398 GetBndCondExpansions()[j]->GetExpSize();
399 for (std::size_t e = 0; e < nBndEdges; ++e)
401 std::size_t nBndEdgePts = fields[i+1]->
402 GetBndCondExpansions()[j]->GetExp(e)->GetTotPoints();
404 std::size_t id1 = fields[i+1]->
405 GetBndCondExpansions()[j]->GetPhys_Offset(e);
407 std::size_t id2 = fields[0]->GetTrace()->
408 GetPhys_Offset(fields[0]->GetTraceMap()->
409 GetBndCondTraceToGlobalTraceMap(cnt++));
411 if (boost::iequals(fields[i]->GetBndConditions()[j]->
412 GetUserDefined(),
"WallViscous") ||
413 boost::iequals(fields[i]->GetBndConditions()[j]->
414 GetUserDefined(),
"WallAdiabatic"))
417 Vmath::Zero(nBndEdgePts, &scalarVariables[i][id2], 1);
421 boost::iequals(fields[i]->GetBndConditions()[j]->
422 GetUserDefined(),
"Wall") ||
423 boost::iequals(fields[i]->GetBndConditions()[j]->
424 GetUserDefined(),
"Symmetry"))
432 for (std::size_t k = 0; k < nScalars-1; ++k)
435 &(fields[k+1]->GetBndCondExpansions()[j]->
436 UpdatePhys())[id1], 1,
437 &(fields[0]->GetBndCondExpansions()[j]->
438 UpdatePhys())[id1], 1,
439 &scalarVariables[k][id2], 1);
442 &scalarVariables[k][id2], 1,
451 for (std::size_t k = 0; k < nScalars-1; ++k)
456 &scalarVariables[k][id2], 1,
457 &scalarVariables[k][id2], 1);
461 else if (fields[i]->GetBndConditions()[j]->
462 GetBoundaryConditionType() ==
467 &(fields[i+1]->GetBndCondExpansions()[j]->
468 UpdatePhys())[id1], 1,
469 &(fields[0]->GetBndCondExpansions()[j]->
470 UpdatePhys())[id1], 1,
471 &scalarVariables[i][id2], 1);
475 if (fields[i]->GetBndConditions()[j]->
476 GetBoundaryConditionType() ==
480 &scalarVariables[i][id2], 1,
485 else if ((fields[i]->GetBndConditions()[j])->
486 GetBoundaryConditionType() ==
496 &scalarVariables[i][id2], 1,
497 &scalarVariables[i][id2], 1,
514 std::size_t nBndRegions = fields[nScalars]->
515 GetBndCondExpansions().num_elements();
516 for (std::size_t j = 0; j < nBndRegions; ++j)
518 if (fields[nScalars]->GetBndConditions()[j]->
519 GetBoundaryConditionType() ==
525 std::size_t nBndEdges = fields[nScalars]->
526 GetBndCondExpansions()[j]->GetExpSize();
527 for (std::size_t e = 0; e < nBndEdges; ++e)
529 std::size_t nBndEdgePts = fields[nScalars]->
530 GetBndCondExpansions()[j]->GetExp(e)->GetTotPoints();
532 std::size_t id1 = fields[nScalars]->
533 GetBndCondExpansions()[j]->GetPhys_Offset(e);
535 std::size_t id2 = fields[0]->GetTrace()->
536 GetPhys_Offset(fields[0]->GetTraceMap()->
537 GetBndCondTraceToGlobalTraceMap(cnt++));
540 if (boost::iequals(fields[nScalars]->GetBndConditions()[j]->
541 GetUserDefined(),
"WallViscous"))
545 &scalarVariables[nScalars-1][id2], 1);
549 else if (fields[nScalars]->GetBndConditions()[j]->
550 GetBoundaryConditionType() ==
555 for(std::size_t n = 0; n < nBndEdgePts; ++n)
558 GetBndCondExpansions()[j]->
560 ene = fields[nScalars]->
561 GetBndCondExpansions()[j]->
562 GetPhys()[id1 +n] / rho - tmp2[id2+n];
563 scalarVariables[nScalars-1][id2+n] =
564 m_eos->GetTemperature(rho, ene);
569 if (fields[nScalars]->GetBndConditions()[j]->
571 !boost::iequals(fields[nScalars]->GetBndConditions()[j]
572 ->GetUserDefined(),
"WallAdiabatic"))
575 &scalarVariables[nScalars-1][id2], 1,
576 &fluxO1[nScalars-1][id2], 1);
581 else if (((fields[nScalars]->GetBndConditions()[j])->
583 boost::iequals(fields[nScalars]->GetBndConditions()[j]->
584 GetUserDefined(),
"WallAdiabatic"))
587 &pFwd[nScalars-1][id2], 1,
588 &fluxO1[nScalars-1][id2], 1);
606 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
607 std::size_t nVariables = fields.num_elements();
611 for (std::size_t i = 0; i < nVariables-1; ++i)
627 std::size_t nDim = fields[0]->GetCoordim(0);
628 for (std::size_t i = 1; i < nVariables; ++i)
631 for (std::size_t j = 0; j < nDim; ++j)
634 fields[i]->GetFwdBwdTracePhys(qfield[j][i], qFwd, qBwd);
645 qfluxtemp, 1, qfluxtemp, 1);
648 if (fields[0]->GetBndCondExpansions().num_elements())
650 ApplyBCsO2(fields, i, j, qfield[j][i], qFwd, qBwd, qfluxtemp);
654 Vmath::Vadd(nTracePts, qfluxtemp, 1, qflux[i], 1, qflux[i], 1);
666 const std::size_t var,
667 const std::size_t dir,
673 boost::ignore_unused(qfield, qBwd);
676 std::size_t nBndRegions = fields[var]->GetBndCondExpansions().num_elements();
678 for (std::size_t i = 0; i < nBndRegions; ++i)
681 std::size_t nBndEdges = fields[var]->
682 GetBndCondExpansions()[i]->GetExpSize();
684 if (fields[var]->GetBndConditions()[i]->GetBoundaryConditionType()
691 for (std::size_t e = 0; e < nBndEdges; ++e)
693 std::size_t nBndEdgePts = fields[var]->
694 GetBndCondExpansions()[i]->GetExp(e)->GetTotPoints();
696 std::size_t id2 = fields[0]->GetTrace()->
697 GetPhys_Offset(fields[0]->GetTraceMap()->
698 GetBndCondTraceToGlobalTraceMap(cnt++));
702 if (fields[var]->GetBndConditions()[i]->
704 && !boost::iequals(fields[var]->GetBndConditions()[i]->
705 GetUserDefined(),
"WallAdiabatic"))
710 &penaltyflux[id2], 1);
714 else if ((fields[var]->GetBndConditions()[i])->
718 "Neumann bcs not implemented for LDGNS");
729 else if (boost::iequals(fields[var]->GetBndConditions()[i]->
730 GetUserDefined(),
"WallAdiabatic"))
742 &penaltyflux[id2], 1);
#define ASSERTL0(condition, msg)
void NumericalFluxO1(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, Array< OneD, 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.
Array< OneD, Array< OneD, NekDouble > > m_traceVel
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
DiffusionFactory & GetDiffusionFactory()
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 Sdiv(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha/y.
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.
DiffusionFluxVecCBNS m_fluxVectorNS
EquationOfStateSharedPtr m_eos
Equation of system for computing temperature.
void NumericalFluxO2(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, Array< OneD, Array< OneD, Array< OneD, 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.
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.
std::shared_ptr< Expansion3D > Expansion3DSharedPtr
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
SpatialDomains::Geometry1DSharedPtr GetGeom1D() const
DiffusionFluxPenaltyNS m_fluxPenaltyNS
EquationOfStateFactory & GetEquationOfStateFactory()
Declaration of the equation of state factory singleton.
NekDouble m_C11
Penalty coefficient for LDGNS.
Array< OneD, Array< OneD, NekDouble > > m_homoDerivs
void Neg(int n, T *x, const int incx)
Negate x = -x.
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.
Array< OneD, Array< OneD, NekDouble > > m_traceNormals
Array< OneD, NekDouble > m_traceOneOverH
h scaling for penalty term
std::shared_ptr< Expansion2D > Expansion2DSharedPtr
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_viscTensor
void Svtsvtp(int n, const T alpha, const T *x, int incx, const T beta, const T *y, int incy, T *z, int incz)
vvtvvtp (scalar times vector plus scalar times vector):
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
virtual 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)
Calculate weak DG Diffusion in the LDG form for the Navier-Stokes (NS) equations: ...
LibUtilities::SessionReaderSharedPtr m_session
void Zero(int n, T *x, const int incx)
Zero vector.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
std::shared_ptr< Expansion1D > Expansion1DSharedPtr
static DiffusionSharedPtr create(std::string diffType)
std::shared_ptr< SessionReader > SessionReaderSharedPtr
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 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.
virtual void v_InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)