Skip to content

Fix L2Roe, LMRoe and the general-gas Roe scheme in 3D - #2944

Draft
rois1995 wants to merge 5 commits into
fix_hllc_moving_gridsfrom
fix_roe_3d_wave_strengths
Draft

rois1995 wants to merge 5 commits into
fix_hllc_moving_gridsfrom
fix_roe_3d_wave_strengths

Conversation

@rois1995

@rois1995 rois1995 commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Proposed Changes

  • 3D flux. Three Roe-type schemes computed part of their numerical dissipation with a 2D formula, also in 3D: L2Roe, LMRoe and the explicit general-gas Roe. So a jump of density or of tangential velocity across a face (a contact or a shear layer) got a wrong flux on faces that are not aligned with the x axis. The standard Roe scheme is already correct (since Consistent calculation of dissipation terms for Roe #299), and 2D is not affected. The three schemes now use the same 3D formula as the standard Roe.

    delta_wave[0] = delta_rho - delta_p/RoeSoundSpeed2;
    delta_wave[1] = (UnitNormal[0]*delta_vel[2]-UnitNormal[2]*delta_vel[0])*zeta;
    delta_wave[2] = (UnitNormal[1]*delta_vel[0]-UnitNormal[0]*delta_vel[1])*zeta;

    delta_wave[0] = delta_rho - delta_p/RoeSoundSpeed2;
    delta_wave[1] = (UnitNormal[0]*delta_vel[2]-UnitNormal[2]*delta_vel[0]);
    delta_wave[2] = (UnitNormal[1]*delta_vel[0]-UnitNormal[0]*delta_vel[1]);

    delta_wave[0] = delta_rho - delta_p/(RoeSoundSpeed*RoeSoundSpeed);
    delta_wave[1] = UnitNormal[0]*delta_vel[2]-UnitNormal[2]*delta_vel[0];
    delta_wave[2] = UnitNormal[1]*delta_vel[0]-UnitNormal[0]*delta_vel[1];

In 3D, the first three columns of the eigenvector matrix used by SU2 ($j = x, y, z$) are

$$P_j = n_j \begin{pmatrix} 1 \\ \mathbf{u} \\ q^2/2 \end{pmatrix} + \rho \begin{pmatrix} 0 \\ \mathbf{n}\times\mathbf{e}_j \\ \mathbf{u}\cdot(\mathbf{n}\times\mathbf{e}_j) \end{pmatrix}$$

so their wave strengths must be

$$\alpha_j = n_j\left(\Delta\rho - \frac{\Delta p}{c^2}\right) + (\Delta\mathbf{u}\times\mathbf{n})_j .$$

With these, $\sum_j \alpha_j P_j$ is exactly the entropy wave plus the shear wave, $\left(\Delta\rho - \Delta p/c^2\right)(1, \mathbf{u}, q^2/2) + \rho,(0, \Delta\mathbf{u}_t, \mathbf{u}\cdot\Delta\mathbf{u}_t)$, where $\Delta\mathbf{u}_t$ is the tangential part of the velocity jump. The three schemes used $\alpha_x = \Delta\rho - \Delta p/c^2$, $\alpha_y = (\Delta\mathbf{u}\times\mathbf{n})_y$, $\alpha_z = (\Delta\mathbf{u}\times\mathbf{n})_z$, which is right only when $\mathbf{n} = \mathbf{e}_x$. This is the standard 3D Roe dissipation (Roe 1981; Blazek 2015). L2Roe and LMRoe keep their low-Mach scaling of the velocity jumps (Oßwald et al. 2016; Rieper 2011).

  • General-gas Roe, protection for non-physical states. When the averaged speed of sound is not valid, the scheme should set the whole Jacobian to zero. Because of a wrong loop index it cleared only the diagonal, and the rest kept the values of the previous face.

    for (iVar = 0; iVar < nVar; iVar++) {
    Flux[iVar] = 0.0;
    for (jVar = 0; jVar < nVar; jVar++) {
    Jacobian_i[iVar][iVar] = 0.0;
    Jacobian_j[iVar][iVar] = 0.0;
    }

A new unit test checks that a contact and a shear layer give the correct (upwind) flux in 2D and 3D for all four Roe variants. Without the fix, 50 of its checks fail.

This PR builds on #2943. It is part of the split of #2941.

References

  • P. L. Roe, Approximate Riemann solvers, parameter vectors, and difference schemes, J. Comput. Phys. 43 (1981) 357–372.
  • J. Blazek, Computational Fluid Dynamics: Principles and Applications, 3rd ed., Butterworth-Heinemann, 2015 (Roe scheme).
  • F. Rieper, A low-Mach number fix for Roe's approximate Riemann solver, J. Comput. Phys. 230 (2011) 5263–5287 (LMRoe).
  • K. Oßwald, A. Siegmund, P. Birken, V. Hannemann, A. Meister, L2Roe: a low dissipation version of Roe's approximate Riemann solver for low Mach numbers, Int. J. Numer. Methods Fluids 81 (2016) 71–86.

Related Work

PR Checklist

  • I am submitting my contribution to the develop branch.
  • My contribution generates no new compiler warnings (try with --warnlevel=3 when using meson).
  • My contribution is commented and consistent with SU2 style (https://su2code.github.io/docs_v7/Style-Guide/).
  • I used the pre-commit hook to prevent dirty commits and used pre-commit run --all to format old commits.
  • I have added a test case that demonstrates my contribution, if necessary.
  • I have updated appropriate documentation (Tutorials, Docs Page, config_template.cpp), if necessary.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6

rois1995 and others added 2 commits September 30, 2026 13:46
… Roe scheme

Only the diagonal was zeroed (index [iVar][iVar] inside the jVar loop), so the off-diagonal entries kept the
values of the previous edge. The guard of CUpwRoeBase_Flow already clears all entries.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
… explicit general-gas Roe

In 3D the first three columns of the P matrix combine the entropy wave, weighted by n_j, with the shear waves.
Their strengths are n_j (Delta rho - Delta p / c^2) + (Delta u x n)_j; the entropy jump was used unweighted in the
first one only, so a contact or shear layer on a face not aligned with x got a wrong flux. The standard Roe scheme
already projects the jump with P^-1 since #299. Unit test roe_contact_tests.cpp: a contact and a shear layer give
the upwind flux in 2D and 3D.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LEL91DW5WPbPwgFtCvHga6
@joshkellyjak joshkellyjak self-assigned this Oct 12, 2026
delta_wave[2] = (UnitNormal[1]*delta_vel[0]-UnitNormal[0]*delta_vel[1])*zeta;
/*--- The first three columns of the 3D P matrix combine the entropy wave (weighted by the normal) with the
shear waves, so their strengths are n_j (Delta rho - Delta p / c^2) + (Delta u x n)_j. ---*/
const su2double delta_entropy = delta_rho - delta_p/RoeSoundSpeed2;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

const auto

delta_wave[2] = (UnitNormal[1]*delta_vel[0]-UnitNormal[0]*delta_vel[1]);
/*--- The first three columns of the 3D P matrix combine the entropy wave (weighted by the normal) with the
shear waves, so their strengths are n_j (Delta rho - Delta p / c^2) + (Delta u x n)_j. ---*/
const su2double delta_entropy = delta_rho - delta_p/RoeSoundSpeed2;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

delta_wave[2] = UnitNormal[1]*delta_vel[0]-UnitNormal[0]*delta_vel[1];
/*--- The first three columns of the 3D P matrix combine the entropy wave (weighted by the normal) with the
shear waves, so their strengths are n_j (Delta rho - Delta p / c^2) + (Delta u x n)_j. ---*/
const su2double delta_entropy = delta_rho - delta_p/(RoeSoundSpeed*RoeSoundSpeed);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

^

@rois1995

Copy link
Copy Markdown
Contributor Author

Merged the updated #2943 in 73af49d to propagate the latest #2942/develop changes through the stack.

@rois1995

Copy link
Copy Markdown
Contributor Author

Propagated the ideal-gas HLLC supersonic face-enthalpy Jacobian fix and the regression test covering both Jacobian modes from #2943 (4960dd03be). The HLLC unit tests pass with 784 assertions. The convergence comparison and its scope are documented in #2943.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants