Skip to main content

jSACSMA

PyPI version License

Dual-backend (JAX + NumPy) implementation of the Sacramento Soil Moisture Accounting model (SAC-SMA) with optional Snow-17 coupling — usable standalone or as a SYMFLUENCE plugin.

Part of the SYMFLUENCE JAX-native model family — self-contained packages that run standalone (NumPy fallback, no JAX required) and register automatically with SYMFLUENCE when installed alongside it.

Features

  • Differentiable: automatic differentiation through the full simulation (JAX)
  • Fast: JIT compilation via lax.scan; vmap for ensembles; GPU-capable
  • Dependency-light: pure-NumPy fallback when JAX is not installed
  • Plugin architecture: auto-registers with SYMFLUENCE via entry points

Installation

pip install jsacsma          # NumPy backend
pip install 'jsacsma[jax]'    # with JAX (differentiable, JIT)

Quickstart

from jsacsma.model import simulate

# coupled Snow-17 + SAC-SMA (temperature drives the snow module)
flow, state = simulate(precip, temp, pet, day_of_year=doy, latitude=51.17)

# standalone SAC-SMA (no snow module)
flow, state = simulate(precip, temp, pet, snow_module="none")

Gradient-based calibration

The JAX backend makes the full simulation differentiable end-to-end, so model parameters can be calibrated with gradient descent:

import jax
from jsacsma.losses import kge_loss, get_kge_gradient_fn

grad_fn = get_kge_gradient_fn(precip, temp, pet, observed)
value, grads = grad_fn(params)          # dKGE/dparam for every parameter

nse_loss / kge_loss and their gradient factories are JIT-compatible and work with any optax optimizer. Within SYMFLUENCE the same interface powers the ADAM and L-BFGS calibration options.

Use with SYMFLUENCE

jsacsma registers with SYMFLUENCE through the symfluence.plugins entry point — installation is the integration:

pip install symfluence jsacsma
# config.yaml (excerpt)
model:
  hydrological_model: SACSMA

SYMFLUENCE then handles forcing preparation, calibration, evaluation, and benchmarking for the model with no further wiring.

Model structure

SAC-SMA (Burnash, 1995) partitions the soil into upper- and lower-zone tension and free water storages, generating direct runoff, surface runoff, interflow, and primary/supplemental baseflow. The optional Snow-17 coupling (Anderson, 2006) converts precipitation to rain-plus-melt before the soil accounting.

16 calibration parameters (jsacsma.PARAM_BOUNDS); snow parameters are handled by the embedded Snow-17 component.

Testing

pip install -e '.[dev]'
pytest

How to cite

If you use jSACSMA in your research, please cite the SYMFLUENCE companion papers, which describe the design of the JAX-native model family (registry integration, differentiability, and the calibration experiments they enable):

Eythorsson, D., et al. (2026). The registry as social contract: Architectural patterns for community hydrological modeling. Water Resources Research (submitted).

Eythorsson, D., et al. (2026). From configuration to prediction: Multi-model, multi-basin experiments with SYMFLUENCE. Water Resources Research (submitted).

Citation metadata for this package is provided in CITATION.cff; a version-specific DOI is minted via Zenodo for each GitHub release.

References

  • Burnash, R. J. C. (1995). The NWS River Forecast System — catchment modeling. In V. P. Singh (Ed.), Computer Models of Watershed Hydrology (pp. 311–366). Water Resources Publications.
  • Anderson, E. A. (2006). Snow Accumulation and Ablation Model — SNOW-17. NOAA Technical Report NWS HYDRO-17.

License

Apache-2.0. See LICENSE.

Metadata

Release files for jsacsma 0.2.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jsacsma 0.2.5
File Size Uploaded Provenance Actions
jsacsma-0.2.5.tar.gz 46.2 kB Without provenance Details for jsacsma-0.2.5.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for jsacsma 0.2.5
File Interpreter ABI Platform Actions
jsacsma-0.2.5-py3-none-any.whl Python 3 none any Details for jsacsma-0.2.5-py3-none-any.whl

Total release size: 93.6 kB

Release files / jsacsma-0.2.5.tar.gz

Download URL jsacsma-0.2.5.tar.gz
Size 46.2 kB
Tags Source
SHA-256 checksum
How to use checksums
85c9f9c27bf94a8c64617d6b2a7b7a7181cb1a008afff659b6d5b50cae3b0a65
BLAKE2b-256 checksum
How to use checksums
bdc0c83a25ab787d172e169e10a73c932156cf5fa0e4cc2e8ea641a6fe9e52ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Release files / jsacsma-0.2.5-py3-none-any.whl

Download URL jsacsma-0.2.5-py3-none-any.whl
Size 47.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e1d204e7d1cfa4e79c91a9249dd77045119a05eeb4b11999495a0259c2379588
BLAKE2b-256 checksum
How to use checksums
776439fb773ad93dafaf3b963750b42bf862f7ed917bfee79d1f7df0eca0a2e4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Security for jsacsma 0.2.5

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page