Station Assimilation
ROI-based assimilation of station snow depth and SWE observations.
Table of contents
Overview
openAMUNDSEN-DA supports ROI-based assimilation of in situ station snow observations:
station_hsfor snow depthstation_swefor snow water equivalent- each active station contributes one likelihood term,
- stations with lower uncertainty influence the weights more strongly,
- stations with higher uncertainty influence the weights more weakly,
- all active stations on one assimilation date are combined into one ROI-level member weighting.
Supported Variables
The following assimilation-event variables are supported:
data_assimilation:
assimilation_events:
- date: 2023-01-10
variable: station_hs
- date: 2023-03-09
variable: station_swe
Required Inputs
Station observation CSVs
Station observations live under:
obs/stations/<station_id>.csv
Expected columns:
timesnow_depthswe
Typical layout:
time,snow_depth,swe
2022-10-01 00:00:00,0.10,15.1
2022-10-01 01:00:00,0.10,14.8
...
Notes:
snow_depthis expected inmsweis expected inmm- a station file may exist even if only one variable is later assimilated
- missing values are allowed, but the requested variable must have either a unique nearest finite, nonnegative value within half the model timestep or one accepted symmetric interpolation for the station to become active
For a station event, the assimilation timestamp is the event date at the active
step’s start time. Naive timestamps are interpreted in the setup timezone.
Exactly two equidistant values that lie on opposite sides of the model time are
averaged when both are inside the half-timestep window and their timestamps are
no more than 24 hours apart. The mean is treated as an interpolated scalar at
the model time without reducing its observation uncertainty. Duplicate,
same-side or larger ties remain invalid, as does a value farther than half a
timestep away. Model point output must exist at the exact model-clock
timestamp. The matcher uses same-ID metadata rows whose use_for_da role is
enabled; station IDs remain strings so leading zeros are preserved.
Station DA metadata
Station DA metadata live in:
obs/stations/stations_da_metadata.csv
Expected columns:
station_idstation_uncertainty_pcths_sigma_abs_minswe_sigma_abs_min
Optional map metadata columns:
idandnamexandyin the setup CRSaltuse_for_daanduse_for_benchmark
For subdomain preparation, station_id, x and y in this table are also a
complete station-selection contract. When the legacy
stations_snow_depth.csv table exists it remains authoritative; otherwise the
preparer selects same-ID observation series from these coordinates and disables
both roles for stations that lie only in the configured station buffer.
Example:
station_id,station_uncertainty_pct,hs_sigma_abs_min,swe_sigma_abs_min
proviantdepot,20,0.05,15
latschbloder,80,0.20,
Notes:
station_uncertainty_pctstill falls back to the project-level default when the metadata value is empty.hs_sigma_abs_minis required for every activestation_hsstation.swe_sigma_abs_minis required for every activestation_swestation.- Missing required absolute sigma metadata is a hard configuration error.
- Before propagation, every station enabled for DA or benchmarking must have a same-ID observation CSV and openAMUNDSEN time-series output point. Matching is case-insensitive while the configured IDs are preserved. Stations disabled for both roles are exempt.
data_assimilation.assimilation_eventsis final. openAMUNDSEN-DA validates its time support but does not select, substitute or remove station events. Generate different leaf schedules before execution when local support differs.- Classified project-map station markers require
station_id,x,y,use_for_daanduse_for_benchmark. A benchmark-enabled station is drawn as a holdout and must not also be DA-active.
Configuration
Project-level station DA settings live under:
data_assimilation:
station:
default_station_uncertainty_pct: 25
min_station_uncertainty_pct: 10
single_station_factor: 2.0
Meaning of the keys:
default_station_uncertainty_pct: fallback whenstation_uncertainty_pctis empty in metadatamin_station_uncertainty_pct: lower bound to avoid overconfident station influencesingle_station_factor: extra sigma inflation when only one active station is available for a date
The absolute sigma floor is configured per station in stations_da_metadata.csv:
hs_sigma_abs_mininmforstation_hsswe_sigma_abs_mininmmforstation_swe
Effective Station Uncertainty
The station uncertainty used in DA is an effective uncertainty, not only sensor error.
It can absorb:
- instrument uncertainty
- local station quality and maintenance confidence
- exposure, slope, aspect, wind redistribution and vegetation around the station
- flat-field or sheltered-location effects
- broad point-to-ROI representativeness concerns
Interpretation:
- lower station uncertainty -> narrower likelihood -> stronger update
- higher station uncertainty -> wider likelihood -> weaker update
Because percentage-only scaling can become unrealistically strict near zero snow, the implementation always combines the relative term with the station-wise absolute sigma floor from metadata.
Likelihood
For one assimilation date, each active station contributes a Gaussian log-likelihood term for every ensemble member.
Definitions:
y_s= observed station valueH_m,s= modeled point value at the same station for membermsigma_s= effective station sigma for stations
Residual:
residual_m,s = H_m,s - y_s
Station contribution:
log L_m,s ∝ -0.5 * (residual_m,s / sigma_s)^2
ROI-level member likelihood:
log L_m,total = sum over all active stations s of log L_m,s
The normalized particle-filter weights are then computed from these summed log-likelihoods.
Single-Station Handling
If only one active station is available on a DA date, the observation is still used, but more cautiously.
Version 1 policy:
- write a warning
- inflate the station sigma by
single_station_factor
Effective single-station sigma:
sigma_eff = sigma_base * single_station_factor
This keeps a single station from speaking too loudly at ROI scale while still allowing it to contribute.
What Counts as an Active Station
A station is active on a DA date when:
- the station belongs to the ROI / setup station set,
- the required observation variable exists,
- the observation value is finite,
- the observation value is nonnegative,
- a unique nearest timestamp or accepted symmetric interpolation can be resolved,
- model point output exists for the station for all members.
Stations failing these checks are skipped and logged.
Outputs and Diagnostics
For station DA dates, the pipeline writes:
weights_station_hs_YYYYMMDD.csvorweights_station_swe_YYYYMMDD.csvstation_diagnostics_station_hs_YYYYMMDD.csvorstation_diagnostics_station_swe_YYYYMMDD.csv- one diagnostic PNG per station-DA date
The diagnostics CSV contains station-level details used for the update, such as:
station_idmember_idobs_valuemodel_valuesigma- residual terms
- final member weights
The fraction time-series plot also marks station DA dates with vertical lines:
HSforstation_hsSWEforstation_swe
Practical Interpretation
The station DA update does not force the ensemble mean directly to the station observation.
Instead, it reweights the members that already exist.
That means:
- if the ensemble already contains members close to the station observation, the posterior mean can move strongly toward the station
- if no ensemble member is close to the station observation, the DA can only move toward the best available members
This is standard particle-filter behavior and is especially important for strong, low-uncertainty station updates.