Skip to content

[CI probe, do not merge] CCE OpenACC EOS helper diagnostics - #1812

Closed
sbryngelson wants to merge 18 commits into
MFlowCode:masterfrom
sbryngelson:probe/cce-acc
Closed

[CI probe, do not merge] CCE OpenACC EOS helper diagnostics#1812
sbryngelson wants to merge 18 commits into
MFlowCode:masterfrom
sbryngelson:probe/cce-acc

Conversation

@sbryngelson

Copy link
Copy Markdown
Member

Temporary probe for the Frontier CCE OpenACC NaNs seen on #1811. Runs one lane on seven targeted tests and prints each EOS helper evaluated on the device next to its host value at startup. Will be closed once the failing construct is identified.

Any Mie-Gruneisen EOS p = p_ref + rho Gamma_G (e - e_ref) is MFC's rho e = Gamma p + Pi with Gamma = 1/Gamma_G and Pi = rho e_ref - p_ref/Gamma_G, so the existing operators need only the coefficients and dPi/drho. s_eos_coefficients is the single dispatch: the Mie-Gruneisen case supplies a linear-Hugoniot reference curve (u_s = c0 + s u_p, linear release) and one shared conversion produces Gamma, Pi and dPi/drho; a second family is one more case. Stiffened and ideal gas return the constants resolved at init, and no caller invokes the routine yet, so every existing answer is bit-identical - 27-case gate. Parameters mg_rho0, mg_c0, mg_s, mg_G0 follow the flat per-fluid style; the validator requires all four under mie_gruneisen, forbids them otherwise, and forbids qv there because e_ref carries the formation energy. Thirty pytest checks pin the maths against finite differences and a numerically integrated isentrope.
A Mie-Gruneisen fluid has neither gamma, pi_inf nor qv, and an ideal gas has no pi_inf: the validator now refuses them, and the suite's base fluid and every example drop the dead values. The ideal-gas half duplicates MFlowCode#1808 and drops out once it merges.
The mixture loop calls s_eos_coefficients per phase when any fluid's EOS is state dependent; the stiffened-gas arithmetic is untouched (27/27 bit-identical on the gate). The sound speed takes the partial densities as an optional argument and mixes frozen per-phase moduli, with the derivative term applied at that one site. Callers that cannot supply them are refused by the validator: 5-equation, HLL/HLLC/LF only, no bubbles, hypoelasticity, IBM, IGR, relativity, MHD, chemistry, acoustic source, probes, post-process c, characteristic BCs or Wood's law. Validation: symmetric-impact shock speed and plateau density match the Hugoniot to 1.4e-3, and a small pulse travels at the analytic sound speed to 1.9e-4 (the missing derivative term would give 24%).
gamma = gammas(1) and friends were assigned and never read; lit_gamma was assigned in both output routines and read in neither.
…eck passes from worktrees

(cherry picked from commit 5ad5c85)
Isentropic release of a JWL fluid lands on the closed-form isentrope to 7.5e-5 at N = 200 and 9e-7 at N = 800; goldens for JWL beside an ideal gas, Mie-Gruneisen under Wood's law, and Mie-Gruneisen with characteristic walls. The acoustic pulse now comes from a rectangle patch and is tracked by its centroid: an analytic IC is compiled in and every distinct one costs the suite a full rebuild.
One reference-curve routine with a Gruneisen closure Gamma_G = Gamma_0 + a mu, one coefficient conversion, one sound-speed formula and one RK4 stepper for the phasic isentrope and the reference temperature. Adds the temperature T = T_ref + (e - e_ref)/c_v and its T_wrt output, the cubic Hugoniot, the Vinet cold curve, the 6-equation model on the phasic isentrope, and helpers that fetch their own coefficients so no feature reads gammas(i) directly: hypoelasticity, IBM, acoustic sources and the reactive burn open up. The validator refuses initial states outside a state-dependent EOS and keeps qv as the shared formation-energy zero.
Goldens for Vinet, the cubic Hugoniot, MG with hypoelasticity, with IBM, and a MG reactant burning to JWL products; the isentropic release now serves JWL and Vinet and the Hugoniot recovery a quadratic fit. The convergence harness runs a private copy of each case in a temporary directory without rebuilding, so specs that share a case file can run concurrently.
Copilot AI lite review requested due to automatic review settings September 3, 2026 17:04

