From cdc2392e1d9640faf17947296d662a8b0311bd09 Mon Sep 17 00:00:00 2001 From: Josh Kelly Date: Sun, 7 Dec 2025 11:34:37 +0000 Subject: [PATCH 01/13] Added MUSCL Ramps options --- Common/include/CConfig.hpp | 43 +++++++++++++++++++++++ Common/include/option_structure.hpp | 13 ++++++- Common/src/CConfig.cpp | 18 ++++++++++ SU2_CFD/include/solvers/CScalarSolver.inl | 8 ++--- SU2_CFD/include/solvers/CSolver.hpp | 1 + SU2_CFD/src/iteration/CFluidIteration.cpp | 26 ++++++++++++++ SU2_CFD/src/solvers/CEulerSolver.cpp | 4 +-- SU2_CFD/src/solvers/CIncEulerSolver.cpp | 4 +-- SU2_CFD/src/solvers/CNEMOEulerSolver.cpp | 4 +-- 9 files changed, 110 insertions(+), 11 deletions(-) diff --git a/Common/include/CConfig.hpp b/Common/include/CConfig.hpp index 794622bb1a1e..9e38bfc23865 100644 --- a/Common/include/CConfig.hpp +++ b/Common/include/CConfig.hpp @@ -1097,6 +1097,7 @@ class CConfig { bool SpatialFourier; /*!< \brief option for computing the fourier transforms for subsonic non-reflecting BC. */ bool RampMotionFrame; /*!< \brief option for ramping up or down the motion Frame values */ bool RampOutlet; /*!< \brief option for ramping up or down the outlet values */ + bool RampMUSCL; bool RampRotatingFrame; /*!< \brief option for ramping up or down the motion Frame values */ bool RampTranslationFrame; /*!< \brief option for ramping up or down the outlet values */ bool RampOutletMassFlow; /*!< \brief option for ramping up or down the motion Frame values */ @@ -1113,6 +1114,11 @@ class CConfig { array kt_polycoeffs{{0.0}}; /*!< \brief Array for thermal conductivity polynomial coefficients. */ bool Body_Force; /*!< \brief Flag to know if a body force is included in the formulation. */ + su2double rampMUSCLValue; /*!< \brief Current value of the MUSCL ramp */ + su2double RampMUSCLPower; /*!< \brief Exponent by which to raise the MUSCL ramp to the power of */ + MUSCL_RAMP_TYPE Kind_MUSCLRamp; + unsigned long *rampMUSCLCoeff; /*!< \brief ramp MUSCL value coefficients for the COption class. */ + ENUM_STREAMWISE_PERIODIC Kind_Streamwise_Periodic; /*!< \brief Kind of Streamwise periodic flow (pressure drop or massflow) */ bool Streamwise_Periodic_Temperature; /*!< \brief Use real periodicity for Energy equation or otherwise outlet source term. */ su2double Streamwise_Periodic_PressureDrop; /*!< \brief Value of prescribed pressure drop [Pa] which results in an artificial body force vector. */ @@ -5179,6 +5185,12 @@ class CConfig { */ bool GetRampOutflow(void) const { return RampOutlet; } + /*! + * \brief Get MUSCL ramp option. + * \return Ramp MUSCL option + */ + bool GetMUSCLRamp(void) const { return RampMUSCL; } + /*! * \brief General interface for accessing ramp coefficient information * \return coeff for ramps @@ -5189,6 +5201,37 @@ class CConfig { else return 0; }; + /*! + * \brief Interface for accessing MUSCL ramp coefficient information + * \return coeff for ramps + */ + unsigned long GetMUSCLRampCoeff(RAMP_COEFF val_coeff) const { + return rampMUSCLCoeff[val_coeff]; + } + + /*! + * \brief Set MUSCL ramp value. + */ + void SetMUSCLRampValue(su2double ramp_value) { rampMUSCLValue = ramp_value; } + + /*! + * \brief Get MUSCL ramp value. + * \return Ramp MUSCL value + */ + su2double GetMUSCLRampValue(void) const { return rampMUSCLValue; } + + /*! + * \brief Get MUSCL ramp power. + * \return Ramp MUSCL power + */ + su2double GetMUSCLRampPower(void) const { return RampMUSCLPower; } + + /*! + * \brief Get MUSCL ramp kind. + * \return Ramp MUSCL kind + */ + MUSCL_RAMP_TYPE GetKind_MUSCLRamp(void) const { return Kind_MUSCLRamp; } + /*! * \brief Generic interface for setting monitor outlet values for the ramp. */ diff --git a/Common/include/option_structure.hpp b/Common/include/option_structure.hpp index bf99257b1387..4a8fe76aa9c1 100644 --- a/Common/include/option_structure.hpp +++ b/Common/include/option_structure.hpp @@ -1931,7 +1931,18 @@ enum TURBO_MARKER_TYPE{ enum class RAMP_TYPE{ GRID, /*!< \brief flag for rotational/translational ramps */ - BOUNDARY /*!< \brief flag for pressure/mass flow ramps*/ + BOUNDARY, /*!< \brief flag for pressure/mass flow ramps*/ + MUSCL /*!< \brief flag for MUSCL ramps */ +}; + +enum class MUSCL_RAMP_TYPE{ + ITERATION, /*!< \brief flag for linear iteration-based ramp */ + SMOOTH_FUNCTION /*!< \brief flag for smooth cosine ramp */ +}; + +static const MapType MUSCLRamp_Map = { + MakePair("ITERATION", MUSCL_RAMP_TYPE::ITERATION) + MakePair("SMOOTH_FUNCTION", MUSCL_RAMP_TYPE::SMOOTH_FUNCTION) }; /*! diff --git a/Common/src/CConfig.cpp b/Common/src/CConfig.cpp index 0a9cca0f63f7..a71f64259f63 100644 --- a/Common/src/CConfig.cpp +++ b/Common/src/CConfig.cpp @@ -1986,6 +1986,18 @@ void CConfig::SetConfig_Options() { addBoolOption("MUSCL_FLOW", MUSCL_Flow, true); /*!\brief MUSCL_KAPPA_FLOW \n DESCRIPTION: Blending coefficient for the U-MUSCL scheme \ingroup Config*/ addDoubleOption("MUSCL_KAPPA_FLOW", MUSCL_Kappa_Flow, 0.0); + /*!\brief RAMP_MUSCL \n DESCRIPTION: Enable ramping of the MUSCL scheme from 1st to 2nd order using specified method*/ + addBoolOption("RAMP_MUSCL", RampMUSCL, false); + /*! brief RAMP_OUTLET_COEFF \n DESCRIPTION: the 1st coeff is the ramp start iteration, + * the 2nd coeff is the iteration update frequenct, 3rd coeff is the total number of iterations */ + unsigned short nMUSCLCoeffs = 3; + rampMUSCLCoeff = new unsigned long [nMUSCLCoeffs]; + rampMUSCLCoeff[0] = 0.0; rampMUSCLCoeff[1] = 1.0; rampMUSCLCoeff[2] = 500.0; + addULongListOption("RAMP_MUSCL_COEFF", nMUSCLCoeffs, rampMUSCLCoeff); + /*!\brief RAMP_MUSCL_POWER \n DESRCIPTION: Exponent of the MUSCL ramp formulation */ + addDoubleOption("RAMP_MUSCL_POWER", RampMUSCLPower, 1.0); + /*!\brief KIND_MUSCL_RAMP \n DESCRIPTION: The kind of MUSCL Ramp to be applied */ + addEnumOption("KIND_MUSCL_RAMP", Kind_MUSCLRamp, MUSCLRamp_Map, MUSCL_RAMP_TYPE::ITERATION); /*!\brief SLOPE_LIMITER_FLOW * DESCRIPTION: Slope limiter for the direct solution. \n OPTIONS: See \link Limiter_Map \endlink \n DEFAULT VENKATAKRISHNAN \ingroup Config*/ addEnumOption("SLOPE_LIMITER_FLOW", Kind_SlopeLimit_Flow, Limiter_Map, LIMITER::VENKATAKRISHNAN); @@ -4479,6 +4491,12 @@ void CConfig::SetPostprocessing(SU2_COMPONENT val_software, unsigned short val_i } } + if(RampMUSCL && !DiscreteAdjoint){ + rampMUSCLValue = 0.0; + } else { + rampMUSCLValue = 1.0; + } + /*--- Check on extra Relaxation factor for Giles---*/ if(extrarelfac[1] > 0.5){ extrarelfac[1] = 0.5; diff --git a/SU2_CFD/include/solvers/CScalarSolver.inl b/SU2_CFD/include/solvers/CScalarSolver.inl index bcf9fae33602..5c6f088ec441 100644 --- a/SU2_CFD/include/solvers/CScalarSolver.inl +++ b/SU2_CFD/include/solvers/CScalarSolver.inl @@ -222,8 +222,8 @@ void CScalarSolver::Upwind_Residual(CGeometry* geometry, CSolver** for (auto iVar = 0u; iVar < solver_container[FLOW_SOL]->GetnPrimVarGrad(); iVar++) { const su2double V_ij = V_j[iVar] - V_i[iVar]; - su2double Project_Grad_i = MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappaFlow); - su2double Project_Grad_j = MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappaFlow); + su2double Project_Grad_i = config->GetMUSCLRampValue() * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappaFlow); + su2double Project_Grad_j = config->GetMUSCLRampValue() * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappaFlow); if (limiterFlow) { Project_Grad_i *= Limiter_i[iVar]; @@ -251,8 +251,8 @@ void CScalarSolver::Upwind_Residual(CGeometry* geometry, CSolver** for (auto iVar = 0u; iVar < nVar; iVar++) { const su2double U_ij = Scalar_j[iVar] - Scalar_i[iVar]; - su2double Project_Grad_i = MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, U_ij, kappa); - su2double Project_Grad_j = MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, U_ij, kappa); + su2double Project_Grad_i = config->GetMUSCLRampValue() * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, U_ij, kappa); + su2double Project_Grad_j = config->GetMUSCLRampValue() * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, U_ij, kappa); if (limiter) { Project_Grad_i *= Limiter_i[iVar]; diff --git a/SU2_CFD/include/solvers/CSolver.hpp b/SU2_CFD/include/solvers/CSolver.hpp index f0b3a4c493d1..a6f5b5089549 100644 --- a/SU2_CFD/include/solvers/CSolver.hpp +++ b/SU2_CFD/include/solvers/CSolver.hpp @@ -587,6 +587,7 @@ class CSolver { * \param[in] vector_ij - Distance vector. * \param[in] delta_ij - Centered difference. * \param[in] kappa - Blending coefficient for U-MUSCL reconstruction. + * \param[in] ramp_val - Value of the ramp * \return - Projected variable. */ inline su2double MUSCL_Reconstruction(const su2double* grad, const su2double* vector_ij, su2double delta_ij, su2double kappa) { diff --git a/SU2_CFD/src/iteration/CFluidIteration.cpp b/SU2_CFD/src/iteration/CFluidIteration.cpp index 529b3e12453c..493fdad1b7f1 100644 --- a/SU2_CFD/src/iteration/CFluidIteration.cpp +++ b/SU2_CFD/src/iteration/CFluidIteration.cpp @@ -241,6 +241,9 @@ bool CFluidIteration::Monitor(COutput* output, CIntegration**** integration, CGe if (config[val_iZone]->GetRampOutflow()) UpdateRamp(geometry, config, config[val_iZone]->GetInnerIter(), val_iZone, RAMP_TYPE::BOUNDARY); + if (config[val_iZone]->GetMUSCLRamp()) + UpdateRamp(geometry, config, config[val_iZone]->GetInnerIter(), val_iZone, RAMP_TYPE::MUSCL); + output->SetHistoryOutput(geometry[val_iZone][val_iInst][MESH_0], solver[val_iZone][val_iInst][MESH_0], config[val_iZone], config[val_iZone]->GetTimeIter(), config[val_iZone]->GetOuterIter(), config[val_iZone]->GetInnerIter()); @@ -330,6 +333,29 @@ void CFluidIteration::UpdateRamp(CGeometry**** geometry_container, CConfig** con } } } + + if (ramp_flag == RAMP_TYPE::MUSCL) { + const long unsigned startIter = config->GetMUSCLRampCoeff(RAMP_COEFF::INITIAL_VALUE); + const long unsigned updateFreq = config->GetMUSCLRampCoeff(RAMP_COEFF::UPDATE_FREQ); + const long unsigned finalIter = config->GetMUSCLRampCoeff(RAMP_COEFF::FINAL_ITER); + const auto power = config->GetMUSCLRampPower(); + auto iterFrac = (static_cast(iter - startIter)/static_cast(finalIter - startIter)); + if (iter < startIter) return; + if ((iter == startIter) && (rank == MASTER_NODE)) cout << "Beginning to ramp MUSCL scheme..." << endl; + if ((iter % updateFreq == 0 && iter < finalIter) || (iter == finalIter)) { + switch (config->GetKind_MUSCLRamp()) { + case MUSCL_RAMP_TYPE::ITERATION: + config->SetMUSCLRampValue(std::pow(std::min(1.0, iterFrac), power)); + break; + case MUSCL_RAMP_TYPE::SMOOTH_FUNCTION: + config->SetMUSCLRampValue(std::pow((0.5 * (1 - cos(M_PI * std::min(1.0, iterFrac)))), power)); + break; + default: + break; + } + if (rank == MASTER_NODE) cout << "MUSCL Ramp value updated. New Value: " << config->GetMUSCLRampValue() << endl; + } + } } void CFluidIteration::ComputeTurboPerformance(CSolver***** solver, CGeometry**** geometry_container, CConfig** config_container, unsigned long ExtIter) { diff --git a/SU2_CFD/src/solvers/CEulerSolver.cpp b/SU2_CFD/src/solvers/CEulerSolver.cpp index dcca14edd19d..a9d730c2d47a 100644 --- a/SU2_CFD/src/solvers/CEulerSolver.cpp +++ b/SU2_CFD/src/solvers/CEulerSolver.cpp @@ -1881,8 +1881,8 @@ void CEulerSolver::Upwind_Residual(CGeometry *geometry, CSolver **solver_contain for (auto iVar = 0u; iVar < nPrimVarGrad; iVar++) { const su2double V_ij = V_j[iVar] - V_i[iVar]; - const su2double Project_Grad_i = nkRelax * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappa); - const su2double Project_Grad_j = nkRelax * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappa); + const su2double Project_Grad_i = config->GetMUSCLRampValue() * nkRelax * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappa); + const su2double Project_Grad_j = config->GetMUSCLRampValue() * nkRelax * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappa); su2double lim_i = 1.0; su2double lim_j = 1.0; diff --git a/SU2_CFD/src/solvers/CIncEulerSolver.cpp b/SU2_CFD/src/solvers/CIncEulerSolver.cpp index 3df1ffbe3dd8..da75fbb98811 100644 --- a/SU2_CFD/src/solvers/CIncEulerSolver.cpp +++ b/SU2_CFD/src/solvers/CIncEulerSolver.cpp @@ -1279,8 +1279,8 @@ void CIncEulerSolver::Upwind_Residual(CGeometry *geometry, CSolver **solver_cont for (auto iVar = 0u; iVar < nPrimVarGrad; iVar++) { const su2double V_ij = V_j[iVar] - V_i[iVar]; - const su2double Project_Grad_i = nkRelax * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappa); - const su2double Project_Grad_j = nkRelax * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappa); + const su2double Project_Grad_i = config->GetMUSCLRampValue() * nkRelax * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappa); + const su2double Project_Grad_j = config->GetMUSCLRampValue() * nkRelax * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappa); su2double lim_i = 1.0; su2double lim_j = 1.0; diff --git a/SU2_CFD/src/solvers/CNEMOEulerSolver.cpp b/SU2_CFD/src/solvers/CNEMOEulerSolver.cpp index 65f3ea81f123..6078b6fbe00d 100644 --- a/SU2_CFD/src/solvers/CNEMOEulerSolver.cpp +++ b/SU2_CFD/src/solvers/CNEMOEulerSolver.cpp @@ -542,8 +542,8 @@ void CNEMOEulerSolver::Upwind_Residual(CGeometry *geometry, CSolver **solver_con for (auto iVar = 0ul; iVar < nPrimVarGrad; iVar++) { const su2double V_ij = V_j[iVar] - V_i[iVar]; - Project_Grad_i[iVar] = nkRelax * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappa); - Project_Grad_j[iVar] = nkRelax * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappa); + Project_Grad_i[iVar] = config->GetMUSCLRampValue() * nkRelax * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappa); + Project_Grad_j[iVar] = config->GetMUSCLRampValue() * nkRelax * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappa); if (limiter) { if (van_albada) { From 8c521a62a436ad74f3bb81f4a1242e2b38f42569 Mon Sep 17 00:00:00 2001 From: Josh Kelly Date: Mon, 8 Dec 2025 17:54:20 +0000 Subject: [PATCH 02/13] Move MUSCL ramp into MUSCL reconstruction and updated numerics simd + added ulong array config options and updated muscl ramp coeffs --- Common/include/CConfig.hpp | 6 ++-- Common/src/CConfig.cpp | 11 +++++-- .../numerics_simd/flow/convection/common.hpp | 33 +++++++++++-------- .../numerics_simd/flow/convection/roe.hpp | 2 +- SU2_CFD/include/solvers/CScalarSolver.inl | 8 ++--- SU2_CFD/include/solvers/CSolver.hpp | 2 +- SU2_CFD/src/iteration/CFluidIteration.cpp | 2 +- SU2_CFD/src/solvers/CEulerSolver.cpp | 4 +-- SU2_CFD/src/solvers/CIncEulerSolver.cpp | 4 +-- SU2_CFD/src/solvers/CNEMOEulerSolver.cpp | 4 +-- 10 files changed, 44 insertions(+), 32 deletions(-) diff --git a/Common/include/CConfig.hpp b/Common/include/CConfig.hpp index 9e38bfc23865..bbe52eea2459 100644 --- a/Common/include/CConfig.hpp +++ b/Common/include/CConfig.hpp @@ -1117,7 +1117,7 @@ class CConfig { su2double rampMUSCLValue; /*!< \brief Current value of the MUSCL ramp */ su2double RampMUSCLPower; /*!< \brief Exponent by which to raise the MUSCL ramp to the power of */ MUSCL_RAMP_TYPE Kind_MUSCLRamp; - unsigned long *rampMUSCLCoeff; /*!< \brief ramp MUSCL value coefficients for the COption class. */ + unsigned long rampMUSCLCoeff[3]; /*!< \brief ramp MUSCL value coefficients for the COption class. */ ENUM_STREAMWISE_PERIODIC Kind_Streamwise_Periodic; /*!< \brief Kind of Streamwise periodic flow (pressure drop or massflow) */ bool Streamwise_Periodic_Temperature; /*!< \brief Use real periodicity for Energy equation or otherwise outlet source term. */ @@ -1349,6 +1349,8 @@ class CConfig { void addUShortArrayOption(const string& name, int size, bool allow_fewer, unsigned short* option_field); + void addULongArrayOption(const string& name, int size, bool allow_fewer, unsigned long* option_field); + void addDoubleListOption(const string& name, unsigned short & size, su2double * & option_field); void addShortListOption(const string& name, unsigned short & size, short * & option_field); @@ -5230,7 +5232,7 @@ class CConfig { * \brief Get MUSCL ramp kind. * \return Ramp MUSCL kind */ - MUSCL_RAMP_TYPE GetKind_MUSCLRamp(void) const { return Kind_MUSCLRamp; } + MUSCL_RAMP_TYPE GetKindMUSCLRamp(void) const { return Kind_MUSCLRamp; } /*! * \brief Generic interface for setting monitor outlet values for the ramp. diff --git a/Common/src/CConfig.cpp b/Common/src/CConfig.cpp index a71f64259f63..9f56306fbd1f 100644 --- a/Common/src/CConfig.cpp +++ b/Common/src/CConfig.cpp @@ -409,6 +409,13 @@ void CConfig::addULongListOption(const string& name, unsigned short & size, unsi option_map.insert(pair(name, val)); } +void CConfig::addULongArrayOption(const string& name, const int size, const bool allow_fewer, unsigned long* option_field) { + assert(option_map.find(name) == option_map.end()); + all_options.insert(pair(name, true)); + COptionBase* val = new COptionArray(name, size, allow_fewer, option_field); + option_map.insert(pair(name, val)); +} + void CConfig::addStringListOption(const string& name, unsigned short & num_marker, string* & option_field) { assert(option_map.find(name) == option_map.end()); all_options.insert(pair(name, true)); @@ -1990,10 +1997,8 @@ void CConfig::SetConfig_Options() { addBoolOption("RAMP_MUSCL", RampMUSCL, false); /*! brief RAMP_OUTLET_COEFF \n DESCRIPTION: the 1st coeff is the ramp start iteration, * the 2nd coeff is the iteration update frequenct, 3rd coeff is the total number of iterations */ - unsigned short nMUSCLCoeffs = 3; - rampMUSCLCoeff = new unsigned long [nMUSCLCoeffs]; rampMUSCLCoeff[0] = 0.0; rampMUSCLCoeff[1] = 1.0; rampMUSCLCoeff[2] = 500.0; - addULongListOption("RAMP_MUSCL_COEFF", nMUSCLCoeffs, rampMUSCLCoeff); + addULongArrayOption("RAMP_MUSCL_COEFF", 3, false, rampMUSCLCoeff); /*!\brief RAMP_MUSCL_POWER \n DESRCIPTION: Exponent of the MUSCL ramp formulation */ addDoubleOption("RAMP_MUSCL_POWER", RampMUSCLPower, 1.0); /*!\brief KIND_MUSCL_RAMP \n DESCRIPTION: The kind of MUSCL Ramp to be applied */ diff --git a/SU2_CFD/include/numerics_simd/flow/convection/common.hpp b/SU2_CFD/include/numerics_simd/flow/convection/common.hpp index c3e402e6ff44..b197748d52c7 100644 --- a/SU2_CFD/include/numerics_simd/flow/convection/common.hpp +++ b/SU2_CFD/include/numerics_simd/flow/convection/common.hpp @@ -73,7 +73,8 @@ FORCEINLINE Double musclReconstruction(const GradType& grad, const Double delta, size_t iVar, Double kappa, - Double relax) { + Double relax, + Double ramp_val) { const Double proj = dot(grad[iVar], vector_ij); return relax * umusclProjection(proj, delta, kappa); } @@ -88,7 +89,8 @@ FORCEINLINE void musclUnlimited(Int iPoint, const Gradient_t& gradient, CPair& V, Double kappa, - Double relax) { + Double relax, + Double ramp_val) { constexpr auto nVarGrad = nVarGrad_ > 0 ? nVarGrad_ : VarType::nVar; auto grad_i = gatherVariables(iPoint, gradient); @@ -99,8 +101,8 @@ FORCEINLINE void musclUnlimited(Int iPoint, const Double delta_ij = V.j.all(iVar) - V.i.all(iVar); /*--- U-MUSCL reconstructed variables ---*/ - const Double proj_i = musclReconstruction(grad_i, vector_ij, delta_ij, iVar, kappa, relax); - const Double proj_j = musclReconstruction(grad_j, vector_ij, delta_ij, iVar, kappa, relax); + const Double proj_i = musclReconstruction(grad_i, vector_ij, delta_ij, iVar, kappa, relax, ramp_val); + const Double proj_j = musclReconstruction(grad_j, vector_ij, delta_ij, iVar, kappa, relax, ramp_val); /*--- Apply reconstruction: V_L = V_i + 0.5 * dV_ij^kap ---*/ V.i.all(iVar) += 0.5 * proj_i; @@ -119,7 +121,8 @@ FORCEINLINE void musclPointLimited(Int iPoint, const Gradient_t& gradient, CPair& V, Double kappa, - Double relax) { + Double relax, + Double ramp_val) { constexpr auto nVarGrad = nVarGrad_ > 0 ? nVarGrad_ : VarType::nVar; auto lim_i = gatherVariables(iPoint, limiter); @@ -133,8 +136,8 @@ FORCEINLINE void musclPointLimited(Int iPoint, const Double delta_ij = V.j.all(iVar) - V.i.all(iVar); /*--- U-MUSCL reconstructed variables ---*/ - const Double proj_i = musclReconstruction(grad_i, vector_ij, delta_ij, iVar, kappa, relax); - const Double proj_j = musclReconstruction(grad_j, vector_ij, delta_ij, iVar, kappa, relax); + const Double proj_i = musclReconstruction(grad_i, vector_ij, delta_ij, iVar, kappa, relax, ramp_val); + const Double proj_j = musclReconstruction(grad_j, vector_ij, delta_ij, iVar, kappa, relax, ramp_val); /*--- Apply reconstruction: V_L = V_i + 0.5 * lim * dV_ij^kap ---*/ V.i.all(iVar) += 0.5 * lim_i(iVar) * proj_i; @@ -152,7 +155,8 @@ FORCEINLINE void musclEdgeLimited(Int iPoint, const Gradient_t& gradient, CPair& V, Double kappa, - Double relax) { + Double relax, + Double ramp_val) { constexpr auto nVarGrad = nVarGrad_ > 0 ? nVarGrad_ : VarType::nVar; auto grad_i = gatherVariables(iPoint, gradient); @@ -164,8 +168,8 @@ FORCEINLINE void musclEdgeLimited(Int iPoint, const Double delta_ij_2 = pow(delta_ij, 2) + 1e-6; /*--- U-MUSCL reconstructed variables ---*/ - const Double proj_i = musclReconstruction(grad_i, vector_ij, delta_ij, iVar, kappa, relax); - const Double proj_j = musclReconstruction(grad_j, vector_ij, delta_ij, iVar, kappa, relax); + const Double proj_i = musclReconstruction(grad_i, vector_ij, delta_ij, iVar, kappa, relax, ramp_val); + const Double proj_j = musclReconstruction(grad_j, vector_ij, delta_ij, iVar, kappa, relax, ramp_val); /// TODO: Customize the limiter function. const Double lim_i = (delta_ij_2 + proj_i*delta_ij) / (pow(proj_i,2) + delta_ij_2); @@ -202,7 +206,8 @@ FORCEINLINE CPair reconstructPrimitives(Int iEdge, Int iPoint, Int LIMITER limiterType, const CPair& V1st, const VectorDbl& vector_ij, - const VariableType& solution) { + const VariableType& solution, + const su2double& ramp_val) { static_assert(ReconVarType::nVar <= PrimVarType::nVar); const auto& gradients = solution.GetGradient_Reconstruction(); @@ -220,13 +225,13 @@ FORCEINLINE CPair reconstructPrimitives(Int iEdge, Int iPoint, Int constexpr auto nVarGrad = ReconVarType::nVar - 2; switch (limiterType) { case LIMITER::NONE: - musclUnlimited(iPoint, jPoint, vector_ij, gradients, V, kappa, relax); + musclUnlimited(iPoint, jPoint, vector_ij, gradients, V, kappa, relax, ramp_val); break; case LIMITER::VAN_ALBADA_EDGE: - musclEdgeLimited(iPoint, jPoint, vector_ij, gradients, V, kappa, relax); + musclEdgeLimited(iPoint, jPoint, vector_ij, gradients, V, kappa, relax, ramp_val); break; default: - musclPointLimited(iPoint, jPoint, vector_ij, limiters, gradients, V, kappa, relax); + musclPointLimited(iPoint, jPoint, vector_ij, limiters, gradients, V, kappa, relax, ramp_val); break; } V.i.density() = V.i.pressure() / (gasConst * V.i.temperature()); diff --git a/SU2_CFD/include/numerics_simd/flow/convection/roe.hpp b/SU2_CFD/include/numerics_simd/flow/convection/roe.hpp index 6b1d09e8b9e1..597ddc7efedb 100644 --- a/SU2_CFD/include/numerics_simd/flow/convection/roe.hpp +++ b/SU2_CFD/include/numerics_simd/flow/convection/roe.hpp @@ -123,7 +123,7 @@ class CRoeBase : public Base { /*--- Recompute density and enthalpy instead of reconstructing. ---*/ auto V = reconstructPrimitives >( - iEdge, iPoint, jPoint, gamma, gasConst, muscl, umusclKappa, nkRelax, typeLimiter, V1st, vector_ij, solution); + iEdge, iPoint, jPoint, gamma, gasConst, muscl, umusclKappa, nkRelax, typeLimiter, V1st, vector_ij, solution, config.GetMUSCLRampValue()); /*--- Compute conservative variables. ---*/ diff --git a/SU2_CFD/include/solvers/CScalarSolver.inl b/SU2_CFD/include/solvers/CScalarSolver.inl index 5c6f088ec441..62029bd26edc 100644 --- a/SU2_CFD/include/solvers/CScalarSolver.inl +++ b/SU2_CFD/include/solvers/CScalarSolver.inl @@ -222,8 +222,8 @@ void CScalarSolver::Upwind_Residual(CGeometry* geometry, CSolver** for (auto iVar = 0u; iVar < solver_container[FLOW_SOL]->GetnPrimVarGrad(); iVar++) { const su2double V_ij = V_j[iVar] - V_i[iVar]; - su2double Project_Grad_i = config->GetMUSCLRampValue() * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappaFlow); - su2double Project_Grad_j = config->GetMUSCLRampValue() * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappaFlow); + su2double Project_Grad_i = MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappaFlow, config->GetMUSCLRampValue()); + su2double Project_Grad_j = MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappaFlow, config->GetMUSCLRampValue()); if (limiterFlow) { Project_Grad_i *= Limiter_i[iVar]; @@ -251,8 +251,8 @@ void CScalarSolver::Upwind_Residual(CGeometry* geometry, CSolver** for (auto iVar = 0u; iVar < nVar; iVar++) { const su2double U_ij = Scalar_j[iVar] - Scalar_i[iVar]; - su2double Project_Grad_i = config->GetMUSCLRampValue() * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, U_ij, kappa); - su2double Project_Grad_j = config->GetMUSCLRampValue() * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, U_ij, kappa); + su2double Project_Grad_i = MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, U_ij, kappa, config->GetMUSCLRampValue()); + su2double Project_Grad_j = MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, U_ij, kappa, config->GetMUSCLRampValue()); if (limiter) { Project_Grad_i *= Limiter_i[iVar]; diff --git a/SU2_CFD/include/solvers/CSolver.hpp b/SU2_CFD/include/solvers/CSolver.hpp index a6f5b5089549..4fcecf4f7a15 100644 --- a/SU2_CFD/include/solvers/CSolver.hpp +++ b/SU2_CFD/include/solvers/CSolver.hpp @@ -590,7 +590,7 @@ class CSolver { * \param[in] ramp_val - Value of the ramp * \return - Projected variable. */ - inline su2double MUSCL_Reconstruction(const su2double* grad, const su2double* vector_ij, su2double delta_ij, su2double kappa) { + inline su2double MUSCL_Reconstruction(const su2double* grad, const su2double* vector_ij, su2double delta_ij, su2double kappa, su2double ramp_val) { su2double project_grad = GeometryToolbox::DotProduct(nDim, grad, vector_ij); return LimiterHelpers<>::umusclProjection(project_grad, delta_ij, kappa); } diff --git a/SU2_CFD/src/iteration/CFluidIteration.cpp b/SU2_CFD/src/iteration/CFluidIteration.cpp index 493fdad1b7f1..e1c60e2ea1bf 100644 --- a/SU2_CFD/src/iteration/CFluidIteration.cpp +++ b/SU2_CFD/src/iteration/CFluidIteration.cpp @@ -343,7 +343,7 @@ void CFluidIteration::UpdateRamp(CGeometry**** geometry_container, CConfig** con if (iter < startIter) return; if ((iter == startIter) && (rank == MASTER_NODE)) cout << "Beginning to ramp MUSCL scheme..." << endl; if ((iter % updateFreq == 0 && iter < finalIter) || (iter == finalIter)) { - switch (config->GetKind_MUSCLRamp()) { + switch (config->GetKindMUSCLRamp()) { case MUSCL_RAMP_TYPE::ITERATION: config->SetMUSCLRampValue(std::pow(std::min(1.0, iterFrac), power)); break; diff --git a/SU2_CFD/src/solvers/CEulerSolver.cpp b/SU2_CFD/src/solvers/CEulerSolver.cpp index a9d730c2d47a..06ade8873507 100644 --- a/SU2_CFD/src/solvers/CEulerSolver.cpp +++ b/SU2_CFD/src/solvers/CEulerSolver.cpp @@ -1881,8 +1881,8 @@ void CEulerSolver::Upwind_Residual(CGeometry *geometry, CSolver **solver_contain for (auto iVar = 0u; iVar < nPrimVarGrad; iVar++) { const su2double V_ij = V_j[iVar] - V_i[iVar]; - const su2double Project_Grad_i = config->GetMUSCLRampValue() * nkRelax * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappa); - const su2double Project_Grad_j = config->GetMUSCLRampValue() * nkRelax * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappa); + const su2double Project_Grad_i = nkRelax * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappa, config->GetMUSCLRampValue()); + const su2double Project_Grad_j = nkRelax * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappa, config->GetMUSCLRampValue()); su2double lim_i = 1.0; su2double lim_j = 1.0; diff --git a/SU2_CFD/src/solvers/CIncEulerSolver.cpp b/SU2_CFD/src/solvers/CIncEulerSolver.cpp index da75fbb98811..501286ecf206 100644 --- a/SU2_CFD/src/solvers/CIncEulerSolver.cpp +++ b/SU2_CFD/src/solvers/CIncEulerSolver.cpp @@ -1279,8 +1279,8 @@ void CIncEulerSolver::Upwind_Residual(CGeometry *geometry, CSolver **solver_cont for (auto iVar = 0u; iVar < nPrimVarGrad; iVar++) { const su2double V_ij = V_j[iVar] - V_i[iVar]; - const su2double Project_Grad_i = config->GetMUSCLRampValue() * nkRelax * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappa); - const su2double Project_Grad_j = config->GetMUSCLRampValue() * nkRelax * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappa); + const su2double Project_Grad_i = nkRelax * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappa, config->GetMUSCLRampValue()); + const su2double Project_Grad_j = nkRelax * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappa, config->GetMUSCLRampValue()); su2double lim_i = 1.0; su2double lim_j = 1.0; diff --git a/SU2_CFD/src/solvers/CNEMOEulerSolver.cpp b/SU2_CFD/src/solvers/CNEMOEulerSolver.cpp index 6078b6fbe00d..1e3ab602aa12 100644 --- a/SU2_CFD/src/solvers/CNEMOEulerSolver.cpp +++ b/SU2_CFD/src/solvers/CNEMOEulerSolver.cpp @@ -542,8 +542,8 @@ void CNEMOEulerSolver::Upwind_Residual(CGeometry *geometry, CSolver **solver_con for (auto iVar = 0ul; iVar < nPrimVarGrad; iVar++) { const su2double V_ij = V_j[iVar] - V_i[iVar]; - Project_Grad_i[iVar] = config->GetMUSCLRampValue() * nkRelax * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappa); - Project_Grad_j[iVar] = config->GetMUSCLRampValue() * nkRelax * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappa); + Project_Grad_i[iVar] = nkRelax * MUSCL_Reconstruction(Gradient_i[iVar], Vector_ij, V_ij, kappa, config->GetMUSCLRampValue()); + Project_Grad_j[iVar] = nkRelax * MUSCL_Reconstruction(Gradient_j[iVar], Vector_ij, V_ij, kappa, config->GetMUSCLRampValue()); if (limiter) { if (van_albada) { From af9a5e5c076c0999643f818715862c91e702de59 Mon Sep 17 00:00:00 2001 From: Josh Kelly Date: Mon, 8 Dec 2025 20:43:20 +0000 Subject: [PATCH 03/13] Documentation + test case RAMP_MUSCL --- .../naca0012/inv_NACA0012_Roe_MUSCL_ramp.cfg | 99 +++++++++++++++++++ TestCases/hybrid_regression.py | 8 ++ TestCases/parallel_regression.py | 8 ++ TestCases/serial_regression.py | 8 ++ config_template.cfg | 16 +++ 5 files changed, 139 insertions(+) create mode 100644 TestCases/euler/naca0012/inv_NACA0012_Roe_MUSCL_ramp.cfg diff --git a/TestCases/euler/naca0012/inv_NACA0012_Roe_MUSCL_ramp.cfg b/TestCases/euler/naca0012/inv_NACA0012_Roe_MUSCL_ramp.cfg new file mode 100644 index 000000000000..f9e750e37bde --- /dev/null +++ b/TestCases/euler/naca0012/inv_NACA0012_Roe_MUSCL_ramp.cfg @@ -0,0 +1,99 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% SU2 configuration file % +% Case description: Transonic inviscid flow around a NACA0012 (regression) % +% Author: Thomas D. Economon % +% Institution: Stanford University % +% Date: 2012.10.07 % +% File Version 8.3.0 "Harrier" % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% ------------- DIRECT, ADJOINT, AND LINEARIZED PROBLEM DEFINITION ------------% +% +SOLVER= EULER +MATH_PROBLEM= DIRECT +RESTART_SOL= NO + +% ----------- COMPRESSIBLE AND INCOMPRESSIBLE FREE-STREAM DEFINITION ----------% +% +MACH_NUMBER= 0.8 +AOA= 1.25 +FREESTREAM_PRESSURE= 101325.0 +FREESTREAM_TEMPERATURE= 288.15 + +% ---------------------- REFERENCE VALUE DEFINITION ---------------------------% +% +REF_ORIGIN_MOMENT_X = 0.25 +REF_ORIGIN_MOMENT_Y = 0.00 +REF_ORIGIN_MOMENT_Z = 0.00 +REF_LENGTH= 1.0 +REF_AREA= 1.0 +REF_DIMENSIONALIZATION= FREESTREAM_PRESS_EQ_ONE + +% ----------------------- BOUNDARY CONDITION DEFINITION -----------------------% +% +MARKER_EULER= ( airfoil ) +MARKER_FAR= ( farfield ) +MARKER_PLOTTING= ( airfoil ) +MARKER_MONITORING= ( airfoil ) + +% ------------- COMMON PARAMETERS TO DEFINE THE NUMERICAL METHOD --------------% +% +NUM_METHOD_GRAD= WEIGHTED_LEAST_SQUARES +CFL_NUMBER= 20.0 +CFL_ADAPT= NO +CFL_ADAPT_PARAM= ( 1.5, 0.5, 1.0, 100.0 ) +RK_ALPHA_COEFF= ( 0.66667, 0.66667, 1.000000 ) +ITER= 1000 +LINEAR_SOLVER= BCGSTAB +LINEAR_SOLVER_ERROR= 1E-6 +LINEAR_SOLVER_ITER= 5 + +% -------------------------- MULTIGRID PARAMETERS -----------------------------% +% +MGLEVEL= 3 +MGCYCLE= W_CYCLE +MG_PRE_SMOOTH= ( 1, 2, 2, 2 ) +MG_POST_SMOOTH= ( 1, 1, 1, 1 ) +MG_CORRECTION_SMOOTH= ( 1, 1, 1, 1 ) +MG_DAMP_RESTRICTION= 0.80 +MG_DAMP_PROLONGATION= 0.80 + +% -------------------- FLOW NUMERICAL METHOD DEFINITION -----------------------% +% +CONV_NUM_METHOD_FLOW= ROE +MUSCL_FLOW= YES +RAMP_MUSCL= YES +RAMP_MUSCL_COEFF= (0.0, 1.0, 20.0) +RAMP_MUSCL_POWER = 1 +KIND_MUSCL_RAMP= ITERATION +SLOPE_LIMITER_FLOW= VENKATAKRISHNAN +VENKAT_LIMITER_COEFF= 0.01 +JST_SENSOR_COEFF= ( 0.5, 0.02 ) +TIME_DISCRE_FLOW= EULER_IMPLICIT + +% --------------------------- CONVERGENCE PARAMETERS --------------------------% +% +CONV_RESIDUAL_MINVAL= -10 +CONV_STARTITER= 10 +CONV_CAUCHY_ELEMS= 100 +CONV_CAUCHY_EPS= 1E-6 + +% ------------------------- INPUT/OUTPUT INFORMATION --------------------------% +% +MESH_FILENAME= mesh_NACA0012_inv.su2 +MESH_FORMAT= SU2 +MESH_OUT_FILENAME= mesh_out +SOLUTION_FILENAME= solution_flow +SOLUTION_ADJ_FILENAME= solution_adj +TABULAR_FORMAT= CSV +CONV_FILENAME= history +RESTART_FILENAME= restart_flow +RESTART_ADJ_FILENAME= restart_adj +VOLUME_FILENAME= flow +VOLUME_ADJ_FILENAME= adjoint +GRAD_OBJFUNC_FILENAME= of_grad +SURFACE_FILENAME= surface_flow +SURFACE_ADJ_FILENAME= surface_adjoint +SCREEN_OUTPUT = (INNER_ITER, RMS_DENSITY, RMS_ENERGY, LIFT, DRAG) diff --git a/TestCases/hybrid_regression.py b/TestCases/hybrid_regression.py index 6d9dd9cef253..b4ce5364b98e 100644 --- a/TestCases/hybrid_regression.py +++ b/TestCases/hybrid_regression.py @@ -62,6 +62,14 @@ def main(): naca0012.test_vals = [-4.766168, -4.287699, 0.326688, 0.022661] test_list.append(naca0012) + # NACA0012 w/ MUSCL ramp + naca0012_MUSCL_ramp = TestCase('naca0012_MUSCL_ramp') + naca0012_MUSCL_ramp.cfg_dir = "euler/naca0012" + naca0012_MUSCL_ramp.cfg_file = "inv_NACA0012_Roe_MUSCL_ramp.cfg" + naca0012_MUSCL_ramp.test_iter = 30 + naca0012_MUSCL_ramp.test_vals = [-4.766168, -4.287699, 0.326688, 0.022661] + test_list.append(naca0012_MUSCL_ramp) + # Supersonic wedge wedge = TestCase('wedge') wedge.cfg_dir = "euler/wedge" diff --git a/TestCases/parallel_regression.py b/TestCases/parallel_regression.py index 7e4df8048912..3b29080c3555 100644 --- a/TestCases/parallel_regression.py +++ b/TestCases/parallel_regression.py @@ -231,6 +231,14 @@ def main(): naca0012.test_vals = [-4.607257, -4.138750, 0.327682, 0.022685] test_list.append(naca0012) + # NACA0012 w/ MUSCL ramp + naca0012_MUSCL_ramp = TestCase('naca0012_MUSCL_ramp') + naca0012_MUSCL_ramp.cfg_dir = "euler/naca0012" + naca0012_MUSCL_ramp.cfg_file = "inv_NACA0012_Roe_MUSCL_ramp.cfg" + naca0012_MUSCL_ramp.test_iter = 30 + naca0012_MUSCL_ramp.test_vals = [-4.766168, -4.287699, 0.326688, 0.022661] + test_list.append(naca0012_MUSCL_ramp) + # Supersonic wedge wedge = TestCase('wedge') wedge.cfg_dir = "euler/wedge" diff --git a/TestCases/serial_regression.py b/TestCases/serial_regression.py index 075856261908..a3f85c365edb 100644 --- a/TestCases/serial_regression.py +++ b/TestCases/serial_regression.py @@ -104,6 +104,14 @@ def main(): naca0012.test_vals = [-4.766184, -4.287722, 0.326688, 0.022661] test_list.append(naca0012) + # NACA0012 w/ MUSCL ramp + naca0012_MUSCL_ramp = TestCase('naca0012_MUSCL_ramp') + naca0012_MUSCL_ramp.cfg_dir = "euler/naca0012" + naca0012_MUSCL_ramp.cfg_file = "inv_NACA0012_Roe_MUSCL_ramp.cfg" + naca0012_MUSCL_ramp.test_iter = 30 + naca0012_MUSCL_ramp.test_vals = [-4.766168, -4.287699, 0.326688, 0.022661] + test_list.append(naca0012_MUSCL_ramp) + # Supersonic wedge wedge = TestCase('wedge') wedge.cfg_dir = "euler/wedge" diff --git a/config_template.cfg b/config_template.cfg index aa7a1a97fc97..94e8541686fd 100644 --- a/config_template.cfg +++ b/config_template.cfg @@ -1463,6 +1463,22 @@ CUSTOM_OBJFUNC= 'DRAG + 10 * pow(fmax(0.4-LIFT, 0), 2)' % Required for 2nd order upwind schemes (NO, YES) MUSCL_FLOW= YES % +% Option to ramp the MUSCL reconstruction scheme gradually from first to second order +RAMP_MUSCL= NO +% +% Coefficients for the MUSCL ramp, 1st is ramp start iteration, +% 2nd is the ramp update frequency, 3rd is the total number of iterations of the ramp +RAMP_MUSCL_COEFF= (1000.0, 10.0, 500.0) +% +% Value for modifying how aggresively the ramp is applied (cannot be less than or equal to 0) +% < 1 = Aggresive ramp up early, slower later, > 1 slow initial ramping, more aggresive towards end +RAMP_MUSCL_POWER = 1 +% +% Type of MUSCL ramp function used +% ITERATION = [min(1.0, iter/endIter)]^RAMP_MUSCL_POWER +% SMOOTH_FUNCTION = [1/2 * ( 1 - cos ( pi * min(1.0, iter/endIter)))]^RAMP_MUSCL_POWER +KIND_MUSCL_RAMP= ITERATION +% % Coefficient for blending upwind and central differences in MUSCL scheme. % Values range from -1 (fully one-sided) to 1 (central difference). MUSCL_KAPPA_FLOW= 0.0 From 4f35fecc3c4d5e1cf57cdef39e37d19edfe670d2 Mon Sep 17 00:00:00 2001 From: Josh Kelly Date: Mon, 8 Dec 2025 20:44:32 +0000 Subject: [PATCH 04/13] Coefficient warning --- TestCases/euler/naca0012/inv_NACA0012_Roe_MUSCL_ramp.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/TestCases/euler/naca0012/inv_NACA0012_Roe_MUSCL_ramp.cfg b/TestCases/euler/naca0012/inv_NACA0012_Roe_MUSCL_ramp.cfg index f9e750e37bde..cdd2c2fab2a5 100644 --- a/TestCases/euler/naca0012/inv_NACA0012_Roe_MUSCL_ramp.cfg +++ b/TestCases/euler/naca0012/inv_NACA0012_Roe_MUSCL_ramp.cfg @@ -65,6 +65,7 @@ MG_DAMP_PROLONGATION= 0.80 CONV_NUM_METHOD_FLOW= ROE MUSCL_FLOW= YES RAMP_MUSCL= YES +% NOTE: These coefficients are not practical for real calculations, this is for the purpose of regression testing. RAMP_MUSCL_COEFF= (0.0, 1.0, 20.0) RAMP_MUSCL_POWER = 1 KIND_MUSCL_RAMP= ITERATION From e30dab3540c12ccc538c75f8a6d7d21ce49c3ef4 Mon Sep 17 00:00:00 2001 From: Josh Kelly Date: Mon, 8 Dec 2025 20:57:43 +0000 Subject: [PATCH 05/13] Added warning for incorrectly set RAMP_MUSCL_POWER --- Common/src/CConfig.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Common/src/CConfig.cpp b/Common/src/CConfig.cpp index 9f56306fbd1f..a284f7b0dc89 100644 --- a/Common/src/CConfig.cpp +++ b/Common/src/CConfig.cpp @@ -4497,6 +4497,7 @@ void CConfig::SetPostprocessing(SU2_COMPONENT val_software, unsigned short val_i } if(RampMUSCL && !DiscreteAdjoint){ + if (RampMUSCLPower <= 0.0) SU2_MPI::Error("RAMP_MUSCL_POWER cannot be less than or equal to zero!"); rampMUSCLValue = 0.0; } else { rampMUSCLValue = 1.0; From a94858fc9c487f90ae673d1ef37e4b1a7641ca8a Mon Sep 17 00:00:00 2001 From: Josh Kelly Date: Mon, 8 Dec 2025 21:07:29 +0000 Subject: [PATCH 06/13] Updated testcase --- TestCases/hybrid_regression.py | 8 -------- TestCases/parallel_regression.py | 8 -------- TestCases/serial_regression.py | 8 -------- TestCases/turbomachinery/axial_stage_2D/Axial_stage2D.cfg | 5 +++++ 4 files changed, 5 insertions(+), 24 deletions(-) diff --git a/TestCases/hybrid_regression.py b/TestCases/hybrid_regression.py index 35f96e886244..c7ad4c989645 100644 --- a/TestCases/hybrid_regression.py +++ b/TestCases/hybrid_regression.py @@ -62,14 +62,6 @@ def main(): naca0012.test_vals = [-4.766168, -4.287699, 0.326688, 0.022661] test_list.append(naca0012) - # NACA0012 w/ MUSCL ramp - naca0012_MUSCL_ramp = TestCase('naca0012_MUSCL_ramp') - naca0012_MUSCL_ramp.cfg_dir = "euler/naca0012" - naca0012_MUSCL_ramp.cfg_file = "inv_NACA0012_Roe_MUSCL_ramp.cfg" - naca0012_MUSCL_ramp.test_iter = 30 - naca0012_MUSCL_ramp.test_vals = [-4.766168, -4.287699, 0.326688, 0.022661] - test_list.append(naca0012_MUSCL_ramp) - # Supersonic wedge wedge = TestCase('wedge') wedge.cfg_dir = "euler/wedge" diff --git a/TestCases/parallel_regression.py b/TestCases/parallel_regression.py index e71eeb7cc776..c96bc56ac810 100644 --- a/TestCases/parallel_regression.py +++ b/TestCases/parallel_regression.py @@ -231,14 +231,6 @@ def main(): naca0012.test_vals = [-4.607257, -4.138750, 0.327682, 0.022685] test_list.append(naca0012) - # NACA0012 w/ MUSCL ramp - naca0012_MUSCL_ramp = TestCase('naca0012_MUSCL_ramp') - naca0012_MUSCL_ramp.cfg_dir = "euler/naca0012" - naca0012_MUSCL_ramp.cfg_file = "inv_NACA0012_Roe_MUSCL_ramp.cfg" - naca0012_MUSCL_ramp.test_iter = 30 - naca0012_MUSCL_ramp.test_vals = [-4.766168, -4.287699, 0.326688, 0.022661] - test_list.append(naca0012_MUSCL_ramp) - # Supersonic wedge wedge = TestCase('wedge') wedge.cfg_dir = "euler/wedge" diff --git a/TestCases/serial_regression.py b/TestCases/serial_regression.py index 2f374f540d1e..94bc257ddb8c 100644 --- a/TestCases/serial_regression.py +++ b/TestCases/serial_regression.py @@ -104,14 +104,6 @@ def main(): naca0012.test_vals = [-4.766184, -4.287722, 0.326688, 0.022661] test_list.append(naca0012) - # NACA0012 w/ MUSCL ramp - naca0012_MUSCL_ramp = TestCase('naca0012_MUSCL_ramp') - naca0012_MUSCL_ramp.cfg_dir = "euler/naca0012" - naca0012_MUSCL_ramp.cfg_file = "inv_NACA0012_Roe_MUSCL_ramp.cfg" - naca0012_MUSCL_ramp.test_iter = 30 - naca0012_MUSCL_ramp.test_vals = [-4.766168, -4.287699, 0.326688, 0.022661] - test_list.append(naca0012_MUSCL_ramp) - # Supersonic wedge wedge = TestCase('wedge') wedge.cfg_dir = "euler/wedge" diff --git a/TestCases/turbomachinery/axial_stage_2D/Axial_stage2D.cfg b/TestCases/turbomachinery/axial_stage_2D/Axial_stage2D.cfg index 042a04c01cbb..f6708b26683c 100755 --- a/TestCases/turbomachinery/axial_stage_2D/Axial_stage2D.cfg +++ b/TestCases/turbomachinery/axial_stage_2D/Axial_stage2D.cfg @@ -118,6 +118,11 @@ LIMITER_ITER= 999999 % CONV_NUM_METHOD_FLOW= ROE MUSCL_FLOW= YES +MUSCL_FLOW= YES +RAMP_MUSCL= YES +% NOTE: These coefficients are not practical for real calculations, this is for the purpose of regression testing. +RAMP_MUSCL_COEFF= (0.0, 1.0, 20.0) +RAMP_MUSCL_POWER = 1 SLOPE_LIMITER_FLOW= VAN_ALBADA_EDGE ENTROPY_FIX_COEFF= 0.01 JST_SENSOR_COEFF= ( 0.5, 0.02 ) From 957b574f676fd1ce25a5fe1e7cdc5f9ae618540c Mon Sep 17 00:00:00 2001 From: Josh Kelly Date: Mon, 8 Dec 2025 21:07:36 +0000 Subject: [PATCH 07/13] remove testcase --- .../naca0012/inv_NACA0012_Roe_MUSCL_ramp.cfg | 100 ------------------ 1 file changed, 100 deletions(-) delete mode 100644 TestCases/euler/naca0012/inv_NACA0012_Roe_MUSCL_ramp.cfg diff --git a/TestCases/euler/naca0012/inv_NACA0012_Roe_MUSCL_ramp.cfg b/TestCases/euler/naca0012/inv_NACA0012_Roe_MUSCL_ramp.cfg deleted file mode 100644 index cdd2c2fab2a5..000000000000 --- a/TestCases/euler/naca0012/inv_NACA0012_Roe_MUSCL_ramp.cfg +++ /dev/null @@ -1,100 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% SU2 configuration file % -% Case description: Transonic inviscid flow around a NACA0012 (regression) % -% Author: Thomas D. Economon % -% Institution: Stanford University % -% Date: 2012.10.07 % -% File Version 8.3.0 "Harrier" % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% ------------- DIRECT, ADJOINT, AND LINEARIZED PROBLEM DEFINITION ------------% -% -SOLVER= EULER -MATH_PROBLEM= DIRECT -RESTART_SOL= NO - -% ----------- COMPRESSIBLE AND INCOMPRESSIBLE FREE-STREAM DEFINITION ----------% -% -MACH_NUMBER= 0.8 -AOA= 1.25 -FREESTREAM_PRESSURE= 101325.0 -FREESTREAM_TEMPERATURE= 288.15 - -% ---------------------- REFERENCE VALUE DEFINITION ---------------------------% -% -REF_ORIGIN_MOMENT_X = 0.25 -REF_ORIGIN_MOMENT_Y = 0.00 -REF_ORIGIN_MOMENT_Z = 0.00 -REF_LENGTH= 1.0 -REF_AREA= 1.0 -REF_DIMENSIONALIZATION= FREESTREAM_PRESS_EQ_ONE - -% ----------------------- BOUNDARY CONDITION DEFINITION -----------------------% -% -MARKER_EULER= ( airfoil ) -MARKER_FAR= ( farfield ) -MARKER_PLOTTING= ( airfoil ) -MARKER_MONITORING= ( airfoil ) - -% ------------- COMMON PARAMETERS TO DEFINE THE NUMERICAL METHOD --------------% -% -NUM_METHOD_GRAD= WEIGHTED_LEAST_SQUARES -CFL_NUMBER= 20.0 -CFL_ADAPT= NO -CFL_ADAPT_PARAM= ( 1.5, 0.5, 1.0, 100.0 ) -RK_ALPHA_COEFF= ( 0.66667, 0.66667, 1.000000 ) -ITER= 1000 -LINEAR_SOLVER= BCGSTAB -LINEAR_SOLVER_ERROR= 1E-6 -LINEAR_SOLVER_ITER= 5 - -% -------------------------- MULTIGRID PARAMETERS -----------------------------% -% -MGLEVEL= 3 -MGCYCLE= W_CYCLE -MG_PRE_SMOOTH= ( 1, 2, 2, 2 ) -MG_POST_SMOOTH= ( 1, 1, 1, 1 ) -MG_CORRECTION_SMOOTH= ( 1, 1, 1, 1 ) -MG_DAMP_RESTRICTION= 0.80 -MG_DAMP_PROLONGATION= 0.80 - -% -------------------- FLOW NUMERICAL METHOD DEFINITION -----------------------% -% -CONV_NUM_METHOD_FLOW= ROE -MUSCL_FLOW= YES -RAMP_MUSCL= YES -% NOTE: These coefficients are not practical for real calculations, this is for the purpose of regression testing. -RAMP_MUSCL_COEFF= (0.0, 1.0, 20.0) -RAMP_MUSCL_POWER = 1 -KIND_MUSCL_RAMP= ITERATION -SLOPE_LIMITER_FLOW= VENKATAKRISHNAN -VENKAT_LIMITER_COEFF= 0.01 -JST_SENSOR_COEFF= ( 0.5, 0.02 ) -TIME_DISCRE_FLOW= EULER_IMPLICIT - -% --------------------------- CONVERGENCE PARAMETERS --------------------------% -% -CONV_RESIDUAL_MINVAL= -10 -CONV_STARTITER= 10 -CONV_CAUCHY_ELEMS= 100 -CONV_CAUCHY_EPS= 1E-6 - -% ------------------------- INPUT/OUTPUT INFORMATION --------------------------% -% -MESH_FILENAME= mesh_NACA0012_inv.su2 -MESH_FORMAT= SU2 -MESH_OUT_FILENAME= mesh_out -SOLUTION_FILENAME= solution_flow -SOLUTION_ADJ_FILENAME= solution_adj -TABULAR_FORMAT= CSV -CONV_FILENAME= history -RESTART_FILENAME= restart_flow -RESTART_ADJ_FILENAME= restart_adj -VOLUME_FILENAME= flow -VOLUME_ADJ_FILENAME= adjoint -GRAD_OBJFUNC_FILENAME= of_grad -SURFACE_FILENAME= surface_flow -SURFACE_ADJ_FILENAME= surface_adjoint -SCREEN_OUTPUT = (INNER_ITER, RMS_DENSITY, RMS_ENERGY, LIFT, DRAG) From 73212991404eedc4f5b421aaad0873bcaf708c5f Mon Sep 17 00:00:00 2001 From: Josh Kelly Date: Mon, 8 Dec 2025 21:25:46 +0000 Subject: [PATCH 08/13] Change to ramp muscl paramater structure --- Common/include/CConfig.hpp | 26 ++++++----------------- Common/src/CConfig.cpp | 10 ++++----- SU2_CFD/src/iteration/CFluidIteration.cpp | 14 ++++++------ 3 files changed, 19 insertions(+), 31 deletions(-) diff --git a/Common/include/CConfig.hpp b/Common/include/CConfig.hpp index bbe52eea2459..db178a5d83c5 100644 --- a/Common/include/CConfig.hpp +++ b/Common/include/CConfig.hpp @@ -1114,10 +1114,12 @@ class CConfig { array kt_polycoeffs{{0.0}}; /*!< \brief Array for thermal conductivity polynomial coefficients. */ bool Body_Force; /*!< \brief Flag to know if a body force is included in the formulation. */ + struct CMUSCLRampParam { + su2double RampMUSCLPower; /*!< \brief Exponent by which to raise the MUSCL ramp to the power of */ + MUSCL_RAMP_TYPE Kind_MUSCLRamp; /*!< \brief The kind of MUSCL ramp */ + unsigned long rampMUSCLCoeff[3]; /*!< \brief ramp MUSCL value coefficients for the COption class. */ + } RampMUSCLParam; su2double rampMUSCLValue; /*!< \brief Current value of the MUSCL ramp */ - su2double RampMUSCLPower; /*!< \brief Exponent by which to raise the MUSCL ramp to the power of */ - MUSCL_RAMP_TYPE Kind_MUSCLRamp; - unsigned long rampMUSCLCoeff[3]; /*!< \brief ramp MUSCL value coefficients for the COption class. */ ENUM_STREAMWISE_PERIODIC Kind_Streamwise_Periodic; /*!< \brief Kind of Streamwise periodic flow (pressure drop or massflow) */ bool Streamwise_Periodic_Temperature; /*!< \brief Use real periodicity for Energy equation or otherwise outlet source term. */ @@ -5203,14 +5205,6 @@ class CConfig { else return 0; }; - /*! - * \brief Interface for accessing MUSCL ramp coefficient information - * \return coeff for ramps - */ - unsigned long GetMUSCLRampCoeff(RAMP_COEFF val_coeff) const { - return rampMUSCLCoeff[val_coeff]; - } - /*! * \brief Set MUSCL ramp value. */ @@ -5223,16 +5217,10 @@ class CConfig { su2double GetMUSCLRampValue(void) const { return rampMUSCLValue; } /*! - * \brief Get MUSCL ramp power. - * \return Ramp MUSCL power - */ - su2double GetMUSCLRampPower(void) const { return RampMUSCLPower; } - - /*! - * \brief Get MUSCL ramp kind. + * \brief Get MUSCL ramp paramaters. * \return Ramp MUSCL kind */ - MUSCL_RAMP_TYPE GetKindMUSCLRamp(void) const { return Kind_MUSCLRamp; } + const CMUSCLRampParam& GetMUSCLRampParam(void) const { return RampMUSCLParam; } /*! * \brief Generic interface for setting monitor outlet values for the ramp. diff --git a/Common/src/CConfig.cpp b/Common/src/CConfig.cpp index 0dad2e3a9135..63b6e11f97ac 100644 --- a/Common/src/CConfig.cpp +++ b/Common/src/CConfig.cpp @@ -1997,12 +1997,12 @@ void CConfig::SetConfig_Options() { addBoolOption("RAMP_MUSCL", RampMUSCL, false); /*! brief RAMP_OUTLET_COEFF \n DESCRIPTION: the 1st coeff is the ramp start iteration, * the 2nd coeff is the iteration update frequenct, 3rd coeff is the total number of iterations */ - rampMUSCLCoeff[0] = 0.0; rampMUSCLCoeff[1] = 1.0; rampMUSCLCoeff[2] = 500.0; - addULongArrayOption("RAMP_MUSCL_COEFF", 3, false, rampMUSCLCoeff); + RampMUSCLParam.rampMUSCLCoeff[0] = 0.0; RampMUSCLParam.rampMUSCLCoeff[1] = 1.0; RampMUSCLParam.rampMUSCLCoeff[2] = 500.0; + addULongArrayOption("RAMP_MUSCL_COEFF", 3, false, RampMUSCLParam.rampMUSCLCoeff); /*!\brief RAMP_MUSCL_POWER \n DESRCIPTION: Exponent of the MUSCL ramp formulation */ - addDoubleOption("RAMP_MUSCL_POWER", RampMUSCLPower, 1.0); + addDoubleOption("RAMP_MUSCL_POWER", RampMUSCLParam.RampMUSCLPower, 1.0); /*!\brief KIND_MUSCL_RAMP \n DESCRIPTION: The kind of MUSCL Ramp to be applied */ - addEnumOption("KIND_MUSCL_RAMP", Kind_MUSCLRamp, MUSCLRamp_Map, MUSCL_RAMP_TYPE::ITERATION); + addEnumOption("KIND_MUSCL_RAMP", RampMUSCLParam.Kind_MUSCLRamp, MUSCLRamp_Map, MUSCL_RAMP_TYPE::ITERATION); /*!\brief SLOPE_LIMITER_FLOW * DESCRIPTION: Slope limiter for the direct solution. \n OPTIONS: See \link Limiter_Map \endlink \n DEFAULT VENKATAKRISHNAN \ingroup Config*/ addEnumOption("SLOPE_LIMITER_FLOW", Kind_SlopeLimit_Flow, Limiter_Map, LIMITER::VENKATAKRISHNAN); @@ -4497,7 +4497,7 @@ void CConfig::SetPostprocessing(SU2_COMPONENT val_software, unsigned short val_i } if(RampMUSCL && !DiscreteAdjoint){ - if (RampMUSCLPower <= 0.0) SU2_MPI::Error("RAMP_MUSCL_POWER cannot be less than or equal to zero!"); + if (RampMUSCLParam.RampMUSCLPower <= 0.0) SU2_MPI::Error("RAMP_MUSCL_POWER cannot be less than or equal to zero!", CURRENT_FUNCTION); rampMUSCLValue = 0.0; } else { rampMUSCLValue = 1.0; diff --git a/SU2_CFD/src/iteration/CFluidIteration.cpp b/SU2_CFD/src/iteration/CFluidIteration.cpp index e1c60e2ea1bf..5b3fec0b1689 100644 --- a/SU2_CFD/src/iteration/CFluidIteration.cpp +++ b/SU2_CFD/src/iteration/CFluidIteration.cpp @@ -335,20 +335,20 @@ void CFluidIteration::UpdateRamp(CGeometry**** geometry_container, CConfig** con } if (ramp_flag == RAMP_TYPE::MUSCL) { - const long unsigned startIter = config->GetMUSCLRampCoeff(RAMP_COEFF::INITIAL_VALUE); - const long unsigned updateFreq = config->GetMUSCLRampCoeff(RAMP_COEFF::UPDATE_FREQ); - const long unsigned finalIter = config->GetMUSCLRampCoeff(RAMP_COEFF::FINAL_ITER); - const auto power = config->GetMUSCLRampPower(); + const auto RampMUSCLParam = config->GetMUSCLRampParam(); + const long unsigned startIter = RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::INITIAL_VALUE]; + const long unsigned updateFreq = RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::UPDATE_FREQ]; + const long unsigned finalIter = RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::FINAL_ITER]; auto iterFrac = (static_cast(iter - startIter)/static_cast(finalIter - startIter)); if (iter < startIter) return; if ((iter == startIter) && (rank == MASTER_NODE)) cout << "Beginning to ramp MUSCL scheme..." << endl; if ((iter % updateFreq == 0 && iter < finalIter) || (iter == finalIter)) { - switch (config->GetKindMUSCLRamp()) { + switch (RampMUSCLParam.Kind_MUSCLRamp) { case MUSCL_RAMP_TYPE::ITERATION: - config->SetMUSCLRampValue(std::pow(std::min(1.0, iterFrac), power)); + config->SetMUSCLRampValue(std::pow(std::min(1.0, iterFrac), RampMUSCLParam.RampMUSCLPower)); break; case MUSCL_RAMP_TYPE::SMOOTH_FUNCTION: - config->SetMUSCLRampValue(std::pow((0.5 * (1 - cos(M_PI * std::min(1.0, iterFrac)))), power)); + config->SetMUSCLRampValue(std::pow((0.5 * (1 - cos(M_PI * std::min(1.0, iterFrac)))), RampMUSCLParam.RampMUSCLPower)); break; default: break; From c33590db285003a4c3e0c42a4f0ef57dc00a2b0c Mon Sep 17 00:00:00 2001 From: Josh Kelly Date: Mon, 8 Dec 2025 21:58:46 +0000 Subject: [PATCH 09/13] fix testcase --- TestCases/turbomachinery/axial_stage_2D/Axial_stage2D.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/TestCases/turbomachinery/axial_stage_2D/Axial_stage2D.cfg b/TestCases/turbomachinery/axial_stage_2D/Axial_stage2D.cfg index f6708b26683c..957d2fdb6e1f 100755 --- a/TestCases/turbomachinery/axial_stage_2D/Axial_stage2D.cfg +++ b/TestCases/turbomachinery/axial_stage_2D/Axial_stage2D.cfg @@ -118,7 +118,6 @@ LIMITER_ITER= 999999 % CONV_NUM_METHOD_FLOW= ROE MUSCL_FLOW= YES -MUSCL_FLOW= YES RAMP_MUSCL= YES % NOTE: These coefficients are not practical for real calculations, this is for the purpose of regression testing. RAMP_MUSCL_COEFF= (0.0, 1.0, 20.0) From 19267a868c43f48717e352f999e395fcbb683cd9 Mon Sep 17 00:00:00 2001 From: Josh Kelly Date: Tue, 9 Dec 2025 07:56:20 +0000 Subject: [PATCH 10/13] Correction --- SU2_CFD/include/numerics_simd/flow/convection/common.hpp | 2 +- SU2_CFD/include/solvers/CSolver.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SU2_CFD/include/numerics_simd/flow/convection/common.hpp b/SU2_CFD/include/numerics_simd/flow/convection/common.hpp index a96cc056055d..08c1d67511c0 100644 --- a/SU2_CFD/include/numerics_simd/flow/convection/common.hpp +++ b/SU2_CFD/include/numerics_simd/flow/convection/common.hpp @@ -74,7 +74,7 @@ FORCEINLINE Double musclReconstruction(const GradType& grad, Double relax, Double ramp_val) { const Double proj = dot(grad[iVar], vector_ij); - return relax * umusclProjection(proj, delta, kappa); + return ramp_val * relax * umusclProjection(proj, delta, kappa); } /*! diff --git a/SU2_CFD/include/solvers/CSolver.hpp b/SU2_CFD/include/solvers/CSolver.hpp index 4fcecf4f7a15..884671abf369 100644 --- a/SU2_CFD/include/solvers/CSolver.hpp +++ b/SU2_CFD/include/solvers/CSolver.hpp @@ -592,7 +592,7 @@ class CSolver { */ inline su2double MUSCL_Reconstruction(const su2double* grad, const su2double* vector_ij, su2double delta_ij, su2double kappa, su2double ramp_val) { su2double project_grad = GeometryToolbox::DotProduct(nDim, grad, vector_ij); - return LimiterHelpers<>::umusclProjection(project_grad, delta_ij, kappa); + return ramp_val * LimiterHelpers<>::umusclProjection(project_grad, delta_ij, kappa); } /*! From 3383a950d2fbf95b51b81bd698125b970e1bc158 Mon Sep 17 00:00:00 2001 From: Josh Kelly Date: Tue, 9 Dec 2025 15:49:22 +0000 Subject: [PATCH 11/13] Update reg test values --- TestCases/hybrid_regression.py | 2 +- TestCases/parallel_regression.py | 2 +- TestCases/serial_regression.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/TestCases/hybrid_regression.py b/TestCases/hybrid_regression.py index c7ad4c989645..312b2b66cfb3 100644 --- a/TestCases/hybrid_regression.py +++ b/TestCases/hybrid_regression.py @@ -564,7 +564,7 @@ def main(): axial_stage2D.cfg_dir = "turbomachinery/axial_stage_2D" axial_stage2D.cfg_file = "Axial_stage2D.cfg" axial_stage2D.test_iter = 20 - axial_stage2D.test_vals = [1.084448, 1.526930, -2.895083, 2.607569, -2.479664, 3.063779, 106380.000000, 106380.000000, 5.733600, 64.737000] + axial_stage2D.test_vals = [1.065797, 1.519589, -2.928280, 2.573904, -2.526637, 3.017140, 106370.000000, 106370.000000, 5.726800, 64.383000] test_list.append(axial_stage2D) # 2D transonic stator restart diff --git a/TestCases/parallel_regression.py b/TestCases/parallel_regression.py index c96bc56ac810..fb89f7ba1655 100644 --- a/TestCases/parallel_regression.py +++ b/TestCases/parallel_regression.py @@ -1108,7 +1108,7 @@ def main(): axial_stage2D.cfg_dir = "turbomachinery/axial_stage_2D" axial_stage2D.cfg_file = "Axial_stage2D.cfg" axial_stage2D.test_iter = 20 - axial_stage2D.test_vals = [1.084454, 1.526942, -2.895082, 2.607570, -2.479664, 3.063779, 106380.000000, 106380.000000, 5.733600, 64.737000] + axial_stage2D.test_vals = [1.065803, 1.519598, -2.928278, 2.573906, -2.526640, 3.017138, 106370.000000, 106370.000000, 5.726800, 64.383000] test_list.append(axial_stage2D) # 2D transonic stator restart diff --git a/TestCases/serial_regression.py b/TestCases/serial_regression.py index 94bc257ddb8c..f4005b3cb1b7 100644 --- a/TestCases/serial_regression.py +++ b/TestCases/serial_regression.py @@ -875,7 +875,7 @@ def main(): axial_stage2D.cfg_dir = "turbomachinery/axial_stage_2D" axial_stage2D.cfg_file = "Axial_stage2D.cfg" axial_stage2D.test_iter = 20 - axial_stage2D.test_vals = [1.084452, 1.526941, -2.895084, 2.607568, -2.479664, 3.063779, 106380.000000, 106380.000000, 5.733600, 64.737000] + axial_stage2D.test_vals = [1.065801, 1.519596, -2.928281, 2.573903, -2.526639, 3.017139, 106370.000000, 106370.000000, 5.726800, 64.383000] test_list.append(axial_stage2D) # 2D transonic stator restart From e973bc4f6f2cfc3ae2bdfa078cd95459ffae2e46 Mon Sep 17 00:00:00 2001 From: Josh Kelly Date: Wed, 10 Dec 2025 07:55:37 +0000 Subject: [PATCH 12/13] Added config preprocessing output --- Common/src/CConfig.cpp | 15 +++++++++++++++ SU2_CFD/src/iteration/CFluidIteration.cpp | 6 +++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Common/src/CConfig.cpp b/Common/src/CConfig.cpp index 63b6e11f97ac..c83a15418195 100644 --- a/Common/src/CConfig.cpp +++ b/Common/src/CConfig.cpp @@ -6992,6 +6992,21 @@ void CConfig::SetOutput(SU2_COMPONENT val_software, unsigned short val_izone) { auto PrintLimiterInfo = [&](const LIMITER kind_limiter, const su2double kappa) { cout << "Second order integration in space, with slope limiter.\n"; + if (RampMUSCL) { + cout << "Ramping MUSCL sheme from first to second order starting at iter " << RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::INITIAL_VALUE] + << ", ending at iter " << RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::FINAL_ITER] + RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::INITIAL_VALUE] + << ", updating every " << RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::UPDATE_FREQ] << " iterations." << endl; + string MUSCLRampType; + switch (RampMUSCLParam.Kind_MUSCLRamp) { + case MUSCL_RAMP_TYPE::ITERATION: + MUSCLRampType = "linear"; + break; + case MUSCL_RAMP_TYPE::SMOOTH_FUNCTION: + MUSCLRampType = "cosine"; + break; + } + cout << "Ramp applied according to a " << MUSCLRampType << " function, raised to the power " << RampMUSCLParam.RampMUSCLPower << "." << endl; + } if (kappa != 0.0) cout << "U-MUSCL reconstruction, with coefficient: " << kappa << ".\n"; switch (kind_limiter) { case LIMITER::NONE: diff --git a/SU2_CFD/src/iteration/CFluidIteration.cpp b/SU2_CFD/src/iteration/CFluidIteration.cpp index 5b3fec0b1689..fea25ba3b45d 100644 --- a/SU2_CFD/src/iteration/CFluidIteration.cpp +++ b/SU2_CFD/src/iteration/CFluidIteration.cpp @@ -338,11 +338,11 @@ void CFluidIteration::UpdateRamp(CGeometry**** geometry_container, CConfig** con const auto RampMUSCLParam = config->GetMUSCLRampParam(); const long unsigned startIter = RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::INITIAL_VALUE]; const long unsigned updateFreq = RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::UPDATE_FREQ]; - const long unsigned finalIter = RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::FINAL_ITER]; - auto iterFrac = (static_cast(iter - startIter)/static_cast(finalIter - startIter)); + const long unsigned rampLength = RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::FINAL_ITER]; + auto iterFrac = (static_cast(iter - startIter)/static_cast((rampLength + startIter) - startIter)); if (iter < startIter) return; if ((iter == startIter) && (rank == MASTER_NODE)) cout << "Beginning to ramp MUSCL scheme..." << endl; - if ((iter % updateFreq == 0 && iter < finalIter) || (iter == finalIter)) { + if ((iter % updateFreq == 0 && iter < (rampLength + startIter)) || (iter == (rampLength + startIter))) { switch (RampMUSCLParam.Kind_MUSCLRamp) { case MUSCL_RAMP_TYPE::ITERATION: config->SetMUSCLRampValue(std::pow(std::min(1.0, iterFrac), RampMUSCLParam.RampMUSCLPower)); From 036af7cabbdc9254b8423e6f89f84fb697b3e3eb Mon Sep 17 00:00:00 2001 From: Josh Kelly Date: Wed, 10 Dec 2025 14:42:22 +0000 Subject: [PATCH 13/13] formatting --- Common/src/CConfig.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/src/CConfig.cpp b/Common/src/CConfig.cpp index c83a15418195..013609ef7d9c 100644 --- a/Common/src/CConfig.cpp +++ b/Common/src/CConfig.cpp @@ -6993,7 +6993,7 @@ void CConfig::SetOutput(SU2_COMPONENT val_software, unsigned short val_izone) { auto PrintLimiterInfo = [&](const LIMITER kind_limiter, const su2double kappa) { cout << "Second order integration in space, with slope limiter.\n"; if (RampMUSCL) { - cout << "Ramping MUSCL sheme from first to second order starting at iter " << RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::INITIAL_VALUE] + cout << "Ramping MUSCL sheme from first to second order starting at iter " << RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::INITIAL_VALUE] << ", ending at iter " << RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::FINAL_ITER] + RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::INITIAL_VALUE] << ", updating every " << RampMUSCLParam.rampMUSCLCoeff[RAMP_COEFF::UPDATE_FREQ] << " iterations." << endl; string MUSCLRampType; @@ -7001,7 +7001,7 @@ void CConfig::SetOutput(SU2_COMPONENT val_software, unsigned short val_izone) { case MUSCL_RAMP_TYPE::ITERATION: MUSCLRampType = "linear"; break; - case MUSCL_RAMP_TYPE::SMOOTH_FUNCTION: + case MUSCL_RAMP_TYPE::SMOOTH_FUNCTION: MUSCLRampType = "cosine"; break; }