Use low-Mach wall speed for shared-motion GPU gate

This commit is contained in:
Frank14f
2026-10-31 14:05:43 +08:00
parent 33dcb422c6
commit d0bcefa60c
2 changed files with 9 additions and 3 deletions
+5 -1
View File
@@ -40,7 +40,11 @@ link exists. Unrelated moving/static body and probe overlaps still reject.
This is a sufficient restricted-group condition, not support for near-contact This is a sufficient restricted-group condition, not support for near-contact
or independent motion. The r4, distance8.3, dy=.5 counterexample remains rejected. or independent motion. The r4, distance8.3, dy=.5 counterexample remains rejected.
CPU tests enumerate candidate donors/write footprints over subcell phases; CPU tests enumerate candidate donors/write footprints over subcell phases;
GPU tests compare fixed vs hold and member-order permutations through crossings. GPU tests compare fixed vs hold and member-order permutations through crossings
at wall speed .01 over the full +/-D envelope (8000 steps). The initial .5-speed
fixture failed with NaNs; a single-circle control also failed at step69. That
Mach~.866 fixture was unsuitable as a low-Mach numerical gate. Its failure is
retained; the geometric MAX_STEP proof is unchanged, not a stability guarantee.
CUDA kernels and arithmetic are unchanged. CUDA kernels and arithmetic are unchanged.
## New structural parameters (not inherited from the paper) ## New structural parameters (not inherited from the paper)
@@ -50,8 +50,10 @@ def test_fixed_vs_shared_hold(tmp_path):
def test_common_motion_member_order_has_no_population_effect(tmp_path): def test_common_motion_member_order_has_no_population_effect(tmp_path):
offsets = np.concatenate((np.arange(.5, 20.5, .5), np.arange(19.5, -20.5, -.5), # MAX_STEP=.5 is a geometric bound, not a low-Mach stability guarantee.
np.arange(-19.5, .5, .5))) # Keep the complete +/-D excursion at wall speed .01, equal to mean inflow.
offsets = np.concatenate((np.arange(1, 2001), np.arange(1999, -2001, -1),
np.arange(-1999, 1))) * .01
forward = simulate(tmp_path, moving=True, offsets=offsets) forward = simulate(tmp_path, moving=True, offsets=offsets)
reverse = simulate(tmp_path, moving=True, offsets=offsets, reverse=True) reverse = simulate(tmp_path, moving=True, offsets=offsets, reverse=True)
assert forward[3] > 0 and forward[3] == reverse[3] assert forward[3] > 0 and forward[3] == reverse[3]