Changelog
Source:NEWS.md
kwb.raindrop (development version)
New features
download_engine()fetches the Tandler “Regenwasserbewirtschaftung” Windows executable from the companion repositoryKWB-R/kwb.raindrop.binariesand caches it undertools::R_user_dir("kwb.raindrop", "cache")/<version>/. Multiple engine versions can coexist side-by-side because the version is encoded in the release tag (engine-<YYYY-MM-DD>), not in the asset filename. The download is atomic (temp file + rename) and rejects obviously broken responses (< 1 KB ⇒ likely a 404 HTML page).compute_costs()anddefault_cost_rates()attach a per-scenario construction-cost breakdown (cost_excavation,cost_profiling,cost_filter,cost_storage,cost_total) to a parameter grid using the Austrian unit-cost rates supplied by Johannes Leimgruber (OeStaP, 2026-03-27). Passstorage_type = "infiltration_box"(Sickerbox, default, ~95 % porosity) or"gravel_trench"(Schotterrigol, ~30 % porosity) — or a per-rowstorage_typecolumn on the grid — to switch the storage layer. The new columns are wired into theexample_wien_minimal,workflow_wienandworkflow_badausseevignettes so the solution-space datatables become filterable and sortable by cost.New vignette
example_wien_minimal: a self-contained smoke test of the full input → engine → results loop on Wien. Now extended into an ET-diagnostics grid that sweeps three engine switches —keineVerdunstungBeiRegen,Hoernschemeyer_aktivand theET0ref_GrasReferenzverdunstungfactor (0,1,100) — at Daniel’s reference geometry (12 scenarios total). After Daniel’s XLSX review of the SWIMM-UrbanEva comparison run, the vignette now also unconditionally corrects three furtherbase.h5defaults on every row:Dach/Berechnungsparameter/Evapotranspiration_aktiv = 0(impervious roof, no vegetation; the engine then skips writing Dach.h5, see “Minor improvements and bug fixes” below),Mulde_Rigole/Eigenschaften_Oberflaeche/EvapPond = 0(no open-water ET while the grass is submerged), andMulde_Rigole/Parameter_Evapotranspiration/LAI_LeafAreaIndex = 3.9(Hörnschemeyer grass value, was8.5). After the model loop the per-scenario*.h5inputs are dumped to a single XLSX (raindrop_wien_minimal_params.xlsx) with one sheet per scenario plus abasesheet for the un-modified template, atimeseries_infosheet summarising the rain / ET0 series fed to every run (identical across scenarios), and anapplied_settingssheet listing the diff of every key the package writes on top ofbase.h5per scenario. Prints a complete static-parameter overview frombase.h5for review of every default that drives the model. Designed to render on Windows CI; the four heavy case-study vignettes only render their parameter grids on CI and skip the model runs.
Helper scripts
-
inst/scripts/prepare_wien_swmm_timeseries.Rconverts the shipped Wien rainfall (10-minute, mm) and reference ET0 (daily, mm/day) series to SWMM-5 external time-series files (wien_rain.dat,wien_et0.dat) for direct import into a SWMM[TIMESERIES]/[RAINGAGES]/[EVAPORATION]block. Output directory defaults totempdir(); passout_dir(R) or a positional CLI argument (Rscript) to redirect.
Inputs and data shipping
Per-scenario input data ships under
inst/extdata/models/<scenario>/for Wien, Bad Aussee and Eisenstadt 2005 (base.h5HDF5 model templates plusrain.csv.gzandet.csvtime series for the two GeoSphere-Austria sites). Vignettes read inputs viasystem.file()and write model outputs to atempdir()scratch root, so they are hermetic and reproducible.Rain timeseries are shipped gzipped (
rain.csv.gz);readr::read_csv()reads the compressed files transparently. Totalinst/extdata/footprint is ~6.8 MB (down from ~53 MB raw).Provenance documented in
inst/extdata/SOURCES.mdand an “Input data” section in each rendered vignette: precipitation and evapotranspiration come from GeoSphere Austria (Österreichischer Wetterdienst, formerly ZAMG); HDF5 templates are produced with the Tandler engine.
CI / packaging
GitHub Actions workflows for Claude Code (
@claudemention bot and automatic PR review) added; both pinned to Opus 4.7 withthink hardreasoning on the review prompt.R-CMD-checkmatrix restricted towindows-latest(devel/oldrel/release) — the calculation engine is a Windows.exe, so non-Windows runners cannot exercise the workflow. Aligns with the existingtest-coverageandpkgdownjobs.Bumped
actions/checkoutto v5 and pinnedactions/upload-artifactto v4 (Node.js 24 readiness ahead of the 2026-09-16 Node 20 removal).
Dependency hygiene
-
tidyr,rlang: moved toImports(used in package code). -
plotly: moved fromImportstoSuggests(only used in vignettes). -
htmlwidgets,readr,writexl: added toSuggests(used in vignettes).
Bug fixes
-
get_simulation_results_optim()andget_simulation_results_optim_parallel()no longer returnNULLwhen only the connected-area H5 (Dach.h5) is missing; they now return a partial result withconnected_area = NULLwhile still populating the element side. This unblocks scenarios where//Massnahmenelemente/Dach/Berechnungsparameter/Evapotranspiration_aktivis0and the engine consequently skips writing Dach.h5. -
add_overflow_events_and_waterbalance()tolerates per-scenarioNULLand missing components (element,connected_area,*$water_balance,element$rates). Affected scenarios still produce a row of the output tibble with the available metrics computed and the missing columns left asNA. -
R/plot_hpond_vs_ref.R: replace literal▲glyph in the caption with▲so the source file is ASCII-only (R-CMD-check WARNING). -
R/read_hdf5_timeseries.R: wrap array-indexing notation ([1, ],[2..k, ],[, 1],[, 2..k]) in backticks so roxygen2’s markdown parser does not turn them into broken\link{...}entries.