Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Landlab inputs for the Pioneer Fire, WA

The landlab contract’s reference event (WA4818312053120240608), in three steps:

  1. Stage every dataset the landlab workflow reads into one Zarr store, each on its native grid.

  2. Align the store onto the contract’s 10 m UTM grid with gaia align, and look at it.

  3. Convert the aligned store to GeoTIFF and ESRI ASCII grids with GDAL alone (scripts/landlab-inputs.sh).

The soil-derived node fields (porosity, cohesion, ...) are not computed here: landlab_data_prep derives them from the seven SOLUS layers.

1. Stage

examples/pioneer.yaml lists the required inputs (DEM, burn severity, the seven SOLUS soil layers, STATSGO K-factor, NLCD), plus PRISM and Synoptic precipitation for an atmospheric river in December 2025. The static layers ignore the window. Its AOI, examples/pioneer-aoi.geojson, is the perimeter’s bounding box, and meets five BAER fires, so fire and year choose the 2024 Pioneer Fire. The stores go to the scratch/public prefix on Kopah, which anyone can read and which is deleted after 2 weeks; the landlab files go to /tmp.

# Pioneer Fire, WA (2024): the landlab workflow's reference event. Its required inputs
# (DEM, burn severity, SOLUS soil, STATSGO K-factor, land cover), plus station and PRISM
# precipitation for the December 2025 atmospheric river. Check with --dry-run, then stage:
#   gaia stage --config examples/pioneer.yaml --dry-run
#   gaia stage --config examples/pioneer.yaml -o /tmp/pioneer
# pioneer-landlab.ipynb aligns the result onto the landlab grid over the same AOI.
name: pioneer
attrs:
  title: Pioneer Fire landlab inputs, with the December 2025 atmospheric river
aoi: pioneer-aoi.geojson            # relative to this file; also gaia align --aoi
window: 2025-12-01/2025-12-16       # whole days, end included; static layers ignore it
datasets:
  dem/usgs10m: {}
  burn-severity: {fire: pioneer, year: 2024}   # the AOI meets five BAER fires
  soil/solus100: {}
  soil/statsgo: {}
  nlcd: {year: 2021}
  prism: {variables: [ppt, tmin, tmax]}
  synoptic: {}
