Skip to content

Comments

Fix MUSCL THINC right-state using already-overwritten left-state values#1181

Open
sbryngelson wants to merge 2 commits intoMFlowCode:masterfrom
sbryngelson:fix/muscl-thinc-overwrite
Open

Fix MUSCL THINC right-state using already-overwritten left-state values#1181
sbryngelson wants to merge 2 commits intoMFlowCode:masterfrom
sbryngelson:fix/muscl-thinc-overwrite

Conversation

@sbryngelson
Copy link
Member

@sbryngelson sbryngelson commented Feb 21, 2026

User description

Summary

Severity: HIGH — right-state reconstruction uses overwritten left-state values.

File: src/simulation/m_muscl.fpp, lines 285-301

In the MUSCL-THINC interface reconstruction, the left-state values (vL_rs_vf for contxb, contxe, and advxb) are overwritten during left reconstruction. The right-state reconstruction then divides by these already-overwritten values instead of the original cell-center values. While the math accidentally cancels (left THINC value / left THINC value = original ratio), this relies on exact cancellation and is fragile.

Before

! Left reconstruction overwrites vL_rs_vf
vL_rs_vf(j,k,l,contxb) = vL_rs_vf(j,k,l,contxb) / vL_rs_vf(j,k,l,advxb) * aTHINC
vL_rs_vf(j,k,l,advxb) = aTHINC
! Right reconstruction uses the overwritten values
vR_rs_vf(j,k,l,contxb) = vL_rs_vf(j,k,l,contxb) / vL_rs_vf(j,k,l,advxb) * aTHINC
!                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ overwritten!

After

! Save original density ratios before any overwrites
rho_b = vL_rs_vf(j,k,l,contxb) / vL_rs_vf(j,k,l,advxb)
rho_e = vL_rs_vf(j,k,l,contxe) / (1._wp - vL_rs_vf(j,k,l,advxb))
! Both reconstructions use the saved ratios
vL_rs_vf(j,k,l,contxb) = rho_b * aTHINC_L
vR_rs_vf(j,k,l,contxb) = rho_b * aTHINC_R

Why this went undetected

The algebraic cancellation makes this produce correct results in most cases. It would only fail if the THINC clamping pushed aTHINC to exactly 0 or 1, causing 0/0.

Test plan

  • Run MUSCL-THINC interface compression test
  • Verify left and right reconstructed states are physically consistent

🤖 Generated with Claude Code

Fixes #1202

Summary by CodeRabbit

  • Refactor
    • Optimized density ratio calculations in the simulation engine to improve computational efficiency and GPU parallelization across three-dimensional domains.

CodeAnt-AI Description

Preserve original density ratios when computing MUSCL-THINC interface states

What Changed

  • Save original cell-centered density ratios before THINC overwrites them and use those saved ratios for both left and right interface reconstructions.
  • Left and right reconstructed volume fractions no longer divide by values that were just overwritten, so reconstructed states remain physically consistent even when THINC clamps to 0 or 1.
  • Mark per-thread scalars as private in the GPU parallel loop to prevent data races on GPU builds, improving reliability of parallel runs.

Impact

✅ Avoids 0/0 errors during interface reconstruction
✅ More reliable GPU runs (prevents data races)
✅ Consistent left/right reconstructed interface states

💡 Usage Guide

Checking Your Pull Request

Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.

Talking to CodeAnt AI

Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:

@codeant-ai ask: Your question here

This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.

Example

@codeant-ai ask: Can you suggest a safer alternative to storing this secret?

Preserve Org Learnings with CodeAnt

You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:

@codeant-ai: Your feedback here

This helps CodeAnt AI learn and adapt to your team's coding style and standards.

Example

@codeant-ai: Do not flag unused imports.

Retrigger review

Ask CodeAnt AI to review the PR again, by typing:

@codeant-ai: review

Check Your Repository Health

To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.

Copilot AI review requested due to automatic review settings February 21, 2026 03:23
@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 21, 2026

CodeAnt AI is reviewing your PR.


Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 21, 2026

Warning

Rate limit exceeded

@sbryngelson has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 9 minutes and 36 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 1d0265f and ac18720.

