37template<LIMITER LimiterKind>
44 template<
class FieldType>
46 size_t varEnd,
const FieldType&);
70template<
class Type = su2
double>
78 const Type& value_i,
const Type& value_j,
const Type& kappa) {
80 for (
Int iDim = 0; iDim < nDim; ++iDim) proj += halfEdge[iDim] * gradient[iDim];
81 const Type cent = 0.5 * (value_j - value_i);
96 const Type cent = 0.5 * delta;
97 const Type upw = grad_proj - cent;
98 return (1.0 - kappa) * upw + (1.0 + kappa) * cent;
103 Type y = delta*(delta+proj) + eps2;
104 return (y + delta*proj) / (y + 2*proj*proj);
109 return delta * (proj + delta) / (
pow(proj, 2) +
pow(delta, 2) + eps);
115 return max(0.0, min(factor, 1.0));
120 Type Dp = fabs(delta);
121 Type Dm = fabs(proj);
122 if(Dp>(2.0*Dm))
return 1.0;
123 Type y =
pow(Dp, 3) + epsp;
125 return (y + Dp*S3) / (y + Dm*(delta*delta+S3));
130 Type Dp = fabs(delta);
131 Type Dm = fabs(proj);
132 if(Dp>(2.0*Dm))
return 1.0;
133 Type y =
pow(Dp, 4) + epsp;
134 Type S4 = 2.0*Dm*(Dp*Dp-2.0*Dm*(Dp-2.0*Dm));
135 return (y + Dp*S4) / (y + Dm*(
pow(delta,3)+S4));
140 Type Dp = fabs(delta);
141 Type Dm = fabs(proj);
142 if(Dp>(2.0*Dm))
return 1.0;
143 Type y =
pow(Dp, 5) + epsp;
144 Type S5 = 8.0*Dm*Dm*(Dp*Dp-2.0*Dm*(Dp-Dm));
145 return (y + Dp*S5) / (y + Dm*(
pow(delta,4)+S5));
162 template<
class... Ts>
168 template<
class... Ts>
194 template<
class... Ts>
206 template<
class... Ts>
232 template<
class... Ts>
244 template<
class... Ts>
270 template<
class... Ts>
282 template<
class... Ts>
308 template<
class... Ts>
320 template<
class... Ts>
345 template<
class FieldType>
347 size_t varEnd,
const FieldType& field)
351 su2double largeNum = 0.1*std::numeric_limits<passivedouble>::max();
358 sharedMin.
resize(varEnd) = largeNum;
359 sharedMax.
resize(varEnd) =-largeNum;
372 for(
size_t iVar = varBegin; iVar < varEnd; ++iVar)
374 localMin(iVar) = min(localMin(iVar), field(iPoint, iVar));
375 localMax(iVar) = max(localMax(iVar), field(iPoint, iVar));
382 for(
size_t iVar = varBegin; iVar < varEnd; ++iVar)
384 atomicMin(localMin(iVar), sharedMin(iVar));
385 atomicMax(localMax(iVar), sharedMax(iVar));
392 localMin = sharedMin;
395 localMax = sharedMax;
405 for(
size_t iVar = varBegin; iVar < varEnd; ++iVar)
407 su2double range = sharedMax(iVar) - sharedMin(iVar);
415 template<
class... Ts>
441 template<
class... Ts>
483 template<
class... Ts>
A templated matrix/vector-like object.
Definition C2DContainer.hpp:374
C2DContainer & resize(const Index_t size1, const Index_t size2=1) noexcept
Request a change of size.
Definition C2DContainer.hpp:541
static Comm GetComm()
Definition mpi_structure.hpp:530
static void Allreduce(const void *sendbuf, void *recvbuf, int count, Datatype datatype, Op op, Comm comm)
Definition mpi_structure.hpp:570
Main class for defining the problem; basically this class reads the configuration file,...
Definition CConfig.hpp:64
su2double GetVenkat_LimiterCoeff(void) const
Get the value of limiter coefficient.
Definition CConfig.hpp:2557
su2double GetRefElemLength(void) const
Get the reference element length for computing the slope limiting epsilon.
Definition CConfig.hpp:2486
su2double GetAdjSharp_LimiterCoeff(void) const
Get the value of sharp edge limiter.
Definition CConfig.hpp:2569
Parent class for defining the geometry of the problem (complete geometry, multigrid agglomerated geom...
Definition CGeometry.hpp:75
CPoint * nodes
Node vector (dual grid information).
Definition CGeometry.hpp:253
unsigned long GetnPointDomain() const
Get number of real points (that belong to the domain).
Definition CGeometry.hpp:593
su2double & GetSharpEdge_Distance(unsigned long iPoint)
Get the value of the distance to a sharp edge.
Definition CPoint.hpp:521
su2double & GetWall_Distance(unsigned long iPoint)
Get the value of the distance to the nearest wall.
Definition CPoint.hpp:492
Scalar_t * data() noexcept
Definition C2DContainer.hpp:222
A simple SIMD type relying on implicit vectorization, i.e. done by the compiler, explicitly vectorize...
Definition vectorization.hpp:89
#define FORCEINLINE
Definition code_config.hpp:44
passivedouble su2double
Definition code_config.hpp:181
FORCEINLINE ARRAY_T pow(const ARRAY_T &a, const ARRAY_T &b)
Definition special_vectorization.hpp:179
#define MPI_MAX
Definition mpi_structure.hpp:490
#define MPI_MIN
Definition mpi_structure.hpp:489
#define MPI_DOUBLE
Definition mpi_structure.hpp:484
void SetPreaccIn(Ts &&... data)
Sets the scalar inputs of a preaccumulation section.
Definition ad_structure.hpp:186
#define BEGIN_SU2_OMP_SAFE_GLOBAL_ACCESS
Definition omp_structure.hpp:187
#define END_SU2_OMP_FOR
Definition omp_structure.hpp:158
#define SU2_OMP_FOR_(ARGS)
Definition omp_structure.hpp:149
#define SU2_NOWAIT
Definition omp_structure.hpp:153
#define END_SU2_OMP_SAFE_GLOBAL_ACCESS
Definition omp_structure.hpp:192
void atomicMin(const T &local, T &shared)
Definition omp_structure.hpp:322
void atomicMax(const T &local, T &shared)
Definition omp_structure.hpp:305
LIMITER
Types of slope limiters.
Definition option_structure.hpp:1038
@ VENKATAKRISHNAN
Slope limiter using Venkatakrisnan method (stencil formulation).
@ NISHIKAWA_R3
Slope limiter using Nishikawa's R3 method (stencil formulation).
@ NISHIKAWA_R4
Slope limiter using Nishikawa's R4 method (stencil formulation).
@ SHARP_EDGES
Slope limiter using sharp edges.
@ NISHIKAWA_R5
Slope limiter using Nishikawa's R5 method (stencil formulation).
@ VENKATAKRISHNAN_WANG
Slope limiter using Venkatakrisnan method, eps based on solution (stencil formulation).
@ WALL_DISTANCE
Slope limiter using wall distance.
@ BARTH_JESPERSEN
Slope limiter using Barth-Jespersen method (stencil formulation).
constexpr passivedouble PI_NUMBER
Pi number (not using M_PI to avoid Windows issues).
Definition option_structure.hpp:108
su2double limiterFunction(size_t, su2double proj, su2double delta) const
Venkatakrishnan function with a numerical epsilon.
Definition CLimiterDetails.hpp:174
su2double eps2
Definition CLimiterDetails.hpp:157
su2double geometricFactor(Ts &...) const
No geometric modification for this kind of limiter.
Definition CLimiterDetails.hpp:169
void preprocess(Ts &...)
Set a small epsilon to avoid divisions by 0.
Definition CLimiterDetails.hpp:163
su2double epsp
Definition CLimiterDetails.hpp:226
void preprocess(CGeometry &, const CConfig &config, Ts &...)
Store the reference lenght based eps^3 parameter, limited to a small number to avoid divisions by 0.
Definition CLimiterDetails.hpp:233
su2double geometricFactor(Ts &...) const
No geometric modification for this kind of limiter.
Definition CLimiterDetails.hpp:245
su2double limiterFunction(size_t, su2double proj, su2double delta) const
Smooth function that disables limiting in smooth regions.
Definition CLimiterDetails.hpp:250
su2double limiterFunction(size_t, su2double proj, su2double delta) const
Smooth function that disables limiting in smooth regions.
Definition CLimiterDetails.hpp:288
su2double geometricFactor(Ts &...) const
No geometric modification for this kind of limiter.
Definition CLimiterDetails.hpp:283
su2double epsp
Definition CLimiterDetails.hpp:264
void preprocess(CGeometry &, const CConfig &config, Ts &...)
Store the reference lenght based eps^4 parameter, limited to a small number to avoid divisions by 0.
Definition CLimiterDetails.hpp:271
su2double limiterFunction(size_t, su2double proj, su2double delta) const
Smooth function that disables limiting in smooth regions.
Definition CLimiterDetails.hpp:326
void preprocess(CGeometry &, const CConfig &config, Ts &...)
Store the reference lenght based eps^5 parameter, limited to a small number to avoid divisions by 0.
Definition CLimiterDetails.hpp:309
su2double geometricFactor(Ts &...) const
No geometric modification for this kind of limiter.
Definition CLimiterDetails.hpp:321
su2double epsp
Definition CLimiterDetails.hpp:302
su2double limiterFunction(size_t, su2double proj, su2double delta) const
Smooth function that disables limiting in smooth regions.
Definition CLimiterDetails.hpp:464
void preprocess(CGeometry &, const CConfig &config, Ts &...)
Store the reference lenght based eps^2 parameter.
Definition CLimiterDetails.hpp:442
su2double geometricFactor(size_t iPoint, CGeometry &geometry) const
Full limiting (1st order) near sharp edges.
Definition CLimiterDetails.hpp:454
su2double eps1
Definition CLimiterDetails.hpp:436
su2double geometricFactor(Ts &...) const
No geometric modification for this kind of limiter.
Definition CLimiterDetails.hpp:207
su2double limiterFunction(size_t, su2double proj, su2double delta) const
Smooth function that disables limiting in smooth regions.
Definition CLimiterDetails.hpp:212
su2double eps2
Definition CLimiterDetails.hpp:188
void preprocess(CGeometry &, const CConfig &config, Ts &...)
Store the reference lenght based eps^2 parameter, limited to a small number to avoid divisions by 0.
Definition CLimiterDetails.hpp:195
su2double geometricFactor(Ts &...) const
No geometric modification for this kind of limiter.
Definition CLimiterDetails.hpp:416
su2activevector eps2
Definition CLimiterDetails.hpp:340
su2double limiterFunction(size_t iVar, su2double proj, su2double delta) const
Smooth function that disables limiting in smooth regions.
Definition CLimiterDetails.hpp:421
static su2activevector sharedMax
Definition CLimiterDetails.hpp:339
void preprocess(CGeometry &geometry, const CConfig &config, size_t varBegin, size_t varEnd, const FieldType &field)
Store the solution range based eps^2 parameter.
Definition CLimiterDetails.hpp:346
su2double geometricFactor(size_t iPoint, CGeometry &geometry) const
Full limiting (1st order) near walls.
Definition CLimiterDetails.hpp:496
su2double limiterFunction(size_t, su2double proj, su2double delta) const
Smooth function that disables limiting in smooth regions.
Definition CLimiterDetails.hpp:506
su2double eps1
Definition CLimiterDetails.hpp:478
void preprocess(CGeometry &, const CConfig &config, Ts &...)
Store the reference lenght based eps^2 parameter.
Definition CLimiterDetails.hpp:484
A traits class for limiters, see notes for "computeLimiters_impl()".
Definition CLimiterDetails.hpp:39
su2double geometricFactor(size_t iPoint, CGeometry &) const
Geometric modifier (e.g. increase limiting near sharp edges).
void preprocess(CGeometry &, CConfig &, size_t varBegin, size_t varEnd, const FieldType &)
Compute any global value that may be needed by the other functions.
su2double limiterFunction(size_t iVar, su2double proj, su2double delta) const
Smooth (usually) function of the maximum/minimum (positive/negative) gradient projections onto the ed...
Common small functions used by limiters.
Definition CLimiterDetails.hpp:72
static FORCEINLINE Type reconstructionIncrement(Int nDim, const Type *halfEdge, const Type *gradient, const Type &value_i, const Type &value_j, const Type &kappa)
MUSCL reconstruction increment using the displacement to the middle of an edge.
Definition CLimiterDetails.hpp:77
static FORCEINLINE Type r3Function(const Type &proj, const Type &delta, const Type &epsp)
Definition CLimiterDetails.hpp:118
static FORCEINLINE Type umusclProjection(const Type &grad_proj, const Type &delta, const Type &kappa)
Definition CLimiterDetails.hpp:85
static FORCEINLINE Type r4Function(const Type &proj, const Type &delta, const Type &epsp)
Definition CLimiterDetails.hpp:128
static FORCEINLINE Type venkatFunction(const Type &proj, const Type &delta, const Type &eps2)
Definition CLimiterDetails.hpp:101
static FORCEINLINE Type vanAlbadaFunction(const Type &proj, const Type &delta, const Type &eps)
Definition CLimiterDetails.hpp:107
static FORCEINLINE Type r5Function(const Type &proj, const Type &delta, const Type &epsp)
Definition CLimiterDetails.hpp:138
static FORCEINLINE Type epsilon()
Definition CLimiterDetails.hpp:73
static FORCEINLINE Type raisedSine(const Type &dist)
Definition CLimiterDetails.hpp:112