| """Write a lightweight lazy-data protocol and content-determining coefficients.""" |
|
|
| import argparse |
| from pathlib import Path |
|
|
| import numpy as np |
| import yaml |
|
|
|
|
| ROOT = Path(__file__).resolve().parents[1] |
|
|
|
|
| def main(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--force", action="store_true") |
| args = parser.parse_args() |
| config = yaml.safe_load((ROOT / "conf/config.yaml").read_text()) |
| data, generator = config["data"], config["generator"] |
| output = ROOT / data["root"] / data["protocol_file"] |
| output.parent.mkdir(parents=True, exist_ok=True) |
| if output.exists() and not args.force: |
| print(f"exists={output.relative_to(ROOT)}") |
| return |
| rng = np.random.default_rng(int(config["seed"])) |
| experiments = len(data["experiments"]) |
| growth = float(generator["growth_rate_per_hour"]) * np.asarray(generator["experiment_growth_multipliers"]) |
| np.savez_compressed( |
| output, |
| format_version=np.asarray(data["format_version"]), |
| generation_method=np.asarray("deterministic_structured_lazy_low_rank_v1"), |
| experiments=np.asarray(data["experiments"]), |
| times_hours=np.arange(int(data["time_steps"]), dtype=np.int16) * int(data["step_hours"]), |
| pressure_levels_hpa=np.asarray(data["pressure_levels_hpa"], dtype=np.int16), |
| latitudes_degrees=np.linspace(90.0, -90.0, int(data["latitude_points"])), |
| longitudes_degrees=np.linspace(0.0, 360.0, int(data["longitude_points"]), endpoint=False), |
| field_shape=np.asarray(data["field_shape"], dtype=np.int64), |
| spectral_shape=np.asarray(data["spectral_shape"], dtype=np.int64), |
| ensemble_size=np.asarray(data["ensemble_size"]), |
| triangular_truncation=np.asarray(data["triangular_truncation"]), |
| nsp=np.asarray(data["nsp"]), |
| phase=rng.uniform(0, 2 * np.pi, experiments), |
| amplitude=float(generator["perturbation_ms"]) * np.asarray(generator["compensation_scales"]), |
| growth_rate=growth, |
| spectral_phase=rng.uniform(0, 2 * np.pi, experiments), |
| spectral_amplitude=rng.uniform(0.8, 1.2, experiments) * 1e-5, |
| base_wind_ms=np.asarray(generator["base_wind_ms"]), |
| spectral_slope=np.asarray(generator["spectral_slope"]), |
| coefficient_seed=np.asarray(config["seed"]), |
| raw_fields_materialized=np.asarray(False), |
| ) |
| print(f"protocol={output.relative_to(ROOT)} bytes={output.stat().st_size} logical_field={data['field_shape']} logical_spectral={data['spectral_shape']}") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|