Skip to content

Commit 6338bff

Browse files
authored
Merge pull request #1375 from su2code/base_flow_variable
Intermediate class of variable for all flow solver variables + Fix for MUSCL in NEMO solver
2 parents f361b13 + a413c79 commit 6338bff

34 files changed

+643
-1032
lines changed

Common/include/code_config.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,17 @@ template<class T, class F> struct su2conditional<false, T, F> { using type = F;
6767
template<bool B, class T, class F>
6868
using su2conditional_t = typename su2conditional<B,T,F>::type;
6969

70+
/*! \brief Static cast "In" to "Out", in debug builds a dynamic cast is used. */
71+
template<class Out, class In>
72+
FORCEINLINE Out su2staticcast_p(In ptr) {
73+
static_assert(std::is_pointer<In>::value, "This expects a pointer");
74+
#ifndef NDEBUG
75+
return static_cast<Out>(ptr);
76+
#else
77+
return dynamic_cast<Out>(ptr);
78+
#endif
79+
}
80+
7081
/*--- Detect compilation with OpenMP. ---*/
7182
#if defined(_OPENMP)
7283
#define HAVE_OMP

SU2_CFD/include/limiters/CLimiterDetails.hpp

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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
};

SU2_CFD/include/solvers/CEulerSolver.hpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -684,12 +684,6 @@ class CEulerSolver : public CFVMFlowSolverBase<CEulerVariable, ENUM_REGIME::COMP
684684
CConfig *config,
685685
unsigned short val_marker) final;
686686

687-
/*!
688-
* \brief Set the new solution variables to the current solution value for classical RK.
689-
* \param[in] geometry - Geometrical definition of the problem.
690-
*/
691-
inline void Set_NewSolution() final { nodes->SetSolution_New(); }
692-
693687
/*!
694688
* \brief Update the solution using a Runge-Kutta scheme.
695689
* \param[in] geometry - Geometrical definition of the problem.

SU2_CFD/include/solvers/CFVMFlowSolverBase.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,6 +1102,11 @@ class CFVMFlowSolverBase : public CSolver {
11021102

11031103
public:
11041104

1105+
/*!
1106+
* \brief Set the new solution variables to the current solution value for classical RK.
1107+
*/
1108+
inline void Set_NewSolution() final { nodes->SetSolution_New(); }
1109+
11051110
/*!
11061111
* \brief Load a solution from a restart file.
11071112
* \param[in] geometry - Geometrical definition of the problem.

SU2_CFD/include/solvers/CScalarSolver.inl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "../../../Common/include/parallelization/omp_structure.hpp"
2828
#include "../../../Common/include/toolboxes/geometry_toolbox.hpp"
2929
#include "../../include/solvers/CScalarSolver.hpp"
30+
#include "../../include/variables/CFlowVariable.hpp"
3031

3132
template <class VariableType>
3233
CScalarSolver<VariableType>::CScalarSolver(bool conservative) : CSolver(), Conservative(conservative) {}
@@ -92,10 +93,10 @@ void CScalarSolver<VariableType>::Upwind_Residual(CGeometry* geometry, CSolver**
9293
const bool limiterFlow =
9394
(config->GetKind_SlopeLimit_Flow() != NO_LIMITER) && (config->GetKind_SlopeLimit_Flow() != VAN_ALBADA_EDGE);
9495

95-
CVariable* flowNodes = solver_container[FLOW_SOL]->GetNodes();
96+
auto* flowNodes = su2staticcast_p<CFlowVariable*>(solver_container[FLOW_SOL]->GetNodes());
9697

9798
/*--- Pick one numerics object per thread. ---*/
98-
CNumerics* numerics = numerics_container[CONV_TERM + omp_get_thread_num() * MAX_TERMS];
99+
auto* numerics = numerics_container[CONV_TERM + omp_get_thread_num() * MAX_TERMS];
99100

100101
/*--- Static arrays of MUSCL-reconstructed flow primitives and turbulence variables (thread safety). ---*/
101102
su2double solution_i[MAXNVAR] = {0.0}, flowPrimVar_i[MAXNVARFLOW] = {0.0};

0 commit comments

Comments
 (0)