11:52:28 [   1.2s] stagefile: Wrote s3://gaia/scratch/public/pioneer/stage.yaml
11:52:28 [   1.2s] runner: dem/usgs10m: loading (static)
11:52:28 [   1.2s] datasets.dem: DEM: opening https://prd-tnm.s3.amazonaws.com/StagedProducts/Elevation/13/TIFF/USGS_Seamless_DEM_13.vrt
11:52:33 [   6.0s] io: Writing Zarr to s3://gaia/scratch/public/pioneer/pioneer.zarr
11:52:37 [  10.4s] io: Saved s3://gaia/scratch/public/pioneer/pioneer.zarr
11:52:37 [  10.6s] io: Wrote STAC item s3://gaia/scratch/public/pioneer/pioneer.json
11:52:37 [  10.6s] runner: burn-severity: loading (static)
11:52:38 [  11.4s] datasets.burn_severity: BAER: pioneer_wa4818312053120240608_sbs (2024)
11:52:44 [  16.9s] datasets.burn_severity: BAER: exporting raster 3727 (1092 x 1656 cells)
11:52:47 [  19.8s] io: Writing Zarr to s3://gaia/scratch/public/pioneer/pioneer.zarr
11:52:50 [  23.8s] io: Saved s3://gaia/scratch/public/pioneer/pioneer.zarr
11:52:51 [  23.9s] io: Wrote STAC item s3://gaia/scratch/public/pioneer/pioneer.json
11:52:51 [  23.9s] runner: soil/solus100: loading (static)
11:52:51 [  23.9s] datasets.soil: SOLUS: opening https://storage.googleapis.com/solus100pub/anylithicdpt_cm_p.tif
11:52:51 [  24.6s] datasets.soil: SOLUS: opening https://storage.googleapis.com/solus100pub/cec7_0_cm_p.tif
11:52:52 [  25.0s] datasets.soil: SOLUS: opening https://storage.googleapis.com/solus100pub/claytotal_0_cm_p.tif
11:52:52 [  25.4s] datasets.soil: SOLUS: opening https://storage.googleapis.com/solus100pub/dbovendry_0_cm_p.tif
11:52:52 [  25.7s] datasets.soil: SOLUS: opening https://storage.googleapis.com/solus100pub/ph1to1h2o_0_cm_p.tif
11:52:53 [  26.0s] datasets.soil: SOLUS: opening https://storage.googleapis.com/solus100pub/sandtotal_0_cm_p.tif
11:52:53 [  26.3s] datasets.soil: SOLUS: opening https://storage.googleapis.com/solus100pub/silttotal_0_cm_p.tif
11:52:53 [  26.7s] io: Writing Zarr to s3://gaia/scratch/public/pioneer/pioneer.zarr
11:52:59 [  32.7s] io: Saved s3://gaia/scratch/public/pioneer/pioneer.zarr
11:52:59 [  32.8s] io: Wrote STAC item s3://gaia/scratch/public/pioneer/pioneer.json
11:52:59 [  32.8s] runner: soil/statsgo: loading (static)
11:52:59 [  32.8s] datasets.soil: STATSGO: opening https://prod-is-usgs-sb-prod-publish.s3.amazonaws.com/6750c172d34ed8d3858534d8/statsgo-KFFACT.tif
11:53:00 [  33.4s] io: Writing Zarr to s3://gaia/scratch/public/pioneer/pioneer.zarr
11:53:06 [  38.9s] io: Saved s3://gaia/scratch/public/pioneer/pioneer.zarr
11:53:06 [  39.0s] io: Wrote STAC item s3://gaia/scratch/public/pioneer/pioneer.json
11:53:06 [  39.0s] runner: nlcd: loading (static)
11:53:06 [  39.0s] datasets.nlcd: NLCD: opening https://usgs.osn.mghpcc.org/hytest/nlcd/annual-nlcd-cu-c1v1/mosaic/Annual_NLCD_LndCov_2021_CU_C1V1.tif
11:53:10 [  43.5s] io: Writing Zarr to s3://gaia/scratch/public/pioneer/pioneer.zarr
11:53:16 [  49.7s] io: Saved s3://gaia/scratch/public/pioneer/pioneer.zarr
11:53:16 [  49.8s] io: Wrote STAC item s3://gaia/scratch/public/pioneer/pioneer.json
11:53:16 [  49.8s] runner: prism: loading (2025-12-01T00:00:00/2025-12-17T00:00:00, read as 2025-11-30T00:00:00/2025-12-18T00:00:00)
11:53:17 [  50.0s] prism_cache.cache: PRISM ppt: 18 of 18 grid(s) in cache https://s3.kopah.uw.edu/gaia/public/prism (0 provisional, 0 missing)
11:53:17 [  50.2s] prism_cache.cache: PRISM tmin: 18 of 18 grid(s) in cache https://s3.kopah.uw.edu/gaia/public/prism (0 provisional, 0 missing)
11:53:17 [  50.3s] prism_cache.cache: PRISM tmax: 18 of 18 grid(s) in cache https://s3.kopah.uw.edu/gaia/public/prism (0 provisional, 0 missing)
11:53:17 [  50.5s] datasets.prism: PRISM ppt: reading 18 day(s) x 36 x 35 cells from cached COGs
11:53:23 [  56.2s] datasets.prism: PRISM tmin: reading 18 day(s) x 36 x 35 cells from cached COGs
11:53:35 [  68.4s] datasets.prism: PRISM tmax: reading 18 day(s) x 36 x 35 cells from cached COGs
11:53:47 [  80.4s] io: Writing Zarr to s3://gaia/scratch/public/pioneer/pioneer.zarr
11:53:55 [  88.5s] io: Saved s3://gaia/scratch/public/pioneer/pioneer.zarr
11:53:55 [  88.7s] io: Wrote STAC item s3://gaia/scratch/public/pioneer/pioneer.json
11:53:55 [  88.7s] runner: synoptic: loading (2025-12-01T00:00:00/2025-12-17T00:00:00, read as 2025-11-30T00:00:00/2025-12-18T00:00:00)
11:53:55 [  88.7s] datasets.synoptic: querying station metadata from https://api.synopticdata.com/v2
11:53:55 [  88.8s] datasets.synoptic: found 4 stations with precip_accum in the AOI
11:53:55 [  88.8s] datasets.synoptic: fetching timeseries for 4 station(s)
11:53:56 [  89.1s] io: Writing Zarr to s3://gaia/scratch/public/pioneer/pioneer.zarr
11:54:05 [  98.5s] io: Saved s3://gaia/scratch/public/pioneer/pioneer.zarr
11:54:05 [  98.8s] io: Wrote STAC item s3://gaia/scratch/public/pioneer/pioneer.json
11:54:05 [  98.8s] runner: Done

