Skip to content

Commit 6ca4116

Browse files
authored
Merge pull request #2356 from su2code/load_less_stuff
Recompute density and enthalpy instead of reconstructing
2 parents a991912 + e05c2cf commit 6ca4116

File tree

27 files changed

+455
-462
lines changed

27 files changed

+455
-462
lines changed

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

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,50 +35,52 @@
3535
/*!
3636
* \brief Unlimited reconstruction.
3737
*/
38-
template<size_t nVar, size_t nDim, class Gradient_t>
38+
template<size_t nVarGrad_ = 0, size_t nVar, size_t nDim, class Gradient_t>
3939
FORCEINLINE void musclUnlimited(Int iPoint,
4040
const VectorDbl<nDim>& vector_ij,
4141
Double scale,
4242
const Gradient_t& gradient,
4343
VectorDbl<nVar>& vars) {
44-
auto grad = gatherVariables<nVar,nDim>(iPoint, gradient);
45-
for (size_t iVar = 0; iVar < nVar; ++iVar) {
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) {
4647
vars(iVar) += scale * dot(grad[iVar], vector_ij);
4748
}
4849
}
4950

5051
/*!
5152
* \brief Limited reconstruction with point-based limiter.
5253
*/
53-
template<size_t nVar, size_t nDim, class Limiter_t, class Gradient_t>
54+
template<size_t nVarGrad_ = 0, size_t nVar, size_t nDim, class Limiter_t, class Gradient_t>
5455
FORCEINLINE void musclPointLimited(Int iPoint,
5556
const VectorDbl<nDim>& vector_ij,
5657
Double scale,
5758
const Limiter_t& limiter,
5859
const Gradient_t& gradient,
5960
VectorDbl<nVar>& vars) {
60-
auto lim = gatherVariables<nVar>(iPoint, limiter);
61-
auto grad = gatherVariables<nVar,nDim>(iPoint, gradient);
62-
for (size_t iVar = 0; iVar < nVar; ++iVar) {
61+
constexpr auto nVarGrad = nVarGrad_ > 0 ? nVarGrad_ : nVar;
62+
auto lim = gatherVariables<nVarGrad>(iPoint, limiter);
63+
auto grad = gatherVariables<nVarGrad,nDim>(iPoint, gradient);
64+
for (size_t iVar = 0; iVar < nVarGrad; ++iVar) {
6365
vars(iVar) += lim(iVar) * scale * dot(grad[iVar], vector_ij);
6466
}
6567
}
6668

6769
/*!
6870
* \brief Limited reconstruction with edge-based limiter.
6971
*/
70-
template<size_t nDim, class VarType, class Gradient_t>
72+
template<size_t nVarGrad_ = 0, size_t nDim, class VarType, class Gradient_t>
7173
FORCEINLINE void musclEdgeLimited(Int iPoint,
7274
Int jPoint,
7375
const VectorDbl<nDim>& vector_ij,
7476
const Gradient_t& gradient,
7577
CPair<VarType>& V) {
76-
constexpr size_t nVar = VarType::nVar;
78+
constexpr auto nVarGrad = nVarGrad_ > 0 ? nVarGrad_ : VarType::nVar;
7779

78-
auto grad_i = gatherVariables<nVar,nDim>(iPoint, gradient);
79-
auto grad_j = gatherVariables<nVar,nDim>(jPoint, gradient);
80+
auto grad_i = gatherVariables<nVarGrad,nDim>(iPoint, gradient);
81+
auto grad_j = gatherVariables<nVarGrad,nDim>(jPoint, gradient);
8082

81-
for (size_t iVar = 0; iVar < nVar; ++iVar) {
83+
for (size_t iVar = 0; iVar < nVarGrad; ++iVar) {
8284
const Double proj_i = dot(grad_i[iVar], vector_ij);
8385
const Double proj_j = dot(grad_j[iVar], vector_ij);
8486
const Double delta_ij = V.j.all(iVar) - V.i.all(iVar);
@@ -93,15 +95,21 @@ FORCEINLINE void musclEdgeLimited(Int iPoint,
9395

9496
/*!
9597
* \brief Retrieve primitive variables for points i/j, reconstructing them if needed.
98+
* \note Density and enthalpy are recomputed from ideal gas EOS.
9699
* \param[in] iEdge, iPoint, jPoint - Edge and its nodes.
100+
* \param[in] gamma - Heat capacity ratio.
101+
* \param[in] gasConst - Specific gas constant.
97102
* \param[in] muscl - If true, reconstruct, else simply fetch.
103+
* \param[in] limiterType - Type of flux limiter.
98104
* \param[in] V1st - Pair of compressible flow primitives for nodes i,j.
99105
* \param[in] vector_ij - Distance vector from i to j.
100106
* \param[in] solution - Entire solution container (a derived CVariable).
101107
* \return Pair of primitive variables.
102108
*/
103109
template<class ReconVarType, class PrimVarType, size_t nDim, class VariableType>
104110
FORCEINLINE CPair<ReconVarType> reconstructPrimitives(Int iEdge, Int iPoint, Int jPoint,
111+
const su2double& gamma,
112+
const su2double& gasConst,
105113
bool muscl, LIMITER limiterType,
106114
const CPair<PrimVarType>& V1st,
107115
const VectorDbl<nDim>& vector_ij,
@@ -119,19 +127,29 @@ FORCEINLINE CPair<ReconVarType> reconstructPrimitives(Int iEdge, Int iPoint, Int
119127
}
120128

121129
if (muscl) {
130+
/*--- Recompute density and enthalpy instead of reconstructing. ---*/
131+
constexpr auto nVarGrad = ReconVarType::nVar - 2;
132+
122133
switch (limiterType) {
123134
case LIMITER::NONE:
124-
musclUnlimited(iPoint, vector_ij, 0.5, gradients, V.i.all);
125-
musclUnlimited(jPoint, vector_ij,-0.5, gradients, V.j.all);
135+
musclUnlimited<nVarGrad>(iPoint, vector_ij, 0.5, gradients, V.i.all);
136+
musclUnlimited<nVarGrad>(jPoint, vector_ij,-0.5, gradients, V.j.all);
126137
break;
127138
case LIMITER::VAN_ALBADA_EDGE:
128-
musclEdgeLimited(iPoint, jPoint, vector_ij, gradients, V);
139+
musclEdgeLimited<nVarGrad>(iPoint, jPoint, vector_ij, gradients, V);
129140
break;
130141
default:
131-
musclPointLimited(iPoint, vector_ij, 0.5, limiters, gradients, V.i.all);
132-
musclPointLimited(jPoint, vector_ij,-0.5, limiters, gradients, V.j.all);
142+
musclPointLimited<nVarGrad>(iPoint, vector_ij, 0.5, limiters, gradients, V.i.all);
143+
musclPointLimited<nVarGrad>(jPoint, vector_ij,-0.5, limiters, gradients, V.j.all);
133144
break;
134145
}
146+
V.i.density() = V.i.pressure() / (gasConst * V.i.temperature());
147+
V.j.density() = V.j.pressure() / (gasConst * V.j.temperature());
148+
149+
const su2double cp = gasConst * gamma / (gamma - 1);
150+
V.i.enthalpy() = cp * V.i.temperature() + 0.5 * squaredNorm<nDim>(V.i.velocity());
151+
V.j.enthalpy() = cp * V.j.temperature() + 0.5 * squaredNorm<nDim>(V.j.velocity());
152+
135153
/*--- Detect a non-physical reconstruction based on negative pressure or density. ---*/
136154
const Double neg_p_or_rho = fmax(fmin(V.i.pressure(), V.j.pressure()) < 0.0,
137155
fmin(V.i.density(), V.j.density()) < 0.0);

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class CRoeBase : public Base {
5656

5757
const su2double kappa;
5858
const su2double gamma;
59+
const su2double gasConst;
5960
const su2double entropyFix;
6061
const bool finestGrid;
6162
const bool dynamicGrid;
@@ -69,6 +70,7 @@ class CRoeBase : public Base {
6970
CRoeBase(const CConfig& config, unsigned iMesh, Ts&... args) : Base(config, iMesh, args...),
7071
kappa(config.GetRoe_Kappa()),
7172
gamma(config.GetGamma()),
73+
gasConst(config.GetGas_ConstantND()),
7274
entropyFix(config.GetEntropyFix_Coeff()),
7375
finestGrid(iMesh == MESH_0),
7476
dynamicGrid(config.GetDynamic_Grid()),
@@ -117,7 +119,7 @@ class CRoeBase : public Base {
117119
V1st.j.all = gatherVariables<nPrimVar>(jPoint, solution.GetPrimitive());
118120

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

122124
/*--- Compute conservative variables. ---*/
123125

SU2_CFD/include/solvers/CFVMFlowSolverBase.inl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1485,6 +1485,11 @@ void CFVMFlowSolverBase<V, R>::EdgeFluxResidual(const CGeometry *geometry,
14851485
"by the SIMD length (2, 4, or 8).", CURRENT_FUNCTION);
14861486
}
14871487
InstantiateEdgeNumerics(solvers, config);
1488+
1489+
/*--- The SIMD numerics do not use gradients of density and enthalpy. ---*/
1490+
if (!config->GetContinuous_Adjoint()) {
1491+
SU2_OMP_SAFE_GLOBAL_ACCESS(nPrimVarGrad = std::min<unsigned short>(nDim + 2, nPrimVarGrad);)
1492+
}
14881493
}
14891494

14901495
/*--- Non-physical counter. ---*/

SU2_CFD/include/variables/CEulerVariable.hpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,8 @@ class CEulerVariable : public CFlowVariable {
116116
*/
117117
bool SetSoundSpeed(unsigned long iPoint, su2double soundspeed2) final {
118118
if (soundspeed2 < 0.0) return true;
119-
else {
120-
Primitive(iPoint,nDim+4) = sqrt(soundspeed2);
121-
return false;
122-
}
119+
Primitive(iPoint,nDim+4) = sqrt(soundspeed2);
120+
return false;
123121
}
124122

125123
/*!

SU2_CFD/src/output/CElasticityOutput.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,6 @@ void CElasticityOutput::LoadHistoryData(CConfig *config, CGeometry *geometry, CS
111111
/*--- Linear analysis: RMS of the displacements in the nDim coordinates ---*/
112112
/*--- Nonlinear analysis: UTOL, RTOL and DTOL (defined in the Postprocessing function) ---*/
113113

114-
115114
if (linear_analysis){
116115
SetHistoryOutputValue("RMS_DISP_X", log10(fea_solver->GetRes_RMS(0)));
117116
SetHistoryOutputValue("RMS_DISP_Y", log10(fea_solver->GetRes_RMS(1)));

SU2_CFD/src/solvers/CEulerSolver.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ CEulerSolver::CEulerSolver(CGeometry *geometry, CConfig *config,
6464
(config->GetTime_Marching() == TIME_MARCHING::DT_STEPPING_2ND);
6565
const bool time_stepping = (config->GetTime_Marching() == TIME_MARCHING::TIME_STEPPING);
6666
const bool adjoint = config->GetContinuous_Adjoint() || config->GetDiscrete_Adjoint();
67+
const bool centered = config->GetKind_ConvNumScheme_Flow() == SPACE_CENTERED;
6768

6869
int Unst_RestartIter = 0;
6970
unsigned long iPoint, iMarker, counter_local = 0, counter_global = 0;
@@ -116,9 +117,12 @@ CEulerSolver::CEulerSolver(CGeometry *geometry, CConfig *config,
116117

117118
nDim = geometry->GetnDim();
118119

119-
nVar = nDim+2;
120-
nPrimVar = nDim+9; nPrimVarGrad = nDim+4;
121-
nSecondaryVar = nSecVar; nSecondaryVarGrad = 2;
120+
nVar = nDim + 2;
121+
nPrimVar = nDim + 9;
122+
/*--- Centered schemes only need gradients for viscous fluxes (T and v). ---*/
123+
nPrimVarGrad = nDim + (centered && !config->GetContinuous_Adjoint() ? 1 : 4);
124+
nSecondaryVar = nSecVar;
125+
nSecondaryVarGrad = 2;
122126

123127
/*--- Initialize nVarGrad for deallocation ---*/
124128

SU2_CFD/src/solvers/CIncEulerSolver.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ CIncEulerSolver::CIncEulerSolver(CGeometry *geometry, CConfig *config, unsigned
5656
(config->GetTime_Marching() == TIME_MARCHING::DT_STEPPING_2ND));
5757
bool time_stepping = config->GetTime_Marching() == TIME_MARCHING::TIME_STEPPING;
5858
bool adjoint = (config->GetContinuous_Adjoint()) || (config->GetDiscrete_Adjoint());
59+
const bool centered = config->GetKind_ConvNumScheme_Flow() == SPACE_CENTERED;
5960

6061
/* A grid is defined as dynamic if there's rigid grid movement or grid deformation AND the problem is time domain */
6162
dynamic_grid = config->GetDynamic_Grid();
@@ -117,7 +118,10 @@ CIncEulerSolver::CIncEulerSolver(CGeometry *geometry, CConfig *config, unsigned
117118
nDim = geometry->GetnDim();
118119

119120
/*--- Make sure to align the sizes with the constructor of CIncEulerVariable. ---*/
120-
nVar = nDim+2; nPrimVar = nDim+9; nPrimVarGrad = nDim+4;
121+
nVar = nDim + 2;
122+
nPrimVar = nDim + 9;
123+
/*--- Centered schemes only need gradients for viscous fluxes (T and v, but we need also to include P). ---*/
124+
nPrimVarGrad = nDim + (centered ? 2 : 4);
121125

122126
/*--- Initialize nVarGrad for deallocation ---*/
123127

SU2_CFD/src/variables/CEulerVariable.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030

3131
CEulerVariable::CEulerVariable(su2double density, const su2double *velocity, su2double energy, unsigned long npoint,
3232
unsigned long ndim, unsigned long nvar, const CConfig *config)
33-
: CFlowVariable(npoint, ndim, nvar, ndim + 9, ndim + 4, config),
33+
: CFlowVariable(npoint, ndim, nvar, ndim + 9,
34+
ndim + (config->GetKind_ConvNumScheme_Flow() == SPACE_CENTERED && !config->GetContinuous_Adjoint() ? 1 : 4), config),
3435
indices(ndim, 0) {
3536

3637
const bool dual_time = (config->GetTime_Marching() == TIME_MARCHING::DT_STEPPING_1ST) ||
@@ -77,7 +78,7 @@ CEulerVariable::CEulerVariable(su2double density, const su2double *velocity, su2
7778
Grad_AuxVar.resize(nPoint, nAuxVar, nDim, 0.0);
7879
AuxVar.resize(nPoint, nAuxVar) = su2double(0.0);
7980
}
80-
81+
8182
if (config->GetKind_FluidModel() == ENUM_FLUIDMODEL::DATADRIVEN_FLUID){
8283
DataDrivenFluid = true;
8384
DatasetExtrapolation.resize(nPoint) = 0;

SU2_CFD/src/variables/CIncEulerVariable.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030

3131
CIncEulerVariable::CIncEulerVariable(su2double pressure, const su2double *velocity, su2double temperature,
3232
unsigned long npoint, unsigned long ndim, unsigned long nvar, const CConfig *config)
33-
: CFlowVariable(npoint, ndim, nvar, ndim + 9, ndim + 4, config),
33+
: CFlowVariable(npoint, ndim, nvar, ndim + 9,
34+
ndim + (config->GetKind_ConvNumScheme_Flow() == SPACE_CENTERED ? 2 : 4), config),
3435
indices(ndim, 0) {
3536

3637
const bool dual_time = (config->GetTime_Marching() == TIME_MARCHING::DT_STEPPING_1ST) ||

TestCases/TestCase.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,9 @@ def run_filediff(self, with_tsan=False, with_asan=False):
464464
print('Ignored entries: ' + str(ignore_counter))
465465
print('Maximum difference: ' + str(max_delta) + '%')
466466

467+
if not passed:
468+
print(open(self.test_file).readlines())
469+
467470
print('==================== End Test: %s ====================\n'%self.tag)
468471

469472
sys.stdout.flush()

0 commit comments

Comments
 (0)