Skip to content

Changelog#

All notable changes to this project will be documented in this file. The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]#

Added#

  • schism: Wire pyTMD harmonic boundary; add scribes counting and discharge gating
  • alaska: Add initial Alaska domain support
  • sflux: Subset atmospheric forcing to SCHISM mesh footprint

Changed#

  • tides: Replace ambiguous multiplication sign in log strings
  • tides: Apply ruff-format to data/tides.py
  • sfincs: Switch boundary forcing to pyTMD harmonic predictor
  • tides: Replace pytides+OTPSnc with pyTMD predictor; consolidate pixi envs

[3.1.2.0.0-rc2] - 2026-05-16#

Added#

  • sfincs: Add NOAA CRM topobathy and make obs-point snap configurable

Changed#

  • mpi: Make thread-pinning user-supplied and self-heal SLURM affinity
  • Remove backward-compatibility shims

Fixed#

  • mpi: Propagate runtime_env into make_stofs_boundary
  • mpi: Remove EFA auto-detection from build_mpi_env

[3.1.2.0.0-rc1] - 2026-05-08#

Added#

  • schism: Add output frequency controls and param.nml validation
  • utils: Introduce naive-UTC time-handling contract
  • schism: Per-node datum correction and exact domain polygon
  • regridding: Bilinear STOFS regrid via unstructured ESMF mesh
  • sfincs: Create-stage robustness improvements
  • plotting: Add side-by-side water-level comparison animation
  • qgis: Add SCHISM mesh, CO-OPS, and selection-aware polygon ops
  • stages: Wire animation and obs-point workflows into plot stages
  • plotting: Add spatial/animation renderers and observations module
  • outputs: Add canonical water-level output loaders
  • Add MPI runtime detection and system binary support
  • Add pixi-build recipes for SFINCS and SCHISM
  • Add tides, regridding, sflux, and schism_prep modules
  • Add pixi SCHISM build infrastructure
  • discharge: Rename nwm_discharge to river_discharge and add snap distance threshold
  • qgis: NWM flowlines override, flowpath export, and stream order validation
  • plotting: Add reusable plotting module
  • discharge: Simplify nwm_discharge config to flowlines + nwm_id_column
  • qgis: NWM flowlines override, flowpath export, stream order validation
  • utils: Add clip-and-reproject raster utility
  • Add flood depth map downscaling stage
  • Make gages and nexus NHF layers optional
  • Add NWM Coastal QGIS plugin
  • Make from_dict public on config classes
  • Add human-readable str to workflow result classes
  • Add quadtree output read compatibility patch
  • Auto-fetch CopDEM, GEBCO, and ESA WorldCover without data catalogs

Changed#

  • Switch to numpy.typing.NDArray annotations and tidy spelling
  • io: Centralize netCDF helpers and roll them out across writers
  • downloader: Skip files already cached on disk
  • Vectorize per-query loops with SciPy KDTree
  • Split monolithic stages into named helpers
  • Narrow except Exception clauses across pipeline
  • Wrap network/file/fd resources in context managers
  • Replace ambiguous unicode characters with ASCII (RUF002/RUF003)
  • schism: Split divide_mesh into extract_mesh and split_mesh
  • Use context managers for netCDF4 Dataset opens
  • Extract obs-point helpers and tighten validation
  • Apply pre-commit auto-fixes and spelling corrections
  • subsetter: Rewrite boundary cutting and switch to netCDF4
  • Standardize netCDF4 imports and minor cleanups
  • Reorganize package into model-specific and data subpackages
  • Move ModelConfig field docs to NumPy class docstring
  • Use #: comments for ModelConfig field docs
  • Remove all legacy config field references
  • Remove legacy config migration helpers
  • Remove legacy binary field migration
  • Convert package imports to lazy loading
  • Rename LevelInfo.count to n_cells and type crs as optional
  • Replace activation scripts with pixi-build path dependencies
  • Move submodules under coastal_models/
  • Use ty: ignore with correct rule names instead of type: ignore
  • Replace assert statements with proper exceptions in src
  • Fix lint errors and configure ruff for new modules
  • Reorganize tests into domain-specific directories
  • Replace Singularity invocations with native Python calls in stages
  • Move legacy bash scripts to tests/legacy_scripts
  • logging: Consolidate hydromt output suppression
  • stages: Remove duplicate station plotting from sfincs/schism stages
  • sfincs: Replace Singularity container with native binary execution
  • Fix lint errors from pre-commit hooks
  • Apply ssort reordering and ruff formatting
  • qgis-plugin: Extract helpers from _on_union_divides
  • Fix typos
  • Rewrite NOAA station matching with spatial KDTree lookup
  • Rewrite observation point snapping for quadtree grids
  • Rename topobathy modules and standardize dataset source names
  • Replace per-module loggers with shared logger
  • Move SFINCS observation points from run to create workflow
  • Replace rioxarray with gdalwarp for NOAA DEM and topobathy clipping
  • Code quality improvements and performance fixes

