Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
438 commits
Select commit Hold shift + click to select a range
28a4584
fix(fv): seed the initial condition across virtual-junction splices (…
cbuahin Aug 31, 2026
a4f77bb
fix(fv): a diverged step now fails loud instead of scoring OK (#156 R3)
cbuahin Aug 31, 2026
9645f7d
fix(fv): four latent TPA-path defects, measured as not-yet-biting (#1…
cbuahin Aug 31, 2026
4738bca
feat(io): components write their own config files -- edits survive a …
cbuahin Aug 31, 2026
1794ceb
fix(fv): the substep floor no longer overrides CFL (#156 R2 root cause)
cbuahin Aug 31, 2026
23c1ddf
feat(io): the heat renderer covers every section -- IO3a's decline gu…
cbuahin Aug 31, 2026
5015810
feat(python): bind the five transport-process C API surfaces
cbuahin Aug 31, 2026
3aa37c0
fix(quality): Kdecay is 1/day in every file, 1/sec inside -- and deca…
cbuahin Aug 31, 2026
183f59f
feat(io): water age and ARD write their own config files -- IO3 save …
cbuahin Aug 31, 2026
ec22580
feat(lard): MSX species ride the segments and react -- L3, the last u…
cbuahin Aug 31, 2026
be9faef
feat(reactions): TEMP hydraulic variable — temperature-dependent kine…
cbuahin Aug 31, 2026
b1c76e8
fix(tests): guard M_PI and setenv for MSVC
cbuahin Aug 31, 2026
cc2bf91
fix(lid): restore -VlidIn and the usage area unit conversion
cbuahin Aug 31, 2026
6526f79
fix(tests): include <cstring> for std::strlen
cbuahin Aug 31, 2026
3d0940e
fix(ci): un-invert the libomp symbol check, raise the CMake pin
cbuahin Aug 31, 2026
1aad476
test(climate): the no-source temperature default is 0, not 70
cbuahin Aug 31, 2026
fd9f6b9
docs(manual): TPA requirements blocks + Phase 6 measured validation (…
cbuahin Aug 31, 2026
8931006
feat(heat): bed conduction, deep-ground conduction, hyporheic exchang…
cbuahin Sep 1, 2026
9744b00
fix(engine): three memory bugs behind the CI test failures
cbuahin Sep 1, 2026
6264eb8
fix(heat): the ARD cell and node-store heat steps get D-H5d's integra…
cbuahin Sep 1, 2026
d868b2c
feat(heat): name getters for the bound shortwave and cloud timeseries…
cbuahin Sep 1, 2026
3e87868
fix(io): SWEEP dates and [MAP] Units stop drifting between saves -- t…
cbuahin Sep 1, 2026
f920f67
fix(ci): raise the scikit-build-core CMake floor to 4.3
cbuahin Sep 1, 2026
1736593
feat(quality): the closeout batch -- five bindings land, no quality c…
cbuahin Sep 1, 2026
3086e6b
chore(plans): track the transport plan corpus -- the debt the status …
cbuahin Sep 1, 2026
eed20e8
docs(manual): quality reference chapters 7-9 -- ARD, multi-species re…
cbuahin Sep 1, 2026
92e2adb
docs(plans): quality-closeout check record, lessons 218-221, status u…
cbuahin Sep 1, 2026
3aca916
feat(heat): per-element attributes land -- PE1 threading, PE2 overrid…
cbuahin Sep 1, 2026
c6ee06f
docs(plans): PE check record, lessons 222-224, PE plan status
cbuahin Sep 1, 2026
658d9a1
docs(manual): wire chapters 7-9 into the quality reference TOC
cbuahin Sep 1, 2026
8aa1a00
feat(2d): overland transport S1 -- species mass rides the LTS marcher…
cbuahin Sep 2, 2026
4ad689b
docs(plans): S1 check record, overland plan + D-2DT3 correction, less…
cbuahin Sep 2, 2026
1c01b4b
fix(build): actually disable FMA contraction on MSVC
cbuahin Sep 2, 2026
1af1db1
feat(edit): batch delete APIs -- one name-index rebuild per batch, pe…
cbuahin Sep 2, 2026
2d2730d
feat(2d): overland transport S2 -- source concentrations, limited dis…
cbuahin Sep 2, 2026
0f0b1df
docs(plans): S2 check record, lesson 227
cbuahin Sep 2, 2026
474a93c
revert(build): drop the bogus /fp:contract- flag
cbuahin Sep 2, 2026
178576a
feat(2d): overland transport S3 -- the 1D<->2D coupling carries speci…
cbuahin Sep 2, 2026
a112143
docs(plans): S3 check record, lesson 228
cbuahin Sep 2, 2026
bbd1377
fix(2d): include <stdexcept>/<string> in ExplicitInertialSolver.cpp
cbuahin Sep 2, 2026
f1cdaa3
feat(2d): write per-cell cumulative rainfall volume (Mesh2_face_rain_…
cbuahin Sep 2, 2026
0ae862c
perf(2d): Kokkos solver perf counters + CPU/GPU perf review findings
cbuahin Sep 2, 2026
9d7e2e5
docs(plans): perf review §7.3 final — TwinOaks LTS-off also blows pas…
cbuahin Sep 2, 2026
55e260c
fix(io): InpWriter emits authored form — ELEVATION offsets and advers…
cbuahin Sep 2, 2026
d230c41
feat(2d-api): swmm_2d_get_rainfall_bulk / swmm_2d_get_rain_volume_bulk
cbuahin Sep 3, 2026
7b944b7
fix(2d): rain_cum_ init spliced into a reconstructVertexRenderDepths …
cbuahin Sep 3, 2026
c3fff64
feat(python): base wheel builds and ships the Kokkos-OpenMP plugin
cbuahin Sep 3, 2026
6eee5d6
ci: build the OpenMP plugin in the Python workflow, harden the smoke …
cbuahin Sep 3, 2026
10479a6
feat(output): live .out reading - open_live/refresh + per-period flush
cbuahin Sep 3, 2026
309e84f
feat(threads): honour explicit THREADS, warn on over-allocation, expo…
cbuahin Sep 3, 2026
136a689
feat(2d): Kokkos OpenMP backend follows [OPTIONS] THREADS (GPU plugin…
cbuahin Sep 3, 2026
657bd59
fix(2d): consistent 1D↔2D units for boundary conditions
cbuahin Sep 3, 2026
6d369d5
fix(build): commit the S4 data members SWMMEngine/SurfaceRouter2D alr…
cbuahin Sep 3, 2026
4c169db
fix(build): land the rest of the S4 patch set 6d369d5d left behind
cbuahin Sep 4, 2026
39370ef
fix(parity): legacy-faithful KW/steady node states, dividers, DWF, ou…
cbuahin Sep 4, 2026
d9c7ab2
fix(losses): monthly CONDUCT factor and faithful cross-section in con…
cbuahin Sep 4, 2026
3e6c0bc
refactor(structures): drop dead init-time orifice cOrif/cWeir/hCrit s…
cbuahin Sep 4, 2026
47fffcf
fix(build): land the Routing.cpp half of the divider/steady refactor …
cbuahin Sep 4, 2026
13e545b
fix(dw): route DUMMY-xsect conduits through the non-conduit path
cbuahin Sep 4, 2026
3c8c4ce
fix(pumps): TYPE3 keeps unit speed; setting multiplies pump flow once
cbuahin Sep 4, 2026
ad3cd31
test(pumps): control-rule leg for the fractional-speed parity gate
cbuahin Sep 4, 2026
e19bace
fix(parity): report-path REAL4 accumulation, strict RDII grid, gage a…
cbuahin Sep 4, 2026
5fdb655
fix(io): read the full legacy grammar for external [TIMESERIES] files
cbuahin Sep 4, 2026
040e736
feat(tseries): explicit time-only (relative) mode for inline [TIMESER…
cbuahin Sep 4, 2026
02ecd7f
fix(report): interpolate subcatch gw/snow/LID-drain results to the re…
cbuahin Sep 4, 2026
93f12fa
fix(report): legacy-exact AVERAGES mode - float32 display accumulatio…
cbuahin Sep 4, 2026
2fa8d48
fix(controls): snap routing steps to the RULE_STEP grid
cbuahin Sep 4, 2026
e21fc3b
fix(2d): uniform tail split - no degenerate substeps at coupling-wind…
cbuahin Sep 4, 2026
f47f3bc
feat(2d): report-time old/new blend for snapshot depth/head + pending…
cbuahin Sep 4, 2026
688b6b3
fix(fv): route DUMMY conduits as pass-throughs + ERROR 134 validation
cbuahin Sep 4, 2026
861b1a8
fix(lid): rain-barrel dry-time resets on subcatchment rainfall, not u…
cbuahin Sep 4, 2026
ce8ade5
fix(input): zero negative DEPTH-mode link offsets with WARNING 03
cbuahin Sep 4, 2026
68f4ca3
fix(lid): rain-barrel dry clock updates AFTER the drain check (legacy…
cbuahin Sep 4, 2026
fbc4ef1
fix(build): Inflow.hpp includes <cstdint> for its uint8_t member
cbuahin Sep 4, 2026
801b57f
test(forcing): climate temperature baseline is 70 degF, not 0
cbuahin Sep 4, 2026
c009c69
fix(dw): force-main friction uses the precomputed sBot factor (legacy…
cbuahin Sep 4, 2026
56379ed
fix(dw): force-main dq1 groups the slope expression before the dt mul…
cbuahin Sep 4, 2026
2fa426d
fix(dw): force-main dq2/dq5/dqdh use legacy grouping; trace dqdh columns
cbuahin Sep 5, 2026
e7ade2c
feat(gwf): public [GWF] expression API + strict validator; LAT alias,…
cbuahin Sep 5, 2026
544c79f
feat(inlets): inlet junctions, inlet-usage/design C API, legacy-parit…
cbuahin Sep 6, 2026
82e7cc6
fix(forcemain): getFricFactor matches legacy forcmain.c bit-exact
cbuahin Sep 6, 2026
d38152e
feat(inlets): SWMM 5.x write profile, GeoPackage street/inlet tables,…
cbuahin Sep 6, 2026
d0a2155
feat(2d): mixed triangle/quad meshes ([2D_QUADS]) and FULL_SWE / DIFF…
cbuahin Sep 6, 2026
d204ea7
build(wasm): Emscripten support — STATIC engine, no Threads/dl/OpenMP…
cbuahin Sep 6, 2026
0e3155a
build(wasm): PluginFactory — stub dynamic loading under __EMSCRIPTEN__
cbuahin Sep 6, 2026
5db1270
feat(2d): expose the solver backend and LTS run statistics; name the …
cbuahin Sep 6, 2026
7a91ffd
fix(2d): FULL_SWE prescribed-discharge and normal-flow boundaries
cbuahin Sep 7, 2026
2c00f34
perf(2d): recover the LOCAL_INERTIAL marcher cost lost to the tri-qua…
cbuahin Sep 7, 2026
caa7af5
feat(2d): make the NORMAL_FLOW bed slope signed so an edge can feed t…
cbuahin Sep 7, 2026
347af2d
fix(routing): backflowing outfall reports node inflow = |outflow| (le…
cbuahin Sep 8, 2026
1e71017
fix(tests,typing): MSVC setenv, OpenMP-limit guard, dict type args
cbuahin Sep 8, 2026
2ef7f44
fix(input): reject unknown [CURVES] type keyword (ERROR 205); add WEI…
cbuahin Sep 8, 2026
2cc3720
fix(input): reject [GROUNDWATER] rows with too few items (ERROR 203)
cbuahin Sep 8, 2026
69d24fb
fix(controls): reject non-STATUS/SETTING rule action attributes (lega…
cbuahin Sep 8, 2026
138463a
fix(input): wire legacy table-sequence + rain-file-conflict validatio…
cbuahin Sep 8, 2026
2ea8ebe
feat(2d,transport): results-file options, one transport contract, MSX…
cbuahin Sep 8, 2026
f1befd0
fix(hydraulics): ideal pump ('*' curve) now conveys node inflow (lega…
cbuahin Sep 8, 2026
8152912
chore(release): bump engine to 6.0.0-alpha.4
cbuahin Sep 9, 2026
758e14d
fix(build): add missing humidity + node_vj_face declarations so the t…
cbuahin Sep 9, 2026
ae198f9
test: commit the two sources CMakeLists already references
cbuahin Sep 9, 2026
46cd612
feat(climate): humidity option, C API and bindings
cbuahin Sep 9, 2026
1fe7238
feat(vj): virtual-junction wetting floor and FV mesh phases E2-E4
cbuahin Sep 9, 2026
7b60eec
test(2d): commit the two-zone groundwater gates the build already reg…
cbuahin Sep 9, 2026
4f17dff
fix(parity): restore 4 parity fixes reverted by wholesale shared-file…
cbuahin Sep 9, 2026
b047927
test(2d),docs: fix the BC-units opened-state read; document VJ latera…
cbuahin Sep 9, 2026
27784b1
feat(threads): host-reserved threads count toward oversubscription; h…
cbuahin Sep 9, 2026
02e1e38
fix(math): free the thread_local ODE workspace at thread exit
cbuahin Sep 9, 2026
c347289
fix(hydrology): accept full-word PERVIOUS/IMPERVIOUS subarea RouteTo …
cbuahin Sep 10, 2026
a7f6d36
fix(tests): humidity fixture and the float32 payload ratio
cbuahin Sep 10, 2026
de23107
chore(gitignore): stop tests/verification/ swallowing the gw2d gate s…
cbuahin Sep 10, 2026
137e65e
fix(parity): decimal hours, crown depth extension, subcatchment area UCF
cbuahin Sep 10, 2026
900c55a
fix(gwf): resolve [GWF] expression variables by prefix like legacy (a…
cbuahin Sep 10, 2026
b85b79c
perf(mem): bound the control-action log; fold 2D marcher telemetry as…
cbuahin Sep 10, 2026
259a0ed
build: ship the bit-exact engine by default; fast kernels become opt-in
cbuahin Sep 10, 2026
b3b1590
fix(io): open files by UTF-8 path so non-ASCII paths work on Windows …
cbuahin Sep 10, 2026
02633ac
build(windows): search vcpkg's debug tree when bundling runtime deps …
cbuahin Sep 10, 2026
9226804
fix(xsect): map LinkData::XsectShape to the batch XSectShape via tran…
cbuahin Sep 11, 2026
2003e17
fix(build): reach FileIO.hpp by relative path from the GPU plugin TU …
cbuahin Sep 11, 2026
4039342
fix(xsect): raise FILLED_CIRCULAR conduit offsets by the sediment dep…
cbuahin Sep 11, 2026
68710e6
fix(inlets): stop booking a capture node's overflow as flooding when …
cbuahin Sep 11, 2026
f397c94
fix(api): FILLED_CIRCULAR conduit offsets cross the C API as authored…
cbuahin Sep 11, 2026
cbbdb1a
fix(dw): make the SURCHARGE_METHOD SLOT path op-for-op legacy (Sjober…
cbuahin Sep 11, 2026
4223fee
perf(fv): five bit-identical fixed-cost removals, plus the counters t…
cbuahin Sep 11, 2026
93ba5a3
fix(inflow): drop external and groundwater lateral inflows below lega…
cbuahin Sep 11, 2026
7f40573
fix(xsect): treat STREET and DUMMY sections as open in the batch kern…
cbuahin Sep 11, 2026
85d03e0
fix(xsect): apply the FILLED_CIRCULAR sediment bump to every filled c…
cbuahin Sep 11, 2026
2fe0d2d
perf(fv): cross sections from exact geometry through one POD closure …
cbuahin Sep 12, 2026
a578c6d
refactor(fv): delete the legacy table/Brent closure path
cbuahin Sep 12, 2026
f501d11
fix(link): route lengthened transect conduits with the transect's Man…
cbuahin Sep 12, 2026
1b859b5
fix(dw): conduit evaporation/seepage losses follow legacy's dry-branc…
cbuahin Sep 12, 2026
a1d0548
fix(fv): bound the wave entering a free surface at a slot interface b…
cbuahin Sep 12, 2026
70d2f95
perf(fv): share section blocks across conduits; solve junctions in pa…
cbuahin Sep 12, 2026
2c1518b
fix(hydrology): transliterate legacy Green-Ampt; set the snow-cover f…
cbuahin Sep 12, 2026
73d94cf
perf(fv): bound a pass-through ghost by the cell it fluxes; mass-only…
cbuahin Sep 12, 2026
df69645
fix(spatial): keep the two CRS stores in step so a reprojected model …
cbuahin Sep 12, 2026
1663caa
fix(dw): book node volume in legacy's convention; transport stores de…
cbuahin Sep 13, 2026
791fa1a
fix(fv): keep a lateral into a dry pass-through junction; take the ju…
cbuahin Sep 13, 2026
92e6336
fix(routing): date the step's inflows and trigger runoff on the ms cl…
cbuahin Sep 13, 2026
509906b
fix(groundwater): legacy's inputs, setup and ordering for the aquifer…
cbuahin Sep 13, 2026
b814bcf
fix(io): don't wrap fs::path in utf8_path; drop u8string from EXPECT_…
cbuahin Sep 13, 2026
4e11eac
Fix the remaining UTF-8 path conversions outside the open calls (#7)
cbuahin Sep 13, 2026
a98a81e
fix(build): link bench_fv_closure against the internal static lib on …
cbuahin Sep 13, 2026
4494972
fix(hydrology): legacy LID kernel, snowmelt, curve-number, run-on and…
cbuahin Sep 13, 2026
704ca91
fix(hydrology): legacy rain-gage state machine, HasRunoff, aquifer ev…
cbuahin Sep 14, 2026
98ace17
fix(io): make utf8_path(fs::path) a compile error on every platform (#7)
cbuahin Sep 14, 2026
ae933e6
fix(routing): outfall accounting and stage clock, D-W roughness units…
cbuahin Sep 14, 2026
206ffdf
fix(routing): ROADWAY weir + Cd curve, legacy rule clock, closed-link…
cbuahin Sep 15, 2026
857e475
fix(routing): control-closed conduits, [ADJUSTMENTS] prefix keywords,…
cbuahin Sep 18, 2026
acc0745
fix(routing): street transect geometry, inlet capture order and backf…
cbuahin Sep 19, 2026
3f22b06
fix(hydrology,routing): subarea loss reassociation, conduit lengtheni…
cbuahin Sep 19, 2026
fc66c14
docs(manuals): split the user manual by audience into an Engine Manual
cbuahin Sep 19, 2026
6264409
docs(engine): finish the chapters the audience split only moved
cbuahin Sep 19, 2026
17d108c
feat(2d): water age in hours, MSX and 2D surface quality, groundwater…
cbuahin Sep 19, 2026
ba5db9e
docs(hydraulics): unsplit the diffusive-wave face law row in the clos…
cbuahin Sep 19, 2026
7521f64
docs: manual lint in CI, status badges, labelled Mermaid workflows, n…
cbuahin Sep 20, 2026
2e62d3e
fix(2d): recharge booking lag, a frozen aquifer under a dry surface, …
cbuahin Sep 20, 2026
1e38f8c
docs(figures): one figure manifest, a reproducible figure pipeline, a…
cbuahin Sep 20, 2026
670e9e6
docs(figures): the conceptual process map, the object sketch and the …
cbuahin Sep 20, 2026
fbd0321
docs(engine): complete the input-file grammar — every [OPTIONS] key, …
cbuahin Sep 20, 2026
8714ba0
docs(engine): the 2D mesh and results files, component configuration …
cbuahin Sep 20, 2026
505f1b9
feat(2d): node auto-enrolment and a capped node-to-aquifer recharge
cbuahin Sep 20, 2026
126c2c8
docs(figures): cross-section galleries drawn from the engine's own ge…
cbuahin Sep 20, 2026
0bc0d48
fix(hydrology,routing): FLOW keyword prefix match, repeated inflow ro…
cbuahin Sep 20, 2026
b812868
docs(figures): legacy replacements for LID, infiltration, groundwater…
cbuahin Sep 20, 2026
8ec3dcf
docs(figures): interactive diagrams — pan/zoom viewports, clickable h…
cbuahin Sep 20, 2026
1318881
docs(reference): mesh hydrology, mesh water quality, the 2D momentum …
cbuahin Sep 20, 2026
a0130e4
docs(figures): eleven figures for the mesh hydrology, mesh quality an…
cbuahin Sep 21, 2026
4f58327
docs(manuals): generate the reference manuals' figure and table lists…
cbuahin Sep 21, 2026
3b0f12d
docs(hydraulics): the TPA high-celerity filling divergence was fixed,…
cbuahin Sep 21, 2026
2f58171
docs(application): the manual becomes a formulation-choice manual; Ch…
cbuahin Sep 21, 2026
5b4ed63
docs(application): Chapters 2 and 3 — a filling pipe, and a pipe draw…
cbuahin Sep 21, 2026
bca42d1
docs(application): Chapter 5 — street inlets, and what the inlet junc…
cbuahin Sep 21, 2026
0a1179c
docs(application): Chapters 8, 9 and 10 — the transport engines, reac…
cbuahin Sep 21, 2026
684c529
fix(quality): [LOADINGS] initial buildup, the reported-runoff washoff…
cbuahin Sep 21, 2026
ddaf3bd
docs(application): Chapters 6 and 7 — a coupled model, and hydrology …
cbuahin Sep 21, 2026
ea59577
docs(application): Chapter 4 — 370 virtual junctions on a surveyed trunk
cbuahin Sep 21, 2026
9f9782c
docs(application): Chapter 11 — long-term hydrology, and the last of …
cbuahin Sep 21, 2026
f362d02
fix(quality): route link quality the way legacy findLinkQual does — t…
cbuahin Sep 21, 2026
942f9b0
docs: close out the formulation-documentation programme — roadmap, ch…
cbuahin Sep 21, 2026
4353318
fix(quality): route node quality the way legacy findStorageQual does,…
cbuahin Sep 21, 2026
b0924c7
fix(quality): give the ponded surface its water back — subcatch_getDe…
cbuahin Sep 21, 2026
7ed7a7b
fix(input): match [BUILDUP] and [WASHOFF] function keywords by PREFIX…
cbuahin Sep 21, 2026
73ea554
feat(2d): the groundwater stack — conduit seepage, signed conductance…
cbuahin Sep 21, 2026
23918d2
test(hydrology): pin the CUMULATIVE rain-gage contract against legacy…
cbuahin Sep 21, 2026
b87d0a0
fix(quality): accumulate surface buildup only while the subcatchment …
cbuahin Sep 21, 2026
a2e5c22
fix(quality): deliver wet-weather loads on legacy's interpolation wei…
cbuahin Sep 21, 2026
52fd51c
fix(quality): refuse an inflow below legacy's ZERO instead of dividin…
cbuahin Sep 21, 2026
f6147a8
fix(quality): book washoff mass against the POST-LID volumes, as lega…
cbuahin Sep 21, 2026
a3bb264
fix(quality): findLidLoads read the GAGE's display rainfall into a vo…
cbuahin Sep 21, 2026
80b7b2b
fix(quality): report subcatchment washoff on the RUNOFF clock, not th…
cbuahin Sep 22, 2026
309e07d
fix(quality): the washoff load carries legacy's fOutlet share — the r…
cbuahin Sep 22, 2026
342dfa2
fix(report): legacy's warnings 01-13 carry no trailing period
cbuahin Sep 22, 2026
d636dff
fix(validate): raise the network-layout errors legacy raises — outfal…
cbuahin Sep 22, 2026
8b536ee
fix(output): the area-weighted system rows take legacy's ROUND-TRIPPE…
cbuahin Sep 22, 2026
bd9b5d2
fix(input): accept '-' as a date separator, as legacy does — a hyphen…
cbuahin Sep 22, 2026
24c17d2
fix(quality): resolve pollutant names in treatment expressions — the …
cbuahin Sep 23, 2026
638f684
test(parity): ask whether a saved model still means what it meant
cbuahin Sep 23, 2026
973fba6
fix(io): stop the writer losing model content on save
cbuahin Sep 23, 2026
4a0bc1e
feat(io): write the model to HDF5, for consumers that want arrays
cbuahin Sep 23, 2026
3661597
fix(quality): treatment Cin is a rate over a rate, and HRT takes the …
cbuahin Sep 23, 2026
32a954b
feat(quality): FLOW is a legal treatment variable, as it is in legacy
cbuahin Sep 23, 2026
9d5b934
fix(io): write the grammar edges legacy actually enforces
cbuahin Sep 23, 2026
9746e02
fix(input): a comma inside a name is not a delimiter
cbuahin Sep 24, 2026
b726ea4
fix(quality): wash off co-pollutants — [POLLUTANTS] parsed them, noth…
cbuahin Sep 24, 2026
1df49d0
docs(io): put two writer comments back beside the code they explain
cbuahin Sep 24, 2026
ec6fb94
fix(hydrology): the REPORTED gage rainfall carries the monthly [ADJUS…
cbuahin Sep 24, 2026
a0023c5
fix(geopackage): stop a .gpkg round trip destroying every link offset
cbuahin Sep 25, 2026
b593ac2
fix(hydrology): read the NWS / NCDC rain file layouts — a gage on one…
cbuahin Sep 25, 2026
7de6668
fix(routing): a skipped [EVENTS] window kept publishing the last rout…
cbuahin Sep 25, 2026
c5d0b16
Fix kinematic quality mixing and system-outflow mass accounting
cbuahin Sep 26, 2026
4895765
fix(build): declare the stock SWMM 5 writer profile
cbuahin Sep 26, 2026
2daef06
fix(save): check engine writes before replacing model and mesh files
cbuahin Sep 26, 2026
e7fc5fe
fix(2d): stabilize rainfall interpolation and add nearest neighbour
cbuahin Sep 26, 2026
e7c68b8
docs: document aquifer link exchange to fix manual lint
cbuahin Sep 26, 2026
8a7545b
feat(python): complete engine bindings and harden native access
cbuahin Sep 26, 2026
65a68ee
fix(2d): refresh the mesh rain field when a gage value changes
cbuahin Sep 26, 2026
20c76e4
fix(validate): count a reversed conduit at the node it leaves, not th…
cbuahin Sep 27, 2026
72c96d7
fix(2d): apply and report mesh rainfall exactly as the 1D does
cbuahin Sep 27, 2026
06434a4
fix(input): a negative junction depth is an error, as it is in legacy
cbuahin Sep 27, 2026
f96e5a5
fix(2d): the aquifer bed's drain cap, the reported error's denominato…
cbuahin Sep 27, 2026
1dc8c89
fix(test): the D-A20 age gate needed [OPTIONS] WATER_AGE — it was red…
cbuahin Sep 27, 2026
f370269
fix(input): an unmatched cross-section keyword is an error, as it is …
cbuahin Sep 27, 2026
2f05736
fix(input): a CUSTOM cross-section whose shape curve is missing is an…
cbuahin Sep 28, 2026
e817a14
test(2d): gages outside the mesh domain drive every cell
cbuahin Sep 28, 2026
0e5e0f9
fix(input): report the cross-section geometry setParams already rejects
cbuahin Sep 28, 2026
cc3a2dc
fix(quality): surface quality does not need a land use, and legacy ne…
cbuahin Sep 28, 2026
22b5e80
fix(ci): unbreak Python wheel builds on Windows, Linux and macOS
cbuahin Sep 29, 2026
7a2ff18
fix(input): a regulator's offset2 keeps the AUTHORED crest, as legacy…
cbuahin Sep 29, 2026
8fc5f15
fix(quality): street sweeping runs on legacy's calendar, availability…
cbuahin Sep 29, 2026
1d63ab4
fix(quality): run-on carries the donor's pollutant load, as legacy ca…
cbuahin Sep 29, 2026
5d0f96f
fix(lid): the drain law ran with US unit factors on SI decks; add the…
cbuahin Sep 29, 2026
f38f625
fix(quality): the node's mixing denominator is legacy's FLOORED NET l…
cbuahin Sep 29, 2026
ad2311a
fix(quality): the LID drain's load interpolates between runoff steps,…
cbuahin Sep 29, 2026
c79a1b5
fix(ci): clear the C++ unit-test failures on all four platforms
cbuahin Sep 29, 2026
3d10ac9
fix(input): a subcatchment naming an undefined snow pack is an error
cbuahin Sep 30, 2026
dbb5ac4
build(hc-1): the HydroCouple interface headers, pinned, opt-in, heade…
cbuahin Sep 30, 2026
da8bbb3
fix(test): MSX vs pollutant BMP removal agrees to rounding, not bit-f…
cbuahin Sep 30, 2026
b6b1b6a
docs(changelog): the 1D <-> aquifer seam, G-W1 and D-A20 entries
cbuahin Sep 30, 2026
ceff514
build(d1): the D-C6 guard and a compile-time ABI pin for HydroCouple
cbuahin Sep 30, 2026
1c8bdc8
feat(python): openswmm.engine.catalog, a machine-readable map of the …
cbuahin Sep 30, 2026
665b787
docs(changelog): the openswmm.engine.catalog entry
cbuahin Sep 30, 2026
4c12df8
fix(hydraulics): storage exfiltration is capped once, jointly, from r…
cbuahin Sep 30, 2026
fa77335
fix(hydrology): LID runoff exchange uses legacy's volume-domain arith…
cbuahin Sep 30, 2026
60e219a
feat(catalog): complete member coverage and shared unit labels
cbuahin Sep 30, 2026
2dc5138
chore: stop tracking plan, handoff and result write-ups
cbuahin Sep 30, 2026
e2f3b64
fix(catalog): unit_label accepts the solver's FlowUnits
cbuahin Sep 30, 2026
70e772a
docs: engine catalog guide; manuals no longer cite untracked plans
cbuahin Sep 30, 2026
a710e94
fix(2d): align rainfall output with report times
cbuahin Sep 30, 2026
df9b5f0
fix(python): refresh catalog provenance and documentation links
cbuahin Oct 1, 2026
5a8721e
build: prepare Python wheels for 6.0.0a4.dev1
cbuahin Oct 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
122 changes: 122 additions & 0 deletions .github/workflows/benchmark_dispatch.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
# Tell openswmm.engine.benchmarks that this engine moved, so it can build THIS
# commit and sweep the model corpus against it.
#
# Why a dispatch rather than a job here: the benchmark platform owns the corpus,
# the engine registry, the scoring taxonomy and its own Pages site. Keeping the
# sweep there means this repository needs only permission to say "a new commit
# exists" -- it never needs a Pages credential, and the corpus never has to be
# vendored into this tree.
#
# Gated on Unit Testing succeeding. A sweep is a multi-hour, multi-runner job;
# dispatching a commit that does not build wastes it and buries the real signal
# under a matrix of ERROR cells.
name: Benchmark dispatch

on:
workflow_run:
workflows: ["Unit Testing"]
types: [completed]
branches: [main, develop]
workflow_dispatch:
inputs:
sha:
description: Engine commit to benchmark (blank = this branch's HEAD)
required: false

permissions:
contents: read

env:
BENCHMARKS_REPO: HydroCouple/openswmm.engine.benchmarks

jobs:
dispatch:
name: Notify the benchmark platform
# workflow_run fires on completion regardless of outcome, so filter to the
# successful PUSH runs. Pull-request runs are excluded deliberately: a fork
# PR cannot read secrets, and a sweep per PR would cost more than it tells
# us until the PR tier is curated.
if: >-
github.event_name == 'workflow_dispatch' ||
(github.event.workflow_run.conclusion == 'success' &&
github.event.workflow_run.event == 'push')
runs-on: ubuntu-latest
steps:
- name: Resolve the commit to benchmark
id: target
env:
RUN_SHA: ${{ github.event.workflow_run.head_sha }}
RUN_REF: ${{ github.event.workflow_run.head_branch }}
INPUT_SHA: ${{ inputs.sha }}
run: |
set -euo pipefail
sha="${INPUT_SHA:-${RUN_SHA:-${GITHUB_SHA}}}"
ref="${RUN_REF:-${GITHUB_REF_NAME}}"
# A blank sha would make the receiver silently check out its default
# branch and publish results keyed to the wrong commit.
if [ -z "$sha" ]; then
echo "::error::could not resolve an engine SHA to dispatch"
exit 1
fi
echo "sha=$sha" >> "$GITHUB_OUTPUT"
echo "ref=$ref" >> "$GITHUB_OUTPUT"
echo "Dispatching $ref @ $sha to $BENCHMARKS_REPO"

- name: Check the dispatch token is configured
env:
TOKEN: ${{ secrets.BENCHMARKS_DISPATCH_TOKEN }}
run: |
if [ -n "${TOKEN:-}" ]; then exit 0; fi
cat >&2 <<'MSG'
The secret BENCHMARKS_DISPATCH_TOKEN is not set on this repository.

Cross-repository repository_dispatch cannot use the default
GITHUB_TOKEN -- it is scoped to this repository only -- so a separate
credential is required.

To configure:
1. Create a token that may POST to
HydroCouple/openswmm.engine.benchmarks:
* fine-grained PAT -> Repository access: that repo,
Permissions: Contents = Read and write
* classic PAT -> scope: repo
(A GitHub App installation token works too, and is preferable
for a shared org: it is not tied to one person's account.)
2. Add it here as an Actions secret named
BENCHMARKS_DISPATCH_TOKEN.

Until then the benchmark platform picks this engine up only via its
own nightly cron (07:00 UTC, building `develop`), not per push.
MSG
echo "::error::BENCHMARKS_DISPATCH_TOKEN is not configured -- see the log above"
exit 1

- name: Dispatch to openswmm.engine.benchmarks
env:
TOKEN: ${{ secrets.BENCHMARKS_DISPATCH_TOKEN }}
SHA: ${{ steps.target.outputs.sha }}
REF: ${{ steps.target.outputs.ref }}
run: |
set -euo pipefail
# Built with jq, not string interpolation: a branch name is
# attacker-influenced text and must not be able to break out of the
# JSON body.
payload=$(jq -n \
--arg sha "$SHA" \
--arg ref "$REF" \
--arg repo "$GITHUB_REPOSITORY" \
--arg run_url "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/${{ github.event.workflow_run.id || github.run_id }}" \
'{event_type: "engine-push",
client_payload: {sha: $sha, ref: $ref, repo: $repo, run_url: $run_url}}')

curl --fail-with-body -sS -X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer $TOKEN" \
-H "X-GitHub-Api-Version: 2022-11-28" \
"$GITHUB_API_URL/repos/$BENCHMARKS_REPO/dispatches" \
-d "$payload"

echo "Dispatched $REF @ $SHA"
echo "### Benchmark sweep dispatched" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "\`$REF\` @ \`$SHA\` -> [$BENCHMARKS_REPO]($GITHUB_SERVER_URL/$BENCHMARKS_REPO/actions)" >> "$GITHUB_STEP_SUMMARY"
5 changes: 4 additions & 1 deletion .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
name: CodeQL

permissions:
contents: read

on:
push:
branches: [main] # drop develop — covered by PR
Expand Down Expand Up @@ -52,7 +55,7 @@ jobs:
uses: actions/checkout@v5
with:
repository: microsoft/vcpkg
ref: 2025.02.14
ref: 2026.07.29
path: vcpkg

- name: Install Ninja
Expand Down
40 changes: 29 additions & 11 deletions .github/workflows/deployment.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
name: Deployment

permissions:
contents: read

on:
push:
branches: [main]
Expand All @@ -14,7 +17,7 @@ env:
OMP_NUM_THREADS: 1
# Single source of truth for the vcpkg ref (used by every checkout + the
# in-container clone in pyproject's linux before-all via environment-pass).
VCPKG_REF: "2025.02.14"
VCPKG_REF: "2026.07.29"
# macOS minimum target. Set globally so the engine build job AND vcpkg's
# dependency builds (SUNDIALS/HDF5/sqlite3) compile at this floor; ignored on
# Linux/Windows. The Python wheels set the same value via cibuildwheel
Expand All @@ -23,14 +26,16 @@ env:
MACOSX_DEPLOYMENT_TARGET: "11.0"

jobs:
python-contracts:
uses: ./.github/workflows/python_contracts.yml

# ──────────────────────────────────────────────────────────────────────
# Build release binaries
# ──────────────────────────────────────────────────────────────────────
build:
name: "Build (${{ matrix.alias }})"
permissions:
contents: read
actions: write # x-gha vcpkg binary cache + actions/cache
strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -131,6 +136,15 @@ jobs:
with:
arch: amd64

- name: Re-pin VCPKG_ROOT (Windows)
# vcvars64 (VS 2022 17.6+) exports VCPKG_ROOT pointing at Visual
# Studio's bundled vcpkg, and msvc-dev-cmd forwards it to every later
# step, overriding the job-level env — so configure would silently
# build against VS's port snapshot instead of the pinned checkout.
if: runner.os == 'Windows'
shell: pwsh
run: echo "VCPKG_ROOT=${{ github.workspace }}\vcpkg" >> $env:GITHUB_ENV

- name: Configure (Release)
# Release packaging skips the test/benchmark targets so vcpkg pulls only
# the runtime deps. Kokkos + hypre/AMG are vcpkg/CMake defaults, but
Expand Down Expand Up @@ -215,7 +229,6 @@ jobs:
# not block all wheels. (Previously `needs: build` coupled them.)
permissions:
contents: read
actions: write
strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -299,7 +312,6 @@ jobs:
name: "GPU-omp wheels (${{ matrix.os }})"
permissions:
contents: read
actions: write
strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -426,17 +438,22 @@ jobs:
# numpy (the base wheel's only runtime dep) is pulled from PyPI as a wheel.
"$PY" -m pip install --only-binary :all: numpy
# The project wheels MUST come from the local wheelhouse, never PyPI.
# openswmm / openswmm-gpu-omp are pre-releases (6.0.0a3), and a *stable*
# openswmm / openswmm-gpu-omp are pre-releases (for example, 6.0.0a4.dev1), and a *stable*
# openswmm-gpu-omp 0.0.0 placeholder exists on PyPI; without --no-index pip
# prefers that stable stub over our local pre-release and installs an empty
# package (ModuleNotFoundError: openswmm_gpu_omp). --no-index also makes a
# missing or mis-tagged companion wheel fail loudly here instead of silently
# resolving to PyPI.
"$PY" -m pip install --only-binary :all: --no-index --find-links wheelhouse openswmm openswmm-gpu-omp
"$PY" -m pip show openswmm | tee wheel-smoke-${{ matrix.os }}.txt
# gpu-omp companion must import AND be auto-discovered by base openswmm
# (import openswmm runs _register_gpu_companion → OPENSWMM_GPU_PLUGIN_PATH).
"$PY" -c "import os,openswmm,openswmm_gpu_omp as g; p=os.environ.get('OPENSWMM_GPU_PLUGIN_PATH'); assert p, 'gpu-omp plugin not discovered'; print('OPENSWMM_GPU_PLUGIN_PATH='+p); print('companion at '+g.__file__)" | tee -a wheel-smoke-${{ matrix.os }}.txt
# A plugin must be auto-discovered on `import openswmm`
# (_register_gpu_plugin → OPENSWMM_GPU_PLUGIN_PATH), the companion must
# import, and the discovered directory must actually CONTAIN a built
# plugin binary — a non-empty env var alone would pass even if the
# OpenMP build had silently produced nothing. The base wheel now ships
# the plugin too, so the discovered dir is normally openswmm/engine;
# the shim prefers it and skips the companion (one OpenMP runtime).
"$PY" -c "import os,glob,openswmm,openswmm_gpu_omp as g; p=os.environ.get('OPENSWMM_GPU_PLUGIN_PATH'); assert p, 'no gpu plugin discovered'; d=p.split(os.pathsep)[0]; hits=[f for f in glob.glob(os.path.join(d,'*openswmm_gpu_*')) if f.endswith(('.so','.dylib','.dll'))]; assert hits, 'discovered dir has no plugin binary: '+d; print('OPENSWMM_GPU_PLUGIN_PATH='+p); print('plugin: '+hits[0]); print('companion at '+g.__file__)" | tee -a wheel-smoke-${{ matrix.os }}.txt
# Run the example model end-to-end via the shared smoke script.
"$PY" python/smoke_test.py 2>&1 | tee -a wheel-smoke-${{ matrix.os }}.txt

Expand All @@ -463,7 +480,9 @@ jobs:
python-version: "3.13"

- name: Check version sync (CMake / vcpkg / pyproject)
run: python scripts/check_version_sync.py
run: |
python -m unittest discover -s scripts -p test_version_sync.py
python scripts/check_version_sync.py

- name: Install build frontend
run: |
Expand Down Expand Up @@ -494,7 +513,6 @@ jobs:
name: "C++ unit tests (release gate)"
permissions:
contents: read
actions: write
runs-on: ubuntu-latest
steps:
- name: Checkout repository
Expand Down Expand Up @@ -544,7 +562,7 @@ jobs:
release:
name: Create GitHub Release
if: startsWith(github.ref, 'refs/tags/v')
needs: [build, test, wheels, gpu-omp-wheels, sdist, wheel-smoke]
needs: [build, test, wheels, gpu-omp-wheels, sdist, wheel-smoke, python-contracts]
runs-on: ubuntu-latest
permissions:
contents: write
Expand Down
Loading
Loading