📒 Files selected for processing (1)
  • src/simulation/m_muscl.fpp
📝 Walkthrough

Walkthrough

Modifies MUSCL reconstruction in m_muscl.fpp to compute density ratios (rho_b and rho_e) prior to THINC reconstruction, replacing previous division-based updates with multiplicative operations across all three coordinate directions. Extends GPU parallel private lists accordingly.

Changes

Cohort / File(s) Summary
MUSCL THINC Density Reconstruction
src/simulation/m_muscl.fpp
Introduces pre-computed density ratio variables rho_b and rho_e to establish correct density updates before THINC reconstruction. Replaces division-based contxb/contxe updates with multiplicative operations using these ratios. Changes applied consistently to x, y, and z coordinate direction blocks with GPU private variable declarations extended.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related issues

  • #1200: Main changes compute and cache density ratios (rho_b/rho_e) before THINC reconstruction to prevent left-state updates from corrupting right-state ratio reads—directly addresses the root cause of density ratio corruption in multi-directional reconstruction.

Suggested labels

Review effort 2/5, size:XS

Poem

🐰 A ratio saved before the THINC takes flight,
No overwritten states to cause a plight,
Through x and y and z we bound,
With rho_b and rho_e, the fix is sound! ✨

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The PR fixes MUSCL-THINC overwrite issues in m_muscl.fpp, but linked issue #1202 addresses grid stretching array bounds in m_grid.f90—a completely different file and problem. The linked issue #1202 (grid stretching) does not match the actual code changes (MUSCL-THINC). Either correct the issue link or create a separate PR for the grid stretching fix.
Out of Scope Changes check ⚠️ Warning All changes in m_muscl.fpp relate to fixing the MUSCL-THINC right-state overwrite issue, which is in scope. However, the linked issue #1202 pertains to grid stretching in m_grid.f90, which is not addressed by these changes. The changes are focused on MUSCL-THINC but the linked issue addresses grid stretching; clarify whether both issues should be fixed in this PR or if the link should be updated.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main issue being fixed: preventing right-state THINC reconstruction from using overwritten left-state values.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check ✅ Passed The PR description is thorough and well-structured, covering the problem, motivation, before/after code comparison, root cause, and a test plan.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@codeant-ai codeant-ai bot added the size:S This PR changes 10-29 lines, ignoring generated files label Feb 21, 2026
@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 21, 2026

Nitpicks 🔍

🔒 No security issues identified
⚡ Recommended areas for review

  • Division by zero
    The new code computes rho_b and rho_e by dividing by vL_rs_vf_${XYZ}$(...,advxb) and by (1 - vL_rs_vf_${XYZ}$(...,advxb)). If advxb equals 0 or 1 (or is extremely close), these divisions can produce infinities or very large values, causing NaNs/instabilities downstream. The denominators need a safe-guard (clamping or small epsilon) before division.

  • Unbounded ratios
    rho_b and rho_e are used directly to scale contxb/contxe after being computed. If the denominator is very small the computed ratios may be nonphysical (negative, >1, or huge), which will produce unphysical volume fractions when later multiplied by aTHINC. Consider clamping or validating rho_b/rho_e to a physically consistent range before applying.

  • GPU private list change
    The GPU parallel-loop private list was extended to include rho_b and rho_e. Verify these variables are fully local and initialized per iteration on the device and that their use introduces no unintended dependencies or extra register pressure. Also confirm the added temporaries do not exceed device resource limits for large collapse values.

@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 21, 2026

CodeAnt AI finished reviewing your PR.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Fixes MUSCL-THINC right-state reconstruction by preserving pre-overwrite density ratios from the left state and reusing them for both left and right reconstructions.

Changes:

  • Save pre-reconstruction density ratios (rho_b, rho_e) before THINC overwrites vL_rs_vf_* values.
  • Update left/right reconstructions to use the saved ratios instead of dividing by potentially overwritten left-state fields.

cubic-dev-ai[bot]

This comment was marked as off-topic.

@codecov
Copy link

codecov bot commented Feb 21, 2026

Codecov Report

❌ Patch coverage is 0% with 6 lines in your changes missing coverage. Please review.
✅ Project coverage is 44.06%. Comparing base (df28255) to head (ac18720).
⚠️ Report is 10 commits behind head on master.

Files with missing lines Patch % Lines
src/simulation/m_muscl.fpp 0.00% 6 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##           master    #1181   +/-   ##
=======================================
  Coverage   44.05%   44.06%           
=======================================
  Files          70       70           
  Lines       20496    20494    -2     
  Branches     1989     1989           
=======================================
  Hits         9030     9030           
+ Misses      10328    10326    -2     
  Partials     1138     1138           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 22, 2026

CodeAnt AI is running Incremental review


Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@codeant-ai codeant-ai bot added size:S This PR changes 10-29 lines, ignoring generated files and removed size:S This PR changes 10-29 lines, ignoring generated files labels Feb 22, 2026
@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 22, 2026

CodeAnt AI Incremental review completed.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/simulation/m_muscl.fpp`:
- Around line 250-256: The GPU parallel loop's private clause for the MUSCL
reconstruction is missing scalars A, B, and C which leads to cross-thread data
races; update the private list in the GPU_PARALLEL_LOOP invocation (the clause
currently listing j,k,l,aCL,aC,aCR,aTHINC,moncon,sign,qmin,qmax,rho_b,rho_e) to
also include A, B, and C so that the loop-local temporaries A, B, C used in the
MUSCL/THINC computation are private per thread (look for the muscl_dir
conditional and the GPU_PARALLEL_LOOP macro surrounding the loop body where
A/B/C are assigned and used).
- Around line 282-284: Guard against near-zero denominators when computing rho_b
and rho_e by clamping or early-checking the MUSCL-reconstructed state
vL_rs_vf_${XYZ}$ (j,k,l,advxb) using the existing sgm_eps (or ic_eps) tolerance:
ensure advxb is not below sgm_eps before dividing for rho_b and ensure (1 -
advxb) is not below sgm_eps before dividing for rho_e; if either check fails,
use a safe fallback (e.g., set rho_b/rho_e to a clipped value or the
cell-average aC) so that rho_b, rho_e computations in this block cannot produce
NaN/Inf.

Comment on lines +282 to +284
! Save original density ratios before THINC overwrites them
rho_b = vL_rs_vf_${XYZ}$ (j, k, l, contxb)/vL_rs_vf_${XYZ}$ (j, k, l, advxb)
rho_e = vL_rs_vf_${XYZ}$ (j, k, l, contxe)/(1._wp - vL_rs_vf_${XYZ}$ (j, k, l, advxb))
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Add defensive guards against near-zero denominators in rho_b / rho_e

The outer check guards the cell-average aC, but vL_rs_vf(j,k,l,advxb) is the MUSCL-reconstructed left state, which a slope limiter can legally push to values below ic_eps (for rho_b) or above 1 - ic_eps (making 1 - advxb ≈ 0 for rho_e). sgm_eps is already used for the same purpose on Line 278; applying it here is consistent and avoids NaN/Inf propagation in degenerate cells.

🛡️ Proposed fix
-                                rho_b = vL_rs_vf_${XYZ}$ (j, k, l, contxb)/vL_rs_vf_${XYZ}$ (j, k, l, advxb)
-                                rho_e = vL_rs_vf_${XYZ}$ (j, k, l, contxe)/(1._wp - vL_rs_vf_${XYZ}$ (j, k, l, advxb))
+                                rho_b = vL_rs_vf_${XYZ}$ (j, k, l, contxb)/ &
+                                        max(vL_rs_vf_${XYZ}$ (j, k, l, advxb), sgm_eps)
+                                rho_e = vL_rs_vf_${XYZ}$ (j, k, l, contxe)/ &
+                                        max(1._wp - vL_rs_vf_${XYZ}$ (j, k, l, advxb), sgm_eps)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/simulation/m_muscl.fpp` around lines 282 - 284, Guard against near-zero
denominators when computing rho_b and rho_e by clamping or early-checking the
MUSCL-reconstructed state vL_rs_vf_${XYZ}$ (j,k,l,advxb) using the existing
sgm_eps (or ic_eps) tolerance: ensure advxb is not below sgm_eps before dividing
for rho_b and ensure (1 - advxb) is not below sgm_eps before dividing for rho_e;
if either check fails, use a safe fallback (e.g., set rho_b/rho_e to a clipped
value or the cell-average aC) so that rho_b, rho_e computations in this block
cannot produce NaN/Inf.