Fixed#

  • stages: Apply runtime_env in regrid forcing and predict_tide
  • schism: Chain ring falls back to concat on endpoint mismatch
  • Tighten correctness checks across SCHISM and data layers
  • config: Require explicit prebuilt_dir / geogrid_file paths
  • qgis: Fsync mesh cache and surface MDAL load diagnostics
  • qgis: Cache mesh 2DM/DAT under QGIS profile, not /tmp
  • Pin ffmpeg to GPL build with libx264 for h264 encoding
  • Address Copilot review feedback on observations and plotting
  • Address second round of PR review comments
  • Update stale import paths in docs for mkdocs build
  • Use hgrid.ll for geodesic area computation on projected meshes
  • Address PR review comments
  • Validate schism_exe, use exe name in substep, scope nb-clean
  • Pass subprocess env to MPI detection and apply runtime_env consistently
  • Scope MPI detection to subprocess env and harden EFA probe
  • Address PR review comments
  • Restore isinstance guards for runtime safety
  • Resolve remaining pyright errors across codebase
  • Resolve pyright errors in regridding, stages, and floodmap
  • Add type stubs and suppress third-party pyright noise
  • Address CI failure and review feedback
  • Address PR review comments
  • Assorted source fixes for demo workflow
  • Address PR review comments
  • Scope data catalog globs to exact simulation months
  • ci: Pin mkdocs-jupyter\<0.26 to fix missing CSS template
  • ci: Set JUPYTER_PLATFORM_DIRS=1 for mkdocs builds
  • Handle empty staout and non-fatal QUICKSEARCH errors
  • Clean all generated files before fresh SCHISM workflow runs
  • Clean stale sflux files before regeneration
  • Use CONSERVE regrid method for Grid-to-Mesh(ELEMENT) regridding
  • tests: Enlarge synthetic ESMF grids to avoid BILINEAR regrid failures
  • ci: Exclude regridding tests from CI catch-all test environments
  • tests: Skip ESMF regridding tests on platforms where rc=509
  • Stage remaining changes and add missing type annotations
  • typecheck: Resolve all ty type errors
  • Improve SFINCS streamflow, floodmap, raster, and data catalog
  • Address PR review comments
  • typecheck: Update ty environment python path
  • pixi: Add sfincs activation script to dev environment
  • sfincs: Detect stale Makefile prefix and reconfigure before build
  • Address PR review comments
  • docs: Exclude downloads dir from mkdocs and disable notebook execution
  • typecheck: Configure ty to resolve imports from pixi environment
  • symlinks: Report pre-existing symlinks instead of showing zero created
  • Address PR review comments
  • floodmap: Correct flatten order and add hydromt output suppression
  • Address PR review comments
  • sfincs: Discharge timeseries, STOFS catalog, and floodmap resolution
  • Address PR review comments
  • sfincs: Replace meteo create/clip with clip-before-reproject
  • notebooks: Address PR review comments on flood map basemaps
  • notebooks: Use contextily basemap in lavaca_cli notebook
  • notebooks: Use contextily basemap in lavaca_api notebook
  • deps: Add contextily to plot dependencies
  • Address PR review comments on flood map stage
  • Use MPLBACKEND env var instead of matplotlib.use in conftest
  • Resolve remaining type errors in hydromt compat and gdal helpers
  • Set matplotlib Agg backend in conftest to prevent test hangs
  • Set matplotlib Agg backend only outside Jupyter kernels
  • qgis-plugin: Address PR review comments
  • tests: Update texas.zip path and mock NOAA station coordinates
  • Use geopandas to read zone polygons in compute_aoi_coverage
  • Suppress hydromt-sfincs stdout in both terminal and Jupyter
  • Harden SFINCS init and plot stages
  • Improve GDAL coverage computation and resolve lint
  • docs: Resolve LICENSE rendering and add manual version deploy
  • docs: Resolve LICENSE rendering and add manual version deploy
  • Address PR review comments for SFINCS creation workflow
  • Remove duplicate [0.2.0] section from CHANGELOG auto-merge

New Contributors#

[3.1.1.0.0] - 2026-02-26#

