Download scripts/build_static.py from OneScience-Group/FuXi_v21: direct link, hf CLI and curl.
- Browser
- Download file 2.12 kB
-
https://huggingface.co/OneScience-Group/FuXi_v21/resolve/main/scripts/build_static.py
- Command line
-
hf download hf://OneScience-Group/FuXi_v21/scripts/build_static.py
-
curl -L -o build_static.py https://huggingface.co/OneScience-Group/FuXi_v21/resolve/main/scripts/build_static.py
2.12 kB
| """Build project-defined FuXi static fields and C85 validity mask from scratch.""" | |
| from __future__ import annotations | |
| import argparse | |
| import numpy as np | |
| from common import load_config, resolve_path | |
| from variables import c85_from_config | |
| def build_static_fields(height: int, width: int) -> np.ndarray: | |
| latitude = np.deg2rad(np.linspace(90.0, -90.0, height, dtype=np.float32))[:, None] | |
| longitude = np.deg2rad(np.arange(width, dtype=np.float32) * (360.0 / width))[None, :] | |
| lat = np.broadcast_to(latitude, (height, width)) | |
| lon = np.broadcast_to(longitude, (height, width)) | |
| geopotential = np.zeros_like(lat) | |
| land_sea = np.ones_like(lat) | |
| return np.stack((geopotential, land_sea, np.cos(lat), np.sin(lat), np.cos(lon), np.sin(lon))) | |
| def build_channel_mask(channels: list[str], height: int, width: int) -> np.ndarray: | |
| # The reconstruction has no external missing-channel metadata; all C85 fields are valid. | |
| return np.ones((len(channels), height, width), dtype=np.float32) | |
| def ensure_static_resources(cfg: dict, force: bool = False) -> tuple: | |
| channels, _ = c85_from_config(cfg) | |
| profile = cfg["model"]["profiles"]["full"] | |
| height, width = profile["grid_size"] | |
| static_path = resolve_path(cfg["model"]["static_fields_file"], cfg) | |
| mask_path = resolve_path(cfg["model"]["channel_mask_file"], cfg) | |
| static_path.parent.mkdir(parents=True, exist_ok=True) | |
| mask_path.parent.mkdir(parents=True, exist_ok=True) | |
| if force or not static_path.is_file(): | |
| np.save(static_path, build_static_fields(height, width)) | |
| if force or not mask_path.is_file(): | |
| np.save(mask_path, build_channel_mask(channels, height, width)) | |
| return static_path, mask_path | |
| def main() -> None: | |
| parser = argparse.ArgumentParser(description=__doc__) | |
| parser.add_argument("--config", default="conf/config.yaml") | |
| args = parser.parse_args() | |
| cfg = load_config(args.config) | |
| static_path, mask_path = ensure_static_resources(cfg, force=True) | |
| print(f"Saved from-scratch static resources to {static_path} and {mask_path}") | |
| if __name__ == "__main__": | |
| main() | |