2. Align onto the contract grid

--crs utm --res 10 --aoi gives the contract’s grid: the UTM zone of the AOI (EPSG:32610), 10 m cells, the AOI’s bounds snapped outward to multiples of 10 m, and NaN in cells whose centre is outside the AOI. The -m options are the contract’s resampling methods; without them, DEMs use bilinear and categories mode. PRISM goes nearest (its default, conservative, becomes nearest onto a finer grid), and Synoptic’s stations pass through unchanged.

11:54:08 [   2.4s] align: time target rasters/prism (18 step(s))
11:54:12 [   5.8s] align: grid target EPSG:32610 at 10.0 (3309 x 2182 cells)
11:54:12 [   5.8s] align: regridding dem/usgs10m/elevation (cubic)
11:54:15 [   8.9s] align: regridding rasters/burn-severity/burn_severity (nearest)
11:54:18 [  11.6s] align: regridding rasters/nlcd/landcover (nearest)
11:54:19 [  13.1s] align: regridding rasters/prism/precipitation (nearest)
11:54:22 [  15.8s] align: regridding rasters/prism/tmax (bilinear)
11:54:27 [  20.6s] align: regridding rasters/prism/tmin (bilinear)
11:54:32 [  25.8s] align: regridding soil/solus100/anylithicdpt (bilinear)
11:54:34 [  28.3s] align: regridding soil/solus100/cec7 (bilinear)
11:54:37 [  30.7s] align: regridding soil/solus100/claytotal (bilinear)
11:54:39 [  33.1s] align: regridding soil/solus100/dbovendry (bilinear)
11:54:42 [  35.6s] align: regridding soil/solus100/ph1to1h2o (bilinear)
11:54:44 [  38.0s] align: regridding soil/solus100/sandtotal (bilinear)
11:54:47 [  40.4s] align: regridding soil/solus100/silttotal (bilinear)
11:54:49 [  43.0s] align: regridding soil/statsgo/kffact (nearest)
11:54:53 [  47.2s] io: Writing Zarr to s3://gaia/scratch/public/pioneer-10m/pioneer-10m.zarr
11:56:04 [ 118.3s] io: Saved s3://gaia/scratch/public/pioneer-10m/pioneer-10m.zarr
11:56:05 [ 118.4s] io: Wrote STAC item s3://gaia/scratch/public/pioneer-10m/pioneer-10m.json
11:56:05 [ 118.4s] align: Done
('/', '/dem', '/rasters', '/soil', '/stations', '/dem/usgs10m', '/rasters/burn-severity', '/rasters/nlcd', '/rasters/prism', '/soil/solus100', '/soil/statsgo', '/stations/synoptic')

A look at the aligned store

<Figure size 1500x1100 with 10 Axes>

Accumulated precipitation at each gauge, against PRISM in the gauge’s cell. PRISM’s totals are known at the end of each day (12:00 UTC); hours without a report count as zero.

<Figure size 1500x350 with 3 Axes>

3. Landlab inputs with GDAL

