Case Study 02 — PhysicsNeMo MGN¶
CS02 validates physics-lint against NVIDIA’s PhysicsNeMo MeshGraphNet (MGN)
checkpoint for 2D cylinder vortex shedding. The substrate is incompressible
Navier-Stokes on a mesh; the rule methodology exercised is PH-CON-001 (mass conservation),
with PH-CON-002 and PH-CON-003 correctly emitting SKIP via the
open-driven-dissipative substrate-class dispatch (D0-22 + D0-23 v9 — KE is
neither strictly dissipative nor strictly conservative on a cylinder-wake
flow that imports KE from inflow and dissipates in the wake).
Headline result. PH-CON-001 fires across 5 in-band trajectories sampled
from the 23 in-band members (Strouhal in [0.16, 0.21]) of the Phase-2
pre-fire audit. The median MGN/GT mass-conservation gap is -0.36% of GT,
range [-1.07%, +0.41%]; every per-trajectory gap sits inside the ~5.8%
harness-FE-on-P1 discretization floor. The canonical trajectory-44 pair
lands at 5.857% (GT) / 5.881% (MGN). All 7 D0-24 verdicts PASS.
What the result demonstrates and does NOT demonstrate. PASS verdicts for PH-CON-001 mean MGN is within the GT / harness-FE-on-P1 floor envelope on that trajectory; they are NOT a claim of physical incompressibility to 5%. PH-CON-001 at this discretization bounds MGN’s deviation from GT-equivalence rather than from physical incompressibility — distinguishing the two would require a tighter discretization (deferred to v1.x; see “What physics-lint did NOT catch §1” below for the floor-bounds-resolution distinction). The result is a small-N statistical characterization across the in-band subset, not a full-distribution claim or a CI-gate-threshold derivation.
Scope qualifier — PH-BC-001 no-slip is structurally inapplicable.
D0-27: the CS02 inference protocol masks
boundary nodes during rollout (v_diff_masked = torch.where(mask2, pred_i_velo, zeros)), freezing wall-node velocities at their step-0
ground-truth value of zero. A no-slip check on this rollout computes
||v_wall|| ~ 0 and PASSes by construction, detecting nothing about the
surrogate. P2.2 retired the planned mesh wall-node BC capability-build
on this finding. PH-SYM-001/002/003/004 are scoped particle-side only per
spec §1.2 and are not exercised on the mesh side.
PH-CON-001 routing — harness, not public rule. PH-CON-001 as shipped
in physics-lint v1.0 returns SKIPPED on pde != "heat". CS02 routes
PH-CON-001 through the mesh harness as structural-identity reapplication:
the mass-conservation identity (∫ρ over the domain, ∇·v on incompressible
NS) is reapplied by the harness, validated against the analytical mass-
conservation fixture. This is NOT “rule ran without modification” — it is
the class-level pattern for V1 rules with input-domain restrictions, and
the load-bearing methodology claim of CS02. The shipped CLI and Action do
not yet ingest the mesh substrate either (loader.py rejects
field.type = "mesh"); CLI/Action loader integration for mesh — and for
particle — is planned for v1.2.0 (see docs/backlog/v1.2.md).
The detailed validation harness, the per-trajectory table, the cross-stack table integrating with rung-4a/4b, and the full “what physics-lint did NOT catch” enumeration are below.