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 nCoeffs = fields[0]->GetNcoeffs();
87 for (std::size_t i=0; i < nConvectiveFields; ++i)
95 for (std::size_t i = 0; i < nConvectiveFields; ++i)
97 fields[i]->BwdTrans (tmp[i], outarray[i]);
102 const std::size_t nConvectiveFields,
109 std::size_t nDim = fields[0]->GetCoordim(0);
110 std::size_t nPts = fields[0]->GetTotPoints();
111 std::size_t nCoeffs = fields[0]->GetNcoeffs();
112 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
117 for (std::size_t j = 0; j < nDim; ++j)
120 for (std::size_t i = 0; i < nConvectiveFields; ++i)
127 for (std::size_t i = 0; i < nConvectiveFields; ++i)
136 for (std::size_t j = 0; j < nDim; ++j)
139 for (std::size_t i = 0; i < nConvectiveFields; ++i)
145 DiffuseTraceFlux(fields, inarray, qfield, viscTensor, traceflux, pFwd, pBwd);
149 for (std::size_t i = 0; i < nConvectiveFields; ++i)
151 for (std::size_t j = 0; j < nDim; ++j)
153 qdbase[j] = viscTensor[j][i];
155 fields[i]->IProductWRTDerivBase(qdbase, tmp);
158 fields[i]->AddTraceIntegral (traceflux[i], tmp);
159 fields[i]->SetPhysState (
false);
160 fields[i]->MultiplyByElmtInvMass(tmp, outarray[i]);
171 std::size_t nConvectiveFields = fields.size();
172 std::size_t nDim = fields[0]->GetCoordim(0);
173 std::size_t nCoeffs = fields[0]->GetNcoeffs();
174 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
178 for (std::size_t j = 0; j < nDim; ++j)
181 for (std::size_t i = 0; i < nConvectiveFields; ++i)
189 for (std::size_t j = 0; j < nDim; ++j)
191 for (std::size_t i = 0; i < nConvectiveFields; ++i)
193 fields[i]->IProductWRTDerivBase(j, inarray[i], tmp);
195 fields[i]->AddTraceIntegral (flux[j][i], tmp);
196 fields[i]->SetPhysState (
false);
197 fields[i]->MultiplyByElmtInvMass(tmp, tmp);
198 fields[i]->BwdTrans (tmp, qfield[j][i]);
210 boost::ignore_unused(fields, nonZeroIndex);
223 boost::ignore_unused(qfield, pFwd, pBwd, nonZeroIndex);
234 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
235 std::size_t nvariables = fields.size();
236 std::size_t nDim = fields[0]->GetCoordim(0);
245 for (std::size_t i = 0; i < nvariables; ++i)
251 fields[i]->GetFwdBwdTracePhys(ufield[i], Fwd, Bwd);
263 if (fields[0]->GetBndCondExpansions().size())
268 for (std::size_t j = 0; j < nDim; ++j)
283 boost::ignore_unused(ufield, Bwd);
285 std::size_t nBndRegions =
286 fields[var]->GetBndCondExpansions().size();
288 for (std::size_t i = 0; i < nBndRegions; ++i)
290 if (fields[var]->GetBndConditions()[i]->GetBoundaryConditionType() ==
297 std::size_t nBndEdges =
298 fields[var]->GetBndCondExpansions()[i]->GetExpSize();
301 for (std::size_t e = 0; e < nBndEdges; ++e)
303 std::size_t nBndEdgePts = fields[var]
304 ->GetBndCondExpansions()[i]
309 fields[var]->GetBndCondExpansions()[i]->GetPhys_Offset(e);
311 std::size_t id2 = fields[0]->GetTrace()->GetPhys_Offset(
312 fields[0]->GetTraceMap()->GetBndCondIDToGlobalTraceID(
316 if ( boost::iequals(fields[var]->GetBndConditions()[i]->
317 GetUserDefined(),
"Wall") ||
318 boost::iequals(fields[var]->GetBndConditions()[i]->
319 GetUserDefined(),
"Symmetry") ||
320 boost::iequals(fields[var]->GetBndConditions()[i]->
321 GetUserDefined(),
"WallViscous") ||
322 boost::iequals(fields[var]->GetBndConditions()[i]->
323 GetUserDefined(),
"WallAdiabatic"))
325 Vmath::Vcopy(nBndEdgePts, &Fwd[id2], 1, &penaltyflux[id2], 1);
329 ->GetBndConditions()[i]
334 &(fields[var]->GetBndCondExpansions()[i]->GetPhys())[id1],
335 1, &penaltyflux[id2], 1);
338 else if ((fields[var]->GetBndConditions()[i])
339 ->GetBoundaryConditionType() ==
342 Vmath::Vcopy(nBndEdgePts, &Fwd[id2], 1, &penaltyflux[id2], 1);
358 std::size_t nTracePts = fields[0]->GetTrace()->GetTotPoints();
359 std::size_t nvariables = fields.size();
360 std::size_t nDim = qfield.size();
371 for (std::size_t i = 0; i < nvariables; ++i)
374 fields[i]->GetFwdBwdTracePhys(ufield[i], Fwd, Bwd);
379 for (std::size_t j = 0; j < nDim; ++j)
382 fields[i]->GetFwdBwdTracePhys(qfield[j][i], qFwd, qBwd);
391 Vmath::Vadd(nTracePts, uterm, 1, qfluxtemp, 1, qfluxtemp, 1);
394 if (fields[0]->GetBndCondExpansions().size())
403 Vmath::Vadd(nTracePts, qfluxtemp, 1, qflux[i], 1, qflux[i], 1);
415 const std::size_t var,
const std::size_t dir,
421 boost::ignore_unused(qfield, qBwd);
423 std::size_t nBndRegions =
424 fields[var]->GetBndCondExpansions().size();
427 for (std::size_t i = 0; i < nBndRegions; ++i)
429 if (fields[var]->GetBndConditions()[i]->GetBoundaryConditionType() ==
434 std::size_t nBndEdges =
435 fields[var]->GetBndCondExpansions()[i]->GetExpSize();
438 for (std::size_t e = 0; e < nBndEdges; ++e)
440 std::size_t nBndEdgePts = fields[var]
441 ->GetBndCondExpansions()[i]
446 fields[var]->GetBndCondExpansions()[i]->GetPhys_Offset(e);
448 std::size_t id2 = fields[0]->GetTrace()->GetPhys_Offset(
449 fields[0]->GetTraceMap()->GetBndCondIDToGlobalTraceID(
453 if ( boost::iequals(fields[var]->GetBndConditions()[i]->
454 GetUserDefined(),
"Wall") ||
455 boost::iequals(fields[var]->GetBndConditions()[i]->
456 GetUserDefined(),
"Symmetry") ||
457 boost::iequals(fields[var]->GetBndConditions()[i]->
458 GetUserDefined(),
"WallViscous") ||
459 boost::iequals(fields[var]->GetBndConditions()[i]->
460 GetUserDefined(),
"WallAdiabatic"))
467 ->GetBndConditions()[i]
471 &qFwd[id2], 1, &penaltyflux[id2], 1);
474 else if ((fields[var]->GetBndConditions()[i])
475 ->GetBoundaryConditionType() ==
480 &(fields[var]->GetBndCondExpansions()[i]->GetPhys())[id1],
481 1, &penaltyflux[id2], 1);
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
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 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.
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)
DiffusionFluxVecCB m_fluxVector
virtual 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)
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 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)
Array< OneD, Array< OneD, NekDouble > > m_traceNormals
static DiffusionSharedPtr create(std::string diffType)
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, TensorOfArray3D< NekDouble > &uflux, const Array< OneD, Array< OneD, NekDouble > > &pFwd, const Array< OneD, Array< OneD, NekDouble > > &pBwd)
LibUtilities::SessionReaderSharedPtr m_session
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)
Diffusion term Trace Flux.
std::string m_shockCaptureType
void NumFluxforVector(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &ufield, TensorOfArray3D< 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...
NekDouble m_C11
Coefficient of penalty term.
virtual 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)
Diffusion Flux, calculate the physical derivatives.
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)
virtual void v_InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
std::shared_ptr< SessionReader > SessionReaderSharedPtr
DiffusionFactory & GetDiffusionFactory()
The above copyright notice and this permission notice shall be included.
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayOfArray
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 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 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)
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.