Repository navigation
Conversation
After LIMITER_ITER the scalar flux kernel set its limiter type to NONE, so the turbulence and species reconstruction was no longer limited at all, while the flow solvers keep applying the last stored limiter. The scalar limiter is now frozen in the same way: CScalarSolver stops recomputing it and the kernel keeps applying it. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
The scalar flux kernel already applies the edge limiter, but CScalarSolver still computed point limiters for it and stopped with "Unknown limiter type". The point limiter and its volume outputs are now skipped for VAN_ALBADA_EDGE, as in the flow solvers. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
…structs GetReconstructionGradientRequired is true for the whole case as soon as the flow uses a separate reconstruction gradient, so e.g. SST with MUSCL_TURB= NO computed an unused least-squares gradient at every iteration. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
…e flow does The velocity that convects the scalars was reconstructed without any limiter when the flow used VAN_ALBADA_EDGE. The edge limiter needs no stored values, so it is now applied as in the flow. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
The divergence correction of BOUNDED_SCALAR cancels the part of the upwind flux due to the discrete divergence of the mass flux, so it must use the coefficients of that flux: - SA is not conservative: its flux uses the volume flux mdot+/rho_i + mdot-/rho_j, while the correction used the mass flux, so the correction was rho times too large (e.g. ~1000 for water); - SST, transition and species are conservative: the residual was right, but the Jacobian with respect to rho*phi must be -mdot/rho_i, not -mdot. With rho = 1 nothing changes. With dimensional water (rho = 998.2) the bounded SA flat plate stalled and gave a CD 5% off, now it converges like the non-dimensional case. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
…bounds The MUSCL reconstruction of the turbulence and species variables was not kept within the bounds that clip the solution (e.g. k, omega > 0). In regions where a variable is small and varies a lot, like the decaying omega of the far field on coarse cells, the face values became negative, omega was clipped to its floor and the eddy viscosity grew without limit. The SST NACA0012 at 10 deg with MUSCL_TURB and VENKATAKRISHNAN_WANG did not converge (CD 0.47 after 10000 iterations instead of 0.0158). A face value outside [lowerlimit, upperlimit] of its variable now falls back to the point value. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
SST NACA0012 from the converged restart, with MUSCL_TURB and VAN_ALBADA_EDGE for both the flow and the turbulence, and LIMITER_ITER = 3. It stops with "Unknown limiter type" on develop, and its values change if the limiter is switched off after LIMITER_ITER again or if the flow edge limiter is not applied to the velocity of the turbulence flux. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
…nterfaces At a fluid interface the scalar flux of each donor is weighted by its interpolation weight, but the bounded scalar correction was added with weight 1 for every donor, so with several donors (e.g. KIND_INTERPOLATION= WEIGHTED_AVERAGE) it was counted about as many times as there are donors. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
The epsilon of the Venkatakrishnan and Nishikawa limiters is an absolute number, suited to flow variables of size about 1. The turbulence variables have units and span orders of magnitude, so the limiter did nothing on nu~ (about 1e-5) and acted like Barth-Jespersen on omega (about 1e8); the result also depended on the units of the case. Following Luke (AIAA 2007-3956) and Nishikawa, White and O'Connell (2023), the differences are now divided by max(|phi|, phi_inf) of the point before the limiter function, for the turbulence and transition solvers. Wang's limiter, already relative to the range of the field, and the flow and species solvers are not changed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013UkNcoCEH8nFNrHWzhJCar
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013UkNcoCEH8nFNrHWzhJCar
|
Added the full convergence cases in 732528a: SA NACA0012, SST flat plate, SST NACA0012, and its frozen-limiter counterpart. The existing short SA/SST MPI regressions already cover stored point limiting with The updated PR description includes the comparison against For SST NACA0012, turbulence MUSCL is enabled. At CFL 1000 with the Venkatakrishnan coefficient 0.03, continuously updated limiting stalls near log10 RMS density -10. The wake diagnostics show a k-limiter change of about 0.103 and nine reconstructed faces crossing the lower k bound between consecutive stalled steps. The positivity fallback then switches some faces to their first-order nodal values, near the largest density residuals. This supports a nonlinear reconstruction cycle; the approximate implicit Jacobian omits reconstruction dependence, but a complete root cause and a general code fix have not been validated. The workaround for now is Validation of this update: all four added configurations match the completed full runs exactly in every numerical option; the SST pair differs only in |
The scalar review change replaced the VAN_ALBADA_EDGE form in the shared muscl helper, which also changed the SIMD flow reconstruction and stopped the 30P30N and DSMA661 V&V cases from converging. The flow form (delta^2 + 1e-6) is restored for the flow solver and for the flow velocity and density that the scalar convection reconstructs, so both see the same face values. Only the transported scalars use the van Albada function of the point limiters, selected with MusclLimiter::EDGE_SCALAR. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With the flow van Albada edge limiter restored, 30P30N, DSMA661, the flat plate, bump and SWBLI V&V cases and the axial stage adjoint return to the references they had before the scalar review change. The NACA0012 MUSCL edge test now uses the flow form for the flow and the point-limiter van Albada function for the turbulence variables. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Values from CI run 38717278593 for rae2822_sst (serial, hybrid), species2_primitiveVenturi_JST, species2_primitiveVenturi_Lax_Friedrich and species_active_transport_temp_limits (parallel). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One flow-limiter face cancels to zero in exact arithmetic, so its value is only rounding, which depends on the compiler. Use a margin far above that rounding and a tight relative tolerance. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r2956_flow_vanalbada # Conflicts: # TestCases/hybrid_regression.py # TestCases/parallel_regression.py # TestCases/serial_regression.py # TestCases/tutorials.py # TestCases/vandv.py
|
@rois1995 does this need more work/tuning? because for the naca0012 the results are worse than with #2956 and it needs a magic number to stop the limiter update after iteration 500. In #2931 I had difficulty with the flat plate leading edge and certain meshes when MUSCL was on, so at these edges I switch to first order. Can you have a look and let me know if my switch to first order is still necessary? Are your difficult cells located at and near the leading edge? |
|
@bigfooted Yes, the SST NACA0012 case needs more work before this can be merged. The difficult cells are not at the leading edge:
Your first-order switch in #2931 is for the flow at wall ends. This PR only changes the turbulence limiters, so it does not replace your switch. I did not test your flat plate case with #2956 and this PR. Can you share it? |
# Conflicts: # SU2_CFD/src/output/CFlowOutput.cpp # SU2_CFD/src/variables/CSpeciesVariable.cpp # TestCases/parallel_regression.py
# Conflicts: # UnitTests/meson.build
|
@bigfooted should we merge this? Further investigation would require examining the non-linear updates of the turbulence equations, and I think that is outside the scope of this PR. |
# Conflicts: # TestCases/parallel_regression.py # TestCases/serial_regression.py # TestCases/tutorials.py # TestCases/vandv.py
# Conflicts: # TestCases/parallel_regression.py # UnitTests/meson.build

