Multicomponent Flow Code (MFC)
- Spencer Bryngelson
- Henry Le Berre
- Ben Wilfong
- Haocheng Yu1
- Daniel J. Vickers
- Hyeoksu Lee2
- anandrdbz
- Tanush Prathi
- Yanjun Zhang2
- Ansh Gupta
- Brian Ok
- Nikolaos Tselepidis3
- Rasmit Devkota4
- Mohammed S. Al-Mahrouqi5
- Jean-Sebastien Spratt
- JRChreim
- Dimitrios Adam
- Cameron
- Mike VandenBoom6
- Xuzheng Tian
- Mark Zhang7
- Mauro Rodriguez Jr8
- Sarthak Sharma
- Max Hawkins
- Diego Vaca Revelo
- Davis Cole9
- Eric Dong
- Esteban Cisneros10
- SVS87
- aricer123
- 1. Gatech CSE-AE
- 2. California Institute of Technology
- 3. @NVIDIA, ETH Zurich
- 4. Georgia Tech Research Institute - Quantum Systems Division | Formerly Quantinuum, MIT Lincoln Laboratory
- 5. Georgia Institute of Technology
- 6. University of Florida
- 7. UCLA
- 8. Brown University
- 9. Worcester Polytechnic Institute
- 10. University of Tennessee Space Institute
Description
What's Changed
Feature release. Two new physics capabilities land here — a condensed-phase reactive burn with IBM burning surfaces, and a state-dependent equation-of-state family (Mie-Gruneisen, JWL, Vinet) evaluated per phase on the 5- and 6-equation models — alongside anchored dual-pass HLLD for hypoelasticity. Four unexercised capabilities were removed, so read the breaking changes below before upgrading a case file.
Breaking changes
- Remove the four-equation model (
model_eqns = 4) — the Tait model was never exercised: no test, example, or benchmark set it, and no case anywhere set therhoref/prefpair it required, so its paths were unverifiable in either direction while forcing amodel_eqnsbranch through the pressure inversion, energy assembly, primitive recovery, HLLC, IBM, acoustic source, and both initialization paths.rhorefandprefare gone with it. A case settingmodel_eqns = 4now fails validation. by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1713 - Remove the non-operational hyperelasticity capability — the exposed reference-map implementation was unreachable through a normal case (
hyper_modelwas absent from the parameter registry and generated namelist), contained a 3D-only kernel exposed to lower-dimensional cases, computed the wrong Cauchy-Green contraction for rotated finite deformations, and left derived state fluxes unassigned. User-facing parameters, reference-map state, the constitutive module, solver hooks, and the documentation claims are removed; shared hypoelastic infrastructure stays. A corrected implementation is to be restored separately. by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1675 - Remove MHD from the Lax-Friedrichs solver — the MHD and RMHD branches in
m_riemann_solver_lf.fppwere unreachable through the toolchain and the implementation had subtle defects (the Rusanov bound used only the acoustic sound speed). The branches are deleted and the missing Fortran-side check added. Closes #1661. by @ChrisZYJ in https://github.com/MFlowCode/MFC/pull/1722 - Remove integral output —
integral_wrt,num_integrals, and the 30integral(i)%{x,y,z}{min,max}parameters are gone. The region-integrated pressure output for Euler-Euler bubble runs had no coverage in the roughly nine years since it was added, and its author confirmed it has no users. No hot path is touched; the output was cold-guarded. by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1716 - Cases set only the parameters their equation of state reads — the validator now refuses
pi_infon an ideal gas outright rather than only a nonzero value. The solver already zeroedpi_infsfor an ideal gas at init, so the value was a lie in the case file; 141 dead lines across 117 examples and 19 in test definitions are removed. No golden moves. by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1808 pre_processmust be requested explicitly on restart — restarting without naming a target no longer silently reruns pre-process and deletes the restart data in the directory. Passing-t pre_processstill works if you intend to modify patches. by @danieljvickers in https://github.com/MFlowCode/MFC/pull/1761- Phase change requires two fluids — the phase-change operator uses fixed liquid and vapor indices
lp = 1,vp = 2and writes both fields; with one carrier fluid the vapor index aliased x-momentum. Now rejected at validation. Fixes #1738. by @rj-scharff in https://github.com/MFlowCode/MFC/pull/1743
New features
- Combustion: condensed-phase reactive burn (5-/6-equation, Arrhenius kinetics) and IBM burning surfaces — a programmed, pressure-driven burn on the multi-fluid model that converts a reactant fluid to a product fluid and releases chemical energy, a lightweight route to detonation and deflagration without finite-rate kinetics. It runs on both the pressure-equilibrium 5-equation and the Saurel/Pelanti 6-equation model, with the formation energy threaded through phasic-pressure relaxation so phasic and mixture pressures stay
qv-consistent (existing 6-equation goldens are bit-identical atqv = 0). An optional Arrhenius term gives temperature-driven ignition. Immersed boundaries can now act as burning or transpiring surfaces with wall-normal fuel injection and an optional Vieille's-law pressure-coupled burn rate for internal-ballistics feedback. Also fixes a hang when IBM and chemistry were enabled together, and adds a reactive shock-flame hardcoded IC (hcid 275). by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1670 - State-dependent equations of state: Mie-Gruneisen (linear and cubic Hugoniot), JWL and Vinet, with temperature — per-phase evaluation on the 5- and 6-equation models. Any Mie-Gruneisen form maps onto MFC's
rho*e = Gamma*p + Pi, so the centralized operators need only those coefficients plus their density derivatives; stiffened gas is the degenerate member and stays bit-for-bit identical. Selected per fluid viafluid_pp(i)%eos, with each family owning its parameters and the validator refusing the rest. Evaluated in the mixture coefficients, the frozen mixture sound speed (Wood's law as an N-fluid loop), the characteristic-BC coefficient derivative, probes, post-processc, and through helpers in hypoelasticity, IBM, acoustic sources and the reactive burn. Verified against exact Hugoniot jump relations, analytic acoustic propagation and closed-form isentropic release, with a 27-case stiffened-gas gate confirming no existing path moved. by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1811 - Operator-split integration for the condensed-phase reactive burn —
rburn%substepsfreezes the flow and integrates the burn ODE across the step in equal sub-steps, re-evaluating the mixture pressure from the frozen internal energy each sub-step. Without it, a fast burn ties the reaction time scale to the acoustic CFL and forces a smaller step for the whole simulation, even where nothing is reacting. Defaults to0, which leaves the source in the flow RHS exactly as before. by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1831 - Anchored dual-pass HLLD for hypoelasticity, plus HLLC and interface-consistent HLL — a newly developed anchored dual-pass HLLD form for the non-conservative hypoelastic terms, kept separate from the MHD HLLD because the inner-state equations follow a different eigenstructure. Hypoelasticity gains HLLC and an interface-consistent HLL option, and HLL gains the
alpha div Utreatment so its non-conservative handling aligns with HLLC. Riemann-consistent cross-derivative traces are now passed to the RHS, which finite differencing could not supply for HLLC/HLLD. Default behavior is preserved exactly; derivation notes for the source terms are added undermisc/dev_notes. by @ChrisZYJ in https://github.com/MFlowCode/MFC/pull/1414 - Automatic IB neighborhood radius sizing — set
ib_neighborhood_radius: 0(the new default) and MFC computes the radius from the largest IB width and the largest processor width, with a 10% safety factor. This removes the need to recompute the radius by hand whenever the rank count changes, which previously made the same case awkward to move between CPU and GPU runs or through a strong-scaling sweep. Closes #1536. by @danieljvickers in https://github.com/MFlowCode/MFC/pull/1736 - Hemisphere shell particle cloud packing —
particle_cloud(i)%packing_method = 3places spherical or circular IBM particles inside a hemisphere-shell region, enforcing inner and outer shell-radius clearance, hemisphere-plane clearance, bounding-box clearance, and particle-particle non-overlap. Adds theshell_inner_radiusandshell_outer_radiusparameters. by @BCKim55 in https://github.com/MFlowCode/MFC/pull/1667 - File-per-process IB markers — removes an I/O bottleneck in large immersed-boundary runs. by @danieljvickers in https://github.com/MFlowCode/MFC/pull/1802
- Revised terminal output, with a limiting factor reported for adaptive stepping — narrower per-step lines and, under adaptive output, the factor currently limiting the step. by @wilfonba in https://github.com/MFlowCode/MFC/pull/1757
- Add a 3D reacting mixing-layer example (H2/N2-air, Mach 1.5) and
hcid = 371by @ecisneros8 in https://github.com/MFlowCode/MFC/pull/1758 - SCC26 practice problem preparation by @wilfonba in https://github.com/MFlowCode/MFC/pull/1731
Performance
- Large-scale startup optimizations — initialization changes needed to run at full Frontier scale, including optimizations specific to lattice packing. Collision detection reverts to linear-order prefiltering, which had been consuming three quarters of compute time at 810k IBs per neighborhood while costing about the same at low IB counts. Tested at 500 million immersed boundaries on 78k MPI ranks. by @danieljvickers in https://github.com/MFlowCode/MFC/pull/1686
- Base dependency and configure skips on real state rather than on
CMakeCache.txtby @sbryngelson in https://github.com/MFlowCode/MFC/pull/1696
Bug fixes
- Delete non-finite Lagrange bubbles in boundary enforcement — a bubble's ODE state can go non-finite under strong acoustic forcing, and the out-of-range comparisons in
s_enforce_EL_bubbles_boundary_conditionsare both false for NaN, so the bubble was never deleted. Its NaN position reacheds_get_cell, whereint(NaN)gaveINT_MINand the subsequent read ran roughly 17 GB out of bounds, crashing everybubbles_lagrangeGPU run once a bubble went NaN. The check is inverted to test for inside, so NaN now fails it. by @aliencaocao in https://github.com/MFlowCode/MFC/pull/1772 - Fix two GPU kernels that share a scalar every thread writes — under OpenMP offload this is a data race; OpenACC hides it by predetermining scalars in a compute region as private, so the symptom was a different answer on every run under Cray OpenMP while every other backend looked fine. In HLLC the kernel is emitted twice through a fypp loop and the two hand-written private lists had drifted apart; the lists are now composed from a shared set and an elastic-only set so a variable cannot be left behind in one copy. Lax-Friedrichs had the same defect independently with
Gamm_L/Gamm_R. by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1823 - Continuous damage model corrections — advances the conservative
U_D = m_solid * Dwith fluxU_D*uand sourcem_solid * D_dotinstead of the scalarD, includes-p*Icorrectly in the maximum principal stress for 1D/2D/3D, tracks energy against the undamaged modulusG_0so states stay finite and stable asD -> 1, and clipsDto[0,1]with projection ofU_Dafter each stage. Closes #1673. by @ChrisZYJ in https://github.com/MFlowCode/MFC/pull/1723 - Fix the missing
qvterm in the Lagrange bubble initial pressure —m_bubbles_EL.fppopen-coded the stiffened-gas pressure inversion and dropped the heat-of-formation term present in the canonicals_compute_pressure. Fixes #1706. by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1709 - Fill
ptilso probe output stops writing undefinedptildeandptotby @sbryngelson in https://github.com/MFlowCode/MFC/pull/1742 - Fix hypoelastic probe output by @ChrisZYJ in https://github.com/MFlowCode/MFC/pull/1721
- Debug wall collisions and particle state writing by @danieljvickers in https://github.com/MFlowCode/MFC/pull/1745
- Do not require
(xyz)_domainextents on restarts by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1734 - Make the OpenMP
no_createclause a documented no-op instead of aborting fypp by @engineer-scientist in https://github.com/MFlowCode/MFC/pull/1724 - Keep multi-word values intact when loading toolchain modules by @Mohit-Ak in https://github.com/MFlowCode/MFC/pull/1702
- Fix Python 3.9
fastjsonschemacompatibility by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1678 - Guard the rapidfuzz-dependent assertion in
test_validateby @sbryngelson in https://github.com/MFlowCode/MFC/pull/1705
Build and compiler support
- Avoid an NVHPC 25.5
fort2ICE by expandingf_compute_multidim_cfl_termsby @sbryngelson in https://github.com/MFlowCode/MFC/pull/1718 - Work around amdflang whole-image device codegen instability by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1759
- Move Frontier AMD builds to AFAR drop 23.2.1 by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1768
- Pin ffmt 0.4.5 by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1806
Refactoring and internals
- Centralize the equation-of-state expressions in the Riemann solvers — each EOS expression gets one definition (mixture coefficients, energy, sound speed, bulk modulus, pressure, phase internal energy, isentrope exponent and pressure), so adding a second equation of state became a change inside one module rather than an edit to every solver. This is the groundwork the state-dependent EOS family builds on. by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1762
- Refactor variable conversion into stage-independent common code — the first slice of making
src/commongenuinely stage-independent instead of selecting implementations withMFC_SIMULATION,MFC_PRE_PROCESSandMFC_POST_PROCESS.m_variables_conversionloses all stage-selection macros, uses one species-to-mixture kernel in every executable, and moves material-property arrays, viscosity-index metadata and direction mappings into common global parameters so they have a single declaration and GPU ownership point. Stage-dependent behavior becomes explicit initialization policy. by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1679 - Move input-only checks to
case_validator, delete deadparams_tests, and enforce the split —case_validator.pyandm_checker.fpphad drifted into double entry, with the reactive burn adding nine constraints to both in the same PR. Net -1,363 lines. by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1717 - Refuse an array element passed to a device routine that runs a
seqloop (lint) by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1816 - Check for
integer(wp)and signed d-exponent literals inlint_source.py, addressing #1485 by @BakaOverflow in https://github.com/MFlowCode/MFC/pull/1725 - Tooling dedup:
gen_case_constraints_docs.py,sched.py,user_guide.pyby @AnaPcode in https://github.com/MFlowCode/MFC/pull/1720 - Make
precheckpass under the pre-commit hook from a worktree by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1807 - Remove commented-out code by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1803
- Remove comments referencing invisible external context by @Moferanoluwa in https://github.com/MFlowCode/MFC/pull/1699
- Remove a junk separator comment tripping source lint by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1780
- Enable fortls navigation in VS Code by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1676
CI and testing
Most of this cycle's CI work went into making the Phoenix and Frontier lanes survive a shared, partly unhealthy cluster: bounding queue waits, resubmitting on preemption, backfilling onto whatever partition is free, and naming the node or kernel behind a failure instead of blaming a healthy one.
- Bound SLURM queue wait and combine build and test into one allocation on Phoenix by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1763
- Let Phoenix SLURM jobs wait for a node up to the job timeout (queue cap default 0) by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1770
- Resubmit SLURM jobs on preemption instead of failing (Phoenix embers) by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1771
- Fail fast on bad nodes and cluster outages by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1797
- Name the kernel behind a GPU memory fault, and stop CI condemning healthy nodes by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1800
- Identify the faulted node via
sacctwhen the.outmarker is missing by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1835 - Submit Phoenix GPU test jobs to a partition list for backfill by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1832
- Run Phoenix GPU benchmarks in one single-node job for backfill on matched hardware by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1833
- Request 1 GPU for case-optimization jobs, which only use one by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1836
- Skip the redundant rebuild in the case-optimization run job by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1766
- Run the post-build syscheck under
mpirunon Phoenix by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1728 - Add
--bind-to noneto the Phoenix syscheck smoke test, fixing a GPU-node MPI bind failure by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1834 - Run the NVHPC container lanes without MPI by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1822
- Switch Frontier CI from the revoked hackathon QOS to normal by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1746
- Exclude bad Phoenix GPU node atl1-1-03-007-29-0 (uncorrectable ECC) by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1748
- Reclaim Phoenix V100 node atl1-1-03-002-29-0 (ECC verified clean) by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1749
- Exclude bad Phoenix L40S node atl1-1-03-007-31-0 (uncorrectable ECC) by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1750
- Take gpu-l40s out of rotation and seed frontier10202 as excluded by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1804
- Keep every column of probe output in golden packs by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1712
- Stop the coverage-map bot pushing a no-op commit on every refresh by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1683
- Stop the coverage unit tests committing into the developer's own repository by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1697
- Key coverage-map freshness on the refresh run, not on
_meta.git_shaby @sbryngelson in https://github.com/MFlowCode/MFC/pull/1732 - Post the LOC diff as a sticky pull request comment by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1753
- Resolve CodeQL code-scanning alerts in workflows by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1825
- Checkout with
fetch-depth: 0so the review bot works on fork PRs by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1671
Documentation and repository
- Fix the sign of the radial-velocity term in the documented mixture pressure by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1740
- Fix the broken star history chart in the README by @Dessalines39394 in https://github.com/MFlowCode/MFC/pull/1726
- Revise the pull request template for contribution guidelines by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1752
- Delete
.github/ISSUE_TEMPLATE/bug_report.mdby @sbryngelson in https://github.com/MFlowCode/MFC/pull/1751 - Exclude stackoverflow.com from the lychee link check by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1701
- Exclude the VS Code Marketplace from lychee, it returns 503 to automated requests by @sbryngelson in https://github.com/MFlowCode/MFC/pull/1735
New Contributors
- @Moferanoluwa made their first contribution in https://github.com/MFlowCode/MFC/pull/1699
- @Dessalines39394 made their first contribution in https://github.com/MFlowCode/MFC/pull/1726
- @Mohit-Ak made their first contribution in https://github.com/MFlowCode/MFC/pull/1702
- @AnaPcode made their first contribution in https://github.com/MFlowCode/MFC/pull/1720
- @BakaOverflow made their first contribution in https://github.com/MFlowCode/MFC/pull/1725
- @rj-scharff made their first contribution in https://github.com/MFlowCode/MFC/pull/1743
- @BCKim55 made their first contribution in https://github.com/MFlowCode/MFC/pull/1667
- @aliencaocao made their first contribution in https://github.com/MFlowCode/MFC/pull/1772
Full Changelog: https://github.com/MFlowCode/MFC/compare/v5.6.1...v5.7.0
Notes
Files
MFlowCode/MFC-v5.7.0.zip
Files
(77.5 MB)
| Name | Size | Download all |
|---|---|---|
|
md5:ab91017dde364235cbab81d15cee3e6b
|
77.5 MB | Preview Download |
Additional details
Related works
- Is supplement to
- Software: https://github.com/MFlowCode/MFC/tree/v5.7.0 (URL)
Software
- Repository URL
- https://github.com/MFlowCode/MFC