research: Dütsch --dump-fields capture (research-only; default path unchanged)
At the first step of each scored phase bin in the declared cycles, write a near-body crop (±8D × ±6D, float32 ux, uy, rho + fluid mask), an 8x fluid-weighted downsample of the whole domain, the same-step force and the analytic centre; at every bin read, append fluid-mean rho/ux/uy and crop, inlet- and outlet-strip means to trend.npy. Fail closed if the crop leaves the domain or clips the swept body. Without --dump-fields nothing changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
dd37883d3c
commit
a0aea3b9bf
3 files changed
+116
No files matched your search
@@ -150,3 +150,42 @@ def test_horizon_excludes_future_coverage_and_events(monkeypatch):
|
||||
entry = json.loads(out[0])["cases"][0]
|
||||
assert sorted(int(k) for k in entry["coverage"]) == [3, 4] # nothing from cycles 5, 6
|
||||
assert entry["no_donor"] == 0.0
|
||||
|
||||
|
||||
|
||||
def _capture():
|
||||
spec = importlib.util.spec_from_file_location(
|
||||
"duetsch_capture", Path(__file__).resolve().parents[2] / "research/duetsch_re100_kc5/capture.py")
|
||||
mod = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(mod)
|
||||
return mod
|
||||
|
||||
|
||||
def test_capture_crop_downsample_and_trends():
|
||||
c = _capture()
|
||||
n, D = 2400, 40
|
||||
xm = ym = 0.5 * (n - 1)
|
||||
A, R = p.amplitude(D), 20.0
|
||||
box = c.crop_box(xm, ym, D, n, (xm - A - R, xm + A + R, ym - R, ym + R))
|
||||
assert box == (880, 1520, 960, 1440) and box[1] - box[0] + 1 == 641 and box[3] - box[2] + 1 == 481
|
||||
with pytest.raises(ValueError):
|
||||
c.crop_box(xm, ym, D, 600, (0, 1, 0, 1)) # leaves the domain
|
||||
with pytest.raises(ValueError):
|
||||
c.crop_box(xm, ym, D, n, (xm - 9 * D, xm, ym, ym)) # clips the swept body
|
||||
field = np.arange(64.0).reshape(8, 8)
|
||||
fluid = np.ones((8, 8), bool)
|
||||
fluid[:4, :4] = False
|
||||
down = c.downsample(field, fluid, 4)
|
||||
assert np.isnan(down[0, 0]) and down[1, 1] == field[4:, 4:].mean()
|
||||
rho = np.ones((n, n)); rho[:, 1:81] = 1.01
|
||||
row = c.trend_row(10, 3, 180.0, rho, np.zeros((n, n)), np.zeros((n, n)),
|
||||
np.ones((n, n), bool), D, n, box)
|
||||
assert row[7] == pytest.approx(1.01) and row[9] == pytest.approx(1.0)
|
||||
|
||||
|
||||
def test_dump_steps_are_the_first_step_of_each_bin():
|
||||
T = 5040
|
||||
for k in (11, 21, 30, 31):
|
||||
starts = [s for s in range(T // 4 + (k - 1) * T, T // 4 + k * T)
|
||||
if p.bin_phase(s, T) is not None and p.phase(s, T) == p.bin_phase(s, T)]
|
||||
assert len(starts) == 3 and all(p.cycle(s, T) == k for s in starts)
|
||||
Reference in new issue
Block a user