Strike duration override for previews
1 changed file+7−4
solvers/vonkarman-modal-disk/vk_modal_disk.pymodified+7−4View file
@@ -30,7 +30,7 @@ uses the unrestricted bases instead.
3030 With --device cuda the coupling tensor is assembled and the time stepping runs on a GPU through PyTorch
3131 (the modes and quadrature stay in numpy/scipy); the CPU path is the reference and the two agree to round-off.
3232
33-Usage: python vk_modal_disk.py <challenge.json> <out-dir> [--fields tag,...] [--force F] [--seconds S] [--full] [--device cuda] [tag ...]
33+Usage: python vk_modal_disk.py <challenge.json> <out-dir> [--fields tag,...] [--force F] [--duration T] [--seconds S] [--full] [--device cuda] [tag ...]
3434 where a tag is g<grid spacing in mm>-w<transverse modes>-a<airy modes>-m<oversampling>, e.g. g8-w200-a200-m1
3535 """
3636 from __future__ import annotations
@@ -48,7 +48,7 @@ from bfs_disk import BFSDisk, load_challenge # noqa: E402
4848
4949
5050 class VonKarmanDisk:
51- def __init__(self, ch: dict, spacing: float, n_w: int, n_airy: int, force_override: float | None = None, log=None, symmetric_y: bool | None = None, device: str = "cpu"):
51+ def __init__(self, ch: dict, spacing: float, n_w: int, n_airy: int, force_override: float | None = None, log=None, symmetric_y: bool | None = None, device: str = "cpu", duration_override: float | None = None):
5252 self.ch = ch
5353 self.device = device
5454 self.torch = None
@@ -59,6 +59,8 @@ class VonKarmanDisk:
5959 p = dict(ch["parameters"])
6060 if force_override is not None:
6161 p["strike_peak_force"] = force_override
62+ if duration_override is not None:
63+ p["strike_duration"] = duration_override
6264 ch2 = dict(ch)
6365 ch2["parameters"] = p
6466 self.p = p
@@ -306,6 +308,7 @@ def main():
306308 v = take("--fields", lambda s: set(s.split(",")))
307309 fields_for = v or set()
308310 force = take("--force", float)
311+ duration = take("--duration", float)
309312 seconds = take("--seconds", float)
310313 device = take("--device", str) or "cpu"
311314 full = "--full" in args
@@ -319,9 +322,9 @@ def main():
319322 meta = []
320323 for tag in tags:
321324 spacing, n_w, n_a, m = parse_tag(tag)
322- log(f"{tag}: force={force if force is not None else ch['parameters']['strike_peak_force']} N")
325+ log(f"{tag}: force={force if force is not None else ch['parameters']['strike_peak_force']} N, duration={duration if duration is not None else ch['parameters']['strike_duration']} s")
323326 t0 = time.perf_counter()
324- model = VonKarmanDisk(ch, spacing, n_w, n_a, force, log=log, symmetric_y=False if full else None, device=device)
327+ model = VonKarmanDisk(ch, spacing, n_w, n_a, force, log=log, symmetric_y=False if full else None, device=device, duration_override=duration)
325328 t1 = time.perf_counter()
326329 grid = None
327330 if tag in fields_for: