Repository navigation
Conversation
|
Technically, this model has only one equation, the one for intermittency. Most of the functions are the same as the original LM model. Should I consider the Simplified model (SLM) as an option for the LM model to avoid duplicates? This is how I started, but I am open to discussions and suggestions. |
pcarruscag
left a comment
There was a problem hiding this comment.
If the changes to the solver don't become too intrusive this approach sounds good to me
- Added correlations for Simplified LM. - There is a bug on the computation of grad(n*U)*n
|
I have a question: for each point in the mesh I am trying to compute the dot product between the velocity vector and the normal to the wall of the nearest point on the wall. How do I access such information? I've found that in the CPoint class I have the ClosestWall_Elem variable which stores the index of the closest element on a wall. However, when I try to assess the information with a number of cores greater than 2, it crashes. Moreover, to recover the normal of the element I perform a mean of the normals on the nodes of that element. Is there a structure that has the normals saved for each element of the primal grid? The part that I am referring to is from line 208 in CTransLMSolver.cpp . |
- Modified LM_OPTIONS to include cross-flow effects: from LM2015 to CROSSFLOW
|
See what is done at the bottom of CGeometry.cpp in CGeometry::ComputeWallDistance. |
There was a problem hiding this comment.
CodeQL found more than 10 potential problems in the proposed changes. Check the Files changed tab for more details.
| * \brief Get the index of the closest wall element. | ||
| * \param[in] iPoint - Index of the point. | ||
| */ | ||
| inline unsigned long GetClosestWall_Elem(unsigned long iPoint) {return ClosestWall_Elem(iPoint);} |
There was a problem hiding this comment.
Can you add the param[out] for these please
There was a problem hiding this comment.
Sure, I'll do it now.
| SU2_MPI::Error("Two correlations selected for LM_OPTIONS. Please choose only one.", CURRENT_FUNCTION); | ||
| } | ||
| if (NFoundCorrelations_SLM > 1) { | ||
| SU2_MPI::Error("Two correlations selected for Simplified model into LM_OPTIONS. Please choose only one.", CURRENT_FUNCTION); |
There was a problem hiding this comment.
| SU2_MPI::Error("Two correlations selected for Simplified model into LM_OPTIONS. Please choose only one.", CURRENT_FUNCTION); | |
| SU2_MPI::Error("Two correlations selected for simplified LM_OPTIONS. Please choose only one.", CURRENT_FUNCTION); |
There was a problem hiding this comment.
I'd stick with my change since the options are for the simplified model. They are not simplified options.
|
|
||
| /*--- Check if problem is 2D and LM2015 has been selected ---*/ | ||
| if (lmParsedOptions.LM2015 && val_nDim == 2) { | ||
| SU2_MPI::Error("LM2015 is available only for 3D problems", CURRENT_FUNCTION); |
There was a problem hiding this comment.
is LM2015 gone? or is crossflow the same?
There was a problem hiding this comment.
I have changed the option to CROSSFLOW, since I will use it also for the Simplified model.
| // This is not reported in the paper | ||
| //FPG = max(FPG, 0.0); | ||
|
|
There was a problem hiding this comment.
| // This is not reported in the paper | |
| //FPG = max(FPG, 0.0); |
There was a problem hiding this comment.
I have left it there since I do not know if I have to keep it or not.
There is the geometry toolbox for dot product and normal: |
The problem is more related to the finding of the wall-normal for a point within the volume mesh, not to the computations that it will be involved in. |
|
The solution I suggested didn’t work? |
I still have to check if the implementation is correct but with more than two cores the code breaks. However, I found out that the wall-normal of a volume point can be computed as the normalized gradient of the wall-distance. Does this sound correct to you? However, there is a problem: I am using the aux variables to compute these gradients, but to compute dot(n, U) I first need n, thus I cannot compute them simultaneously. Since these computations are performed in the Preprocessing of the solvers, I was thinking to compute the normal within the FLOW_SOL preprocessing and the dot(n, U) in the TRANS_SOL preprocessing since the flow solver comes before the trans solver. Is this right? |
|
It's not correct. You need to follow the pattern from CGeometry::ComputeWallDistance |
- Added variables only for debug
|
I managed to implement the computation of grad(n*U)*n, but at the moment it is located into CTransLMSolver::PreProcessing. It seems to work with a structured mesh on a flat plate. Currently, I am testing with a 2D profile too. However, being into the PreProcessing of the transition solver, the normals are computed at each iteration, thus it is not computationally efficient if non-deforming meshes are used. I am looking into where to put it such that it is computed just if the mesh is updated (and at the first iteration of course). Plus, I have added a whole lot of variables to the output, but they will be removed in the final version. They are just used as debug. |
|
Do what we do with wall roughness and do it in the same place (computewalldistance and store in CPoint) |
The one-equation model is available with MENTER_SLM and SST (Menter et al. 2015, cross-flow of Vallinayagam Pillai and Lardeau, AIAA 2017-3159) or SA (Lee and Baeder, AIAA 2021-1532). The CODER_SLM and MOD_EPPLER_SLM correlations of Coder and Maughmer (AIAA 2012-672) belong to the Langtry-Menter intermittency equation, not to the one-equation model implemented here, so they now stop with an error. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
…1-1532) - Onset functions, F_turb and R_T = mu_t/mu as in Eqs. 4-7 (the same F_onset2 and F_onset3 as with SST). - Re_theta_c with C_TU1 and C_TU2 blended with the freestream Tu between the constants of Colonia et al. and the original ones (Eqs. 10-13). - SA equation: production times gamma_s, destruction times max(gamma_s, 0.1), with the scaled intermittency of Eq. 18 (Eq. 17). The two-equation LM coupling is unchanged. - Positivity of the implicit operator of the intermittency source (Eq. 24). - Cross-flow: the Langtry et al. stationary cross-flow criterion (Eqs. 36-43) and the Menter-Smirnov C1 criterion (Eqs. 25-35), with the cross-flow strength from the gradient of the vorticity direction. The CODER_SLM and MOD_EPPLER_SLM branch of the source, rejected at configuration, is removed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
The SA source uses the intermittency of the LM models but did not declare it as a preaccumulation input, so its derivative was lost in AD. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
The stationary cross-flow Reynolds number of Langtry et al. contains log(h / theta_t), which diverges for HROUGHNESS= 0. Limit h from below to 0.25 micrometers, the smallest roughness for which the correlation was validated by Lee and Baeder (AIAA 2021-1532) and the reference height h0 of Vallinayagam Pillai and Lardeau (AIAA 2017-3159). Applied to the SA cross-flow of the simplified model and to the LM2015 option of the two-equation model. The roughness factor C_r of the SST cross-flow model is finite for h = 0 and is unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
…ST cross-flow model The implementation matches Eqs. 2-10 and 17-18 of AIAA 2017-3159. The sign of Eq. 2 differs from the printed one, which gives a negative critical Reynolds number; the comment now explains it. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
The papers give no calibration limit for small roughness heights, so the limit of the previous commit (0.25 micrometers, the smallest validated height) is replaced by h >= 1e-8, in the units of HROUGHNESS. It applies to log(h/theta_t) of the Langtry et al. correlation (SA cross-flow of the simplified model, and the cross-flow option of the two-equation model) and to h/h0 of the SST cross-flow model of Vallinayagam Pillai and Lardeau. The limit and whether HROUGHNESS is below it are printed at startup. h and theta_t are both in mesh length units (reference length 1), so log(h/theta_t) does not depend on REF_DIMENSIONALIZATION. Also add the missing end of line after the name of the simplified model without cross-flow. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
The two branches of the conditional had an AD expression and a double. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
The discrete adjoint solvers do not create the transition solver, but the SA and SST sources read its solution when KIND_TRANS_MODEL is set: with MATH_PROBLEM= DISCRETE_ADJOINT and LM (two-equation or simplified) SU2_CFD_AD crashed with a segmentation fault (null pointer) on the E387 case. Stop with a clear error instead. This also applies to the two-equation LM model of develop. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
Four tests on the 6:1 prolate spheroid at 15 degrees (INC_RANS, coarse unstructured grid of 100958 points): SST and SA with MENTER_SLM, with and without cross-flow. Each runs 5 iterations from a converged SST or SA transitional solution; the cross-flow tests restart from the solution of their base model. The grid and the solutions are in su2code/TestCases, branch feature_Trans_SLM. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
Temporary, for the prolate spheroid data of su2code/TestCases#207. To be reverted to develop before merging. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
|
Sorry for the long pause on this PR. I have now brought it up to date and reviewed it against the literature:
I updated the description with the details. Validation runs are next. |
|
Great, thanks! I made some changes to multigrid, so cases that use it will converge differently, hopefully in a positive way. |
…onset with the cross-flow terms - LM_OPTIONS= LM2015 (the name in develop) is accepted again, as CROSSFLOW. - PRODLIM was parsed but never used: P_k^lim is part of the one-equation model of Menter et al. (2015, Eq. 25) and is always applied with it. - The F_ONSET output of the one-equation model now includes the cross-flow corrections, as the value used by the source term. - config_template.cfg documents the LM_OPTIONS of both models. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
…RB_INDEX - BC_Inlet of the transition solver scaled gamma and Re_theta_t as k and omega when an inlet profile file was used, although they are dimensionless and are not read from the file, and read a second variable that the one-equation model does not have. The nVar free-stream values are now used as they are. - With SA the turbulence intensity of the two-equation correlations is limited to 0.027 %, as with k-omega, since the correlations divide by it. - The AD preaccumulation registered two turbulence variables also for SA. - TURB_INDEX: the friction velocity is sqrt(nu |Omega|) at the wall in 2D and 3D (it used mu in 3D and the skin friction coefficient in 2D). - Debug comments replaced. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
EvertBunschoten
left a comment
There was a problem hiding this comment.
Thanks for the work, I think there are a couple of areas in the code that should be addressed to avoid code duplication and improve readability.
| /*! | ||
| * \brief Set Value of Transition Momentum Thickness Reynolds number from correlations. | ||
| */ | ||
| inline virtual void SetCorr_Rec(unsigned long iPoint, su2double val_Corr_Rec) {}; |
There was a problem hiding this comment.
It's a lot of setters and getters. Would it be possible to replace these with a single accessor pair that accesses a struct with all the relevant data? Something like the parsed options used for some of the config options.
There was a problem hiding this comment.
Done in afe6d25: a mutable/const accessor pair for TransitionLMData, shared by the source and output.
There was a problem hiding this comment.
Thank you for the welcome change! Could you place the header file with the struct in a more appropriate location? Feel free to create a separate folder like "include/variables/field_data_classes", where we can store this struct. We can later further apply this principle to reduce the number of accessors in CVariable.
|
Addressed the review comments in afe6d25. The MPI build and all 41 unit cases pass (74372 assertions). All eleven two-rank MPI runs finish successfully. The ten regular cases preserve the printed histories and volume fields; binary restart differences are at most 2.3e-13. All four existing SLM iteration-5 references pass at 1e-5. The shared freestream correlation also makes the LM initialization use the same 0.027% intensity floor as the flow solver. The zero-intensity SA-LM check confirms this change; no reference values were updated. All five forward/reverse CoDiPack interface syntax checks pass. These are compilation checks; sensitivities were not tested. |
# Conflicts: # TestCases/hybrid_regression.py # TestCases/parallel_regression.py # TestCases/serial_regression.py
# Conflicts: # TestCases/parallel_regression.py
Proposed Changes
One-equation (simplified) version of the LM transition model: only the intermittency γ is transported, and the transition onset is computed from local correlations instead of the Re_θt equation. It is enabled with
KIND_TRANS_MODEL= LMandLM_OPTIONS= (SLM, MENTER_SLM), optionally withCROSSFLOW.Supported combinations. Only the combinations published in the literature are allowed; any other one stops with a config error.
The equations are implemented as in these papers, with equation numbers in the code comments. Notes:
KATO-LAUNDERis not inSST_OPTIONS(the SST production limiter stays active in any case).CODER_SLMandMOD_EPPLER_SLMare rejected: Coder & Maughmer (AIAA 2012-672) use these correlations with the two-equation Langtry-Menter model, not with the one-equation model.Fixes to the existing LM model (found while bringing this branch up to date):
INTERMITTENCY_SEPandINTERMITTENCY_EFFwere read as solution variables, but they are not in compact restart files. Restarts are now consistent (tested round trips for the two-equation and one-equation models, compact and full).0.27instead of0.027, and the Tu ≥ 0.027 % limit was applied to only one term of the correlation.KIND_TRANS_MODEL= LMwith a discrete adjoint crashed (null pointer). It now stops with a config error. Adjoint support for transition models would be a separate PR.Tests: new regression tests
slm_spheroid_*(serial, parallel, hybrid) for SST and SA, with and without cross-flow, on a coarse grid of the 6:1 prolate spheroid at 15°. They restart from converged transitional solutions (su2code/TestCases#207), so the transition terms are active. Temporary:.github/workflows/regression.ymluses thefeature_Trans_SLMbranch of TestCases until that PR is merged.Validation (prolate spheroid, airfoils) is in progress.
Related Work
PR Checklist
pre-commit run --allto format old commits.🤖 Generated with Claude Code