NeuralGCM / scripts /result.py
yzt15806542928's picture
Upload folder using huggingface_hub
f4a39ee verified
Raw
History Blame Contribute Delete
2.52 kB
#!/usr/bin/env python3
"""Visualize official NeuralGCM pressure-level predictions."""
from __future__ import annotations
import argparse
import matplotlib.pyplot as plt
import numpy as np
import xarray as xr
try:
from common import load_config, resolve_path
except ModuleNotFoundError: # supports ``python -m scripts.result``
from scripts.common import load_config, resolve_path
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--config", default="conf/config.yaml")
parser.add_argument("--input")
parser.add_argument("--variable", default="temperature_500")
parser.add_argument("--level", type=int, default=500)
parser.add_argument("--lead", type=int, default=0)
parser.add_argument("--output")
args = parser.parse_args()
config = load_config(args.config)
ds = xr.open_dataset(resolve_path(args.input or config["inference"].get("output", "results/predictions.nc"), args.config))
# Official PressureLevelModel output stores named variables with an
# explicit pressure ``level`` dimension; retain compatibility with the
# earlier channel-packed smoke output when present.
variable = args.variable
if variable not in ds.data_vars and variable.rsplit("_", 1)[-1].isdigit():
base, suffix = variable.rsplit("_", 1)
if base in ds.data_vars:
variable = base
args.level = int(suffix)
if variable in ds.data_vars:
field = ds[variable]
if "level" in field.dims:
level = int(args.level)
if level not in ds.level.values:
raise ValueError(f"Unknown pressure level {level}; available levels={ds.level.values.tolist()}")
field = field.sel(level=level)
elif "channel" in ds.coords and args.variable in [str(x) for x in ds.channel.values]:
field = ds.prediction.sel(channel=args.variable)
else:
raise ValueError(f"Unknown channel/variable {args.variable!r}")
if not bool(np.isfinite(field.values).all()):
raise ValueError(
f"Variable {variable!r} contains NaN/Inf; refusing to create "
"a misleading visualization"
)
field.isel(time=args.lead).plot(figsize=(12, 4), cmap="coolwarm")
output = resolve_path(args.output or "results/forecast.png", args.config)
output.parent.mkdir(parents=True, exist_ok=True)
plt.tight_layout(); plt.savefig(output, dpi=150)
print(f"Saved visualization to {output}")
if __name__ == "__main__":
main()