Research & models · Prototype
Yellowstone
Explore Midway Geyser Basin in 3D, inspect its terrain and waterways, and follow river temperature through a saved simulation. The same Python data pipeline also supplies a walkable Godot world.
- River transport errors as the spatial and time steps are reduced.
- HydroSim example: 24 × 24 cells at 2 m spacing; 45 mm/h for 300 s, followed by 300 s without rain.
- Synthetic water balance: 8.64 m³ input, about 0.04118 m³ runoff, 8.59882 m³ storage change. Closure residual about 6.4 × 10⁻¹³ m³. The terrain and rainfall are synthetic.
- Poses decoded from the exported fish animation. Three clips were checked at 61 sample times each.
Midway Geyser Basin in the browser explorer. Height is exaggerated three times in this view; the controls also offer true scale.
- Role
- System design, data sources, implementation and testing with AI coding tools
- Period
- 2026
- Status
- Prototype with a browser data explorer
- Platform
- Python, Godot, browser
Explore Midway
Rotate the terrain, pick a river section, or follow a saved temperature run. The 3D view combines USGS elevation, mapped rivers and pools, LiDAR canopy detections and model results.
The full view uses 1,050,625 elevations at 4 m spacing. A closer view uses a 2 m mesh with 1 m shading detail. Drainage lines follow slopes in the elevation data and can include dry gullies.
River temperature has three color scales: the full run, a fixed 0.10°C window around a selected section, and change since the start. Playback reads saved values, so it works without a running simulation server.
Additional layers show outflow temperature, temperature-based microbial classes and residual canopy cover. Draw a transect to inspect an outflow profile and download its values, compare matched cooling scenarios, or play back saved weather. The forest view uses approximate trees to show canopy structure.
River and surface water
The river model transports temperature downstream and calculates heat exchange. Its tests cover numerical refinement, conservation and restarting a saved run. Discharge is prescribed, so the model does not solve momentum or simulate a dam break.
HydroSim runs separately as a small surface-water model. Its example sends a rainfall pulse over a synthetic terrain grid and plots runoff, storage and the water balance.
In the 24 × 24 cell example, 8.64 m³ of rain produces about 0.04118 m³ of runoff and 8.59882 m³ of added storage. That checks the calculation on a known input; a real catchment would still need calibration.
Reproduce this check
cd yellowstone_python
python -m pytest -q tests/river/test_benchmarks.pycd yellowstone_python
python examples/portfolio/river_checks.py --out ./new-river-checkshydrosim --out ./new-synthetic-runData and queries
The analysis store puts model records into SQLite so they can be queried by location, section and time. Tests compare those queries directly with the input JSON, including missing values and unit conversions.
The examples use small, repeatable datasets. They cover the query results and time alignment rather than making a claim about production throughput.
Reproduce this check
cd yellowstone_python
python -m pytest -q tests/test_analysis_store.py tests/river/test_obs_frame.pypython examples/portfolio/analysis_store.py --out ./new-analysis-exampleGodot world and controls
The Godot prototype uses the same terrain and model exports as the data tools. Input settings support remapping, persistent preferences and switching between a live service and a stored release.
The controls integration script passed 31 assertions in a headless Godot 4.5.1 run. Cursor behavior and visual performance need an interactive run; a headless test cannot show how the controls feel.
The separate park-runtime repository contains a runnable synthetic scene for testing terrain streaming. Its small bundled world makes the streaming code usable without downloading Yellowstone’s full datasets.
Tests and reproducibility
Data exports carry file hashes. The browser checks those hashes before loading an asset, and the test runner records which source files and inputs produced a result.
The receipt tests change source files, inputs and output logs to check that stale results are caught. Restoring the original files restores the match. This tracks which calculation was run; scientific accuracy still depends on the model and its inputs.
Reproduce this check
cd yellowstone_python
python examples/portfolio/evidence_checks.py --out ./new-receipt-exampleTrees and fish animation
The conifer generator builds connected branch graphs from a seed. Reusing a seed reproduces the same tree; changing it produces another branching structure.
Fish-swim generates an animated GLB from a small jointed fish model. Its example has 15 joints and three clips, with exported poses checked at 61 times per clip.
Wildlife-motion provides reusable gait and animation tools. Blender mesh-budget checks exported meshes against size limits before they go into the world.
These tools make repeatable geometry and animation. The example trees and fish are procedural assets, not reconstructions of individual organisms.
Terrain and canopy
Terrain-pages prepares tiled height data for rendering. LiDAR canopy tools find crown candidates and calculate their height and extent. Both can run separately from Yellowstone.
A canopy detection is an estimated crown, not a species identification or a complete tree census. The explorer keeps those detections separate from the terrain and mapped waterways.
Sources and scope
I use Python for the models and data pipeline, Godot for the walkable world, and JavaScript for the browser explorer. AI coding tools are part of the implementation workflow; source selection, design decisions and review remain my responsibility.
The source repository documents the datasets, numerical assumptions and run commands. Observed geography, calculated drainage and simulated temperatures are labeled separately throughout the explorer.
Scope & limitations
The terrain and mapped features come from geographic datasets. River temperatures are simulated, and drainage paths are calculated from the terrain. Neither is a field observation or a forecast.