--- a/examples/fixed_patch_jet.py +++ b/examples/fixed_patch_jet.py @@ -8,6 +8,10 @@ Scale estimates use the continuous peak A=.02, not inlet mean speed: W/A=600, H/A=2250, W**2/nu=1440, H**2/nu=20250, where H=NY-3=45 between on-site planes. An acoustic crossing (~78 steps) does not imply that transients have disappeared. +Mach is sampled over all leaves every 50 steps and is usually inlet dominated; +the discrete inlet peak is slightly below continuous A. This is not an accuracy test. +The 120s checks are cooperative, not an exact interruption deadline. main elapsed +includes construction, advancement and plotting; it is not pure CFD timing. """ import argparse from dataclasses import replace @@ -87,7 +91,7 @@ ax.set_title('Native leaf grid: coarse dx=1, fine dx=0.5\n' 'Red: internal patch; orange: coarse slot; dashed: reservoir\n' 'Flow may cross patch sides; patch does not contain all startup flow', fontsize=10) - fig.savefig(out/'layout.png', dpi=150) + fig.savefig(out/'layout.png', dpi=150, bbox_inches='tight', pad_inches=.15) plt.close(fig) vmax = max(1., *(np.nanmax(np.hypot(f[..., 1], f[..., 2]))/AMPLITUDE for fields in snapshots for f in fields)) @@ -130,7 +134,8 @@ report = dict(config=dict(nx=48, ny=48, bounds=BOUNDS, W=WIDTH, A=AMPLITUDE, nu=.1, rho=1, tau_coarse=.8, tau_fine=1.1, coarse_boundary='slot_reservoir'), guards=dict(check_every=50, positive_density=True, finite=True, - max_Mach=MAX_MACH, max_seconds=MAX_SECONDS), + max_Mach=MAX_MACH, max_seconds=MAX_SECONDS, + timing='cooperative checks, not an exact interruption deadline'), scale_estimates=dict(velocity_basis='continuous peak A, not inlet mean', H=cfg.ny-3, W_over_A=WIDTH/AMPLITUDE, H_over_A=(cfg.ny-3)/AMPLITUDE, W_squared_over_nu=WIDTH**2/cfg.viscosity, @@ -168,6 +173,8 @@ if step: run.step(50) report['last_synchronized_coarse_step'] = run.step_count + if time.monotonic()-start > MAX_SECONDS: + raise TimeoutError('120 second demonstration limit reached after chunk') fields, sample = measure(run.download(), masks, centers, mass0) sample.update(t=step, coarse_steps=step, fine_steps=2*step) report['samples'].append(sample) @@ -177,6 +184,8 @@ with tempfile.TemporaryDirectory(prefix='.plot-', dir=out) as cache: os.environ['MPLCONFIGDIR'] = cache draw(out, snapshots, masks, centers) + if time.monotonic()-start > MAX_SECONDS: + raise TimeoutError('120 second demonstration limit reached after plotting') report['status'] = 'complete' except BaseException as exc: report.update(status='failed', error=f'{type(exc).__name__}: {exc}', @@ -184,6 +193,7 @@ raise finally: report['elapsed_seconds'] = time.monotonic()-start + report['elapsed_scope'] = 'main construction, advancement and plotting; not pure CFD time' (out/'summary.json').write_text(json.dumps(report, indent=2)+'\n') print(f'{report["status"]}: last synchronized coarse step ' f'{report["last_synchronized_coarse_step"]}; output={out}', flush=True)