Copilot AI left a comment

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.

Warning

Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.

Pull request overview

Temporary CI probe to help isolate Frontier CCE OpenACC NaNs by (a) adding device/host EOS helper diagnostics at startup and (b) narrowing CI to a small set of targeted cases; it also extends the toolchain/params to recognize additional EOS selector values and related parameters.

Changes:

  • Add state-dependent EOS selector values/params (Mie-Gruneisen/JWL/Vinet) to the Python toolchain and add selector/constraint tests.
  • Add GPU startup diagnostics that evaluate EOS helpers on device and host and print both for comparison.
  • Modify CI workflow/scripts to disable most lanes and run only a small targeted test subset for the probe.

Reviewed changes

Copilot reviewed 185 out of 188 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
toolchain/mfc/test_case_validator.py Adds constraint tests for new EOS selectors/parameters.
toolchain/mfc/test/test_coverage_unit.py Switches tests to import shared git-env scrub helper from coverage module.
toolchain/mfc/test/coverage.py Scrubs inherited GIT_* env vars for subprocess git calls to avoid hook contamination.
toolchain/mfc/test/case.py Removes ideal-gas pi_inf default from base case params.
toolchain/mfc/params_tests/test_eos_selector.py Updates ideal-gas behavior to reject/ignore stiffness parameter.
toolchain/mfc/params/descriptions.py Documents new T_wrt output option.
toolchain/mfc/params/definitions.py Registers T_wrt, expands EOS selector mappings, and registers MG/JWL/Vinet parameters.
toolchain/mfc/eos.py Adds Python reference implementations for MG/JWL/Vinet curves and related helpers (tests/validation).
tests/ED75D01D/golden-metadata.txt Adds/updates golden metadata for targeted probe runs.
tests/A6846AD4/golden-metadata.txt Adds/updates golden metadata for targeted probe runs.
tests/A421E318/golden-metadata.txt Adds/updates golden metadata for targeted probe runs.
tests/7853BD45/golden-metadata.txt Adds/updates golden metadata for targeted probe runs.
tests/6AE3FB4E/golden-metadata.txt Adds/updates golden metadata for targeted probe runs.
tests/61AF4509/golden-metadata.txt Adds/updates golden metadata for targeted probe runs.
tests/6191C8D0/golden-metadata.txt Adds/updates golden metadata for targeted probe runs.
tests/5AC2F65D/golden-metadata.txt Adds/updates golden metadata for targeted probe runs.
tests/590E4427/golden-metadata.txt Adds/updates golden metadata for targeted probe runs.
tests/4A0CDF9C/golden-metadata.txt Adds/updates golden metadata for targeted probe runs.
tests/471270BB/golden-metadata.txt Adds/updates golden metadata for targeted probe runs.
tests/120043F6/golden-metadata.txt Adds/updates golden metadata for targeted probe runs.
src/simulation/m_time_steppers.fpp Threads alpha_rho through cell-state and sound-speed computation (state-dependent EOS support).
src/simulation/m_start_up.fpp Adds startup GPU/host EOS helper probe + updates internal-energy call signature.
src/simulation/m_sim_helpers.fpp Extends s_compute_cell_state to return alpha_rho rather than a local scratch.
src/simulation/m_riemann_solver_lf.fpp Passes alpha_rho into sound-speed routine.
src/simulation/m_riemann_solver_hypo_hlld.fpp Uses per-phase bulk modulus helper for alt sound speed path.
src/simulation/m_riemann_solver_hllc.fpp Passes alpha_rho into sound-speed routines and switches to phasic isentrope/internal-energy helpers.
src/simulation/m_riemann_solver_hll.fpp Passes alpha_rho into sound-speed routine(s).
src/simulation/m_rhs.fpp Switches bulk modulus computation to phasic bulk modulus helper.
src/simulation/m_reactive_burn.fpp Uses f_phase_temperature instead of stiffened-gas-only thermal relation.
src/simulation/m_pressure_relaxation.fpp Adds state-dependent EOS path via s_phase_density_on_isentrope and updates internal-energy call signature.
src/simulation/m_ibm.fpp Updates internal-energy call signature to EOS-index-based API.
src/simulation/m_hypoelastic.fpp Uses phasic bulk modulus helper for 2-material K computation.
src/simulation/m_global_parameters.fpp Initializes newly-added EOS parameter fields in fluid_pp.
src/simulation/m_data_output.fpp Threads alpha_rho through sound-speed computations and removes unused locals.
src/simulation/m_cbc.fpp Passes alpha_rho into sound-speed and mixture-coefficient time-derivative routines.
src/simulation/m_acoustic_src.fpp Inlines state-dependent per-phase modulus mixing to avoid OpenACC issue.
src/pre_process/m_global_parameters.fpp Initializes newly-added EOS parameter fields in fluid_pp (pre-process).
src/pre_process/m_data_output.fpp Removes unused lit_gamma plumbing.
src/post_process/m_start_up.fpp Threads alpha_rho into sound-speed computation and adds T_wrt temperature output.
src/post_process/m_global_parameters.fpp Initializes new EOS fields and defaults T_wrt to false.
src/post_process/m_derived_variables.fpp Removes old s_derive_sound_speed implementation (sound speed handled elsewhere now).
src/post_process/m_data_output.fpp Updates internal-energy and sound-speed calls to EOS-index-based API.
src/common/m_global_parameters_common.fpp Adds device-resident arrays for EOS selector and reference-curve parameters.
src/common/m_derived_types.fpp Extends physical_parameters with MG/JWL/Vinet parameter fields.
src/common/m_constants.fpp Adds EOS selector constants and RK4/ODE constants for state-dependent EOS helpers.
examples/3D_turb_mixing/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_sphbubcollapse/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_rotating_sphere/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_recovering_sphere/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_rayleigh_taylor_muscl/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_rayleigh_taylor/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_performance_test/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_patch_spherical_harmonic/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_moving_lag_particles/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_mibm_sphere_head_on_collision/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_mibm_periodic_collision/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_lagrange_shbubcollapse/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_lagrange_bubblescreen/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_icpp_stl_cube/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_ibm_stl_test/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_ibm_stl_pyramid/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_ibm_stl_ellipsoid/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_ibm_bowshock/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_brio_wu/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_advection_convergence/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_TaylorGreenVortex_analytical/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_TaylorGreenVortex/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_IGR_jet_1fluid/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_IGR_jet/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_IGR_TaylorGreenVortex_nvidia/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_IGR_TaylorGreenVortex/case.py Removes ideal-gas pi_inf from example inputs.
examples/3D_IGR_33jet/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_zero_circ_vortex_analytical/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_zero_circ_vortex/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_viscous_shock_tube/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_tumbling_rectangle/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_triple_point/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_synthetic_turbulence/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_shockdroplet_muscl/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_shockdroplet/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_shockbubble/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_shock_cloud_rmhd/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_riemann_test_muscl/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_riemann_test/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_richtmyer_meshkov/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_rayleigh_taylor/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_poiseuille_thickening_nn/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_poiseuille_nn/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_patch_modal_shape_exp/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_patch_modal_shape/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_orszag_tang_hyper_cleaning/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_orszag_tang/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_moving_lag_bubs/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_mibm_shock_cylinder/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_mibm_particle_cloud/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_mibm_cylinder_in_cross_flow/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_mhd_rotor/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_mhd_magnetic_vortex/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_lid_driven_cavity_nn/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_lid_driven_cavity/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_laplace_pressure_jump/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_lagrange_rising_bubble/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_lagrange_in_crossflow/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_lagrange_bubblescreen/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_kelvin_helmholtz/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_jet/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_isentropicvortex_analytical/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_isentropicvortex/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_icpp_stl_circle/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_ibm_viscous_drag_over_cylinder/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_ibm_stl_wedge/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_ibm_stl_test/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_ibm_stl_MFCCharacter/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_ibm_poiseuille_nn/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_ibm_multiphase/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_ibm_ellipse/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_ibm_cfl_dt/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_ibm_airfoil/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_ibm/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_hypo_shear_contact/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_herschel_bulkley_poiseuille_nn/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_hardcoded_ic/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_forward_facing_step/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_bingham_poiseuille_nn/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_backward_facing_step/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_axisym_shockbubble/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_advection_muscl/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_advection_convergence/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_advection/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_acoustic_pulse_analytical/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_acoustic_pulse/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_acoustic_broadband/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_TaylorGreenVortex/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_IGR_triple_point/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_IGR_2fluid/case.py Removes ideal-gas pi_inf from example inputs.
examples/2D_GreshoVortex/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_vacuum_restart/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_vacuum/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_titarevtorro_analytical/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_titarevtorro/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_sodshocktube_muscl/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_sodshocktube/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_sod_convergence/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_shuosher_wenoz5/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_shuosher_wenom5/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_shuosher_wenojs5/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_shuosher_teno7/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_shuosher_teno5/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_shuosher_old/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_shuosher_analytical/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_mhd_smooth_alfven_wave/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_laxshocktube/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_kapilashocktube/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_hypo_2materials/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_euler_convergence/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_dai_woodward_hlld/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_dai_woodward/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_convergence/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_brio_wu_rmhd/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_brio_wu_hlld/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_brio_wu/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_advection_convergence/case.py Removes ideal-gas pi_inf from example inputs.
examples/1D_mg_impact/case.py Adds a new MG impact validation case generator.
examples/1D_mg_acoustic/case.py Adds a new MG acoustic-pulse validation case generator.
examples/1D_isentropic_release/case.py Adds a new JWL/Vinet isentropic-release validation case generator.
docs/documentation/contributing.md Updates contributor docs for EOS helper inventory.
docs/documentation/case.md Documents T_wrt output option in case configuration docs.
.github/workflows/test.yml Disables most CI jobs and narrows the self-hosted matrix for the probe.
.github/workflows/common/test.sh Runs only a fixed small subset of tests on pull requests.
.github/scripts/check_coverage_map_health.py Switches git calls to shared _git helper.
.claude/rules/common-pitfalls.md Adds a note about a CCE OpenACC GPU_ROUTINE argument pitfall (context for #1811).
Suppressed comments (3)

toolchain/mfc/test_case_validator.py:1

  • The new test classes are defined after the unittest.main() call. If this module is executed directly (e.g., python test_case_validator.py), unittest.main() runs before these classes exist, so they won't be discovered/executed. Move the if __name__ == \"__main__\": unittest.main() block to the end of the file (after all test class definitions), or remove the direct-execution entrypoint if it's not intended to be used.
    src/simulation/m_start_up.fpp:1
  • The probe allocates device memory, launches a GPU kernel, performs a device→host update, and prints at startup unconditionally. Even if intended as temporary, this is user-visible output and adds runtime overhead to all runs (including non-CI). Consider guarding this behind a dedicated runtime option (e.g., eos_probe = T), a compile-time probe flag, or an environment variable check so the diagnostics can be enabled only when needed.
    toolchain/mfc/test/coverage.py:1
  • Scrubbing all GIT_* environment variables globally for every git subprocess is broader than the documented motivating issue (GIT_DIR, GIT_INDEX_FILE). If any callers rely on other GIT_* variables (e.g., GIT_SSH_COMMAND), this could cause surprising behavior. A narrower scrub (explicitly dropping only GIT_DIR/GIT_INDEX_FILE/GIT_WORK_TREE) or an opt-in parameter on _git (e.g., scrub_git_env=True) would preserve the hook fix while reducing unintended side effects.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread .github/workflows/common/test.sh Outdated
Comment on lines 78 to 80
if [ "${GITHUB_EVENT_NAME:-}" = "pull_request" ]; then
select_opts="--select-enforce"
select_opts="--only 9DAC4DDC 2F35A1FE A421E318 5AC2F65D 29C5D458 34F3999B 3A8359F6"
fi
needs.lint-gate.result == 'success' &&
needs.file-changes.result == 'success' &&
needs.file-changes.outputs.checkall == 'true'
if: false
case-optimization:
name: "Case Opt | ${{ matrix.cluster_name }} (${{ matrix.device }}-${{ matrix.interface }})"
if: github.repository == 'MFlowCode/MFC' && needs.file-changes.outputs.checkall == 'true' && github.event.pull_request.draft != true
if: false
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown

Claude Code Review

Head SHA: 6269824

Files changed:

  • 164
  • .claude/rules/common-pitfalls.md
  • .github/scripts/check_coverage_map_health.py
  • .github/workflows/common/test.sh
  • .github/workflows/test.yml
  • docs/documentation/case.md
  • docs/documentation/contributing.md
  • src/common/m_variables_conversion.fpp
  • src/simulation/m_pressure_relaxation.fpp
  • src/simulation/m_start_up.fpp
  • toolchain/mfc/case_validator.py

Findings:

  • .github/workflows/test.yml disables the primary CI matrix: the github job (Ubuntu/macOS, gfortran/Intel) is set to if: false, the case-optimization job is set to if: false, and the self-hosted cluster matrix is gutted (Phoenix and most Frontier CCE/AMD shards removed, leaving one Frontier ACC entry, plus runs-on: group: phoenix and the NODE_OPTIONS env are dropped). If merged, this PR turns off the gfortran/Intel compiler gate and case-optimization coverage entirely, directly contradicting the "must compile with gfortran, nvfortran, Cray ftn, and Intel ifx" requirement — this looks like a debugging leftover, not an intended change.
  • .github/workflows/common/test.sh replaces --select-enforce (coverage-based PR test selection) with a hardcoded --only list of 7 test UUIDs for every pull_request event. Once merged, all future PRs on this branch would run only those 7 tests in CI instead of the normal coverage-selected set, silently gutting regression coverage repo-wide.
  • src/simulation/m_start_up.fpp (s_initialize_gpu_vars, ~line 1103-1141): a new unconditional "CI probe" block allocates probe, runs a GPU kernel and host-side calls to f_bulk_modulus/s_phase_coefficients/etc., and unconditionally prints eos probe device/eos probe host to stdout on every simulation run (rank 0). This has no debug/feature guard and runs in production for every case, adding stdout noise and extra device work — looks like leftover development scaffolding that should be a unit test, not part of s_initialize_gpu_vars.
  • src/simulation/m_pressure_relaxation.fpp (~line 3107, s_correct_internal_energies init loop): the pressure floor clamp on pres_K_init(i) is now gated by if (.not. any_state_dependent_eos), the case-global flag, whereas the equivalent clamp on pres_relax a few lines later (~line 3120) is correctly gated per-fluid by if (.not. f_is_state_dependent(i)). In a mixed-EOS case (e.g. one stiffened-gas fluid plus one JWL/Mie-Gruneisen/Vinet fluid), any_state_dependent_eos is true globally, so the stiffened-gas fluid's pres_K_init clamp is skipped even though that fluid still uses the stiffened-gas closed form (isentrope_B/isentrope_n) downstream in f_phase_pressure_on_isentrope. An unclamped, near-vacuum initial pressure for the SG phase can then drive (pres + isentrope_B(i))**isentrope_n(i) to a negative base with non-integer exponent inside the isentrope evaluation, producing NaNs for the SG fluid in a mixed-EOS case.

@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown

Lines of Code

File Lines Diff
src/common/m_variables_conversion.fpp 1411 +283
src/post_process/m_derived_variables.fpp 355 -27
src/post_process/m_global_parameters.fpp 380 +22
src/pre_process/m_global_parameters.fpp 450 +21
src/simulation/m_global_parameters.fpp 769 +21
src/common/m_derived_types.fpp 460 +20
src/post_process/m_start_up.fpp 786 +20
src/simulation/m_pressure_relaxation.fpp 170 +18
src/simulation/m_acoustic_src.fpp 515 +15
src/simulation/m_riemann_solver_hllc.fpp 1278 +10
src/common/m_global_parameters_common.fpp 247 +8
src/simulation/m_hypoelastic.fpp 597 +6
src/simulation/m_riemann_solver_hypo_hlld.fpp 782 +6
src/common/m_constants.fpp 92 +5
src/pre_process/m_data_output.fpp 624 -5
src/simulation/m_rhs.fpp 1956 +5
src/simulation/m_data_output.fpp 1308 -2
src/simulation/m_ibm.fpp 1253 +2
src/simulation/m_start_up.fpp 1247 +2
src/simulation/m_time_steppers.fpp 829 +2
src/post_process/m_data_output.fpp 1183 +1
src/simulation/m_cbc.fpp 1115 +1
Directory Lines Diff
common 10262 +316
pre_process 4513 +16
simulation 27754 +86
post_process 3343 +16
total 45872 +434

@codecov

codecov Bot commented Sep 4, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 88.94737% with 42 lines in your changes missing coverage. Please review.
✅ Project coverage is 62.70%. Comparing base (8010057) to head (20ef9a3).
⚠️ Report is 1 commits behind head on master.

Files with missing lines Patch % Lines
src/common/m_variables_conversion.fpp 94.27% 3 Missing and 8 partials ⚠️
src/post_process/m_start_up.fpp 25.00% 8 Missing and 1 partial ⚠️
src/simulation/m_acoustic_src.fpp 10.00% 8 Missing and 1 partial ⚠️
src/simulation/m_pressure_relaxation.fpp 75.00% 1 Missing and 5 partials ⚠️
src/post_process/m_data_output.fpp 0.00% 3 Missing ⚠️
src/simulation/m_data_output.fpp 81.81% 2 Missing ⚠️
src/simulation/m_riemann_solver_hllc.fpp 85.71% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #1812      +/-   ##
==========================================
+ Coverage   62.26%   62.70%   +0.44%     
==========================================
  Files          84       84              
  Lines       21558    21847     +289     
  Branches     3188     3199      +11     
==========================================
+ Hits        13423    13700     +277     
- Misses       5937     5938       +1     
- Partials     2198     2209      +11     

☔ View full report in Codecov by Harness.
📢 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.

@sbryngelson

Copy link
Copy Markdown
Member Author

Closing: this probe has served its purpose. It answered two questions that the full suite could not, because both needed one Frontier lane running one test repeatedly.

Cray OpenACC. Three cycles narrowed the NaNs in the EOS helpers to an array element passed by reference into a device routine containing a loop. Recorded in #1815 and reproduced minimally in sbryngelson/compiler-bugs.

Cray OpenMP. Repointed at the reacting Roe HLLC shocktube, three passes of one binary gave three different answers:

0.07593517165078
0.07593517172084
0.07593517170526

That is a data race, not compiler noise. The cause was c_sum_Yi_Phi, written inside the HLLC kernel and missing from the pure-fluid private list while present in the hypoelastic one. It predates #1811 and is fixed on master in #1823.

No code from this branch is intended for merge.

@sbryngelson sbryngelson closed this Sep 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants