Add a reservoir to the workflow¶
Start with configs/portable/gardiner_workflow.json, give the reservoir a stable
internal ID, and retain a null GRAND ID until the identity is verified. One
workflow can contain multiple reservoir entries; existing worker settings limit
independent calibration jobs.
Prepare usable inputs¶
- Declare capacity, dead-storage definition, channel capacity, units and their evidence. Mean river discharge is not engineering channel capacity.
- Supply consecutive daily or month-start SI records. Keep missing responses missing; complete forcing is required for a continuous simulation block.
- Establish the boundary: sum independent inflow/outlet components only where appropriate. Account for diversions and travel time explicitly. Serial river gauges are not independent inflow components. Levels are never summed.
- For levels, supply geometry and a gauge-to-geometry reference. Where the reference is fitted, use calibration data only and freeze it before assessment. Carry mean-level timing and approximation uncertainty into the profile.
- Mark unresolved source decisions in
source_gates. They prevent promotion to an admitted application/calibration profile.
Select a parameter source¶
| Usable information | Method | Main assumption |
|---|---|---|
| Storage and release | observed_monthly |
Monthly calibration-response percentiles |
| Prepared level-derived storage and release | level_geometry_monthly |
Declared reference and geometry uncertainty |
| Release only | flow_only |
Fixed storage fractions; release-only fitting |
| Storage only | storage_only |
Storage fitting with an explicit release prior |
| Neither response, simulated naturalized flow supplied | ungauged_cr1 |
Capacity fractions and naturalized-flow percentiles |
| Neither response, mean-flow/donor fallback supplied | ungauged_mean_flow |
Regional annual percentile-pattern transfer |
Every route still needs suitable forcing and physical inputs. The mean-flow fallback does not generate a naturalized time series. A missing response is not replaced by a fabricated observation. Existing prepared-calibration adapters have method-specific bounds/objectives; changing a method string alone cannot turn one calibration problem into another.
Use four-route guidance, flow-only details, storage-only details and geometry guidance for the corresponding stage configurations and prior requirements. The portable source bundle includes the backends; private donor files are intentionally not distributed. Supply an explicit local prior/donor source when that route needs it.
Fit, select and apply¶
Choose mixed years covering at least 65% usable calibration data. Decide the application priority before examining held-out results: storage, release or their weighted compromise. Keep numerical policies and bounds explicit. Use checkpoint continuation to assess progress; do not call a preset budget converged.
After calibration, freeze the selected target table and settings. Export from the verified native registry through the stable command:
python -B -m dztr export-profile --registry outputs/my_calibration/registry.json --reservoir-id my_reservoir --preprocessing-json inputs/preprocessing.json --method observed_monthly --output outputs/my_portable_profile.json
Use the actual registry emitted by the calibration stage. The preprocessing
JSON must declare exactly factor and offset_m3s; the exporter does not guess
whether the source data was transformed. A verified --grand-id can replace
--reservoir-id. Export reads the registry and target table, not observations,
and verifies the original source/artifact identities before writing the profile.
The portable profile format embeds the settings and provenance; application
does not need the original archive paths. tools/prepare_researcher_examples_v1.py
documents the separate verified three-public-example release. Exporting a new
solver route requires its own validation; the portable endpoint adapter rejects
unsupported interval profiles.
For subsequent application, pass inflow and declared initial conditions through
dztr simulate or dztr.portable.run_profile. The Python function accepts an
inflow-only DataFrame and returns the existing SimulationResult plus independent
checks. This is a time-series coupling interface, not an incremental routing
network or a new hydrological inflow model.