Add matched diffusive resolution cases for pinball response
This commit is contained in:
@@ -82,3 +82,47 @@ def test_predeclared_comparisons_change_structure_only():
|
||||
assert r.mass == m.mass
|
||||
assert r.stiffness/m.stiffness == pytest.approx(.36)
|
||||
assert [runner.STEPS*s.frequency for s in [z, m, r]] == pytest.approx([60., 60., 36.])
|
||||
|
||||
|
||||
@pytest.mark.parametrize('diameter', [20, 40, 60])
|
||||
def test_diffusive_scaling_preserves_physical_geometry_and_duration(tmp_path, diameter):
|
||||
import json
|
||||
from CelerisLab.config import load_lbm_config
|
||||
scale = diameter/20
|
||||
raw = runner.config(diameter)
|
||||
p = tmp_path/'scaled.json'
|
||||
p.write_text(json.dumps(raw))
|
||||
cfg = load_lbm_config(str(p))
|
||||
cfg.validate()
|
||||
assert cfg.velocity*diameter/cfg.viscosity == pytest.approx(50.)
|
||||
assert (cfg.nx-1)/diameter == 1279/20
|
||||
assert (cfg.ny-2)/diameter == 510/20
|
||||
for original, mapped in zip(runner.CENTRES+runner.PROBES,
|
||||
runner.scaled_points(runner.CENTRES+runner.PROBES, scale)):
|
||||
assert mapped[0]/diameter == pytest.approx(original[0]/20)
|
||||
assert (mapped[1]-.5)/diameter == pytest.approx((original[1]-.5)/20)
|
||||
old = runner.Structure(*runner.STRUCTURES['M2'])
|
||||
new = runner.Structure(2., old.frequency/scale**2, diameter=diameter)
|
||||
assert new.mass/old.mass == pytest.approx(scale**2)
|
||||
assert new.stiffness/old.stiffness == pytest.approx(1/scale**2)
|
||||
assert new.damping == 0.
|
||||
assert cfg.velocity/(new.frequency*diameter) == pytest.approx(5.)
|
||||
assert runner.STEPS*scale**2*cfg.velocity/diameter == pytest.approx(300.)
|
||||
assert runner.WARMUP*scale**2*cfg.velocity/diameter == pytest.approx(256.)
|
||||
# A physical held force maps as F_fine=F_coarse/scale in two dimensions.
|
||||
old.y, old.v = .3, .0002
|
||||
new.y, new.v = scale*old.y, old.v/scale
|
||||
expected = old.candidate(.0001)
|
||||
for _ in range(round(scale**2)):
|
||||
new.y, new.v = new.candidate(.0001/scale)
|
||||
assert (new.y/scale, new.v*scale) == pytest.approx(expected, abs=2e-12)
|
||||
|
||||
|
||||
def test_scaled_summary_uses_requested_units_and_completed_rows():
|
||||
rows = np.zeros((5, 15))
|
||||
rows[:, 0] = np.arange(1, 6)
|
||||
rows[:, 1] = 4.
|
||||
got = runner.summarize(rows, diameter=40, block_steps=3)
|
||||
assert [(x['start_step'], x['end_step']) for x in got] == [(1, 3), (4, 5)]
|
||||
assert all(x['y_rms_D'] == .1 for x in got)
|
||||
assert runner.summarize(rows[:0], diameter=40) == []
|
||||
|
||||
Reference in New Issue
Block a user