Files
CelerisLab/tests/validation/run_j3_reservoir.py
T

82 lines
3.6 KiB
Python

"""Sequential reservoir experiment: stop after a failed positive case."""
import argparse
import json
import os
from pathlib import Path
import sys
from unittest.mock import patch
import numpy as np
import CelerisLab
from CelerisLab.cuda import compiler_v2 as compiler
from run_j1 import ROOT, make_sim, off_path_check
from run_j2_slot import NX, WIDTH, GATES, run_case, restart_check
def old_velocity_check(baseline, width, top_u):
states = []
for source in (baseline, Path(compiler.kernel_path(''))):
with patch.object(compiler, '_KERNEL_DIR', str(source)):
with make_sim(.002, nx=NX, slot_width=width, top_u=top_u) as sim:
sim.initialize()
initial = sim.get_ddf().copy()
sim.run(64)
states.append((initial, sim.get_ddf().copy(), sim.get_flags().copy()))
return bool(all(np.array_equal(a, b) for a, b in zip(*states)))
def checkpoint_check():
with make_sim(.002, nx=NX, top_u=0., slot_width=WIDTH, top_mode='reservoir') as sim:
sim.initialize()
sim.run(11)
return restart_check(sim, .002, top_mode='reservoir')
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--output', type=Path, required=True)
parser.add_argument('--baseline-kernels', type=Path, required=True)
args = parser.parse_args()
assert Path.cwd() == ROOT == Path('/home/frank14f/CelerisLab')
assert sys.executable == '/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python'
assert Path(CelerisLab.__file__).resolve() == ROOT/'src/CelerisLab/__init__.py'
assert Path(compiler.kernel_path('kernel_v2.cu')).resolve() == ROOT/'src/CelerisLab/lbm/kernels/kernel_v2.cu'
assert os.environ.get('CUDA_VISIBLE_DEVICES') in ('0', '1')
report = dict(python=sys.executable, package=CelerisLab.__file__,
cuda_source=compiler.kernel_path('kernel_v2.cu'), physical_gpu=os.environ['CUDA_VISIBLE_DEVICES'],
gates=dict(GATES, top_density_error=5e-7), regressions={}, cases=[],
status=dict(positive='not_tested', negative='not_tested', zero='not_tested',
checkpoint='not_tested'))
def save():
args.output.write_text(json.dumps(report, indent=2)+'\n')
for name, result in (
('j1_velocity_top', old_velocity_check(args.baseline_kernels, 0, .02)),
('j2_velocity_top', old_velocity_check(args.baseline_kernels, WIDTH, 0.)),
('default_off', off_path_check(args.baseline_kernels)),
):
report['regressions'][name] = 'passed' if result else 'failed'
save()
print(json.dumps(report['regressions']), flush=True)
if 'failed' in report['regressions'].values():
return 1
for name, amplitude in (('positive', .002), ('negative', -.002), ('zero', 0.)):
case = run_case(amplitude, top_mode='reservoir', check_restart=False)
report['cases'].append(case)
report['status'][name] = 'passed' if case['passed'] else 'failed'
save()
print(json.dumps({k: case[k] for k in ('amplitude', 'steps', 'checks', 'mass_offset',
'mass_window_span', 'flux_error', 'top_density_error',
'top_velocity_range', 'symmetry')}), flush=True)
if not case['passed']:
return 1
report['status']['checkpoint'] = 'passed' if checkpoint_check() else 'failed'
save()
print(json.dumps(report['status']), flush=True)
return 0 if all(status == 'passed' for status in report['status'].values()) else 1
if __name__ == '__main__':
raise SystemExit(main())