Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
24 changes: 20 additions & 4 deletions .github/workflows/unit_tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,18 @@ jobs:
strategy:
matrix:
python-version: ['3.11', '3.12', '3.13']
name: Python ${{ matrix.python-version }}
extra: ['test,zarr']
marker-serial: ['not parallel and not gpu and not pyfms']
marker-parallel: ['parallel and not gpu and not pyfms']
include:
# add pyfms tests for 3.12
- extra: 'test,pyfms'
marker-serial: 'pyfms and not parallel'
marker-parallel: 'pyfms and parallel'
python-version: '3.12'
# don't cancel other jobs if one fails
fail-fast: false
name: Python ${{ matrix.python-version }}${{ contains(matrix.extra, 'pyfms') && ' (pyFMS)' || '' }}
steps:
- name: Checkout repository
uses: actions/checkout@v6
Expand All @@ -32,16 +43,21 @@ jobs:
python-version: ${{ matrix.python-version }}

- name: Install mpi (MPICH flavor)
if: ${{!contains(matrix.extra, 'pyfms')}}
run: pip3 install mpich

- name: Install pyFMS dependencies (includes system MPI)
if: contains(matrix.extra, 'pyfms')
run: sudo apt-get install libopenmpi-dev netcdf-bin libnetcdf-dev libnetcdff-dev nco libyaml-dev diffutils

- name: Install Python packages
run: pip3 install .[test,zarr]
run: pip3 install .[${{matrix.extra}}]

- name: Run serial cpu tests
run: coverage run --rcfile=pyproject.toml -m pytest -m "not parallel and not gpu" tests
run: coverage run --rcfile=pyproject.toml -m pytest -m "${{matrix.marker-serial}}" tests

- name: Run parallel cpu tests
run: mpiexec -np 6 coverage run --rcfile=pyproject.toml -m mpi4py -m pytest -m "parallel and not gpu" tests
run: mpiexec -np 6 coverage run --rcfile=pyproject.toml -m mpi4py -m pytest -m "${{matrix.marker-parallel}}" tests

- name: Output code coverage
run: |
Expand Down
3 changes: 3 additions & 0 deletions docs/docstrings/monitor/diag_manager_monitor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# diag_manager_monitor

::: monitor.diag_manager_monitor
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ nav:
- "subtile_grid_sizer": docstrings/initialization/subtile_grid_sizer.md
- monitor:
- "convert": docstrings/monitor/convert.md
- "diag_manager_monitor": docstrings/monitor/diag_manager_monitor.md
- "netcdf_monitor": docstrings/monitor/netcdf_monitor.md
- "protocol": docstrings/monitor/protocol.md
- "zarr_monitor": docstrings/monitor/zarr_monitor.md
Expand Down
5 changes: 5 additions & 0 deletions ndsl/optional_imports.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ def __call__(self, *args: Any, **kwargs: dict) -> None:
except ModuleNotFoundError as err:
zarr = RaiseWhenAccessed(err)

try:
import pyfms
except ModuleNotFoundError as err:
pyfms = RaiseWhenAccessed(err)

try:
import cupy
except ImportError:
Expand Down
2 changes: 2 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ module = [
markers = [
# tests running on a cpu (e.g. with cupy)
"gpu",
# tests relying on the optional pyFMS dependency
"pyfms",
# tests relying on at least two MPI processes
"parallel",
# tests relying on the optional zarr dependency
Expand Down
Empty file added tests/monitor/__init__.py
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,7 @@
)
from ndsl.config import Backend
from ndsl.initialization import SubtileGridSizer


pyfms = pytest.importorskip("pyfms")
from ndsl.optional_imports import pyfms


# init fms mpi and set up a simple domain
Expand Down Expand Up @@ -52,7 +50,7 @@ def fms_mpp_init():
return domain_id


def _create_input(reduction: str = "none"):
def _create_input(reduction: str = "none") -> None:
diag_config = {
"title": "ndsl_diag_manager_test",
"base_date": "1 1 1 0 0 0",
Expand Down Expand Up @@ -89,9 +87,9 @@ def _create_input(reduction: str = "none"):


# Simple test, uses a lat/lon grid and (1, npes) layout
@pytest.mark.pyfms
@pytest.mark.parallel
def test_dm_monitor():

def test_dm_monitor() -> None:
npes = MPIComm()._comm.Get_size()
if npes % 6 != 0:
raise RuntimeError("this test requires npes to be a multiple of 6 to run")
Expand Down Expand Up @@ -203,7 +201,7 @@ def test_dm_monitor():
pe = MPIComm()._comm.Get_rank() + 1
filename = "diag_manager_cubed_sphere.tile" + str(pe) + ".nc"
assert Path(filename).exists()
ds = xr.open_mfdataset(filename, decode_times=True)
ds = xr.open_dataset(filename, decode_times=True)
assert "var1" in ds
np.testing.assert_array_equal(ds["var1"].shape, (ntimesteps, ny, nx))
assert "var2" in ds
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,10 @@
)
from ndsl.config import Backend
from ndsl.initialization import SubtileGridSizer
from ndsl.optional_imports import pyfms


pyfms = pytest.importorskip("pyfms")


def _create_input(reduction: str = "none"):
def _create_input() -> None:
diag_config = {
"title": "ndsl_diag_manager_test",
"base_date": "2 1 1 1 1 1",
Expand Down Expand Up @@ -63,10 +61,10 @@ def _create_input(reduction: str = "none"):
f.write(text_content)


def test_dm_monitor_single_tile():
@pytest.mark.pyfms
def test_dm_monitor_single_tile() -> None:
# mpi info
npes = MPIComm()._comm.Get_size()
pe = MPIComm()._comm.Get_rank()
# tile parameters for quantities/domains
nx = 8
ny = 8
Expand Down Expand Up @@ -220,7 +218,7 @@ def test_dm_monitor_single_tile():

# check output!
assert Path("diag_manager_single_tile.nc").exists()
ds = xr.open_mfdataset("diag_manager_single_tile.nc", decode_times=True)
ds = xr.open_dataset("diag_manager_single_tile.nc", decode_times=True)
assert "var_2d" in ds
np.testing.assert_array_equal(ds["var_2d"].shape, (ntimesteps, nx, ny))
assert ds["var_2d"].dims == ("time", "y", "x")
Expand Down
File renamed without changes.
File renamed without changes.
Loading