Added#

  • Per-stage completion tracking in submit path
  • For schism fall back to user from env when slurm.user is not specified
  • Add a new config for passing forcing vdatum adjustment (breaking)
  • Add quiet flag and log output to mark_stage_completed
  • Add support for tpxo for sfincs
  • Patch hydromt-sfincs to use chunked writing in the write step and reducing memory footprint
  • Add the missing divider in the log message after slurm job steps
  • Make sfincs datum adjusment configurable since navd88 conversion is difficult to automate.
  • Filter stations without obs/sim data and adjust the plot setting for better plots.
  • Filter stations without obs/sim data and adjust the plot setting for better plots.
  • Add a new stage for adding stations to schism and comparison with noaa gages
  • Add back support for wind and pressure for sfincs
  • Add a plotting stage to sfincs
  • Add observation points from noaa coops
  • Make model field required in YAML config and add it to schism init template
  • Refactor the sfincs runner to integrate with the existing codebase. (breaking)
  • Use a custom runner for running sfincs for better integration with the existing codebase.
  • Move the workflow and time utilities to the main utils module. (breaking)
  • Make the output arg of the init subcommand mandatory. (breaking)
  • Read the username from the env and use that by default.
  • sfincs: Integrate NOAA DEM fetch stage into creation workflow
  • noaa-dem: Add NOAA DEM auto-discovery and download utility
  • sfincs: Support quadtree grids, obs snapping, and inp overrides
  • cli: Add create and prepare-topobathy subcommands
  • Add SFINCS model creation workflow from AOI polygon
  • Per-stage completion tracking in submit path
  • For schism fall back to user from env when slurm.user is not specified
  • Add a new config for passing forcing vdatum adjustment (breaking)
  • Add quiet flag and log output to mark_stage_completed
  • Add support for tpxo for sfincs
  • Patch hydromt-sfincs to use chunked writing in the write step and reducing memory footprint
  • Add the missing divider in the log message after slurm job steps
  • Make sfincs datum adjusment configurable since navd88 conversion is difficult to automate.
  • Filter stations without obs/sim data and adjust the plot setting for better plots.
  • Filter stations without obs/sim data and adjust the plot setting for better plots.
  • Add a new stage for adding stations to schism and comparison with noaa gages
  • Add back support for wind and pressure for sfincs
  • Add a plotting stage to sfincs
  • Add observation points from noaa coops
  • Make model field required in YAML config and add it to schism init template
  • Refactor the sfincs runner to integrate with the existing codebase. (breaking)
  • Use a custom runner for running sfincs for better integration with the existing codebase.
  • Move the workflow and time utilities to the main utils module. (breaking)
  • Make the output arg of the init subcommand mandatory. (breaking)
  • Read the username from the env and use that by default.

Changed#

  • Remove duplicate domain mappings in runner.py
  • Move singularity_image to SchismModelConfig, make sif_path required, and make slurm.user optional (breaking)
  • Fix meteo grid inflation and forcing pipeline, cutting runtime from 15h+ to \<15min
  • Use apply_all_patches() for hydromt compatibility patches
  • Derive DownloadStage description dynamically from config
  • Add logging, improve docs, and add apply_all_patches helper
  • Deduplicate SFINCS stages and fix OOM forcing write
  • Include stages that are submitted via slurm jobs in the log
  • Make submit and run identical so --start-from/--stop-after gets supported by submit.
  • Replace SCHISM-centric config with polymorphic ModelConfig ABC (breaking)
  • Reformat GitHub templates and project metadata files
  • sfincs: Inline obs-snapping thresholds, clean up imports
  • Add 2-space indentation to workflow log messages
  • Remove submit execution path and SlurmConfig
  • Remove duplicate domain mappings in runner.py
  • Move singularity_image to SchismModelConfig, make sif_path required, and make slurm.user optional (breaking)
  • Fix meteo grid inflation and forcing pipeline, cutting runtime from 15h+ to \<15min
  • Use apply_all_patches() for hydromt compatibility patches
  • Derive DownloadStage description dynamically from config
  • Add logging, improve docs, and add apply_all_patches helper
  • Deduplicate SFINCS stages and fix OOM forcing write
  • Include stages that are submitted via slurm jobs in the log
  • Make submit and run identical so --start-from/--stop-after gets supported by submit.
  • Replace SCHISM-centric config with polymorphic ModelConfig ABC (breaking)

