Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
3ee3c7b
Restore support for older-format NetCDF forcings files that have Time…
PhilMiller Dec 26, 2025
407ed3e
Clean up comments and formatting
PhilMiller Dec 26, 2025
e90c79c
Handle more units, with and without a specified reference epoch
PhilMiller Dec 26, 2025
3002d54
Handle different orderings of variable dimensions
PhilMiller Dec 26, 2025
9f61af0
Flesh out API for state saving and restoring, with adjusted use in Bm…
PhilMiller Nov 25, 2025
bb6011d
WIP Wiring all the pieces together
PhilMiller Nov 26, 2025
1f8001b
Add logic and structures for parsing state saving configuration from …
PhilMiller Dec 9, 2025
6b77086
CMakeLists.txt: Remove commented out bits
PhilMiller Dec 10, 2025
d97e4a7
Add File_Per_Unit state saving mechanism
PhilMiller Dec 16, 2025
99803e0
State saving for multi-BMI
idtodd Jan 16, 2026
27256aa
Cold start config structure
idtodd Jan 19, 2026
3588beb
Cold start loading
idtodd Jan 20, 2026
e27f10e
Fix config JSON array parsing
idtodd Jan 20, 2026
d37625e
Less restrictive start and end of run save state
idtodd Jan 21, 2026
96d20d3
Use parent classes for start and end of run states
idtodd Jan 21, 2026
1d7d0b7
Dynamically sized set value option for python BMI adapter
idtodd Jan 27, 2026
200c2b6
Add output suppression flag for UEB
idtodd Jan 30, 2026
a9fb47b
update t-route submodule ref for named logger
cmaynard-ngwpc Jan 5, 2026
fb23619
Dynamic Forcing Engine CAT-ID Data Type (NGWPC-9255) (#109)
idtodd Jan 6, 2026
c9ee3f4
Docker updates for python ewts packages
cmaynard-ngwpc Jan 8, 2026
b732ae6
Update lstm and t-route submodules for ewts package
cmaynard-ngwpc Jan 8, 2026
098c956
update cicd file to use new branches for releases
miguelp1986 Jan 12, 2026
f0add01
Update submod ref for SMP
idtodd Jan 20, 2026
f4fcc78
Fix use-after-free error
idtodd Dec 8, 2025
193c876
Remove explicit interpreter release
idtodd Dec 8, 2025
03fab9e
Ensure bmi_model has not been destroyed
idtodd Dec 8, 2025
b597be4
Remove null check since that should be an error state if null
idtodd Dec 11, 2025
f01bf47
Finalize forcing engine providers on instances clear
idtodd Dec 19, 2025
dda7b63
Release BMI reference
idtodd Dec 22, 2025
8246276
Revert "Release BMI reference"
cmaynard-ngwpc Jan 21, 2026
155712a
Revert "Finalize forcing engine providers on instances clear"
cmaynard-ngwpc Jan 21, 2026
8a9b863
Revert "Remove null check since that should be an error state if null"
cmaynard-ngwpc Jan 21, 2026
fb86c40
Revert "Ensure bmi_model has not been destroyed"
cmaynard-ngwpc Jan 21, 2026
cd5a61b
Revert "Remove explicit interpreter release"
cmaynard-ngwpc Jan 21, 2026
05df353
Revert "Fix use-after-free error"
cmaynard-ngwpc Jan 21, 2026
5661740
Fix use-after-free error
idtodd Dec 8, 2025
98e3fb0
Remove explicit interpreter release
idtodd Dec 8, 2025
7a75de6
Ensure bmi_model has not been destroyed
idtodd Dec 8, 2025
8aa2ccd
Remove null check since that should be an error state if null
idtodd Dec 11, 2025
e173a4e
Finalize forcing engine providers on instances clear
idtodd Dec 19, 2025
38a4844
Release BMI reference
idtodd Dec 22, 2025
dcc24cb
Update tear down method name
idtodd Jan 21, 2026
f67e220
Catch csv file errors and log exceptions initializing formulation
cmaynard-ngwpc Dec 4, 2025
f5795bd
Add check for empty CSV forcing file.
cmaynard-ngwpc Dec 4, 2025
e4d8303
Update submodule references for LASAM, SFT, SMP, CFE, LSTM, Snow17, T…
cmaynard-ngwpc Jan 21, 2026
fce6188
Ensure bmi_model has not been destroyed
idtodd Dec 8, 2025
63556dc
Remove null check since that should be an error state if null
idtodd Dec 11, 2025
adba13c
Finalize forcing engine providers on instances clear
idtodd Dec 19, 2025
b744ee1
Ensure BMIs Destroyed Before Calling MPI_Finalize (#123)
idtodd Jan 23, 2026
3fc428f
Ensure data ownership not passed to python
idtodd Jan 30, 2026
a5d2428
T-Route save stating for hot start
idtodd Feb 4, 2026
6e9a5f0
Global source for serialization message names
idtodd Feb 4, 2026
9e8a3ca
Expand applicable types for get value as double
idtodd Feb 4, 2026
92bebce
C++14 consts
idtodd Feb 4, 2026
d05953a
Expand python typing interface
idtodd Feb 5, 2026
6d5ceef
Prevent multiple hot start config definitions
idtodd Feb 5, 2026
bf027f6
Use Boost for serializing Multi-BMI
idtodd Feb 6, 2026
a1614e0
Add GetValuePtrInt for Fortran Adapter
idtodd Feb 12, 2026
8c56622
Fortran state hackery
idtodd Feb 17, 2026
3dff58c
Add variable name
idtodd Feb 17, 2026
57c3822
Update submodules for testing
idtodd Feb 18, 2026
082383d
Remove explicit pip install call for package nextgen_forcings_ewts
mxkpp Jan 25, 2026
eefea2d
Add new Dockerfile arg to specify the full name of the ngen-forcing b…
mxkpp Feb 1, 2026
4cfa923
updates to cicd and dockerfile
miguelp1986 Feb 5, 2026
18e0f2c
updated cicd file
miguelp1986 Feb 5, 2026
f0a392c
Added unit conversion code to ForcingsEngineLumpedDataProvider which …
sivasankkar Feb 4, 2026
65a113b
updated cicd file
miguelp1986 Feb 11, 2026
bdf27f4
updated cicd file
miguelp1986 Feb 11, 2026
1764311
updated cicd file
miguelp1986 Feb 11, 2026
2121a51
updated cicd file
miguelp1986 Feb 11, 2026
c470849
updated cicd file
miguelp1986 Feb 11, 2026
8dae76d
Ignore git info
peterkronenberg-rtx Feb 9, 2026
45eb0f9
Merge remote-tracking branch 'NOAA-OWP/master' into development
idtodd Feb 12, 2026
60f2ebf
Add logging library for access to Logger.hpp
idtodd Feb 12, 2026
ebc42f8
Update Boost version requirement
idtodd Feb 12, 2026
2a439e1
Fix download URL to Boost 1.86.0
idtodd Feb 12, 2026
e2f414c
fixing boost version in code scan
miguelp1986 Feb 18, 2026
f05800c
fixing boost version in code scan
miguelp1986 Feb 18, 2026
9e342ba
fixing boost version in code scan
miguelp1986 Feb 18, 2026
163c12a
cicd updates
miguelp1986 Feb 18, 2026
bf87b7c
cicd updates
miguelp1986 Feb 18, 2026
e8f63bb
Flesh out API for state saving and restoring, with adjusted use in Bm…
PhilMiller Nov 25, 2025
5b335da
Add logic and structures for parsing state saving configuration from …
PhilMiller Dec 9, 2025
db2f432
State saving for multi-BMI
idtodd Jan 16, 2026
005aa3f
Use Boost for serializing Multi-BMI
idtodd Feb 6, 2026
3189c31
Remove duplicate declaration
idtodd Feb 18, 2026
9a0a329
Remove old state calls
idtodd Feb 18, 2026
245c1c0
Remove old state saving definitions
idtodd Feb 18, 2026
ac0cc30
Update submodule references for bug fixes
idtodd Feb 18, 2026
3f1d396
Update submodules for testing
idtodd Feb 18, 2026
7eee79f
Update submodule for snow17 fix
idtodd Feb 19, 2026
a47604a
Update submodels for bug fixes
idtodd Feb 20, 2026
7cad804
Fortran packages report byte size of data
idtodd Feb 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ docker
.gitpod.Dockerfile
.gitpod.yml
sonar-project.properties
*_git_info.json

# exclude artifacts from native build
cmake_build
Expand Down
97 changes: 56 additions & 41 deletions .github/actions/ngen-build/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ inputs:
required: false
description: 'Enable mpi support, only available for Linux runners'
default: 'OFF'
build_extern:
required: false
description: 'Use external dependencies where possible'
default: 'OFF'
outputs:
build-dir:
description: "Directory build was performed in"
Expand Down Expand Up @@ -110,64 +114,56 @@ runs:
id: cache-boost-dep
uses: actions/cache@v4
with:
path: boost_1_79_0
path: boost_1_86_0
key: unix-boost-dep

- name: Get Boost Dependency
if: steps.cache-boost-dep.outputs.cache-hit != 'true'
run: |
curl -L -o boost_1_79_0.tar.bz2 https://sourceforge.net/projects/boost/files/boost/1.79.0/boost_1_79_0.tar.bz2/download
tar xjf boost_1_79_0.tar.bz2
curl -L -o boost_1_86_0.tar.bz2 https://sourceforge.net/projects/boost/files/boost/1.86.0/boost_1_86_0.tar.bz2/download
tar xjf boost_1_86_0.tar.bz2
shell: bash

- name: Set Pip Constraints
run: |
echo "numpy<2.0" > $GITHUB_WORKSPACE/constraints.txt
echo "PIP_CONSTRAINT=$GITHUB_WORKSPACE/constraints.txt" >> $GITHUB_ENV
echo "UV_CONSTRAINT=$GITHUB_WORKSPACE/constraints.txt" >> $GITHUB_ENV
shell: bash

- name: Cache Python Dependencies
id: cache-py3-dependencies
uses: actions/cache@v3
with:
path: .venv
key: ${{ runner.os }}-python-deps
- name: Add uv and Native Python Tooling Translations
if: |
inputs.use_python != 'OFF'
run: |
echo 'ACTIVATE_VENV_IF_USE_PYTHON=source .venv/bin/activate' >> $GITHUB_ENV
if command -v uv &>/dev/null; then
echo 'CREATE_VENV=uv venv .venv' >> $GITHUB_ENV
echo 'PIP_INSTALL=uv pip install' >> $GITHUB_ENV
else
echo 'CREATE_VENV=python3 -m venv .venv' >> $GITHUB_ENV
echo 'PIP_INSTALL=pip install' >> $GITHUB_ENV
fi
shell: bash

- name: Get Numpy Python Dependency
# Tried conditioning the cache/install of python with an extra check:
# inputs.use_python != 'OFF' &&
# but what happens is that a runner not requiring python will create an empty cache
# and future runners will pull that and then fail...
# What we could do is try to create a master `requirements.txt`
# and/or a `test_requirements.txt` file that we can build the hash key from
# and read it from the repo...but we still have to always initialize the cache
# regardless of whether a given runner uses it, to avoid another runner failing to
# find it. Or just initialize this minimum requirement of numpy, and let the venv
# grow based on other runners needs, effectively building the cache with each new addition
if: |
steps.cache-py3-dependencies.outputs.cache-hit != 'true'
inputs.use_python != 'OFF'
run: |
python3 -m venv .venv
. .venv/bin/activate
pip install pip
pip install numpy
$CREATE_VENV
$ACTIVATE_VENV_IF_USE_PYTHON
echo $(which python3)
$PIP_INSTALL pip
$PIP_INSTALL numpy
deactivate
shell: bash

- name: Init Additional Python Dependencies
# Don't condition additonal installs on a cache hit
# What will happen, however, is that the venv will get updated
# and thus the cache will get updated
# so any pip install will find modules already installed...
# if: |
# inputs.additional_python_requirements != '' &&
# steps.cache-py3-dependencies.outputs.cache-hit != 'true'
if: |
inputs.use_python != 'OFF' &&
inputs.additional_python_requirements != ''
run: |
python3 -m venv .venv
. .venv/bin/activate
pip install -r ${{ inputs.additional_python_requirements }}
$ACTIVATE_VENV_IF_USE_PYTHON
$PIP_INSTALL -r ${{ inputs.additional_python_requirements }}
deactivate
shell: bash

Expand All @@ -185,21 +181,40 @@ runs:

- name: Cmake Initialization
id: cmake_init
# NOTE: -DCMAKE_POLICY_VERSION_MINIMUM=3.5 is required to use cmake version 4
# and with older pybind11 versions, the minimum cmake version is set to 3.4
# which causes cmake configuration to fail.
run: |
export BOOST_ROOT="$(pwd)/boost_1_79_0"
export CFLAGS="-fsanitize=address -O1 -g -fno-omit-frame-pointer -Werror"
export CXXFLAGS="-fsanitize=address -O1 -g -fno-omit-frame-pointer -pedantic-errors -Werror -Wpessimizing-move -Wparentheses -Wrange-loop-construct -Wsuggest-override"
. .venv/bin/activate
export BOOST_ROOT="$(pwd)/boost_1_86_0"
export CFLAGS="-fsanitize=address -g -fno-omit-frame-pointer -Werror"
export CXXFLAGS="-fsanitize=address -g -fno-omit-frame-pointer -pedantic-errors -Werror -Wpessimizing-move -Wparentheses -Wrange-loop-construct -Wsuggest-override"
if [ ${{ runner.os }} == 'macOS' ]
then
echo "fun:PyType_FromMetaclass" > /tmp/asan_ignore.txt
export CFLAGS="$CFLAGS -O0 -fsanitize-ignorelist=/tmp/asan_ignore.txt -fno-common"
export CXXFLAGS="$CXXFLAGS -O0 -fsanitize-ignorelist=/tmp/asan_ignore.txt -fno-common"
else
export CFLAGS="$CFLAGS -O1"
export CXXFLAGS="$CXXFLAGS -O1"
fi
# NOTE: this is not defined if inputs.use_python != 'ON'
$ACTIVATE_VENV_IF_USE_PYTHON
[ ! -d "$BOOST_ROOT" ] && echo "Error: no Boost root found at $BOOST_ROOT" && exit 1
echo "Cmake Version:"
which cmake
cmake --version
cmake -B ${{ inputs.build-dir }} \
-DNGEN_WITH_EXTERN_ALL:BOOL=${{ inputs.build_extern }} \
-DNGEN_WITH_BMI_C:BOOL=${{ inputs.bmi_c }} \
-DNGEN_WITH_PYTHON:BOOL=${{ inputs.use_python }} \
-DNGEN_WITH_UDUNITS:BOOL=${{ inputs.use_udunits }} \
-DNGEN_WITH_BMI_FORTRAN:BOOL=${{ inputs.bmi_fortran }} \
-DNGEN_WITH_ROUTING:BOOL=${{ inputs.use_troute }} \
-DNGEN_WITH_NETCDF:BOOL=${{ inputs.use_netcdf }} \
-DNGEN_WITH_SQLITE:BOOL=${{ inputs.use_sqlite }} \
-DNGEN_WITH_MPI:BOOL=${{ inputs.use_mpi }} -S .
-DNGEN_WITH_MPI:BOOL=${{ inputs.use_mpi }} \
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 -S .

echo "build-dir=$(echo ${{ inputs.build-dir }})" >> $GITHUB_OUTPUT
shell: bash

Expand All @@ -209,8 +224,8 @@ runs:
# Build Targets
# Disable leak detection during test enumeration
export ASAN_OPTIONS=detect_leaks=false
# Activate venv so that test discovery run during build works
. .venv/bin/activate
# NOTE: this is not defined if inputs.use_python != 'ON'
$ACTIVATE_VENV_IF_USE_PYTHON
cmake --build ${{ inputs.build-dir }} --target ${{ inputs.targets }} -- -j ${{ inputs.build-cores }}
shell: bash

8 changes: 8 additions & 0 deletions .github/actions/ngen-submod-build/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,14 @@ runs:
- name: Cmake Initialization
id: cmake_init
run: |
if [ ${{ runner.os }} == 'macOS' ]
then
export OPT_LEVEL_FLAG="-O0"
else
export OPT_LEVEL_FLAG="-O1"
fi
echo CFLAGS="-fsanitize=address ${OPT_LEVEL_FLAG:?Optimization flag var not set} -g -fno-omit-frame-pointer -Werror" >> $GITHUB_ENV
echo CXXFLAGS="-fsanitize=address ${OPT_LEVEL_FLAG:?Optimization flag var not set} -g -fno-omit-frame-pointer -pedantic-errors -Werror -Wpessimizing-move -Wparentheses -Wrange-loop-construct -Wsuggest-override" >> $GITHUB_ENV
cmake -B ${{ inputs.mod-dir}}/${{ inputs.build-dir }} -S ${{ inputs.mod-dir }} ${{ inputs.cmake-flags }}
echo "build-dir=$(echo ${{ inputs.mod-dir}}/${{ inputs.build-dir }})" >> $GITHUB_OUTPUT
shell: bash
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/module_integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
# The type of runner that the job will run on
strategy:
matrix:
os: [ubuntu-22.04, macos-12]
os: [ubuntu-22.04, macos-15]
fail-fast: false
runs-on: ${{ matrix.os }}

Expand Down
Loading