@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 23, 2026

CodeAnt AI is running Incremental review


Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@codeant-ai codeant-ai bot added size:S This PR changes 10-29 lines, ignoring generated files and removed size:S This PR changes 10-29 lines, ignoring generated files labels Feb 23, 2026
sbryngelson and others added 2 commits February 23, 2026 09:48
The right reconstruction divides by left-state values that were already
overwritten during left reconstruction. Save original density ratios
(contxb/advxb and contxe/(1-advxb)) before left reconstruction and
reuse them for both left and right states.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
These scalars are written per-thread inside the parallel loop
(lines 278-280) but were missing from the private list, causing
a GPU data race on all backends.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@sbryngelson sbryngelson force-pushed the fix/muscl-thinc-overwrite branch from 9992699 to ac18720 Compare February 23, 2026 14:48
Comment on lines +282 to +284
! Save original density ratios before THINC overwrites them
rho_b = vL_rs_vf_${XYZ}$ (j, k, l, contxb)/vL_rs_vf_${XYZ}$ (j, k, l, advxb)
rho_e = vL_rs_vf_${XYZ}$ (j, k, l, contxe)/(1._wp - vL_rs_vf_${XYZ}$ (j, k, l, advxb))
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggestion: Guard the density ratio calculations against division by very small or zero volume fractions to avoid numerical instability in the interface-compression step. [custom_rule]

Severity Level: Minor ⚠️

Suggested change
! Save original density ratios before THINC overwrites them
rho_b = vL_rs_vf_${XYZ}$ (j, k, l, contxb)/vL_rs_vf_${XYZ}$ (j, k, l, advxb)
rho_e = vL_rs_vf_${XYZ}$ (j, k, l, contxe)/(1._wp - vL_rs_vf_${XYZ}$ (j, k, l, advxb))
! Save original density ratios before THINC overwrites them, guarding against extreme volume fractions
rho_b = vL_rs_vf_${XYZ}$ (j, k, l, contxb)/max(vL_rs_vf_${XYZ}$ (j, k, l, advxb), ic_eps)
rho_e = vL_rs_vf_${XYZ}$ (j, k, l, contxe)/max(1._wp - vL_rs_vf_${XYZ}$ (j, k, l, advxb), ic_eps)
Why it matters? ⭐

The change directly addresses a numerical correctness concern in the PR: the existing code divides by vL_rs_vf_${XYZ}$(..., advxb) and (1 - advxb) without guarding against those denominators being zero or extremely small. This can produce Inf/NaN on host or device, and this code runs inside a GPU-parallel loop (so device behavior matters). Replacing the denominator with max(..., ic_eps) prevents division-by-zero and reduces numerical instability while using the existing ic_eps constant already used elsewhere in the file. This maps to the repository review priorities (correctness/numerical issues and GPU safety) and is therefore an appropriate, minimal fix.

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** src/simulation/m_muscl.fpp
**Line:** 282:284
**Comment:**
	*Custom Rule: Guard the density ratio calculations against division by very small or zero volume fractions to avoid numerical instability in the interface-compression step.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
👍 | 👎

@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 23, 2026

CodeAnt AI Incremental review completed.

@github-actions
Copy link

Claude Code Review

Head SHA: 9992699


Files Changed (1)

  • src/simulation/m_muscl.fpp

Summary of Changes

  • Core bug fix: Saves original density ratios (rho_b, rho_e) from vL_rs_vf arrays before THINC overwrites them, eliminating a fragile dependency on algebraic self-cancellation in the right-state computation
  • Right-state correctness: Right reconstruction (vR_rs_vf) now uses the saved pre-overwrite ratios instead of reading from already-mutated left-state arrays
  • GPU data race fix: Adds A, B, C to the GPU_PARALLEL_LOOP private clause — these per-iteration scalars were previously absent, causing a data race in parallel GPU builds
  • Thread-safety: New variables rho_b and rho_e are also added to the private clause, ensuring correct per-thread isolation
  • Code simplification: Left and right reconstruction expressions are simplified from multi-term array reads into single rho_b * aTHINC and rho_e * (1._wp - aTHINC) multiplications