GDAL reads the aligned store directly: each array is a subdataset with its CRS (_CRS), nodata (the Zarr fill_value) and, for packed soil layers, its scale_factor. Remote stores are read through /vsis3/ (or /vsicurl/), using the store’s consolidated metadata.

  SUBDATASET_1_NAME=ZARR:"/vsis3/gaia/scratch/public/pioneer-10m/pioneer-10m.zarr":/dem/usgs10m/elevation
  SUBDATASET_2_NAME=ZARR:"/vsis3/gaia/scratch/public/pioneer-10m/pioneer-10m.zarr":/rasters/burn-severity/burn_severity
  SUBDATASET_3_NAME=ZARR:"/vsis3/gaia/scratch/public/pioneer-10m/pioneer-10m.zarr":/rasters/nlcd/landcover
  SUBDATASET_4_NAME=ZARR:"/vsis3/gaia/scratch/public/pioneer-10m/pioneer-10m.zarr":/rasters/prism/precipitation
  SUBDATASET_5_NAME=ZARR:"/vsis3/gaia/scratch/public/pioneer-10m/pioneer-10m.zarr":/rasters/prism/time_bounds
  SUBDATASET_6_NAME=ZARR:"/vsis3/gaia/scratch/public/pioneer-10m/pioneer-10m.zarr":/rasters/prism/tmax
  SUBDATASET_7_NAME=ZARR:"/vsis3/gaia/scratch/public/pioneer-10m/pioneer-10m.zarr":/rasters/prism/tmin
  SUBDATASET_8_NAME=ZARR:"/vsis3/gaia/scratch/public/pioneer-10m/pioneer-10m.zarr":/soil/solus100/anylithicdpt
  SUBDATASET_9_NAME=ZARR:"/vsis3/gaia/scratch/public/pioneer-10m/pioneer-10m.zarr":/soil/solus100/cec7
  SUBDATASET_10_NAME=ZARR:"/vsis3/gaia/scratch/public/pioneer-10m/pioneer-10m.zarr":/soil/solus100/claytotal
  SUBDATASET_11_NAME=ZARR:"/vsis3/gaia/scratch/public/pioneer-10m/pioneer-10m.zarr":/soil/solus100/dbovendry
  SUBDATASET_12_NAME=ZARR:"/vsis3/gaia/scratch/public/pioneer-10m/pioneer-10m.zarr":/soil/solus100/ph1to1h2o
  SUBDATASET_13_NAME=ZARR:"/vsis3/gaia/scratch/public/pioneer-10m/pioneer-10m.zarr":/soil/solus100/sandtotal
  SUBDATASET_14_NAME=ZARR:"/vsis3/gaia/scratch/public/pioneer-10m/pioneer-10m.zarr":/soil/solus100/silttotal
  SUBDATASET_15_NAME=ZARR:"/vsis3/gaia/scratch/public/pioneer-10m/pioneer-10m.zarr":/soil/statsgo/kffact

Since every raster is already on the contract grid, writing landlab’s files is a format conversion plus the contract’s nodata rules, a few gdal commands per layer. scripts/landlab-inputs.sh writes a float32 GeoTIFF and an ESRI ASCII grid for each layer:

  • nodata (NaN, or a packed integer’s fill) becomes -9999;

  • soil layers are unscaled (cec7 is stored as tenths, ph1to1h2o and dbovendry as hundredths);

  • burn severity keeps classes 2–4 and sets everything else to 1, with no nodata.

Layers the model reads as they are get their Landlab field names (topographic__elevation, burn__severity, landcover, kffact); the soil layers keep SOLUS’s names.

dem/usgs10m/elevation -> /tmp/pioneer-landlab/topographic__elevation.{tif,asc}
rasters/nlcd/landcover -> /tmp/pioneer-landlab/landcover.{tif,asc}
soil/statsgo/kffact -> /tmp/pioneer-landlab/kffact.{tif,asc}
soil/solus100/anylithicdpt -> /tmp/pioneer-landlab/anylithicdpt.{tif,asc}
soil/solus100/cec7 -> /tmp/pioneer-landlab/cec7.{tif,asc}
soil/solus100/claytotal -> /tmp/pioneer-landlab/claytotal.{tif,asc}
soil/solus100/dbovendry -> /tmp/pioneer-landlab/dbovendry.{tif,asc}
soil/solus100/ph1to1h2o -> /tmp/pioneer-landlab/ph1to1h2o.{tif,asc}
soil/solus100/sandtotal -> /tmp/pioneer-landlab/sandtotal.{tif,asc}
soil/solus100/silttotal -> /tmp/pioneer-landlab/silttotal.{tif,asc}
rasters/burn-severity/burn_severity -> /tmp/pioneer-landlab/burn__severity.{tif,asc}
ncols        2182
nrows        3309
xllcorner    671690.000000000000
yllcorner    5329770.000000000000
cellsize     10.000000000000
NODATA_value -9999

The contract’s grid check: every output has the same CRS, transform, shape and nodata.

Loading...