Turbulence and transition variables can differ by many orders of magnitude, but the stored Venkatakrishnan/Nishikawa point limiters currently use an absolute epsilon. Changing the units of the same field can therefore change the limiting.
Normalize the projected increments and neighbor differences by
max(abs(local value), abs(freestream value))for turbulence/transition point limiters. Retain the zero-scale fallback, leave Wang's range-relative epsilon unchanged, and register the reference value as an AD preaccumulation input. Other solver families retain their existing epsilon behavior.Adds unit tests for SA/SST in 2D/3D, field scales from
1e-12to1e12, signed/zero/tiny references, constant fields and Wang compatibility. The derivative test checks the actual limiter computation against finite differences and is registered for both reverse and forward builds. Adds two MPI NACA0012 regression cases for SA/SST with point limiting andLIMITER_ITER=3.Adds four reproducible full convergence configurations for SA NACA0012, SST flat plate, and SST NACA0012 with continuously updated or frozen point limiting. These are manual convergence benchmarks; the existing ten-iteration regressions retain
LIMITER_ITER=3. Exact configurations, input checksums, full histories and plots record the comparison atdevelop3aa1a95558, #2956a3968c9495, and this PR's numerical headf1b5967a57(the new commit only adds cases/documentation).Counts include iteration zero and measure the density stopping criterion, not convergence of every turbulence residual. These results show a case-dependent improvement, rather than a universal acceleration.
SST NACA0012 limitation and current workaround: with
MUSCL_TURB=YES,VENKATAKRISHNAN, coefficient 0.03 and fixed CFL 1000, continually updating the limiter produces a nonlinear wake cycle. Consecutive stalled steps show k-limiter changes and reconstructed faces switching across the k positivity bound to first-order fallback near the largest density residuals. The implicit convective Jacobian omits reconstruction dependence, a plausible contributor; the complete cause and a general code correction remain unvalidated. For this configuration, setLIMITER_ITER=500, keeping turbulence MUSCL enabled: the stored limiter continues to be applied and the density target is reached in 620 iterations. This is the current workaround, with a dedicatedsst_naca_frozen500.cfg; the detailed evidence and control experiments are in the linked README. Edge-basedVAN_ALBADA_EDGEis not frozen by this setting.Validation:
Local builds use GCC 9 with MLPCpp disabled; its existing fluid units were excluded. Forward AD, ARM64 and the complete regression matrix were not run locally. The repository regression workflow only triggers for PRs targeting
develop/master; its matrix will run when this PR is retargeted after #2956 merges.Depends on #2956. This PR targets
fix_scalar_musclto keep the epsilon improvement separate; retarget todevelopafter #2956 merges.