Repository navigation
Conversation
…ons based on k and w - Added computation of k and w starting from SA variables - Added first implementation of SAS (Scale Adaptive Simulation) model
- Changed previous SAS model to SAS_SIMPLE
- Fixed DataType for Periodic Comms
…lified IDDES (SIDDES)
| SAS_SIMPLE, /*!< \brief Menter k-w SST model with Scale Adaptive Simulations modifications. */ | ||
| SAS_COMPLICATED, /*!< \brief Menter k-w SST model with Scale Adaptive Simulations modifications. */ |
There was a problem hiding this comment.
Are these the names in the literature?
There was a problem hiding this comment.
No, these are just placeholders. There are no names in literature, that is why I named them according to the complexity of the model
There was a problem hiding this comment.
Maybe something after the authors since the models come from different papers.
| SST_OPTIONS sasModel = SST_OPTIONS::SAS_SIMPLE; /*!< \brief Enum SST base model. */ | ||
| bool sust = false; /*!< \brief Bool for SST model with sustaining terms. */ | ||
| bool uq = false; /*!< \brief Bool for using uncertainty quantification. */ | ||
| bool sas = false; /*!< \brief Bool for using Scale Adaptive Simulations. */ |
There was a problem hiding this comment.
Probably the type is enough and "none" indicates no sas.
| SST_OPTIONS sasModel = SST_OPTIONS::SAS_SIMPLE; /*!< \brief Enum SST base model. */ | |
| bool sust = false; /*!< \brief Bool for SST model with sustaining terms. */ | |
| bool uq = false; /*!< \brief Bool for using uncertainty quantification. */ | |
| bool sas = false; /*!< \brief Bool for using Scale Adaptive Simulations. */ | |
| SST_OPTIONS sasModel = SST_OPTIONS::NONE; /*!< \brief Enum SST base model. */ | |
| bool sust = false; /*!< \brief Bool for SST model with sustaining terms. */ | |
| bool uq = false; /*!< \brief Bool for using uncertainty quantification. */ |
There was a problem hiding this comment.
Sure, I'll modify it.
| case SST_DDES: cout << "Delayed Detached Eddy Simulation (DDES) with Shear-layer Adapted SGS" << endl; break; | ||
| case SST_IDDES: cout << "Delayed Detached Eddy Simulation (DDES) with Shear-layer Adapted SGS" << endl; break; | ||
| case SST_SIDDES: cout << "Delayed Detached Eddy Simulation (DDES) with Shear-layer Adapted SGS" << endl; break; |
There was a problem hiding this comment.
The description is slightly different right?
There was a problem hiding this comment.
Yes, I planned to modify the details on the final implementation. I'll do it now
|
|
||
| su2double lengthScale_i, lengthScale_j; | ||
| su2double FTrans; /*!< \brief SAS function */ | ||
| su2double VelLapl_X, VelLapl_Y, VelLapl_Z; |
There was a problem hiding this comment.
Use a matrix type for the laplacian in CVariable and here you can have a pointer instead.
Put these variables close to other turbulence variables please.
There was a problem hiding this comment.
I think the main problem with my implementation is that the norm of the velocity laplacian stated in the paper is
There was a problem hiding this comment.
That looks like the norm of the Laplacian of the velocity components, the way you are computing it is not very accurate but maybe it is good enough. You could do it the finite volume way by reusing the numerics classes we use for scalar viscous fluxes.
| su2double VelLaplMag = VelLapl_X*VelLapl_X + VelLapl_Y*VelLapl_Y; | ||
| if (nDim == 3) VelLaplMag += VelLapl_Z*VelLapl_Z; | ||
| const su2double L_vK_1 = KolmConst * StrainMag_i / sqrt(VelLaplMag); |
There was a problem hiding this comment.
Is the velocity laplacian only used for the source term? Or will you have changes to the convection or diffusion fluxes?
There was a problem hiding this comment.
It is just for the source term
| /*! | ||
| * \brief Get the value of the turbulence kinetic energy. | ||
| * \return the value of the turbulence kinetic energy. | ||
| */ | ||
| inline su2double GetSSTVariables_k(unsigned long iPoint) const { return k(iPoint); } | ||
|
|
||
| /*! | ||
| * \brief Get the value of the turbulence frequency Omega. | ||
| * \return the value of the turbulence frequency Omega. | ||
| */ | ||
| inline su2double GetSSTVariables_omega(unsigned long iPoint) const { return Omega(iPoint); } | ||
|
|
||
| /*! | ||
| * \brief Set the value of the SST variables computed with SA solution. | ||
| * \param[in] val_k | ||
| * \param[in] val_Omega | ||
| */ | ||
| void SetSSTVariables(unsigned long iPoint, su2double val_k, su2double val_Omega) { | ||
| k(iPoint) = val_k; |
There was a problem hiding this comment.
Are these changes related to the main theme? or were just debugging? If they can be separated to another PR let's do that please.
There was a problem hiding this comment.
These are for computing the grid size for scale resolving simulations from an SA solution. Probably it has to be revised a little bit, since I found out that the formulation for the TKE is different if the QCR mod is used, thus I think I'll remove them for now.
There was a problem hiding this comment.
You need to undo this change to the codi version.
| inline virtual su2double GetVelLapl_X(unsigned long iPoint) const { return 0.0; } | ||
| /*! | ||
| * \brief Get the value of the value of FTrans. | ||
| */ | ||
| inline virtual su2double GetVelLapl_Y(unsigned long iPoint) const { return 0.0; } | ||
| /*! | ||
| * \brief Get the value of the value of FTrans. | ||
| */ | ||
| inline virtual su2double GetVelLapl_Z(unsigned long iPoint) const { return 0.0; } | ||
|
|
||
| /*! | ||
| * \brief Set the value of the value of FTrans. | ||
| */ | ||
| inline virtual void AddVelLapl(unsigned long iPoint, su2double val_VelLapl_X, su2double val_VelLapl_Y) {} | ||
| /*! | ||
| * \brief Set the value of the value of FTrans. | ||
| */ | ||
| inline virtual void AddVelLapl_Z(unsigned long iPoint, su2double val_VelLapl_Z) {} | ||
| /*! | ||
| * \brief Set the value of the value of FTrans. | ||
| */ | ||
| inline virtual void SetVelLapl(unsigned long iPoint, su2double val_VelLapl_X, su2double val_VelLapl_Y) {} |
There was a problem hiding this comment.
Use a pointer for velocity and then you only need one of each function instead of handling xyz separately.
There was a problem hiding this comment.
Yeah, I'll try using the matrix type
- Changed names of SAS models - Added descriptions of functions - Clean up of output functions - Removed SA functions or SST variables
| /*--- If iPoint is boundary it only takes contributions from other boundary points. ---*/ | ||
| if (boundary_i && !boundary_j) continue; | ||
|
|
||
| /*--- Add solution differences, with correction for compressible flows which use the enthalpy. ---*/ |
There was a problem hiding this comment.
Check if comments need updates please
|
Hi @rois1995 any progress? Would be very interesting to add this to develop, looking forward to using it actually. |
Hi @bigfooted, unfortunately I do not have enough time/computational power to perform a proper validation. I only tried something with a NACA0021 at 17 deg and 60 deg and they were promising, at least for the DDES implementation. The SAS ones are not that good. I'll upload some post-processing as soon as I have the time to do so. |
|
I find your work really interesting. I've been studying the internal flow field in compressors and have had good results using SU2's SA_EDDES for calculating the cantilevered stator with a tip clearance. If you need help with code verification, I'd be glad to assist. |
Hi @Linnnnnn23, every help on the validation/verification is gladly accepted! Let me know if you need anything by my side. |
|
|
Hi @rois1995 , I'd like to help with validation/verification if I can. Let me know if you are interested. You can contact me at berkecancfd@gmail.com. |
Hi @rois1995, I believe there is an error or a typo in the Babu's paper in the Q_SAS source term and in turn in your implementation, which may be the reason for the poor performance in SAS results. This term changes units depending on the output of the max function, which doesn't make any sense. I believe the terms in the max function should be divided by omega^2 and k^2 instead of omega and k, respectively. Which is exactly how it is done in https://resolver.tudelft.nl/uuid:5d23e2a6-5675-450d-bf3d-1dd40d736cae I will try some of the benchmark cases in these papers when I have the time. Let me know what you think. [edit: fixed the link to the tudelft repository] |
|
Pushed e9e8568: vortex tilting now uses |
LES_SENSOR was always 0 with the SST hybrid models because only the SA variable stored the sensor. The storage moves to CTurbVariable and the SST length-scale routine now sets it with the same meaning as for SA: the weight of the LES branch where the LES length is the shorter one, and 0 elsewhere. That is f_d for SST_DDES and SST_EDDES, and 1 - ftilda_d for SST_IDDES and SST_SIDDES, whose length scale is a blend of the two. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013YFdgQwrRqCQ2ihG446aNe
…umulation With an SST hybrid model the k destruction uses the hybrid length scale, which depends on the flow and turbulence solution. It was not declared as a preaccumulation input, so the discrete adjoint lost its sensitivities. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013YFdgQwrRqCQ2ihG446aNe
With an SST hybrid model the k destruction is rho k^(3/2) / l_hyb, but the Jacobian kept the RANS form beta* omega k. With the length scale frozen, the derivative with respect to rho k is 1.5 sqrt(k) / l_hyb and there is no dependence on omega. Only the Jacobian changes, not the residual. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013YFdgQwrRqCQ2ihG446aNe
With SST_OPTIONS= COMPRESSIBILITY-WILCOX or COMPRESSIBILITY-SARKAR the RANS k destruction is multiplied by (1 + zetaFMt), but the hybrid form rho k^(3/2) / l_hyb dropped this factor, so the hybrid models did not reduce to the corrected RANS model where l_hyb = l_RANS. The factor is now applied to the hybrid destruction and to its Jacobian. Without these options zetaFMt is 0 and nothing changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013YFdgQwrRqCQ2ihG446aNe
…brid model The stochastic backscatter model solves its Langevin equations as extra variables of the SA solver, and the flow solver reads them as turbulence variables 1 to 3. With an SST hybrid model these are not there (SST has two variables), so the flow residual read wrong data or out of range. STOCHASTIC_BACKSCATTER= YES now needs an SA hybrid model. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013YFdgQwrRqCQ2ihG446aNe
The SST hybrid models compute their length scale from the grid with the blended constant C_DES = 0.78 F1 + 0.61 (1 - F1). They silently ignored DES_CONST, LES_FILTER_WIDTH and ENFORCE_LES, while the screen output still said "LES enforced in the whole computational domain". CConfig now stops with a clear message when ENFORCE_LES= YES, a positive LES_FILTER_WIDTH or DES_CONST is given with an SST hybrid model, and prints which DES constant is used. The option descriptions and config_template.cfg say which models use these options. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013YFdgQwrRqCQ2ihG446aNe
GRAD_VEL_YX holds dv/dx (velocity gradient entry (1,0)) but was described as the X-gradient of U. The other velocity-gradient descriptions match their entries. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013YFdgQwrRqCQ2ihG446aNe
The SST length-scale loop ran over all points, halos included, without communication. On halo points the neighbourhood is incomplete, so the SST_EDDES length scale (control-volume vertices and averaged vortex tilting) was computed from partial data there. The halo values are not used today (the source term and the output only read domain points), but as for SA the loop now covers the domain points and the halo values are received from the owning rank. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013YFdgQwrRqCQ2ihG446aNe
…obian Only the Jacobian of the hybrid k destruction changes the convergence of the four SST ONERA M6 cases; the SA cases are unchanged. The values come from local builds (gcc 9.4, release -O2, -march=native): serial and mpirun -n 2 with the MPI build, -t 2 with the OpenMP build. The baseline local values of the branch head matched the stored values exactly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013YFdgQwrRqCQ2ihG446aNe
|
While documenting the SST hybrid models I found and fixed these bugs:
About the compressibility corrections in DES mode: the literature does not agree. Forsythe et al. (2002) put the SST correction only into the RANS length scale, so it switches off in LES mode. Xiao and Fu (2009) keep it everywhere. Since this choice needs its own validation, this PR blocks the combination for SST. SA with |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013YFdgQwrRqCQ2ihG446aNe
…f SST" How the SST compressibility corrections should act in the LES region needs its own validation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013YFdgQwrRqCQ2ihG446aNe
…ybrid models Their treatment in the LES region is not validated yet (Forsythe et al. 2002 keep them only in the RANS length scale, others keep them everywhere). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013YFdgQwrRqCQ2ihG446aNe
…used Restore omega * omega and Mt * Mt instead of pow(x, 2), and set the hybrid k-destruction Jacobian as an override of the RANS one. With fast-math the old forms changed the rounding of plain SST runs (transitional_flatplate_tutorial_T3Am). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013YFdgQwrRqCQ2ihG446aNe
|
The NACA 0021 comparison and website page are now prepared: case preview and website PR #223. The page includes the setup, configuration, mesh and flow pictures, forces, pressure distributions and lift spectra for SA-DDES, SA-EDDES, SST-DDES and SST-EDDES. All four use the same 520 c/U averaging interval, with estimates of sampling error. This covers one mesh with a span of one chord. Mesh, time-step and inner-iteration studies are still needed; the page makes those limits explicit. It also identifies the dependency on this PR. The case is separate from the broader documentation update. We will open a separate PR in |
|
@bigfooted @EvertBunschoten, this PR is ready for review. The results are in the SU2 documentation. |
# Conflicts: # TestCases/serial_regression.py
There was a problem hiding this comment.
Thanks for this, the SST DDES/IDDES formulation looks sound overall. I checked it against Gritskevich et al. (2012) and Shur et al. (2008, 2015). DDES (r_d, f_d with C_d1=20, C_d2=3), the blended C_DES = 0.78 F1 + 0.61 (1-F1), the IDDES functions (alpha, f_b, f_dt, f~_d, f_e1, f_e2, f_l, f_t) and the k-destruction rho k^{3/2}/l_hyb with its Jacobian (1.5 sqrt(k)/l, no omega dependence) all match. Registering the length scale as a preaccumulation input is correct.
Points that need attention before merge (details are in the inline comments):
Must fix
- NTS low-dissipation blending (
CNSSolver::SetRoe_Dissipation,config->GetConst_DES()) still uses the SA constant 0.65 for the SST hybrids, while DES_CONST is now forbidden for them. It should use the F1-blended C_DES. - The IDDES/SIDDES filter width is missing h_wn: Delta = min{max[C_w d_w, C_w h_max, h_wn], h_max}.
- l_RANS and l_hyb have no lower bound, so k -> 0 gives 0/0 in the k-destruction term.
Scope
- The new outputs
GRAD_VEL_*,CDkw/F1/F2, an always-onWALL_DISTANCE,LESIQandSRS_GRID_SIZE(which has a hardcoded ratio and a TODO) are not part of the feature. Check if they belong in this PR.
Validation
- The new tests are 5-iteration ONERA M6 restarts, which only guard against regressions. A validation case would help: a backward-facing step, a periodic channel (for the IDDES WMLES branch), or decaying isotropic turbulence (for C_DES). The IDDES RMS_TKE (+3.06, against -0.78 for DDES on the same restart) is worth a look. But maybe the V&V testcase is sufficient...
- Making TIME_DOMAIN mandatory for all hybrid models, including SA, is a behaviour change. Please mention it in the PR description.
| with: | ||
| # -t <Tutorials-branch> -c <Testcases-branch> | ||
| args: -b ${{github.ref}} -t develop -c develop -s ${{matrix.testscript}} | ||
| args: -b ${{github.ref}} -t develop -c feature_SST_IDDES -s ${{matrix.testscript}} |
There was a problem hiding this comment.
Points at the feature_SST_IDDES Testcases branch (also lines 287, 337, 382). Revert to develop before merge.
There was a problem hiding this comment.
Agreed. I am keeping the test branch until TestCases #206 merges; I will switch back to develop before merging this PR.
| SU2_MPI::Error(string("A user-specified LES_FILTER_WIDTH is only available with the SA hybrid RANS/LES models ") + | ||
| "(HYBRID_RANSLES= SA_*). The SST hybrid models compute the filter width from the grid.", CURRENT_FUNCTION); | ||
| } | ||
| if (OptionIsSet("DES_CONST")) { |
There was a problem hiding this comment.
Making this a hard error is strict: config_template.cfg itself sets DES_CONST= 0.65. A warning would do. The bigger issue is that CNSSolver::SetRoe_Dissipation still passes config->GetConst_DES() (0.65) to SetRoe_Dissipation_NTS. With an SST hybrid and ROE_LOW_DISSIPATION= NTS/NTS_DUCROS, the blending therefore uses the SA constant, which the user can no longer change. It should use the F1-blended C_DES for the SST hybrids.
There was a problem hiding this comment.
Changed DES_CONST to a warning for SST, and the NTS sensor now uses the local F1-blended constant.
| "TIME_STEPPING, DUAL_TIME_STEPPING-1ST_ORDER or DUAL_TIME_STEPPING-2ND_ORDER", CURRENT_FUNCTION); | ||
| } | ||
|
|
||
| if (Kind_HybridRANSLES != NO_HYBRIDRANSLES && !Time_Domain) { |
There was a problem hiding this comment.
This now also applies to the SA hybrids, which is a behaviour change. Please mention it in the PR description. The hybridSA/hybridSST enumeration is repeated in SetOutput. A single helper such as IsHybridSST() would avoid that.
There was a problem hiding this comment.
The SA time-domain requirement is now in the PR description. The SST hybrid model check is also shared between the configuration checks and output.
|
|
||
| su2double dk = beta_star * Density_i * ScalarVar_i[1] * ScalarVar_i[0] * (1.0 + zetaFMt); | ||
| if (hybridRANSLES) | ||
| dk = Density_i * sqrt(pow(ScalarVar_i[0], 3)) / lengthScale_i; |
There was a problem hiding this comment.
There is no lower bound on lengthScale_i, so if k -> 0 then l_RANS -> 0 and this becomes 0/0. Please clip the length scale (SA uses max(..., 1e-10) for the same quantity). Also, k*sqrt(k) is cheaper than sqrt(pow(k,3)), and there are trailing spaces on the next line.
There was a problem hiding this comment.
The hybrid length is now bounded at 1e-10, and the destruction term uses k*sqrt(k).
| const su2double | ||
| *TurbPsi_i, /*!< \brief Vector of adjoint turbulent variables at point i. */ | ||
| *TurbPsi_j; /*!< \brief Vector of adjoint turbulent variables at point j. */ | ||
| su2double lengthScale_i, lengthScale_j; /*!< \brief length scale for SST */ |
There was a problem hiding this comment.
These members are uninitialised and documented as "for SST", and the j value is always passed as 0.0. SA passes the DES length through SetDistance, but SST uses this new setter. Please pick one mechanism; if a new member is kept, give it a generic name and initialise it.
There was a problem hiding this comment.
SST needs the wall distance as well as the hybrid length, so I kept a separate, initialized hybrid-length member and removed the unused j value.
| turb_index.resize(nPoint) = su2double(1.0); | ||
| intermittency.resize(nPoint) = su2double(1.0); | ||
|
|
||
| DES_LengthScale.resize(nPoint) = su2double(0.0); |
There was a problem hiding this comment.
DES_LengthScale and Vortex_Tilting are now allocated for every SA and SST RANS run. Please allocate them only when a hybrid model is active, and Vortex_Tilting only for EDDES. The constructor indentation is off, and the file has no newline at the end.
There was a problem hiding this comment.
The hybrid length and sensor are allocated only for hybrid runs, and vortex tilting only for EDDES. I also fixed the indentation and final newline.
| /*--- 3 tr(S^2) - tr(S)^2, where tr(S^2) is the sum of the squares of all the components of S. ---*/ | ||
| trace0 = 0.0; | ||
| for (auto iDim = 0u; iDim < 3; iDim++) | ||
| for (auto jDim = 0u; jDim < 3; jDim++) trace0 += 3.0 * pow(Strain[iDim][jDim], 2); |
There was a problem hiding this comment.
Correct (tr(S^2) is the full double sum), but it changes SA_EDDES results. See the comment in CTurbSASolver.cpp.
There was a problem hiding this comment.
Yes, the correction and the resulting SA_EDDES change are listed in the PR description.
| VectorType intermittency; /*!< \brief Value of the intermittency for the trans. model. */ | ||
| VectorType turb_index; /*!< \brief Value of the turbulence index for transition simulations. */ | ||
| VectorType intermittency; /*!< \brief Value of the intermittency for the transition model. */ | ||
| VectorType Vortex_Tilting; /*!< \brief Value of the vortex tilting measure for EDDES models. */ |
There was a problem hiding this comment.
Should be protected, like DES_LengthScale and lesMode.
There was a problem hiding this comment.
Moved vortex tilting to the protected members.
| if (config->GetKind_HybridRANSLES() == NO_HYBRIDRANSLES) { | ||
| AddVolumeOutput("WALL_DISTANCE", "Wall_Distance", "DEBUG", "Wall distance value"); | ||
| } | ||
| AddVolumeOutput("GRAD_VEL_XX", "Grad_Vel_xx", "VELOCITY_GRADIENT", "X-Gradient of U"); |
There was a problem hiding this comment.
The velocity-gradient, CDkw/F1/F2 and always-on WALL_DISTANCE outputs are unrelated to the hybrid models. Check if they belong in this PR...
There was a problem hiding this comment.
I removed the unrelated velocity-gradient, SST diagnostic and always-on wall-distance outputs. LESIQ is retained as a hybrid-model diagnostic.
| if (config->GetKind_Turb_Model() == TURB_MODEL::SST) { | ||
| const su2double betaStar = 0.09; // constants[6] | ||
| const su2double RANSLength = sqrt(Node_Turb->GetSolution(iPoint, 0)) / max(1e-20, (betaStar * Node_Turb->GetSolution(iPoint, 1))); | ||
| const su2double RatioL = 0.1; // TODO:: it should be less or equal than 0.2 - 0.1. Should be taken as input from config? |
There was a problem hiding this comment.
Hardcoded beta* = 0.09 and RatioL = 0.1, plus a TODO. Is this finalized ?
There was a problem hiding this comment.
I removed SRS_GRID_SIZE, including the fixed ratio and TODO. LESIQ remains as a hybrid-model diagnostic.

Proposed Changes
DDES formulations for the SST model, and fixes to the shear-layer-adapted (EDDES) length scale of SA.
New
HYBRID_RANSLESoptions for SST, from Gritskevich et al., Development of DDES and IDDES Formulations for the k-ω Shear Stress Transport Model, Flow Turbulence Combust 88, 2012 (DOI):SST_DDES: DDES (Appendix 1).SST_IDDES: IDDES (Appendix 2).SST_SIDDES: simplified IDDES, i.e. IDDES without the elevating function f_e (Eq. 12).In all of them the destruction term of the k equation becomes ρ k^{3/2} / l_DES, with C_DES = 0.78 F1 + 0.61 (1 − F1). Its implicit Jacobian uses the same form, with the length scale frozen.
Shear-layer-adapted (SLA) length scale, from Shur et al., An Enhanced Version of DES with Rapid Transition from RANS to LES in Separated Flows, Flow Turbulence Combust 95, 2015 (DOI): Δ_SLA = Δ̃_ω F_KH(⟨VTM⟩), with F_KH = 1 where f_d < 0.99 (Eq. 6).
SST_EDDES: SST-DDES with Δ_SLA (as in Guseva et al., Flow Turbulence Combust 98, 2017, and Xiao et al., Int. J. Heat Fluid Flow 85, 2020).The length scale is computed by
CTurbSolver::ShearLayerAdaptedLengthScale, shared by SA and SST. Where the vorticity vanishes, its direction is undefined and h_max is used, as in standard DDES.Fixes to the existing
SA_EDDES(they change the reference values of theddes_flatplatetest):Other changes
TIME_DOMAIN= YES, and the hybrid model must match the turbulence model (SA_*with SA,SST_*with SST).LES_SENSORis written for SA and SST hybrid models: 0 indicates the RANS length-scale branch, 1 the LES branch, and intermediate values blending. For IDDES the sensor is the LES coefficient1 - f̃_d; the RANS term also contains the elevating function. This field describes the model length scale, not how much turbulence is resolved.DDESoutput group includesLESIQ, a viscosity-based LES quality index.STOCHASTIC_BACKSCATTER,LES_FILTER_WIDTHandENFORCE_LES, since these work only with the SA models. An explicitDES_CONSTis ignored with a warning; SST uses its F1-blended constant, including in the NTS low-dissipation sensor.COMPRESSIBILITY-WILCOXorCOMPRESSIBILITY-SARKARis set. How these corrections should act in the LES region needs its own validation: Forsythe et al. (2002) put the correction only into the RANS length scale, Xiao and Fu (2009) keep it everywhere. SA withCOMPRESSIBILITYis unchanged.Tests
ddes_oneram6_*(serial, parallel and hybrid), one per model:SST_DDES,SST_IDDES,SST_SIDDES,SST_EDDES,SA_EDDES. They run 5 time steps on the existing ONERA M6 hexahedral grid, restarting from a SST or SA RANS solution, so that every model gives different results (about 2 s each on 2 ranks). The LES branch is active in all of them exceptSST_DDES, which is still in RANS mode at these iterations..github/workflows/regression.ymluses thefeature_SST_IDDESbranch of TestCases until that PR is merged.Validation
NACA 0021 at 60 degrees (Re 2.7e5, span 1 chord, periodic), compared with the experiment of Swalwell et al. and with published DES at the same span (Garbaruk et al. 2009). All runs are averaged over the same 520 c/U after the start-up transient.
The EDDES runs (SA and SST) agree with the published DES at the same span. The DDES runs give more lift, drag and suction. This is the expected effect of the shear-layer-adapted length scale: the shear layers switch to LES sooner.
Setup, figures and discussion are in a V&V page for the SU2 website. Preview on my fork: https://rois1995.github.io/SU2/vandv/NACA0021_DDES/
The same site update also rewrites the description of the hybrid models: https://rois1995.github.io/SU2/docs_v7/Hybrid-RANS-LES/
Related Work
PR Checklist
pre-commit run --allto format old commits.🤖 Generated with Claude Code