Skip to content

Commit 9010bba

Browse files
committed
Apply kappa-blending to Roe MUSCL reconstruction
1 parent 6142816 commit 9010bba

File tree

4 files changed

+67
-27
lines changed

4 files changed

+67
-27
lines changed

Common/include/CConfig.hpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -592,11 +592,12 @@ class CConfig {
592592
MUSCL_AdjFlow, /*!< \brief MUSCL scheme for the adj flow equations.*/
593593
MUSCL_AdjTurb, /*!< \brief MUSCL scheme for the adj turbulence equations.*/
594594
MUSCL_Species; /*!< \brief MUSCL scheme for the species equations.*/
595-
su2double MUSCL_Kappa_Flow, /*!< \brief Blending coefficient for MUSCL scheme for the flow equations.*/
596-
MUSCL_Kappa_Turb, /*!< \brief Blending coefficient for MUSCL scheme for the turbulence equations.*/
597-
MUSCL_Kappa_Heat, /*!< \brief Blending coefficient for MUSCL scheme for the (fvm) heat equation.*/
598-
MUSCL_Kappa_AdjFlow, /*!< \brief Blending coefficient for MUSCL scheme for the adj flow equations.*/
599-
MUSCL_Kappa_Species; /*!< \brief MUSCL scheme for the species equations.*/
595+
su2double MUSCL_Kappa, /*!< \brief Blending coefficient for MUSCL scheme. */
596+
MUSCL_Kappa_Flow, /*!< \brief Blending coefficient for MUSCL scheme for the flow equations.*/
597+
MUSCL_Kappa_Turb, /*!< \brief Blending coefficient for MUSCL scheme for the turbulence equations.*/
598+
MUSCL_Kappa_Heat, /*!< \brief Blending coefficient for MUSCL scheme for the (fvm) heat equation.*/
599+
MUSCL_Kappa_AdjFlow, /*!< \brief Blending coefficient for MUSCL scheme for the adj flow equations.*/
600+
MUSCL_Kappa_Species; /*!< \brief Blending coefficient for MUSCL scheme for the species equations.*/
600601
bool Use_Accurate_Jacobians; /*!< \brief Use numerically computed Jacobians for AUSM+up(2) and SLAU(2). */
601602
bool Use_Accurate_Turb_Jacobians; /*!< \brief Use numerically computed Jacobians for standard SA turbulence model. */
602603
bool EulerPersson; /*!< \brief Boolean to determine whether this is an Euler simulation with Persson shock capturing. */
@@ -2461,11 +2462,12 @@ class CConfig {
24612462
* \param[in] val_kind_upwind - If upwind scheme, kind of upwind scheme (Roe, etc.).
24622463
* \param[in] val_kind_slopelimit - If upwind scheme, kind of slope limit.
24632464
* \param[in] val_muscl - Define if we apply a MUSCL scheme or not.
2465+
* \param[in] val_muscl_kappa - Define the blending coefficient for the MUSCL scheme.
24642466
* \param[in] val_kind_fem - If FEM, what kind of FEM discretization.
24652467
*/
24662468
void SetKind_ConvNumScheme(unsigned short val_kind_convnumscheme, CENTERED val_kind_centered,
24672469
UPWIND val_kind_upwind, LIMITER val_kind_slopelimit,
2468-
bool val_muscl, unsigned short val_kind_fem);
2470+
bool val_muscl, su2double val_muscl_kappa, unsigned short val_kind_fem);
24692471

24702472
/*!
24712473
* \brief Get the value of limiter coefficient.

Common/src/CConfig.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8697,13 +8697,14 @@ unsigned short CConfig::GetContainerPosition(unsigned short val_eqsystem) {
86978697
void CConfig::SetKind_ConvNumScheme(unsigned short val_kind_convnumscheme,
86988698
CENTERED val_kind_centered, UPWIND val_kind_upwind,
86998699
LIMITER val_kind_slopelimit, bool val_muscl,
8700-
unsigned short val_kind_fem) {
8700+
su2double val_muscl_kappa, unsigned short val_kind_fem) {
87018701
Kind_ConvNumScheme = val_kind_convnumscheme;
87028702
Kind_Centered = val_kind_centered;
87038703
Kind_Upwind = val_kind_upwind;
87048704
Kind_FEM = val_kind_fem;
87058705
Kind_SlopeLimit = val_kind_slopelimit;
87068706
MUSCL = val_muscl;
8707+
MUSCL_Kappa = val_muscl_kappa;
87078708

87088709
}
87098710

@@ -8721,7 +8722,7 @@ void CConfig::SetGlobalParam(MAIN_SOLVER val_solver,
87218722
if (val_system == RUNTIME_FLOW_SYS) {
87228723
SetKind_ConvNumScheme(Kind_ConvNumScheme_Flow, Kind_Centered_Flow,
87238724
Kind_Upwind_Flow, Kind_SlopeLimit_Flow,
8724-
MUSCL_Flow, NONE);
8725+
MUSCL_Flow, MUSCL_Kappa_Flow, NONE);
87258726
SetKind_TimeIntScheme(Kind_TimeIntScheme_Flow);
87268727
}
87278728
};
@@ -8730,15 +8731,16 @@ void CConfig::SetGlobalParam(MAIN_SOLVER val_solver,
87308731
if (val_system == RUNTIME_TURB_SYS) {
87318732
SetKind_ConvNumScheme(Kind_ConvNumScheme_Turb, Kind_Centered_Turb,
87328733
Kind_Upwind_Turb, Kind_SlopeLimit_Turb,
8733-
MUSCL_Turb, NONE);
8734+
MUSCL_Turb, MUSCL_Kappa_Turb, NONE);
87348735
SetKind_TimeIntScheme(Kind_TimeIntScheme_Turb);
87358736
}
87368737
};
87378738

87388739
auto SetHeatParam = [&]() {
87398740
if (val_system == RUNTIME_HEAT_SYS) {
87408741
SetKind_ConvNumScheme(Kind_ConvNumScheme_Heat, Kind_Centered_Heat,
8741-
Kind_Upwind_Heat, Kind_SlopeLimit_Heat, MUSCL_Heat, NONE);
8742+
Kind_Upwind_Heat, Kind_SlopeLimit_Heat, MUSCL_Heat,
8743+
MUSCL_Kappa_Heat, NONE);
87428744
SetKind_TimeIntScheme(Kind_TimeIntScheme_Heat);
87438745
}
87448746
};
@@ -8747,7 +8749,7 @@ void CConfig::SetGlobalParam(MAIN_SOLVER val_solver,
87478749
if (val_system == RUNTIME_SPECIES_SYS) {
87488750
SetKind_ConvNumScheme(Kind_ConvNumScheme_Species, Kind_Centered_Species,
87498751
Kind_Upwind_Species, Kind_SlopeLimit_Species,
8750-
MUSCL_Species, NONE);
8752+
MUSCL_Species, MUSCL_Kappa_Species, NONE);
87518753
SetKind_TimeIntScheme(Kind_TimeIntScheme_Species);
87528754
}
87538755
};
@@ -8756,7 +8758,7 @@ void CConfig::SetGlobalParam(MAIN_SOLVER val_solver,
87568758
if (val_system == RUNTIME_ADJFLOW_SYS) {
87578759
SetKind_ConvNumScheme(Kind_ConvNumScheme_AdjFlow, Kind_Centered_AdjFlow,
87588760
Kind_Upwind_AdjFlow, Kind_SlopeLimit_AdjFlow,
8759-
MUSCL_AdjFlow, NONE);
8761+
MUSCL_AdjFlow, MUSCL_Kappa_AdjFlow, NONE);
87608762
SetKind_TimeIntScheme(Kind_TimeIntScheme_AdjFlow);
87618763
}
87628764
};
@@ -8782,7 +8784,7 @@ void CConfig::SetGlobalParam(MAIN_SOLVER val_solver,
87828784
if (val_system == RUNTIME_TRANS_SYS) {
87838785
SetKind_ConvNumScheme(Kind_ConvNumScheme_Turb, Kind_Centered_Turb,
87848786
Kind_Upwind_Turb, Kind_SlopeLimit_Turb,
8785-
MUSCL_Turb, NONE);
8787+
MUSCL_Turb, MUSCL_Kappa_Turb, NONE);
87868788
SetKind_TimeIntScheme(Kind_TimeIntScheme_Turb);
87878789
}
87888790
break;
@@ -8796,7 +8798,7 @@ void CConfig::SetGlobalParam(MAIN_SOLVER val_solver,
87968798
if (val_system == RUNTIME_FLOW_SYS) {
87978799
SetKind_ConvNumScheme(Kind_ConvNumScheme_FEM_Flow, Kind_Centered_Flow,
87988800
Kind_Upwind_Flow, Kind_SlopeLimit_Flow,
8799-
MUSCL_Flow, Kind_FEM_Flow);
8801+
MUSCL_Flow, MUSCL_Kappa_Flow, Kind_FEM_Flow);
88008802
SetKind_TimeIntScheme(Kind_TimeIntScheme_FEM_Flow);
88018803
}
88028804
break;
@@ -8813,22 +8815,22 @@ void CConfig::SetGlobalParam(MAIN_SOLVER val_solver,
88138815
if (val_system == RUNTIME_ADJTURB_SYS) {
88148816
SetKind_ConvNumScheme(Kind_ConvNumScheme_AdjTurb, Kind_Centered_AdjTurb,
88158817
Kind_Upwind_AdjTurb, Kind_SlopeLimit_AdjTurb,
8816-
MUSCL_AdjTurb, NONE);
8818+
MUSCL_AdjTurb, 0.0, NONE);
88178819
SetKind_TimeIntScheme(Kind_TimeIntScheme_AdjTurb);
88188820
}
88198821
break;
88208822
case MAIN_SOLVER::HEAT_EQUATION:
88218823
case MAIN_SOLVER::DISC_ADJ_HEAT:
88228824
if (val_system == RUNTIME_HEAT_SYS) {
8823-
SetKind_ConvNumScheme(NONE, CENTERED::NONE, UPWIND::NONE, LIMITER::NONE, NONE, NONE);
8825+
SetKind_ConvNumScheme(NONE, CENTERED::NONE, UPWIND::NONE, LIMITER::NONE, NONE, 0.0, NONE);
88248826
SetKind_TimeIntScheme(Kind_TimeIntScheme_Heat);
88258827
}
88268828
break;
88278829

88288830
case MAIN_SOLVER::FEM_ELASTICITY:
88298831
case MAIN_SOLVER::DISC_ADJ_FEM:
88308832
if (val_system == RUNTIME_FEA_SYS) {
8831-
SetKind_ConvNumScheme(NONE, CENTERED::NONE, UPWIND::NONE, LIMITER::NONE, NONE, NONE);
8833+
SetKind_ConvNumScheme(NONE, CENTERED::NONE, UPWIND::NONE, LIMITER::NONE, NONE, 0.0, NONE);
88328834
SetKind_TimeIntScheme(NONE);
88338835
}
88348836
break;

SU2_CFD/include/numerics_simd/flow/convection/common.hpp

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,47 @@
3535
/*!
3636
* \brief Unlimited reconstruction.
3737
*/
38-
template<size_t nVarGrad_ = 0, size_t nVar, size_t nDim, class Gradient_t>
38+
// template<size_t nVarGrad_ = 0, size_t nVar, size_t nDim, class Gradient_t>
39+
// FORCEINLINE void musclUnlimited(Int iPoint,
40+
// const VectorDbl<nDim>& vector_ij,
41+
// Double kappa,
42+
// const Gradient_t& gradient,
43+
// VectorDbl<nVar>& vars) {
44+
// constexpr auto nVarGrad = nVarGrad_ > 0 ? nVarGrad_ : nVar;
45+
// auto grad = gatherVariables<nVarGrad,nDim>(iPoint, gradient);
46+
// for (size_t iVar = 0; iVar < nVarGrad; ++iVar) {
47+
// vars(iVar) += scale * dot(grad[iVar], vector_ij);
48+
// }
49+
// }
50+
template<size_t nVarGrad_ = 0, size_t nDim, class VarType, class Gradient_t>
3951
FORCEINLINE void musclUnlimited(Int iPoint,
52+
Int jPoint,
4053
const VectorDbl<nDim>& vector_ij,
41-
Double scale,
4254
const Gradient_t& gradient,
43-
VectorDbl<nVar>& vars) {
44-
constexpr auto nVarGrad = nVarGrad_ > 0 ? nVarGrad_ : nVar;
45-
auto grad = gatherVariables<nVarGrad,nDim>(iPoint, gradient);
55+
CPair<VarType>& V,
56+
Double kappa) {
57+
constexpr auto nVarGrad = nVarGrad_ > 0 ? nVarGrad_ : VarType::nVar;
58+
59+
auto grad_i = gatherVariables<nVarGrad,nDim>(iPoint, gradient);
60+
auto grad_j = gatherVariables<nVarGrad,nDim>(jPoint, gradient);
61+
4662
for (size_t iVar = 0; iVar < nVarGrad; ++iVar) {
47-
vars(iVar) += scale * dot(grad[iVar], vector_ij);
63+
/*--- Centered difference: dV_ij^cent = Vj - Vi ---*/
64+
const Double delta_cent = V.j.all(iVar) - V.i.all(iVar);
65+
66+
/*--- Upwind difference: dV_ij^upw = 2 grad(Vi) dot vector_ij - dV_ij^cent ---*/
67+
const Double grad_proj_i = 2.0 * dot(grad_i[iVar], vector_ij);
68+
const Double grad_proj_j = 2.0 * dot(grad_j[iVar], vector_ij);
69+
const Double delta_upwind_i = grad_proj_i - delta_cent;
70+
const Double delta_upwind_j = grad_proj_j - delta_cent;
71+
72+
/*--- Blended difference: dV_ij^kappa = (1-kappa)ΔV_ij^upw + (1+kappa)ΔV_ij^cent ---*/
73+
const Double delta_kappa_i = (1.0 - kappa) * delta_upwind_i + (1.0 + kappa) * delta_cent;
74+
const Double delta_kappa_j = (1.0 - kappa) * delta_upwind_j + (1.0 + kappa) * delta_cent;
75+
76+
/*--- Apply reconstruction: V_ij = Vi + 0.25 * dV_ij^kappa ---*/
77+
V.i.all(iVar) += 0.25 * delta_kappa_i;
78+
V.j.all(iVar) -= 0.25 * delta_kappa_j;
4879
}
4980
}
5081

@@ -100,6 +131,7 @@ FORCEINLINE void musclEdgeLimited(Int iPoint,
100131
* \param[in] gamma - Heat capacity ratio.
101132
* \param[in] gasConst - Specific gas constant.
102133
* \param[in] muscl - If true, reconstruct, else simply fetch.
134+
* \param[in] musclKappa - Blending coefficient for MUSCL reconstruction.
103135
* \param[in] limiterType - Type of flux limiter.
104136
* \param[in] V1st - Pair of compressible flow primitives for nodes i,j.
105137
* \param[in] vector_ij - Distance vector from i to j.
@@ -110,7 +142,8 @@ template<class ReconVarType, class PrimVarType, size_t nDim, class VariableType>
110142
FORCEINLINE CPair<ReconVarType> reconstructPrimitives(Int iEdge, Int iPoint, Int jPoint,
111143
const su2double& gamma,
112144
const su2double& gasConst,
113-
bool muscl, LIMITER limiterType,
145+
bool muscl, const su2double& musclKappa,
146+
LIMITER limiterType,
114147
const CPair<PrimVarType>& V1st,
115148
const VectorDbl<nDim>& vector_ij,
116149
const VariableType& solution) {
@@ -132,8 +165,9 @@ FORCEINLINE CPair<ReconVarType> reconstructPrimitives(Int iEdge, Int iPoint, Int
132165

133166
switch (limiterType) {
134167
case LIMITER::NONE:
135-
musclUnlimited<nVarGrad>(iPoint, vector_ij, 0.5, gradients, V.i.all);
136-
musclUnlimited<nVarGrad>(jPoint, vector_ij,-0.5, gradients, V.j.all);
168+
// musclUnlimited<nVarGrad>(iPoint, vector_ij, 0.5, gradients, V.i.all);
169+
// musclUnlimited<nVarGrad>(jPoint, vector_ij,-0.5, gradients, V.j.all);
170+
musclUnlimited<nVarGrad>(iPoint, jPoint, vector_ij, gradients, V, musclKappa);
137171
break;
138172
case LIMITER::VAN_ALBADA_EDGE:
139173
musclEdgeLimited<nVarGrad>(iPoint, jPoint, vector_ij, gradients, V);

SU2_CFD/include/numerics_simd/flow/convection/roe.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class CRoeBase : public Base {
5858
const su2double gamma;
5959
const su2double gasConst;
6060
const su2double entropyFix;
61+
const su2double muscl_kappa;
6162
const bool finestGrid;
6263
const bool dynamicGrid;
6364
const bool muscl;
@@ -75,6 +76,7 @@ class CRoeBase : public Base {
7576
finestGrid(iMesh == MESH_0),
7677
dynamicGrid(config.GetDynamic_Grid()),
7778
muscl(finestGrid && config.GetMUSCL_Flow()),
79+
muscl_kappa(config.GetMUSCL_Kappa_Flow()),
7880
typeLimiter(config.GetKind_SlopeLimit_Flow()) {
7981
}
8082

@@ -119,7 +121,7 @@ class CRoeBase : public Base {
119121
V1st.j.all = gatherVariables<nPrimVar>(jPoint, solution.GetPrimitive());
120122

121123
auto V = reconstructPrimitives<CCompressiblePrimitives<nDim,nPrimVarGrad> >(
122-
iEdge, iPoint, jPoint, gamma, gasConst, muscl, typeLimiter, V1st, vector_ij, solution);
124+
iEdge, iPoint, jPoint, gamma, gasConst, muscl, muscl_kappa, typeLimiter, V1st, vector_ij, solution);
123125

124126
/*--- Compute conservative variables. ---*/
125127

0 commit comments

Comments
 (0)