Fixed#

  • Address mkdocs warnings
  • Address issues raised by PR reviewer
  • Replace fragile conda hook/activate with direct PATH exports in submit script
  • Add the missing env vars to the submit path and remove dead exports
  • Add conda related paths to the run workflow
  • Export SCHISM_BEGIN_DATE and SCHISM_END_DATE in submit path
  • Truncate discharge arrays to match precip timesteps in merge_source_sink
  • Copy setup_tpxo.txt and Model_tpxo10_atlas from $SCRIPTS_DIR
  • Export date-component env vars in submit path header
  • Add set -e to all bash scripts to propagate errors
  • Export COASTAL_SCRIPTS_DIR and related vars in submit path
  • Source inner scripts from $SCRIPTS_DIR instead of ./
  • Correct shebangs in pre/post_regrid_stofs.bash
  • Compute LENGTH_HRS directly instead of parsing container stdout
  • Use srun instead of mpiexec for MPI stages inside SLURM allocations
  • Avoid pipe deadlock in container commands by draining output via Popen
  • Use NSCRIBES from env with fallback instead of hardcoding
  • Add missing sub-hourly CHRTOUT symlinks for hawaii in last timestep
  • Use numeric comparison (-gt) instead of string comparison (>) for LENGTH_HRS
  • Use integer division for netCDF array index in FECPP app
  • Correct malformed shebangs in forcing bash scripts
  • Add missing $ in ${PDY} variable expansion for log filename
  • Use $COASTAL_DOMAIN instead of hardcoded prvi in TPXO input path
  • Add the mpi/fabric tuning parameters to run
  • Suppress all esmf logs except for errors
  • Set HDF5_USE_FILE_LOCKING to avoid netcdf write issue on nsf mounted locations
  • Add the missing mpi_tasks for the run workflow for schism
  • Shift the start date for hawaii by 1d to avoid the missing file
  • Use the correct wl adjustment obtained from noaa vdatum
  • Get user from env when not provided in config
  • Call end_workflow before returning early in no-wait mode
  • Call expanduser() before resolve() on all path config fields
  • Nwm_retro need to use the same preprocessor as nwm_ana
  • Explicitly set the boundary format to the new nc
  • Explicitly set the boundary format to the new nc
  • Explicitly set the boundary format to the new nc
  • Address the time pasing issue for tpxo
  • Use the correct path to tpxo data for sfincs since it runs the data processing on login node
  • Use the correct package name for click
  • Add a preprocessor to avoid the regular grid issue
  • Use 4326 for stofs data and drop adcirc related vars
  • Replace the code object so pydantic picks it up
  • Monkey patch hydromt's _serialize_crs for cases where crs is proj without authority
  • Add crs info for all supported data sources by @cheginit
  • Add the missing cd step for submit for sfincs models
  • When submit was used for a sfincs model, the container download step was not run
  • Pass the package name so version is identified correctly
  • For the prvi domain prefer nwm_ana over nwm_retro due to a known schism issue with retro
  • Exclude noaa stations where datum is not available.
  • Add the divider line only in the end_stage.
  • Patch the nspool_sta value to be a multiple 18 for all cases.
  • Use the correct path for hgrid.gr3 when querying noaa gages.
  • Modify the stage ordering so noaa query occurs after hgrid file is available.
  • For nwm_ana use the nwm_retro naing convention to avoid the overwrite issue for multiple days.
  • Let hydromt handle the projection detection
  • Let hydromt handle the projection detection
  • Use the symlink workaround only for nwm_retro.
  • Get the observed data in msl.
  • Use point_zs for comparing water levels.
  • Query coops with msl.
  • Set dev as the default when no release exists.
  • Resolve the relative paths provided in config prior to using them.
  • Fix the order of setting log level to avoid suppressing them.
  • Do not write wind entry into the config if it doesn't exists.
  • Use a more robust approach for determining corrupt download files and redirect all sfincs logs to a file.
  • For large files the default 600s timeout for download is not enough for stofs and a size validation is needed.
  • For now pin pyproject formatter for 2.12 since the new version messes up the pixi blocks.
  • Add a logic for cold-start models to set a ram up time to avoid the boundary issues.
  • Remove the duplicate key.
  • Use soft wrap to avoid the log msg dangling issues.
  • Adjust the start date to 2021 for hawaii since we need sub-hourly data.
  • Use a more robust approach for find the stofs path when an old file still exists.
  • Include the date for stofs in the download path since when the start date is changed using skip would have caused using a stale stofs file.
  • Fix the dates for nwm_ana. There were changes in the file names at certain periods.
  • sfincs: Avoid RuntimeWarning from NaN-to-int cast in face node indexing
  • Rename the data module since data folder is in gitignore
  • noaa-dem: Reduce statement count and branches in noaa_dem.py
  • compat: Patch quadtree subgrid setter and _parse_river_list crash
  • Use non-interactive matplotlib backend in SchismPlotStage
  • Deduplicate observation points by spatial proximity
  • Resolve all ty type-checker diagnostics
  • Address mkdocs warnings
  • Address issues raised by PR reviewer
  • Replace fragile conda hook/activate with direct PATH exports in submit script
  • Add the missing env vars to the submit path and remove dead exports
  • Add conda related paths to the run workflow
  • Export SCHISM_BEGIN_DATE and SCHISM_END_DATE in submit path
  • Truncate discharge arrays to match precip timesteps in merge_source_sink
  • Copy setup_tpxo.txt and Model_tpxo10_atlas from $SCRIPTS_DIR
  • Export date-component env vars in submit path header
  • Add set -e to all bash scripts to propagate errors
  • Export COASTAL_SCRIPTS_DIR and related vars in submit path
  • Source inner scripts from $SCRIPTS_DIR instead of ./
  • Correct shebangs in pre/post_regrid_stofs.bash
  • Compute LENGTH_HRS directly instead of parsing container stdout
  • Use srun instead of mpiexec for MPI stages inside SLURM allocations
  • Avoid pipe deadlock in container commands by draining output via Popen
  • Use NSCRIBES from env with fallback instead of hardcoding
  • Add missing sub-hourly CHRTOUT symlinks for hawaii in last timestep
  • Use numeric comparison (-gt) instead of string comparison (>) for LENGTH_HRS
  • Use integer division for netCDF array index in FECPP app
  • Correct malformed shebangs in forcing bash scripts
  • Add missing $ in ${PDY} variable expansion for log filename
  • Use $COASTAL_DOMAIN instead of hardcoded prvi in TPXO input path
  • Add the mpi/fabric tuning parameters to run
  • Suppress all esmf logs except for errors
  • Set HDF5_USE_FILE_LOCKING to avoid netcdf write issue on nsf mounted locations
  • Add the missing mpi_tasks for the run workflow for schism
  • Shift the start date for hawaii by 1d to avoid the missing file
  • Use the correct wl adjustment obtained from noaa vdatum
  • Get user from env when not provided in config
  • Call end_workflow before returning early in no-wait mode
  • Call expanduser() before resolve() on all path config fields
  • Nwm_retro need to use the same preprocessor as nwm_ana
  • Explicitly set the boundary format to the new nc
  • Explicitly set the boundary format to the new nc
  • Explicitly set the boundary format to the new nc
  • Address the time pasing issue for tpxo
  • Use the correct path to tpxo data for sfincs since it runs the data processing on login node
  • Use the correct package name for click
  • Add a preprocessor to avoid the regular grid issue
  • Use 4326 for stofs data and drop adcirc related vars
  • Replace the code object so pydantic picks it up
  • Monkey patch hydromt's _serialize_crs for cases where crs is proj without authority
  • Add crs info for all supported data sources by @cheginit
  • Add the missing cd step for submit for sfincs models
  • When submit was used for a sfincs model, the container download step was not run
  • Pass the package name so version is identified correctly
  • For the prvi domain prefer nwm_ana over nwm_retro due to a known schism issue with retro
  • Exclude noaa stations where datum is not available.
  • Add the divider line only in the end_stage.
  • Patch the nspool_sta value to be a multiple 18 for all cases.
  • Use the correct path for hgrid.gr3 when querying noaa gages.
  • Modify the stage ordering so noaa query occurs after hgrid file is available.
  • For nwm_ana use the nwm_retro naing convention to avoid the overwrite issue for multiple days.
  • Let hydromt handle the projection detection
  • Let hydromt handle the projection detection
  • Use the symlink workaround only for nwm_retro.
  • Get the observed data in msl.
  • Use point_zs for comparing water levels.
  • Query coops with msl.
  • Set dev as the default when no release exists.
  • Resolve the relative paths provided in config prior to using them.
  • Fix the order of setting log level to avoid suppressing them.
  • Do not write wind entry into the config if it doesn't exists.
  • Use a more robust approach for determining corrupt download files and redirect all sfincs logs to a file.
  • For large files the default 600s timeout for download is not enough for stofs and a size validation is needed.
  • For now pin pyproject formatter for 2.12 since the new version messes up the pixi blocks.
  • Add a logic for cold-start models to set a ram up time to avoid the boundary issues.
  • Remove the duplicate key.
  • Use soft wrap to avoid the log msg dangling issues.
  • Adjust the start date to 2021 for hawaii since we need sub-hourly data.
  • Use a more robust approach for find the stofs path when an old file still exists.
  • Include the date for stofs in the download path since when the start date is changed using skip would have caused using a stale stofs file.
  • Fix the dates for nwm_ana. There were changes in the file names at certain periods.

New Contributors#