From ee68c2eac6fd155268199153f87c03c14c67e609 Mon Sep 17 00:00:00 2001 From: ManasBagul23 Date: Thu, 17 Sep 2026 01:09:55 +0530 Subject: [PATCH] Support VAN_ALBADA_EDGE limiter for turbulence and species Setting SLOPE_LIMITER_TURB or SLOPE_LIMITER_SPECIES to VAN_ALBADA_EDGE aborted with "Unknown limiter type", because CScalarSolver always computed point-based limiters. Apply the edge limiter during the MUSCL reconstruction in Upwind_Residual, the same way the flow solvers do, and skip the point limiter computation for it. The LIMITER volume outputs of the scalar solvers are not registered for VAN_ALBADA_EDGE, as for the flow solver, since there are no point limiter values to write. --- SU2_CFD/include/solvers/CScalarSolver.inl | 11 ++++++++--- SU2_CFD/src/output/CFlowOutput.cpp | 14 +++++++++----- config_template.cfg | 2 +- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/SU2_CFD/include/solvers/CScalarSolver.inl b/SU2_CFD/include/solvers/CScalarSolver.inl index 761140905e6c..567b3b0d4afd 100644 --- a/SU2_CFD/include/solvers/CScalarSolver.inl +++ b/SU2_CFD/include/solvers/CScalarSolver.inl @@ -99,6 +99,7 @@ void CScalarSolver::CommonPreprocessing(CGeometry *geometry, const const bool muscl = config->GetMUSCL(); const bool limiter = (config->GetKind_SlopeLimit() != LIMITER::NONE) && (config->GetInnerIter() <= config->GetLimiterIter()); + const bool van_albada = (config->GetKind_SlopeLimit() == LIMITER::VAN_ALBADA_EDGE); /*--- Clear residual and system matrix, not needed for * reducer strategy as we write over the entire matrix. ---*/ @@ -126,7 +127,7 @@ void CScalarSolver::CommonPreprocessing(CGeometry *geometry, const case WEIGHTED_LEAST_SQUARES: SetSolution_Gradient_LS(geometry, config, -1); break; } - if (limiter && muscl) SetSolution_Limiter(geometry, config); + if (limiter && !van_albada && muscl) SetSolution_Limiter(geometry, config); } template @@ -141,6 +142,7 @@ void CScalarSolver::Upwind_Residual(CGeometry* geometry, CSolver** const bool muscl = config->GetMUSCL(); const bool limiter = (config->GetKind_SlopeLimit() != LIMITER::NONE) && (config->GetInnerIter() <= config->GetLimiterIter()); + const bool van_albada = (config->GetKind_SlopeLimit() == LIMITER::VAN_ALBADA_EDGE); /*--- Only reconstruct flow variables if MUSCL is on for flow (requires upwind) and turbulence. ---*/ const bool musclFlow = config->GetMUSCL_Flow() && muscl && (config->GetKind_ConvNumScheme_Flow() == SPACE_UPWIND); @@ -258,7 +260,7 @@ void CScalarSolver::Upwind_Residual(CGeometry* geometry, CSolver** auto Gradient_i = nodes->GetGradient_Reconstruction(iPoint); auto Gradient_j = nodes->GetGradient_Reconstruction(jPoint); - if (limiter) { + if (limiter && !van_albada) { Limiter_i = nodes->GetLimiter(iPoint); Limiter_j = nodes->GetLimiter(jPoint); } @@ -269,7 +271,10 @@ void CScalarSolver::Upwind_Residual(CGeometry* geometry, CSolver** su2double Project_Grad_i = MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, U_ij, kappa, musclRamp); su2double Project_Grad_j = MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, U_ij, kappa, musclRamp); - if (limiter) { + if (van_albada) { + Project_Grad_i *= LimiterHelpers<>::vanAlbadaFunction(Project_Grad_i, U_ij, EPS); + Project_Grad_j *= LimiterHelpers<>::vanAlbadaFunction(Project_Grad_j, U_ij, EPS); + } else if (limiter) { Project_Grad_i *= Limiter_i[iVar]; Project_Grad_j *= Limiter_j[iVar]; } diff --git a/SU2_CFD/src/output/CFlowOutput.cpp b/SU2_CFD/src/output/CFlowOutput.cpp index 2ac2693b9952..438325e2f542 100644 --- a/SU2_CFD/src/output/CFlowOutput.cpp +++ b/SU2_CFD/src/output/CFlowOutput.cpp @@ -1476,7 +1476,7 @@ void CFlowOutput::SetVolumeOutputFieldsScalarLimiter(const CConfig* config) { /*--- Only place outputs of the "SOLUTION" group for species transport here. ---*/ - if (config->GetKind_SlopeLimit_Turb() != LIMITER::NONE) { + if (config->GetKind_SlopeLimit_Turb() != LIMITER::NONE && config->GetKind_SlopeLimit_Turb() != LIMITER::VAN_ALBADA_EDGE) { switch (TurbModelFamily(config->GetKind_Turb_Model())) { case TURB_FAMILY::SA: AddVolumeOutput("LIMITER_NU_TILDE", "Limiter_Nu_Tilde", "LIMITER", "Limiter value of the Spalart-Allmaras variable"); @@ -1492,7 +1492,7 @@ void CFlowOutput::SetVolumeOutputFieldsScalarLimiter(const CConfig* config) { } } - if (config->GetKind_SlopeLimit_Species() != LIMITER::NONE) { + if (config->GetKind_SlopeLimit_Species() != LIMITER::NONE && config->GetKind_SlopeLimit_Species() != LIMITER::VAN_ALBADA_EDGE) { switch (config->GetKind_Species_Model()) { case SPECIES_MODEL::SPECIES_TRANSPORT: for (unsigned short iVar = 0; iVar < config->GetnSpecies(); iVar++) @@ -1658,7 +1658,8 @@ void CFlowOutput::LoadVolumeDataScalar(const CConfig* config, const CSolver* con SetVolumeOutputValue("Q_CRITERION", iPoint, GetQCriterion(Node_Flow->GetVelocityGradient(iPoint))); } - const bool limiter = (config->GetKind_SlopeLimit_Turb() != LIMITER::NONE); + const bool limiter = (config->GetKind_SlopeLimit_Turb() != LIMITER::NONE) && + (config->GetKind_SlopeLimit_Turb() != LIMITER::VAN_ALBADA_EDGE); switch (TurbModelFamily(config->GetKind_Turb_Model())) { case TURB_FAMILY::SA: @@ -1728,6 +1729,9 @@ void CFlowOutput::LoadVolumeDataScalar(const CConfig* config, const CSolver* con } } + const bool limiter_species = (config->GetKind_SlopeLimit_Species() != LIMITER::NONE) && + (config->GetKind_SlopeLimit_Species() != LIMITER::VAN_ALBADA_EDGE); + switch (config->GetKind_Species_Model()) { case SPECIES_MODEL::SPECIES_TRANSPORT: { @@ -1736,7 +1740,7 @@ void CFlowOutput::LoadVolumeDataScalar(const CConfig* config, const CSolver* con SetVolumeOutputValue("SPECIES_" + std::to_string(iVar), iPoint, Node_Species->GetSolution(iPoint, iVar)); SetVolumeOutputValue("RES_SPECIES_" + std::to_string(iVar), iPoint, solver[SPECIES_SOL]->LinSysRes(iPoint, iVar)); SetVolumeOutputValue("DIFFUSIVITY_"+ std::to_string(iVar), iPoint, Node_Species->GetDiffusivity(iPoint,iVar)); - if (config->GetKind_SlopeLimit_Species() != LIMITER::NONE) + if (limiter_species) SetVolumeOutputValue("LIMITER_SPECIES_" + std::to_string(iVar), iPoint, Node_Species->GetLimiter(iPoint, iVar)); if (config->GetPyCustomSource()){ SetVolumeOutputValue("SPECIES_UDS_" + std::to_string(iVar), iPoint, Node_Species->GetUserDefinedSource()(iPoint, iVar)); @@ -1765,7 +1769,7 @@ void CFlowOutput::LoadVolumeDataScalar(const CConfig* config, const CSolver* con SetVolumeOutputValue("RES_" + scalar_name, iPoint, solver[SPECIES_SOL]->LinSysRes(iPoint, flamelet_config_options.n_control_vars + i_scalar)); } - if (config->GetKind_SlopeLimit_Species() != LIMITER::NONE) { + if (limiter_species) { /*--- Limiter for controlling variable transport equations. ---*/ for (auto iCV=0u; iCV