Open. See. Explore. — GFD Data Visualization, Reimagined.
A next-generation desktop app for visualizing geophysical fluid dynamics (GFD) data. Drop a NetCDF file, get an instant 3D globe with smart variable inference — no config needed.
Built as a modern replacement for GrADS / Panoply / ncview.
| View | Description |
|---|---|
| Globe | Interactive 3D sphere with wgpu rendering, camera rotation & zoom, atmospheric glow effect |
| Map | Equirectangular, Mollweide, and Polar Stereographic (N/S) projections with pan & zoom |
| Hovmoller | Time-longitude heatmap diagram |
| Cross-Section | Vertical slice heatmap (Fix Lat / Fix Lon) |
| Profile | 1D line graph — vertical profile or time series with hover crosshair |
| Spectrum | E(n) total wavenumber, E(m) zonal wavenumber bar chart, E(ω) temporal frequency spectrum |
| Overlay | Description |
|---|---|
| Vector Arrows | Wind field arrows on Globe/Map with auto u/v pair detection |
| Contour Lines | Isolines via Marching Squares with value labels (Globe/Map) |
| Streamlines | RK4-integrated streamlines with arrowheads |
| Trajectory | Particle trajectory with full path history, start marker, and current position dot |
- 3-Stage Variable Inference — CF standard_name → name heuristics → data statistics
- Visualization Suggestion — Auto-recommends view, colormap, and overlays based on variable analysis
- Trajectory Pair Detection — Auto-finds 1D lon/lat variable pairs for trajectory overlay
- Wind Pair Detection — Auto-detects u/v wind component pairs
- Units-Aware — Auto-converts radians to degrees for trajectory data
- Time Animation — Play/pause with adjustable speed, frame-step buttons
- Level Selection — Floating vertical level slider for 3D data
- Colormap Range — Slice / Global / Manual scaling + symmetric (0-centered) mode
- Point Info — Hover on Map to see lat/lon/value; click Globe/Map to select profile point
- Interactive Profile — Click Globe/Map → split view with vertical/time/T-Lev profile
- Multi-File — Open multiple NetCDF files, switch between them
- Drag & Drop — Drop NetCDF files to open instantly
- PNG/GIF Export — Publication-quality export with axes, colorbar, title; GIF animation export
- Code Generation — Bidirectional Python (xarray + cartopy + matplotlib) code panel
- Rhai Scripting — Programmable automation via Rhai script engine
- Spectral Filter — Wavenumber truncation filter (ispack-rs integration)
- Temporal Filter — Time-domain lowpass filter for smoothing time series (FFT-based)
- Context Menu — Right-click Globe/Map for Profile here / Export PNG / Center here
- Collapsible Panels —
[/]keys to toggle Data Browser / Inspector - Session Persistence — Auto-save/restore app state across sessions
- LLM Copilot — Chat sidebar with Claude API (Explain / Explore quick actions, markdown rendering)
- Command Palette —
Cmd+Kfuzzy search for views, colormaps, projections, overlays, exports - Recipe Save/Load — Save visualization settings as .py recipes, load & apply
- MCP Server — Machine-readable control interface for external tool integration
- i18n — English / Japanese UI switching
Sequential: Viridis, Plasma, Inferno, Cividis, YlGnBu, Turbo Diverging: RdBu_r, Coolwarm, BrBG, PiYG
| Key | Action |
|---|---|
Space |
Play / Pause animation |
Left / Right |
Step time backward / forward |
Up / Down |
Step level up / down |
1–6 |
Switch view (Globe / Map / Hovmoller / Spectrum / Profile / Section) |
G |
Toggle Grid / Smooth interpolation |
C |
Toggle contour overlay |
V |
Toggle streamline overlay |
T |
Toggle trajectory overlay |
W |
Toggle spectral filter |
[ / ] |
Toggle left / right panel |
Cmd+K |
Open command palette |
- Rust toolchain (stable)
- HDF5 1.10
# macOS
brew install hdf5@1.10
# Set HDF5 path (already configured in .cargo/config.toml for Homebrew default)git clone https://github.com/daktu32/geoscope.git
cd geoscope
# Download sample data (requires GitHub CLI)
./samples/download.sh
cargo run --release -- samples/rossby_haurwitz.ncOr launch without arguments and use the + button in the Data Browser to open files.
Full-resolution sample NetCDF files are available from GitHub Releases:
| File | Size | Description | Try |
|---|---|---|---|
rossby_haurwitz.nc |
62 MB | Rossby-Haurwitz wave, 1001 steps | Globe + contour (C) + streamlines (V) |
beta_gyre.nc |
158 MB | Beta-plane gyre + trajectory | Trajectory (T) + animation (Space) |
held_suarez.nc |
26 MB | 3D atmosphere, 10 levels | Cross-section (6) + level slider |
See samples/README.md for download instructions.
| Layer | Technology | Version |
|---|---|---|
| GUI Framework | eframe + egui_dock | 0.33 / 0.18 |
| GPU Rendering | wgpu (via eframe) | 27 |
| Data I/O | netcdf-rs | 0.12 |
| Image/GIF Export | image + gif | 0.25 / 0.13 |
| Spectral Transforms | ispack-rs | path dep |
| Scripting | rhai | 1 |
| LLM API | ureq (Claude API) | 2 |
| File Dialog | rfd | 0.15 |
| HDF5 Backend | hdf5 (Homebrew) | 1.10 |
src/
├── main.rs # Entry point (D&D, 1280x800)
├── app.rs # App state, eframe integration, SidePanel layout
├── data/
│ ├── mod.rs # DataStore, NetCDF I/O, field/profile/trajectory loading
│ ├── inference.rs # 3-stage variable inference + visualization suggestion
│ ├── spectral_filter.rs # Wavenumber filter (ispack-rs, spectral truncation)
│ ├── temporal_filter.rs # Temporal FFT spectrum + lowpass filter (ispack-rs RealFftPlan)
│ └── trajectory_loader.rs # External trajectory loading (JSON/CSV)
├── renderer/
│ ├── common.rs # Shared types, view_proj matrix, colormap LUT
│ ├── globe.rs # 3D globe (wgpu, UV sphere, WGSL shader)
│ ├── map.rs # 2D map (wgpu, Equirect/Mollweide/Polar)
│ ├── hovmoller.rs # Hovmoller diagram (egui)
│ ├── cross_section.rs # Vertical cross-section (egui)
│ ├── spectrum.rs # E(n)/E(m)/E(ω) energy spectrum (egui)
│ ├── profile.rs # 1D profile / time series (egui)
│ ├── contour.rs # Contour lines — Marching Squares (egui)
│ ├── streamline.rs # Streamlines — RK4 integration (egui)
│ ├── trajectory.rs # Trajectory overlay (egui)
│ ├── vector_overlay.rs # Wind arrows (egui)
│ ├── bitmap_font.rs # 5x7 bitmap font (publication export)
│ └── export.rs # PNG/GIF export (image + gif crate)
├── copilot/
│ ├── mod.rs # LLM Copilot hub
│ ├── llm_client.rs # Claude API client (ureq, background thread)
│ └── context.rs # GFD domain knowledge + view context generation
├── codegen/
│ ├── mod.rs # Code generation hub
│ ├── python.rs # Python (xarray+cartopy+matplotlib) generator
│ ├── parser.rs # Python → GUI reverse parser (bidirectional sync)
│ ├── rhai_engine.rs # Rhai script engine (GeoScope API)
│ └── cmd_palette.rs # Command palette (fuzzy match + action execution)
├── mcp/
│ └── mod.rs # MCP server (JSON-RPC, tool control interface)
├── i18n.rs # Internationalization (EN/JA, t("key") lookup)
└── ui/mod.rs # UI panels (DataBrowser, Viewport, Inspector, CodePanel, Copilot)
| Version | Goal | Status |
|---|---|---|
| v0.1 | Globe + Map + Hovmoller + Spectrum + Export | Done |
| v0.2 | Mollweide + Cross-Section + Vector Overlay + Level/Range control | Done |
| v0.3 | Point Info + Profile + Contour + Streamline + Polar Stereo + GIF Export + Spectral Filter | Done |
| v0.4 | Visualization Suggestion + Trajectory + Code Panel + Rhai Scripting + Recipe Save/Load | Done |
| v0.5 | LLM Copilot + Command Palette | Done |
| v0.6 | i18n + MCP + E(m) bar chart + E(ω) temporal spectrum + temporal filter + Copilot markdown | Done (current) |
| Future | WebAssembly + WebGPU browser version | Planned |
GeoScope is part of the dcmodel ecosystem — numerical models and libraries for GFD developed by the GFD Dennou Club.
ispack-rs → spmodel-rs → GeoScope
(spectral (spectral (visualization)
transforms) models) ← you are here
Primary use case: visualizing output from ispack-rs / spmodel-rs shallow water and atmospheric models. Any CF-compliant NetCDF file is supported.
docs/PRD.md— Product Requirements DocumentPROGRESS.md— Development progress log
MIT License. See LICENSE for details.
- GFD Dennou Club — the research community behind dcmodel
- ISPACK by K. Ishioka — the spectral transform library that started it all