@@ -64,22 +64,28 @@ struct CLimiterDetails
6464/* !
6565 * \brief Common small functions used by limiters.
6666 */
67- namespace LimiterHelpers
67+ template <class Type = su2double>
68+ struct LimiterHelpers
6869{
69- inline passivedouble epsilon () {return std::numeric_limits<passivedouble>::epsilon ();}
70+ FORCEINLINE static Type epsilon () {return std::numeric_limits<passivedouble>::epsilon ();}
7071
71- inline su2double venkatFunction (su2double proj, su2double delta, su2double eps2)
72+ FORCEINLINE static Type venkatFunction (const Type& proj, const Type& delta, const Type& eps2)
7273 {
73- su2double y = delta*(delta+proj) + eps2;
74+ Type y = delta*(delta+proj) + eps2;
7475 return (y + delta*proj) / (y + 2 *proj*proj);
7576 }
7677
77- inline su2double raisedSine (su2double dist )
78+ FORCEINLINE static Type vanAlbadaFunction ( const Type& proj, const Type& delta, const Type& eps )
7879 {
79- su2double factor = 0.5 *(1.0 +dist+sin (PI_NUMBER*dist)/PI_NUMBER);
80+ return delta * (2 *proj + delta) / (4 *pow (proj, 2 ) + pow (delta, 2 ) + eps);
81+ }
82+
83+ FORCEINLINE static Type raisedSine (const Type& dist)
84+ {
85+ Type factor = 0.5 *(1.0 +dist+sin (PI_NUMBER*dist)/PI_NUMBER);
8086 return max (0.0 , min (factor, 1.0 ));
8187 }
82- }
88+ };
8389
8490
8591/* !
@@ -94,7 +100,7 @@ struct CLimiterDetails<BARTH_JESPERSEN>
94100 * \brief Set a small epsilon to avoid divisions by 0.
95101 */
96102 template <class ... Ts>
97- inline void preprocess (Ts&...) {eps2 = LimiterHelpers::epsilon ();}
103+ inline void preprocess (Ts&...) {eps2 = LimiterHelpers<> ::epsilon ();}
98104
99105 /* !
100106 * \brief No geometric modification for this kind of limiter.
@@ -107,7 +113,7 @@ struct CLimiterDetails<BARTH_JESPERSEN>
107113 */
108114 inline su2double limiterFunction (size_t , su2double proj, su2double delta) const
109115 {
110- return LimiterHelpers::venkatFunction (proj, delta, eps2);
116+ return LimiterHelpers<> ::venkatFunction (proj, delta, eps2);
111117 }
112118};
113119
@@ -130,7 +136,7 @@ struct CLimiterDetails<VENKATAKRISHNAN>
130136 su2double L = config.GetRefElemLength ();
131137 su2double K = config.GetVenkat_LimiterCoeff ();
132138 su2double eps1 = fabs (L*K);
133- eps2 = max (eps1*eps1*eps1, LimiterHelpers::epsilon ());
139+ eps2 = max (eps1*eps1*eps1, LimiterHelpers<> ::epsilon ());
134140 }
135141
136142 /* !
@@ -144,7 +150,7 @@ struct CLimiterDetails<VENKATAKRISHNAN>
144150 */
145151 inline su2double limiterFunction (size_t , su2double proj, su2double delta) const
146152 {
147- return LimiterHelpers::venkatFunction (proj, delta, eps2);
153+ return LimiterHelpers<> ::venkatFunction (proj, delta, eps2);
148154 }
149155};
150156
@@ -229,7 +235,7 @@ struct CLimiterDetails<VENKATAKRISHNAN_WANG>
229235 for (size_t iVar = varBegin; iVar < varEnd; ++iVar)
230236 {
231237 su2double range = sharedMax (iVar) - sharedMin (iVar);
232- eps2 (iVar) = max (pow (K*range, 2 ), LimiterHelpers::epsilon ());
238+ eps2 (iVar) = max (pow (K*range, 2 ), LimiterHelpers<> ::epsilon ());
233239 }
234240 }
235241
@@ -245,7 +251,7 @@ struct CLimiterDetails<VENKATAKRISHNAN_WANG>
245251 inline su2double limiterFunction (size_t iVar, su2double proj, su2double delta) const
246252 {
247253 AD::SetPreaccIn (eps2 (iVar));
248- return LimiterHelpers::venkatFunction (proj, delta, eps2 (iVar));
254+ return LimiterHelpers<> ::venkatFunction (proj, delta, eps2 (iVar));
249255 }
250256};
251257
@@ -268,7 +274,7 @@ struct CLimiterDetails<SHARP_EDGES>
268274 su2double L = config.GetRefElemLength ();
269275 su2double K = config.GetVenkat_LimiterCoeff ();
270276 eps1 = fabs (L*K);
271- eps2 = max (eps1*eps1*eps1, LimiterHelpers::epsilon ());
277+ eps2 = max (eps1*eps1*eps1, LimiterHelpers<> ::epsilon ());
272278 }
273279
274280 /* !
@@ -278,15 +284,15 @@ struct CLimiterDetails<SHARP_EDGES>
278284 {
279285 AD::SetPreaccIn (geometry.nodes ->GetSharpEdge_Distance (iPoint));
280286 su2double dist = geometry.nodes ->GetSharpEdge_Distance (iPoint)/(sharpCoeff*eps1)-1.0 ;
281- return LimiterHelpers::raisedSine (dist);
287+ return LimiterHelpers<> ::raisedSine (dist);
282288 }
283289
284290 /* !
285291 * \brief Smooth function that disables limiting in smooth regions.
286292 */
287293 inline su2double limiterFunction (size_t , su2double proj, su2double delta) const
288294 {
289- return LimiterHelpers::venkatFunction (proj, delta, eps2);
295+ return LimiterHelpers<> ::venkatFunction (proj, delta, eps2);
290296 }
291297};
292298
@@ -309,7 +315,7 @@ struct CLimiterDetails<WALL_DISTANCE>
309315 su2double L = config.GetRefElemLength ();
310316 su2double K = config.GetVenkat_LimiterCoeff ();
311317 eps1 = fabs (L*K);
312- eps2 = max (eps1*eps1*eps1, LimiterHelpers::epsilon ());
318+ eps2 = max (eps1*eps1*eps1, LimiterHelpers<> ::epsilon ());
313319 }
314320
315321 /* !
@@ -319,14 +325,14 @@ struct CLimiterDetails<WALL_DISTANCE>
319325 {
320326 AD::SetPreaccIn (geometry.nodes ->GetWall_Distance (iPoint));
321327 su2double dist = geometry.nodes ->GetWall_Distance (iPoint)/(sharpCoeff*eps1)-1.0 ;
322- return LimiterHelpers::raisedSine (dist);
328+ return LimiterHelpers<> ::raisedSine (dist);
323329 }
324330
325331 /* !
326332 * \brief Smooth function that disables limiting in smooth regions.
327333 */
328334 inline su2double limiterFunction (size_t , su2double proj, su2double delta) const
329335 {
330- return LimiterHelpers::venkatFunction (proj, delta, eps2);
336+ return LimiterHelpers<> ::venkatFunction (proj, delta, eps2);
331337 }
332338};
0 commit comments