Findings

No bugs or CLAUDE.md violations found. The refactor is mathematically correct and equivalent to the original under normal conditions, while being more robust under THINC edge cases (aTHINC clamped to 0 or 1).

Improvement Opportunities:

  1. src/simulation/m_muscl.fpp — Division-by-zero guard for rho_b/rho_e
    rho_b divides by advxb and rho_e divides by (1 - advxb). If advxb is exactly 0.0 or 1.0 before THINC reconstruction (valid volume fraction edge cases), both computations yield 0/0 or x/0. The PR description explicitly cites these as motivation for the fix, but no guards were added. Consider adding explicit guards (e.g., only compute and apply ratios when advxb is within (ic_eps, 1 - ic_eps)).

  2. src/simulation/m_muscl.fpp — Variable naming clarity for aTHINC
    The PR description uses distinct names aTHINC_L and aTHINC_R in its pseudocode, but the implementation reuses the single variable aTHINC, relying on sequential overwrite between left and right blocks. Introducing aTHINC_L and aTHINC_R as separate locals (or at least a comment) would make the two distinct THINC values explicit and guard against future reordering bugs — the same class of bug this PR fixes.

  3. src/simulation/m_muscl.fpp — Comment distinguishing left/right advxb assignments
    Both left and right reconstruction blocks set advxb = aTHINC using the sequentially-overwritten aTHINC variable. A brief comment distinguishing the left-state value from the right-state value would improve reviewability, especially given that the recent commit history (9992699) shows these subtle omissions can persist undetected across multiple review cycles.

@github-actions
Copy link

Claude Code Review

Head SHA: ac18720


Files Changed (1)

  • src/simulation/m_muscl.fpp

Summary

  • Fixes a correctness bug in MUSCL-THINC interface reconstruction: the right-state reconstruction was reading from vL_rs_vf arrays that had already been overwritten by the left-state reconstruction
  • Pre-computes density ratios rho_b and rho_e before the THINC left-state overwrite, then uses those saved values for both left and right reconstructions
  • Eliminates fragile reliance on coincidental algebraic cancellation that would silently fail if THINC clamping pushed aTHINC exactly to 0 or 1
  • Adds A, B, C, rho_b, and rho_e to the GPU parallel loop private clause, fixing a pre-existing data race on those loop-local variables

Findings

No bugs or CLAUDE.md violations found. The fix is mathematically correct and the GPU private clause is properly updated.

Improvement opportunities:

  1. src/simulation/m_muscl.fpp ~line 282–283 — Division guard documentation
    rho_b and rho_e divide by vL_rs_vf(j,k,l,advxb) and (1._wp - vL_rs_vf(j,k,l,advxb)). The surrounding if (aC >= ic_eps .and. aC <= 1._wp - ic_eps) guards entry into the THINC block using the cell-centered aC, not the left-reconstructed advxb, so it does not directly protect these divisions. Adding a brief comment explaining why advxb is safe here (e.g., because MUSCL reconstruction bounds it away from 0/1) would make the implicit assumption explicit and ease future maintenance.

  2. src/simulation/m_muscl.fpp ~line 251 — Variable scope
    rho_b and rho_e are declared at subroutine scope but are only meaningful inside the inner THINC block. A Fortran BLOCK construct would restrict their scope to where they are used, reducing the risk of accidental use elsewhere and signalling intent to readers.

  3. src/simulation/m_muscl.fpp ~line 256 — GPU private clause comment
    The private clause has grown to 13 entries and the penalty for omitting a variable is a silent data race on GPU. A short inline comment grouping the entries (e.g., loop indices / MUSCL variables / THINC scalars / density ratios) would help reviewers quickly verify completeness when future variables are added.


Reviewed with Claude Code

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

Labels

size:S This PR changes 10-29 lines, ignoring generated files

Development

Successfully merging this pull request may close these issues.

Grid stretching uses wrong array bounds for y_cc and z_cc

1 participant