roms-tools 3.1.2__py3-none-any.whl → 3.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- roms_tools/__init__.py +3 -0
- roms_tools/analysis/cdr_analysis.py +203 -0
- roms_tools/analysis/cdr_ensemble.py +198 -0
- roms_tools/analysis/roms_output.py +80 -46
- roms_tools/data/grids/GLORYS_global_grid.nc +0 -0
- roms_tools/download.py +4 -0
- roms_tools/plot.py +113 -51
- roms_tools/setup/boundary_forcing.py +45 -20
- roms_tools/setup/cdr_forcing.py +122 -8
- roms_tools/setup/cdr_release.py +161 -8
- roms_tools/setup/grid.py +150 -141
- roms_tools/setup/initial_conditions.py +113 -48
- roms_tools/setup/{datasets.py → lat_lon_datasets.py} +443 -938
- roms_tools/setup/mask.py +63 -7
- roms_tools/setup/nesting.py +314 -117
- roms_tools/setup/river_datasets.py +527 -0
- roms_tools/setup/river_forcing.py +46 -20
- roms_tools/setup/surface_forcing.py +7 -9
- roms_tools/setup/tides.py +2 -3
- roms_tools/setup/topography.py +8 -10
- roms_tools/setup/utils.py +396 -23
- roms_tools/tests/test_analysis/test_cdr_analysis.py +144 -0
- roms_tools/tests/test_analysis/test_cdr_ensemble.py +202 -0
- roms_tools/tests/test_analysis/test_roms_output.py +61 -3
- roms_tools/tests/test_setup/test_boundary_forcing.py +54 -52
- roms_tools/tests/test_setup/test_cdr_forcing.py +54 -0
- roms_tools/tests/test_setup/test_cdr_release.py +118 -1
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/ALK_ALT_CO2_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/ALK_ALT_CO2_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/ALK_ALT_CO2_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/ALK_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/ALK_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/ALK_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DIC_ALT_CO2_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DIC_ALT_CO2_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DIC_ALT_CO2_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DIC_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DIC_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DIC_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DOC_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DOC_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DOC_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DOCr_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DOCr_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DOCr_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DON_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DON_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DON_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DONr_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DONr_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DONr_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DOP_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DOP_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DOP_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DOPr_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DOPr_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/DOPr_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/Fe_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/Fe_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/Fe_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/Lig_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/Lig_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/Lig_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/NH4_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/NH4_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/NH4_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/NO3_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/NO3_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/NO3_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/O2_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/O2_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/O2_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/PO4_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/PO4_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/PO4_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/SiO3_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/SiO3_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/SiO3_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diatC_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diatC_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diatC_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diatChl_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diatChl_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diatChl_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diatFe_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diatFe_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diatFe_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diatP_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diatP_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diatP_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diatSi_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diatSi_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diatSi_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diazC_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diazC_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diazC_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diazChl_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diazChl_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diazChl_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diazFe_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diazFe_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diazFe_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diazP_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diazP_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/diazP_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/spC_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/spC_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/spC_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/spCaCO3_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/spCaCO3_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/spCaCO3_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/spChl_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/spChl_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/spChl_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/spFe_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/spFe_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/spFe_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/spP_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/spP_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/spP_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/zarr.json +406 -406
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/zooC_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/zooC_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/bgc_boundary_forcing_from_climatology.zarr/zooC_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/salt_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/salt_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/salt_south/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/salt_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/temp_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/temp_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/temp_south/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/temp_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/u_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/u_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/u_south/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/u_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/ubar_east/c/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/ubar_north/c/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/ubar_south/c/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/ubar_west/c/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/v_east/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/v_north/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/v_south/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/v_west/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/vbar_east/c/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/vbar_north/c/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/vbar_south/c/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/vbar_west/c/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/boundary_forcing.zarr/zarr.json +182 -182
- roms_tools/tests/test_setup/test_data/grid.zarr/h/c/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/grid.zarr/zarr.json +191 -191
- roms_tools/tests/test_setup/test_data/grid_that_straddles_dateline.zarr/h/c/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/grid_that_straddles_dateline.zarr/zarr.json +210 -210
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/ALK/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/ALK_ALT_CO2/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/DIC/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/DIC_ALT_CO2/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/DOC/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/DOCr/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/DON/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/DONr/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/DOP/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/DOPr/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/Fe/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/Lig/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/NH4/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/NO3/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/O2/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/PO4/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/SiO3/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/diatC/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/diatChl/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/diatFe/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/diatP/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/diatSi/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/diazC/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/diazChl/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/diazFe/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/diazP/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/salt/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/spC/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/spCaCO3/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/spChl/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/spFe/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/spP/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/temp/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/u/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/ubar/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/v/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/vbar/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/zarr.json +182 -182
- roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/zooC/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_unified_bgc_from_climatology.zarr/salt/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_unified_bgc_from_climatology.zarr/temp/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_unified_bgc_from_climatology.zarr/u/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_unified_bgc_from_climatology.zarr/ubar/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_unified_bgc_from_climatology.zarr/v/c/0/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_unified_bgc_from_climatology.zarr/vbar/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/initial_conditions_with_unified_bgc_from_climatology.zarr/zarr.json +187 -187
- roms_tools/tests/test_setup/test_data/tidal_forcing.zarr/u_Im/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/tidal_forcing.zarr/u_Re/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/tidal_forcing.zarr/v_Im/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/tidal_forcing.zarr/v_Re/c/0/0/0 +0 -0
- roms_tools/tests/test_setup/test_data/tidal_forcing.zarr/zarr.json +66 -66
- roms_tools/tests/test_setup/test_grid.py +236 -115
- roms_tools/tests/test_setup/test_initial_conditions.py +94 -41
- roms_tools/tests/test_setup/{test_datasets.py → test_lat_lon_datasets.py} +409 -100
- roms_tools/tests/test_setup/test_nesting.py +119 -31
- roms_tools/tests/test_setup/test_river_datasets.py +48 -0
- roms_tools/tests/test_setup/test_surface_forcing.py +2 -1
- roms_tools/tests/test_setup/test_utils.py +92 -2
- roms_tools/tests/test_setup/utils.py +71 -0
- roms_tools/tests/test_tiling/test_join.py +241 -0
- roms_tools/tests/test_utils.py +139 -17
- roms_tools/tiling/join.py +189 -0
- roms_tools/utils.py +131 -99
- {roms_tools-3.1.2.dist-info → roms_tools-3.3.0.dist-info}/METADATA +12 -2
- {roms_tools-3.1.2.dist-info → roms_tools-3.3.0.dist-info}/RECORD +221 -211
- {roms_tools-3.1.2.dist-info → roms_tools-3.3.0.dist-info}/WHEEL +0 -0
- {roms_tools-3.1.2.dist-info → roms_tools-3.3.0.dist-info}/licenses/LICENSE +0 -0
- {roms_tools-3.1.2.dist-info → roms_tools-3.3.0.dist-info}/top_level.txt +0 -0
roms_tools/utils.py
CHANGED
|
@@ -3,16 +3,51 @@ import logging
|
|
|
3
3
|
import re
|
|
4
4
|
import textwrap
|
|
5
5
|
import warnings
|
|
6
|
-
from collections.abc import Callable, Iterable
|
|
6
|
+
from collections.abc import Callable, Iterable, Sequence
|
|
7
|
+
from dataclasses import dataclass
|
|
7
8
|
from importlib.util import find_spec
|
|
8
9
|
from pathlib import Path
|
|
10
|
+
from typing import TypeAlias
|
|
9
11
|
|
|
10
12
|
import numpy as np
|
|
11
13
|
import xarray as xr
|
|
12
|
-
from attr import dataclass
|
|
13
14
|
|
|
14
15
|
from roms_tools.constants import R_EARTH
|
|
15
16
|
|
|
17
|
+
FilePaths: TypeAlias = str | Path | list[Path | str]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _path_list_from_input(files: FilePaths) -> list[Path]:
|
|
21
|
+
"""Converts a generic user input to a list of Paths.
|
|
22
|
+
|
|
23
|
+
Takes a list of strings or paths, or wildcard pattern, and
|
|
24
|
+
returns a list of pathlib.Path objects
|
|
25
|
+
|
|
26
|
+
Parameters
|
|
27
|
+
----------
|
|
28
|
+
files: FilePaths
|
|
29
|
+
A list of files (str, Path), single path as a str or Path, or a wildcard string
|
|
30
|
+
|
|
31
|
+
Returns
|
|
32
|
+
-------
|
|
33
|
+
List[Path]
|
|
34
|
+
A list of pathlib.Paths
|
|
35
|
+
"""
|
|
36
|
+
if isinstance(files, str):
|
|
37
|
+
filepaths = sorted(Path(files).parent.glob(Path(files).name))
|
|
38
|
+
if not filepaths:
|
|
39
|
+
raise FileNotFoundError(f"No files matched: {files}")
|
|
40
|
+
elif isinstance(files, Path):
|
|
41
|
+
filepaths = [
|
|
42
|
+
files,
|
|
43
|
+
]
|
|
44
|
+
elif isinstance(files, list):
|
|
45
|
+
filepaths = [Path(f) for f in files]
|
|
46
|
+
else:
|
|
47
|
+
raise TypeError("'files' should be str, Path, or List[Path | str]")
|
|
48
|
+
|
|
49
|
+
return filepaths
|
|
50
|
+
|
|
16
51
|
|
|
17
52
|
@dataclass
|
|
18
53
|
class FileMatchResult:
|
|
@@ -25,56 +60,39 @@ class FileMatchResult:
|
|
|
25
60
|
|
|
26
61
|
|
|
27
62
|
def _get_file_matches(
|
|
28
|
-
filename: str | Path |
|
|
63
|
+
filename: str | Path | Sequence[str | Path],
|
|
29
64
|
) -> FileMatchResult:
|
|
30
65
|
"""Filter the filename using an optional wildcard search in the filename.
|
|
31
66
|
|
|
32
67
|
Parameters
|
|
33
68
|
----------
|
|
34
|
-
filename : str
|
|
69
|
+
filename : str | Path | Sequence[str | Path]
|
|
35
70
|
An item to search for matches.
|
|
36
71
|
"""
|
|
37
72
|
# Precompile the regex for matching wildcard characters
|
|
38
73
|
wildcard_regex = re.compile(r"[\*\?\[\]]")
|
|
39
74
|
|
|
40
|
-
#
|
|
41
|
-
if isinstance(filename, str | Path):
|
|
42
|
-
|
|
43
|
-
elif isinstance(filename,
|
|
44
|
-
|
|
75
|
+
# Normalize input into a list of strings
|
|
76
|
+
if isinstance(filename, (str | Path)):
|
|
77
|
+
filenames: list[str] = [str(filename)]
|
|
78
|
+
elif isinstance(filename, Sequence):
|
|
79
|
+
filenames = [str(f) for f in filename]
|
|
45
80
|
else:
|
|
46
|
-
msg = "filename must be a string, Path, or a
|
|
81
|
+
msg = "filename must be a string, Path, or a sequence of strings/Paths."
|
|
47
82
|
raise ValueError(msg)
|
|
48
83
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
msg = f"No files found matching the pattern '{filename_str}'."
|
|
59
|
-
raise FileNotFoundError(msg)
|
|
60
|
-
else:
|
|
61
|
-
matching_files = [filename_str]
|
|
62
|
-
|
|
63
|
-
# Handle the case when filename is a list
|
|
64
|
-
elif isinstance(filename_str, list):
|
|
65
|
-
# contains_wildcard = any(wildcard_regex.search(f) for f in filename_str)
|
|
66
|
-
if contains_wildcard := any(wildcard_regex.search(f) for f in filename_str):
|
|
67
|
-
matching_files = []
|
|
68
|
-
for f in filename_str:
|
|
69
|
-
files = glob.glob(f)
|
|
70
|
-
if not files:
|
|
71
|
-
msg = f"No files found matching the pattern '{f}'."
|
|
72
|
-
raise FileNotFoundError(msg)
|
|
73
|
-
matching_files.extend(files)
|
|
84
|
+
contains_wildcard = any(wildcard_regex.search(f) for f in filenames)
|
|
85
|
+
matching_files: list[str] = []
|
|
86
|
+
|
|
87
|
+
for f in filenames:
|
|
88
|
+
if wildcard_regex.search(f):
|
|
89
|
+
files = glob.glob(f)
|
|
90
|
+
if not files:
|
|
91
|
+
raise FileNotFoundError(f"No files found matching the pattern '{f}'.")
|
|
92
|
+
matching_files.extend(files)
|
|
74
93
|
else:
|
|
75
|
-
matching_files
|
|
94
|
+
matching_files.append(f)
|
|
76
95
|
|
|
77
|
-
# Sort the matching files
|
|
78
96
|
return FileMatchResult(
|
|
79
97
|
contains_wildcard=contains_wildcard,
|
|
80
98
|
matches=sorted(matching_files),
|
|
@@ -132,11 +150,60 @@ def _get_ds_combine_base_params() -> dict[str, str]:
|
|
|
132
150
|
}
|
|
133
151
|
|
|
134
152
|
|
|
153
|
+
def get_dask_chunks(
|
|
154
|
+
dim_names: dict[str, str], time_chunking: bool = True
|
|
155
|
+
) -> dict[str, int]:
|
|
156
|
+
"""Return the default dask chunks for ROMS datasets.
|
|
157
|
+
|
|
158
|
+
Parameters
|
|
159
|
+
----------
|
|
160
|
+
dim_names : dict[str, str]
|
|
161
|
+
Dictionary specifying the names of dimensions in the dataset.
|
|
162
|
+
- For lat-lon datasets, provide keys "latitude" and "longitude" (and optionally "depth" and "time").
|
|
163
|
+
- For ROMS datasets, the default ROMS dimensions are assumed ("eta_rho", "xi_rho", "s_rho", etc.).
|
|
164
|
+
time_chunking : bool, optional
|
|
165
|
+
Whether to chunk along the time dimension.
|
|
166
|
+
- True: chunk time dimension with size 1 (useful for processing large time-series data with Dask).
|
|
167
|
+
- False: do not explicitly chunk time; Dask will use default auto-chunking.
|
|
168
|
+
Defaults to True.
|
|
169
|
+
|
|
170
|
+
Returns
|
|
171
|
+
-------
|
|
172
|
+
dict[str, int]
|
|
173
|
+
The default dask chunks for ROMS datasets.
|
|
174
|
+
"""
|
|
175
|
+
if "latitude" in dim_names and "longitude" in dim_names:
|
|
176
|
+
# for lat-lon datasets
|
|
177
|
+
chunks = {
|
|
178
|
+
dim_names["latitude"]: -1,
|
|
179
|
+
dim_names["longitude"]: -1,
|
|
180
|
+
}
|
|
181
|
+
else:
|
|
182
|
+
# For ROMS datasets
|
|
183
|
+
chunks = {
|
|
184
|
+
"eta_rho": -1,
|
|
185
|
+
"eta_v": -1,
|
|
186
|
+
"xi_rho": -1,
|
|
187
|
+
"xi_u": -1,
|
|
188
|
+
"s_rho": -1,
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if "depth" in dim_names:
|
|
192
|
+
chunks[dim_names["depth"]] = -1
|
|
193
|
+
if "time" in dim_names and time_chunking:
|
|
194
|
+
chunks[dim_names["time"]] = 1
|
|
195
|
+
if "ntides" in dim_names:
|
|
196
|
+
chunks[dim_names["ntides"]] = 1
|
|
197
|
+
|
|
198
|
+
return chunks
|
|
199
|
+
|
|
200
|
+
|
|
135
201
|
def _load_data_dask(
|
|
136
202
|
filenames: list[str],
|
|
137
203
|
dim_names: dict[str, str],
|
|
138
204
|
time_chunking: bool = True,
|
|
139
205
|
decode_times: bool = True,
|
|
206
|
+
decode_timedelta: bool = True,
|
|
140
207
|
read_zarr: bool = True,
|
|
141
208
|
load_kwargs: dict[str, str] | None = None,
|
|
142
209
|
) -> xr.Dataset:
|
|
@@ -158,6 +225,9 @@ def _load_data_dask(
|
|
|
158
225
|
decode_times: bool, optional
|
|
159
226
|
If True, decode times and timedeltas encoded in the standard NetCDF datetime format into datetime objects. Otherwise, leave them encoded as numbers.
|
|
160
227
|
Defaults to True.
|
|
228
|
+
decode_timedelta: bool, optional
|
|
229
|
+
If True, decode timedeltas encoded in the standard NetCDF datetime format into datetime objects. Otherwise, leave them encoded as numbers.
|
|
230
|
+
Defaults to True.
|
|
161
231
|
read_zarr: bool, optional
|
|
162
232
|
If True, use the zarr engine to read the dataset, and don't use mfdataset.
|
|
163
233
|
Defaults to False.
|
|
@@ -175,28 +245,7 @@ def _load_data_dask(
|
|
|
175
245
|
If a list of files is provided but dim_names["time"] is not available or use_dask=False.
|
|
176
246
|
|
|
177
247
|
"""
|
|
178
|
-
|
|
179
|
-
# for lat-lon datasets
|
|
180
|
-
chunks = {
|
|
181
|
-
dim_names["latitude"]: -1,
|
|
182
|
-
dim_names["longitude"]: -1,
|
|
183
|
-
}
|
|
184
|
-
else:
|
|
185
|
-
# For ROMS datasets
|
|
186
|
-
chunks = {
|
|
187
|
-
"eta_rho": -1,
|
|
188
|
-
"eta_v": -1,
|
|
189
|
-
"xi_rho": -1,
|
|
190
|
-
"xi_u": -1,
|
|
191
|
-
"s_rho": -1,
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
if "depth" in dim_names:
|
|
195
|
-
chunks[dim_names["depth"]] = -1
|
|
196
|
-
if "time" in dim_names and time_chunking:
|
|
197
|
-
chunks[dim_names["time"]] = 1
|
|
198
|
-
if "ntides" in dim_names:
|
|
199
|
-
chunks[dim_names["ntides"]] = 1
|
|
248
|
+
chunks = get_dask_chunks(dim_names, time_chunking)
|
|
200
249
|
|
|
201
250
|
with warnings.catch_warnings():
|
|
202
251
|
warnings.filterwarnings(
|
|
@@ -209,6 +258,7 @@ def _load_data_dask(
|
|
|
209
258
|
return xr.open_zarr(
|
|
210
259
|
filenames[0],
|
|
211
260
|
decode_times=decode_times,
|
|
261
|
+
decode_timedelta=decode_timedelta,
|
|
212
262
|
chunks=chunks,
|
|
213
263
|
consolidated=None,
|
|
214
264
|
storage_options={"token": "anon"},
|
|
@@ -218,7 +268,7 @@ def _load_data_dask(
|
|
|
218
268
|
return xr.open_mfdataset(
|
|
219
269
|
filenames,
|
|
220
270
|
decode_times=decode_times,
|
|
221
|
-
decode_timedelta=
|
|
271
|
+
decode_timedelta=decode_timedelta,
|
|
222
272
|
chunks=chunks,
|
|
223
273
|
**kwargs,
|
|
224
274
|
)
|
|
@@ -237,7 +287,7 @@ def _check_load_data_dask(use_dask: bool) -> None:
|
|
|
237
287
|
RuntimeError
|
|
238
288
|
If dask is requested but not installed.
|
|
239
289
|
"""
|
|
240
|
-
if use_dask and not
|
|
290
|
+
if use_dask and not has_dask():
|
|
241
291
|
msg = (
|
|
242
292
|
"Dask is required but not installed. Install it with:\n"
|
|
243
293
|
" • `pip install roms-tools[dask]` or\n"
|
|
@@ -310,12 +360,13 @@ def _check_load_data_filename(
|
|
|
310
360
|
raise ValueError(msg)
|
|
311
361
|
|
|
312
362
|
|
|
313
|
-
def
|
|
363
|
+
def load_data(
|
|
314
364
|
filename: str | Path | list[str | Path],
|
|
315
|
-
dim_names: dict[str, str],
|
|
316
|
-
use_dask: bool,
|
|
365
|
+
dim_names: dict[str, str] | None = None,
|
|
366
|
+
use_dask: bool = False,
|
|
317
367
|
time_chunking: bool = True,
|
|
318
368
|
decode_times: bool = True,
|
|
369
|
+
decode_timedelta: bool = True,
|
|
319
370
|
force_combine_nested: bool = False,
|
|
320
371
|
read_zarr: bool = False,
|
|
321
372
|
ds_loader_fn: Callable[[], xr.Dataset] | None = None,
|
|
@@ -324,21 +375,24 @@ def _load_data(
|
|
|
324
375
|
|
|
325
376
|
Parameters
|
|
326
377
|
----------
|
|
327
|
-
filename :
|
|
378
|
+
filename : str | Path | list[str | Path]
|
|
328
379
|
The path to the data file(s). Can be a single string (with or without wildcards), a single Path object,
|
|
329
380
|
or a list of strings or Path objects containing multiple files.
|
|
330
|
-
dim_names :
|
|
381
|
+
dim_names : dict[str, str], optional
|
|
331
382
|
Dictionary specifying the names of dimensions in the dataset.
|
|
332
383
|
Required only for lat-lon datasets to map dimension names like "latitude" and "longitude".
|
|
333
384
|
For ROMS datasets, this parameter can be omitted, as default ROMS dimensions ("eta_rho", "xi_rho", "s_rho") are assumed.
|
|
334
|
-
use_dask: bool
|
|
385
|
+
use_dask: bool, optional
|
|
335
386
|
Indicates whether to use dask for chunking. If True, data is loaded with dask; if False, data is loaded eagerly. Defaults to False.
|
|
336
387
|
time_chunking : bool, optional
|
|
337
388
|
If True and `use_dask=True`, the data will be chunked along the time dimension with a chunk size of 1.
|
|
338
389
|
If False, the data will not be chunked explicitly along the time dimension, but will follow the default auto chunking scheme. This option is useful for ROMS restart files.
|
|
339
390
|
Defaults to True.
|
|
340
391
|
decode_times: bool, optional
|
|
341
|
-
If True, decode times
|
|
392
|
+
If True, decode times encoded in the standard NetCDF datetime format into datetime objects. Otherwise, leave them encoded as numbers.
|
|
393
|
+
Defaults to True.
|
|
394
|
+
decode_timedelta: bool, optional
|
|
395
|
+
If True, decode timedeltas encoded in the standard NetCDF datetime format into datetime objects. Otherwise, leave them encoded as numbers.
|
|
342
396
|
Defaults to True.
|
|
343
397
|
force_combine_nested: bool, optional
|
|
344
398
|
If True, forces the use of nested combination (`combine_nested`) regardless of whether wildcards are used.
|
|
@@ -385,6 +439,7 @@ def _load_data(
|
|
|
385
439
|
dim_names,
|
|
386
440
|
time_chunking,
|
|
387
441
|
decode_times,
|
|
442
|
+
decode_timedelta,
|
|
388
443
|
read_zarr,
|
|
389
444
|
load_kwargs,
|
|
390
445
|
)
|
|
@@ -394,7 +449,7 @@ def _load_data(
|
|
|
394
449
|
ds = xr.open_dataset(
|
|
395
450
|
file,
|
|
396
451
|
decode_times=decode_times,
|
|
397
|
-
decode_timedelta=
|
|
452
|
+
decode_timedelta=decode_timedelta,
|
|
398
453
|
chunks=None,
|
|
399
454
|
)
|
|
400
455
|
ds_list.append(ds)
|
|
@@ -629,30 +684,7 @@ def save_datasets(dataset_list, output_filenames, use_dask=False, verbose=True):
|
|
|
629
684
|
return saved_filenames
|
|
630
685
|
|
|
631
686
|
|
|
632
|
-
def
|
|
633
|
-
"""Returns the appropriate Dask chunking dictionary based on grid location.
|
|
634
|
-
|
|
635
|
-
Parameters
|
|
636
|
-
----------
|
|
637
|
-
location : str
|
|
638
|
-
The grid location, one of "rho", "u", or "v".
|
|
639
|
-
chunk_size : int
|
|
640
|
-
The chunk size to apply.
|
|
641
|
-
|
|
642
|
-
Returns
|
|
643
|
-
-------
|
|
644
|
-
dict
|
|
645
|
-
Dictionary specifying the chunking strategy.
|
|
646
|
-
"""
|
|
647
|
-
chunk_mapping = {
|
|
648
|
-
"rho": {"eta_rho": chunk_size, "xi_rho": chunk_size},
|
|
649
|
-
"u": {"eta_rho": chunk_size, "xi_u": chunk_size},
|
|
650
|
-
"v": {"eta_v": chunk_size, "xi_rho": chunk_size},
|
|
651
|
-
}
|
|
652
|
-
return chunk_mapping.get(location, {})
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
def _generate_coordinate_range(min_val: float, max_val: float, resolution: float):
|
|
687
|
+
def generate_coordinate_range(min_val: float, max_val: float, resolution: float):
|
|
656
688
|
"""Generate an array of target coordinates (e.g., latitude or longitude) within a
|
|
657
689
|
specified range, with a resolution that is rounded to the nearest value of the form
|
|
658
690
|
`1/n` (or integer).
|
|
@@ -714,7 +746,7 @@ def _generate_coordinate_range(min_val: float, max_val: float, resolution: float
|
|
|
714
746
|
return target.astype(np.float32)
|
|
715
747
|
|
|
716
748
|
|
|
717
|
-
def
|
|
749
|
+
def generate_focused_coordinate_range(
|
|
718
750
|
center: float,
|
|
719
751
|
sc: float,
|
|
720
752
|
min_val: float,
|
|
@@ -800,7 +832,7 @@ def _generate_focused_coordinate_range(
|
|
|
800
832
|
return centers, faces
|
|
801
833
|
|
|
802
834
|
|
|
803
|
-
def
|
|
835
|
+
def remove_edge_nans(
|
|
804
836
|
field: xr.DataArray, xdim: str, layer_depth: xr.DataArray | None = None
|
|
805
837
|
) -> tuple[xr.DataArray, xr.DataArray | None]:
|
|
806
838
|
"""Remove NaN-only slices at the edges of a specified dimension.
|
|
@@ -876,7 +908,7 @@ def _remove_edge_nans(
|
|
|
876
908
|
return field, layer_depth
|
|
877
909
|
|
|
878
910
|
|
|
879
|
-
def
|
|
911
|
+
def has_dask() -> bool:
|
|
880
912
|
"""Determine if the Dask package is installed.
|
|
881
913
|
|
|
882
914
|
Returns
|
|
@@ -888,7 +920,7 @@ def _has_dask() -> bool:
|
|
|
888
920
|
return find_spec("dask") is not None
|
|
889
921
|
|
|
890
922
|
|
|
891
|
-
def
|
|
923
|
+
def has_gcsfs() -> bool:
|
|
892
924
|
"""Determine if the GCSFS package is installed.
|
|
893
925
|
|
|
894
926
|
Returns
|
|
@@ -900,7 +932,7 @@ def _has_gcsfs() -> bool:
|
|
|
900
932
|
return find_spec("gcsfs") is not None
|
|
901
933
|
|
|
902
934
|
|
|
903
|
-
def
|
|
935
|
+
def has_copernicus() -> bool:
|
|
904
936
|
"""Determine if the Copernicus Marine Toolkit package is installed.
|
|
905
937
|
|
|
906
938
|
Returns
|
|
@@ -976,7 +1008,7 @@ def infer_nominal_horizontal_resolution(
|
|
|
976
1008
|
return float(resolution_in_degrees)
|
|
977
1009
|
|
|
978
1010
|
|
|
979
|
-
def
|
|
1011
|
+
def get_pkg_error_msg(purpose: str, package_name: str, option_name: str) -> str:
|
|
980
1012
|
"""Generate an error message indicating how to install an optional dependency.
|
|
981
1013
|
|
|
982
1014
|
Parameters
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: roms-tools
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.3.0
|
|
4
4
|
Summary: Tools for running and analysing UCLA-ROMS simulations
|
|
5
5
|
Author-email: Nora Loose <nora.loose@gmail.com>, Thomas Nicholas <tom@cworthy.org>, Scott Eilerman <scott.eilerman@cworthy.org>
|
|
6
6
|
License: Apache-2
|
|
@@ -42,15 +42,25 @@ Requires-Dist: dask[diagnostics]; extra == "stream"
|
|
|
42
42
|
Requires-Dist: gcsfs; extra == "stream"
|
|
43
43
|
Requires-Dist: zarr; extra == "stream"
|
|
44
44
|
Requires-Dist: copernicusmarine; extra == "stream"
|
|
45
|
+
Provides-Extra: notebooks
|
|
46
|
+
Requires-Dist: dask[diagnostics]; extra == "notebooks"
|
|
47
|
+
Requires-Dist: gcsfs; extra == "notebooks"
|
|
48
|
+
Requires-Dist: zarr; extra == "notebooks"
|
|
49
|
+
Requires-Dist: copernicusmarine; extra == "notebooks"
|
|
50
|
+
Requires-Dist: gdown; extra == "notebooks"
|
|
51
|
+
Requires-Dist: ipykernel; extra == "notebooks"
|
|
52
|
+
Requires-Dist: jupyter; extra == "notebooks"
|
|
45
53
|
Dynamic: license-file
|
|
46
54
|
|
|
47
55
|
# ROMS-Tools
|
|
56
|
+
|
|
48
57
|
[](https://anaconda.org/conda-forge/roms-tools)
|
|
49
58
|
[](https://pypi.org/project/roms-tools/)
|
|
59
|
+
[](https://github.com/CWorthy-ocean/roms-tools/actions/workflows/tests.yaml?query=branch%3Amain)
|
|
50
60
|
[](https://codecov.io/gh/CWorthy-ocean/roms-tools)
|
|
51
61
|
[](https://roms-tools.readthedocs.io/en/latest/?badge=latest)
|
|
52
|
-

|
|
53
62
|

|
|
63
|
+
[](https://pepy.tech/projects/roms-tools)
|
|
54
64
|
|
|
55
65
|
## Overview
|
|
56
66
|
|