38 #include <boost/algorithm/string/predicate.hpp> 65 std::size_t nDim = pFields[0]->GetCoordim(0);
66 std::size_t nTracePts = pFields[0]->GetTrace()->GetTotPoints();
69 for (std::size_t i = 0; i < nDim; ++i)
77 const std::size_t nConvectiveFields,
84 std::size_t nDim = fields[0]->GetCoordim(0);
85 std::size_t nPts = fields[0]->GetTotPoints();
86 std::size_t nCoeffs = fields[0]->GetNcoeffs();
87 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
93 for (std::size_t j = 0; j < nDim; ++j)
98 for (std::size_t i = 0; i < nConvectiveFields; ++i)
110 for (std::size_t j = 0; j < nDim; ++j)
112 for (std::size_t i = 0; i < nConvectiveFields; ++i)
114 fields[i]->IProductWRTDerivBase(j, inarray[i], tmp);
116 fields[i]->AddTraceIntegral(flux[j][i], tmp);
117 fields[i]->SetPhysState(
false);
118 fields[i]->MultiplyByElmtInvMass(tmp, tmp);
119 fields[i]->BwdTrans(tmp, qfield[j][i]);
125 for (std::size_t j = 0; j < nDim; ++j)
128 for (std::size_t i = 0; i < nConvectiveFields; ++i)
141 for (std::size_t i = 0; i < nConvectiveFields; ++i)
143 for (std::size_t j = 0; j < nDim; ++j)
145 qdbase[j] = viscTensor[j][i];
147 fields[i]->IProductWRTDerivBase(qdbase, tmp);
151 fields[i]->AddTraceIntegral(flux[0][i], tmp);
152 fields[i]->SetPhysState(
false);
153 fields[i]->MultiplyByElmtInvMass(tmp, tmp);
154 fields[i]->BwdTrans(tmp, outarray[i]);
165 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
166 std::size_t nvariables = fields.num_elements();
167 std::size_t nDim = fields[0]->GetCoordim(0);
176 for (std::size_t i = 0; i < nvariables; ++i)
182 fields[i]->GetFwdBwdTracePhys(ufield[i], Fwd, Bwd);
194 if (fields[0]->GetBndCondExpansions().num_elements())
199 for (std::size_t j = 0; j < nDim; ++j)
214 boost::ignore_unused(ufield, Bwd);
216 std::size_t nBndRegions =
217 fields[var]->GetBndCondExpansions().num_elements();
219 for (std::size_t i = 0; i < nBndRegions; ++i)
221 if (fields[var]->GetBndConditions()[i]->GetBoundaryConditionType() ==
228 std::size_t nBndEdges =
229 fields[var]->GetBndCondExpansions()[i]->GetExpSize();
232 for (std::size_t e = 0; e < nBndEdges; ++e)
234 std::size_t nBndEdgePts = fields[var]
235 ->GetBndCondExpansions()[i]
240 fields[var]->GetBndCondExpansions()[i]->GetPhys_Offset(e);
242 std::size_t id2 = fields[0]->GetTrace()->GetPhys_Offset(
243 fields[0]->GetTraceMap()->GetBndCondTraceToGlobalTraceMap(
247 if ( boost::iequals(fields[var]->GetBndConditions()[i]->
248 GetUserDefined(),
"Wall") ||
249 boost::iequals(fields[var]->GetBndConditions()[i]->
250 GetUserDefined(),
"Symmetry") ||
251 boost::iequals(fields[var]->GetBndConditions()[i]->
252 GetUserDefined(),
"WallViscous") ||
253 boost::iequals(fields[var]->GetBndConditions()[i]->
254 GetUserDefined(),
"WallAdiabatic"))
256 Vmath::Vcopy(nBndEdgePts, &Fwd[id2], 1, &penaltyflux[id2], 1);
260 ->GetBndConditions()[i]
265 &(fields[var]->GetBndCondExpansions()[i]->GetPhys())[id1],
266 1, &penaltyflux[id2], 1);
269 else if ((fields[var]->GetBndConditions()[i])
270 ->GetBoundaryConditionType() ==
273 Vmath::Vcopy(nBndEdgePts, &Fwd[id2], 1, &penaltyflux[id2], 1);
289 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
290 std::size_t nvariables = fields.num_elements();
291 std::size_t nDim = qfield.num_elements();
302 for (std::size_t i = 0; i < nvariables; ++i)
305 fields[i]->GetFwdBwdTracePhys(ufield[i], Fwd, Bwd);
310 for (std::size_t j = 0; j < nDim; ++j)
313 fields[i]->GetFwdBwdTracePhys(qfield[j][i], qFwd, qBwd);
322 Vmath::Vadd(nTracePts, uterm, 1, qfluxtemp, 1, qfluxtemp, 1);
325 if (fields[0]->GetBndCondExpansions().num_elements())
334 Vmath::Vadd(nTracePts, qfluxtemp, 1, qflux[i], 1, qflux[i], 1);
346 const std::size_t var,
const std::size_t dir,
352 boost::ignore_unused(qfield, qBwd);
354 std::size_t nBndRegions =
355 fields[var]->GetBndCondExpansions().num_elements();
358 for (std::size_t i = 0; i < nBndRegions; ++i)
360 if (fields[var]->GetBndConditions()[i]->GetBoundaryConditionType() ==
365 std::size_t nBndEdges =
366 fields[var]->GetBndCondExpansions()[i]->GetExpSize();
369 for (std::size_t e = 0; e < nBndEdges; ++e)
371 std::size_t nBndEdgePts = fields[var]
372 ->GetBndCondExpansions()[i]
377 fields[var]->GetBndCondExpansions()[i]->GetPhys_Offset(e);
379 std::size_t id2 = fields[0]->GetTrace()->GetPhys_Offset(
380 fields[0]->GetTraceMap()->GetBndCondTraceToGlobalTraceMap(
384 if ( boost::iequals(fields[var]->GetBndConditions()[i]->
385 GetUserDefined(),
"Wall") ||
386 boost::iequals(fields[var]->GetBndConditions()[i]->
387 GetUserDefined(),
"Symmetry") ||
388 boost::iequals(fields[var]->GetBndConditions()[i]->
389 GetUserDefined(),
"WallViscous") ||
390 boost::iequals(fields[var]->GetBndConditions()[i]->
391 GetUserDefined(),
"WallAdiabatic"))
398 ->GetBndConditions()[i]
402 &qFwd[id2], 1, &penaltyflux[id2], 1);
405 else if ((fields[var]->GetBndConditions()[i])
406 ->GetBoundaryConditionType() ==
411 &(fields[var]->GetBndCondExpansions()[i]->GetPhys())[id1],
412 1, &penaltyflux[id2], 1);
std::string m_shockCaptureType
void ApplyVectorBCs(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)
void NumFluxforScalar(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &ufield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &uflux, const Array< OneD, Array< OneD, NekDouble > > &pFwd=NullNekDoubleArrayofArray, const Array< OneD, Array< OneD, NekDouble > > &pBwd=NullNekDoubleArrayofArray)
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=NullNekDoubleArrayofArray, const Array< OneD, Array< OneD, NekDouble > > &pBwd=NullNekDoubleArrayofArray)
DiffusionFactory & GetDiffusionFactory()
static DiffusionSharedPtr create(std::string diffType)
LibUtilities::SessionReaderSharedPtr m_session
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
void NumFluxforVector(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &ufield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &qfield, Array< OneD, Array< OneD, NekDouble > > &qflux)
Build the numerical flux for the 2nd order derivatives todo: add variable coeff and h dependence to p...
void Neg(int n, T *x, const int incx)
Negate x = -x.
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.
Array< OneD, Array< OneD, NekDouble > > m_traceNormals
DiffusionFluxVecCB m_fluxVector
NekDouble m_C11
Coefficient of penalty term.
void ApplyScalarBCs(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const std::size_t var, const Array< OneD, const NekDouble > &ufield, const Array< OneD, const NekDouble > &Fwd, const Array< OneD, const NekDouble > &Bwd, Array< OneD, NekDouble > &penaltyflux)
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayofArray
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)
virtual void v_InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
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.