roms-tools 2.5.0__py3-none-any.whl → 2.6.1__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.
Files changed (33) hide show
  1. ci/environment-with-xesmf.yml +16 -0
  2. roms_tools/analysis/roms_output.py +521 -187
  3. roms_tools/analysis/utils.py +169 -0
  4. roms_tools/plot.py +351 -214
  5. roms_tools/regrid.py +161 -9
  6. roms_tools/setup/boundary_forcing.py +22 -22
  7. roms_tools/setup/datasets.py +40 -44
  8. roms_tools/setup/grid.py +28 -28
  9. roms_tools/setup/initial_conditions.py +23 -31
  10. roms_tools/setup/nesting.py +3 -3
  11. roms_tools/setup/river_forcing.py +22 -23
  12. roms_tools/setup/surface_forcing.py +14 -13
  13. roms_tools/setup/tides.py +7 -7
  14. roms_tools/setup/topography.py +2 -2
  15. roms_tools/tests/test_analysis/test_roms_output.py +299 -188
  16. roms_tools/tests/test_regrid.py +85 -2
  17. roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/.zmetadata +2 -2
  18. roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/.zmetadata +2 -2
  19. roms_tools/tests/test_setup/test_river_forcing.py +47 -51
  20. roms_tools/tests/test_vertical_coordinate.py +73 -0
  21. roms_tools/utils.py +11 -7
  22. roms_tools/vertical_coordinate.py +7 -0
  23. {roms_tools-2.5.0.dist-info → roms_tools-2.6.1.dist-info}/METADATA +22 -11
  24. {roms_tools-2.5.0.dist-info → roms_tools-2.6.1.dist-info}/RECORD +33 -30
  25. {roms_tools-2.5.0.dist-info → roms_tools-2.6.1.dist-info}/WHEEL +1 -1
  26. /roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/{river_location → river_flux}/.zarray +0 -0
  27. /roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/{river_location → river_flux}/.zattrs +0 -0
  28. /roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/{river_location → river_flux}/0.0 +0 -0
  29. /roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/{river_location → river_flux}/.zarray +0 -0
  30. /roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/{river_location → river_flux}/.zattrs +0 -0
  31. /roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/{river_location → river_flux}/0.0 +0 -0
  32. {roms_tools-2.5.0.dist-info → roms_tools-2.6.1.dist-info/licenses}/LICENSE +0 -0
  33. {roms_tools-2.5.0.dist-info → roms_tools-2.6.1.dist-info}/top_level.txt +0 -0
@@ -236,7 +236,7 @@ class TestRiverForcingGeneral:
236
236
  for name in indices.keys():
237
237
  for (eta_rho, xi_rho) in indices[name]:
238
238
  assert coast[eta_rho, xi_rho]
239
- assert river_forcing.ds["river_location"][eta_rho, xi_rho] > 0
239
+ assert river_forcing.ds["river_flux"][eta_rho, xi_rho] > 0
240
240
 
241
241
  def test_missing_source_name(self, iceland_test_grid):
242
242
  with pytest.raises(ValueError, match="`source` must include a 'name'."):
@@ -394,13 +394,16 @@ class TestRiverForcingGeneral:
394
394
 
395
395
 
396
396
  class TestRiverForcingWithoutPrescribedIndices:
397
+ start_time = datetime(1998, 1, 1)
398
+ end_time = datetime(1998, 3, 1)
399
+
397
400
  def test_logging_message(self, iceland_test_grid, caplog):
398
401
 
399
402
  with caplog.at_level(logging.INFO):
400
403
  RiverForcing(
401
404
  grid=iceland_test_grid,
402
- start_time=datetime(1998, 1, 1),
403
- end_time=datetime(1998, 3, 1),
405
+ start_time=self.start_time,
406
+ end_time=self.end_time,
404
407
  )
405
408
  # Verify the info message in the log
406
409
  assert "No river indices provided." in caplog.text
@@ -427,21 +430,20 @@ class TestRiverForcingWithoutPrescribedIndices:
427
430
  )
428
431
 
429
432
  with pytest.raises(ValueError, match="No relevant rivers found."):
430
- RiverForcing(
431
- grid=grid,
432
- start_time=datetime(1998, 1, 1),
433
- end_time=datetime(1998, 3, 1),
434
- )
433
+ RiverForcing(grid=grid, start_time=self.start_time, end_time=self.end_time)
435
434
 
436
435
 
437
436
  class TestRiverForcingWithPrescribedIndices:
438
- def test_logging_message(self, iceland_test_grid, single_cell_indices, caplog):
437
+ start_time = datetime(1998, 1, 1)
438
+ end_time = datetime(1998, 3, 1)
439
+
440
+ def test_logging_message(self, single_cell_indices, caplog, iceland_test_grid):
439
441
 
440
442
  with caplog.at_level(logging.INFO):
441
443
  RiverForcing(
442
444
  grid=iceland_test_grid,
443
- start_time=datetime(1998, 1, 1),
444
- end_time=datetime(1998, 3, 1),
445
+ start_time=self.start_time,
446
+ end_time=self.end_time,
445
447
  indices=single_cell_indices,
446
448
  )
447
449
  # Verify the info message in the log
@@ -450,16 +452,13 @@ class TestRiverForcingWithPrescribedIndices:
450
452
  @pytest.mark.parametrize(
451
453
  "indices_fixture", ["single_cell_indices", "multi_cell_indices"]
452
454
  )
453
- def test_indices_stay_untouched(self, iceland_test_grid, indices_fixture, request):
455
+ def test_indices_stay_untouched(self, indices_fixture, request, iceland_test_grid):
454
456
  indices = request.getfixturevalue(indices_fixture)
455
457
 
456
- start_time = datetime(1998, 1, 1)
457
- end_time = datetime(1998, 3, 1)
458
-
459
458
  river_forcing = RiverForcing(
460
459
  grid=iceland_test_grid,
461
- start_time=start_time,
462
- end_time=end_time,
460
+ start_time=self.start_time,
461
+ end_time=self.end_time,
463
462
  indices=indices,
464
463
  )
465
464
  river_forcing.original_indices == indices
@@ -476,14 +475,14 @@ class TestRiverForcingWithPrescribedIndices:
476
475
 
477
476
  # check that all values are integers for single cell rivers
478
477
  non_zero_values = river_forcing_with_prescribed_single_cell_indices.ds[
479
- "river_location"
478
+ "river_flux"
480
479
  ]
481
480
  is_integer = non_zero_values == np.floor(non_zero_values)
482
481
  assert (is_integer).all()
483
482
 
484
483
  # check that not all values are integers for multi cell rivers
485
484
  non_zero_values = river_forcing_with_prescribed_multi_cell_indices.ds[
486
- "river_location"
485
+ "river_flux"
487
486
  ]
488
487
  is_integer = non_zero_values == np.floor(non_zero_values)
489
488
  assert not (is_integer).all()
@@ -506,7 +505,7 @@ class TestRiverForcingWithPrescribedIndices:
506
505
  assert river_forcing == river_forcing_with_prescribed_single_cell_indices
507
506
 
508
507
  def test_reproducibility_with_flipped_dictionary_entries(
509
- self, iceland_test_grid, tmp_path
508
+ self, tmp_path, iceland_test_grid
510
509
  ):
511
510
  indices = {
512
511
  "Hvita(Olfusa)": [(8, 6)],
@@ -526,20 +525,17 @@ class TestRiverForcingWithPrescribedIndices:
526
525
  "Bruara": [(8, 6)],
527
526
  }
528
527
 
529
- start_time = datetime(1998, 1, 1)
530
- end_time = datetime(1998, 3, 1)
531
-
532
528
  river_forcing = RiverForcing(
533
529
  grid=iceland_test_grid,
534
- start_time=start_time,
535
- end_time=end_time,
530
+ start_time=self.start_time,
531
+ end_time=self.end_time,
536
532
  indices=indices,
537
533
  )
538
534
 
539
535
  river_forcing_from_flipped_indices = RiverForcing(
540
536
  grid=iceland_test_grid,
541
- start_time=start_time,
542
- end_time=end_time,
537
+ start_time=self.start_time,
538
+ end_time=self.end_time,
543
539
  indices=flipped_indices,
544
540
  )
545
541
 
@@ -568,8 +564,8 @@ class TestRiverForcingWithPrescribedIndices:
568
564
  ):
569
565
  RiverForcing(
570
566
  grid=iceland_test_grid,
571
- start_time=datetime(1998, 1, 1),
572
- end_time=datetime(1998, 3, 1),
567
+ start_time=self.start_time,
568
+ end_time=self.end_time,
573
569
  indices=indices,
574
570
  )
575
571
 
@@ -581,8 +577,8 @@ class TestRiverForcingWithPrescribedIndices:
581
577
  ):
582
578
  RiverForcing(
583
579
  grid=iceland_test_grid,
584
- start_time=datetime(1998, 1, 1),
585
- end_time=datetime(1998, 3, 1),
580
+ start_time=self.start_time,
581
+ end_time=self.end_time,
586
582
  indices=fake_indices,
587
583
  )
588
584
 
@@ -590,8 +586,8 @@ class TestRiverForcingWithPrescribedIndices:
590
586
  with pytest.raises(ValueError, match="`indices` must be a dictionary."):
591
587
  RiverForcing(
592
588
  grid=iceland_test_grid,
593
- start_time=datetime(1998, 1, 1),
594
- end_time=datetime(1998, 3, 1),
589
+ start_time=self.start_time,
590
+ end_time=self.end_time,
595
591
  indices="invalid",
596
592
  )
597
593
 
@@ -602,8 +598,8 @@ class TestRiverForcingWithPrescribedIndices:
602
598
  ):
603
599
  RiverForcing(
604
600
  grid=iceland_test_grid,
605
- start_time=datetime(1998, 1, 1),
606
- end_time=datetime(1998, 3, 1),
601
+ start_time=self.start_time,
602
+ end_time=self.end_time,
607
603
  indices={},
608
604
  )
609
605
 
@@ -612,8 +608,8 @@ class TestRiverForcingWithPrescribedIndices:
612
608
  with pytest.raises(ValueError, match="River name `123` must be a string."):
613
609
  RiverForcing(
614
610
  grid=iceland_test_grid,
615
- start_time=datetime(1998, 1, 1),
616
- end_time=datetime(1998, 3, 1),
611
+ start_time=self.start_time,
612
+ end_time=self.end_time,
617
613
  indices=indices,
618
614
  )
619
615
 
@@ -624,8 +620,8 @@ class TestRiverForcingWithPrescribedIndices:
624
620
  with pytest.raises(ValueError, match="must be a list of tuples."):
625
621
  RiverForcing(
626
622
  grid=iceland_test_grid,
627
- start_time=datetime(1998, 1, 1),
628
- end_time=datetime(1998, 3, 1),
623
+ start_time=self.start_time,
624
+ end_time=self.end_time,
629
625
  indices=indices,
630
626
  )
631
627
 
@@ -636,8 +632,8 @@ class TestRiverForcingWithPrescribedIndices:
636
632
  with pytest.raises(ValueError, match="must be a tuple of length 2"):
637
633
  RiverForcing(
638
634
  grid=iceland_test_grid,
639
- start_time=datetime(1998, 1, 1),
640
- end_time=datetime(1998, 3, 1),
635
+ start_time=self.start_time,
636
+ end_time=self.end_time,
641
637
  indices=indices,
642
638
  )
643
639
 
@@ -648,8 +644,8 @@ class TestRiverForcingWithPrescribedIndices:
648
644
  with pytest.raises(ValueError, match="First element of tuple for river"):
649
645
  RiverForcing(
650
646
  grid=iceland_test_grid,
651
- start_time=datetime(1998, 1, 1),
652
- end_time=datetime(1998, 3, 1),
647
+ start_time=self.start_time,
648
+ end_time=self.end_time,
653
649
  indices=indices,
654
650
  )
655
651
 
@@ -658,8 +654,8 @@ class TestRiverForcingWithPrescribedIndices:
658
654
  with pytest.raises(ValueError, match="Second element of tuple for river"):
659
655
  RiverForcing(
660
656
  grid=iceland_test_grid,
661
- start_time=datetime(1998, 1, 1),
662
- end_time=datetime(1998, 3, 1),
657
+ start_time=self.start_time,
658
+ end_time=self.end_time,
663
659
  indices=indices,
664
660
  )
665
661
 
@@ -668,8 +664,8 @@ class TestRiverForcingWithPrescribedIndices:
668
664
  with pytest.raises(ValueError, match="Value of eta_rho for river"):
669
665
  RiverForcing(
670
666
  grid=iceland_test_grid,
671
- start_time=datetime(1998, 1, 1),
672
- end_time=datetime(1998, 3, 1),
667
+ start_time=self.start_time,
668
+ end_time=self.end_time,
673
669
  indices=indices,
674
670
  )
675
671
 
@@ -678,8 +674,8 @@ class TestRiverForcingWithPrescribedIndices:
678
674
  with pytest.raises(ValueError, match="Value of xi_rho for river"):
679
675
  RiverForcing(
680
676
  grid=iceland_test_grid,
681
- start_time=datetime(1998, 1, 1),
682
- end_time=datetime(1998, 3, 1),
677
+ start_time=self.start_time,
678
+ end_time=self.end_time,
683
679
  indices=indices,
684
680
  )
685
681
 
@@ -688,7 +684,7 @@ class TestRiverForcingWithPrescribedIndices:
688
684
  with pytest.raises(ValueError, match="Duplicate location"):
689
685
  RiverForcing(
690
686
  grid=iceland_test_grid,
691
- start_time=datetime(1998, 1, 1),
692
- end_time=datetime(1998, 3, 1),
687
+ start_time=self.start_time,
688
+ end_time=self.end_time,
693
689
  indices=indices,
694
690
  )
@@ -0,0 +1,73 @@
1
+ import pytest
2
+ import numpy as np
3
+ import xarray as xr
4
+
5
+ from roms_tools.vertical_coordinate import (
6
+ compute_cs,
7
+ sigma_stretch,
8
+ compute_depth,
9
+ compute_depth_coordinates,
10
+ )
11
+
12
+
13
+ def test_compute_cs():
14
+ sigma = np.linspace(-1, 0, 10)
15
+ theta_s, theta_b = 5, 2
16
+ cs = compute_cs(sigma, theta_s, theta_b)
17
+ assert cs.shape == sigma.shape
18
+ assert np.all(cs <= 0) and np.all(cs >= -1)
19
+
20
+ with pytest.raises(ValueError, match="theta_s must be between 0 and 10"):
21
+ compute_cs(sigma, 15, 2)
22
+
23
+ with pytest.raises(ValueError, match="theta_b must be between 0 and 4"):
24
+ compute_cs(sigma, 5, 5)
25
+
26
+
27
+ def test_sigma_stretch():
28
+ theta_s, theta_b, N = 5, 2, 10
29
+ cs, sigma = sigma_stretch(theta_s, theta_b, N, "r")
30
+ assert cs.shape == sigma.shape
31
+ assert isinstance(cs, xr.DataArray)
32
+ assert isinstance(sigma, xr.DataArray)
33
+
34
+ with pytest.raises(
35
+ ValueError,
36
+ match="Type must be either 'w' for vertical velocity points or 'r' for rho-points.",
37
+ ):
38
+ sigma_stretch(theta_s, theta_b, N, "invalid")
39
+
40
+
41
+ def test_compute_depth():
42
+ zeta = xr.DataArray(0.5)
43
+ h = xr.DataArray(10.0)
44
+ hc = 5.0
45
+ cs = xr.DataArray(np.linspace(-1, 0, 10), dims="s_rho")
46
+ sigma = xr.DataArray(np.linspace(-1, 0, 10), dims="s_rho")
47
+
48
+ depth = compute_depth(zeta, h, hc, cs, sigma)
49
+ assert depth.shape == sigma.shape
50
+ assert isinstance(depth, xr.DataArray)
51
+
52
+
53
+ def test_compute_depth_coordinates():
54
+ grid_ds = xr.Dataset(
55
+ {
56
+ "h": xr.DataArray([[10, 20], [30, 40]], dims=("eta_rho", "xi_rho")),
57
+ "Cs_r": xr.DataArray(np.linspace(-1, 0, 10), dims="s_rho"),
58
+ "sigma_r": xr.DataArray(np.linspace(-1, 0, 10), dims="s_rho"),
59
+ "Cs_w": xr.DataArray(np.linspace(-1, 0, 11), dims="s_w"),
60
+ "sigma_w": xr.DataArray(np.linspace(-1, 0, 11), dims="s_w"),
61
+ },
62
+ attrs={"hc": 5.0},
63
+ )
64
+
65
+ depth = compute_depth_coordinates(grid_ds, depth_type="layer", location="rho")
66
+ assert isinstance(depth, xr.DataArray)
67
+ assert "eta_rho" in depth.dims and "xi_rho" in depth.dims
68
+
69
+ with pytest.raises(ValueError, match="Invalid depth_type"):
70
+ compute_depth_coordinates(grid_ds, depth_type="invalid")
71
+
72
+ with pytest.raises(ValueError, match="Invalid location"):
73
+ compute_depth_coordinates(grid_ds, location="invalid")
roms_tools/utils.py CHANGED
@@ -3,6 +3,7 @@ from pathlib import Path
3
3
  import re
4
4
  import glob
5
5
  import logging
6
+ import warnings
6
7
 
7
8
 
8
9
  def _load_data(
@@ -139,13 +140,16 @@ def _load_data(
139
140
  if "time" in dim_names and time_chunking:
140
141
  chunks[dim_names["time"]] = 1
141
142
 
142
- ds = xr.open_mfdataset(
143
- matching_files,
144
- decode_times=decode_times,
145
- chunks=chunks,
146
- **combine_kwargs,
147
- **kwargs,
148
- )
143
+ with warnings.catch_warnings():
144
+ warnings.filterwarnings("ignore", category=UserWarning, module="xarray")
145
+
146
+ ds = xr.open_mfdataset(
147
+ matching_files,
148
+ decode_times=decode_times,
149
+ chunks=chunks,
150
+ **combine_kwargs,
151
+ **kwargs,
152
+ )
149
153
 
150
154
  # Rechunk the dataset along the tidal constituent dimension ("ntides") after loading
151
155
  # because the original dataset does not have a chunk size of 1 along this dimension.
@@ -171,6 +171,12 @@ def compute_depth_coordinates(
171
171
  - Spatial slicing (`eta`, `xi`) is performed before depth computation to optimize efficiency.
172
172
  - Depth calculations rely on the ROMS vertical stretching curves (`Cs`) and sigma-layers.
173
173
  """
174
+ # Validate location
175
+ valid_locations = {"rho", "u", "v"}
176
+ if location not in valid_locations:
177
+ raise ValueError(
178
+ f"Invalid location: {location}. Must be one of {valid_locations}."
179
+ )
174
180
 
175
181
  # Select the appropriate depth computation parameters
176
182
  if depth_type == "layer":
@@ -220,6 +226,7 @@ def compute_depth_coordinates(
220
226
  depth = compute_depth(zeta, h, grid_ds.attrs["hc"], Cs, sigma)
221
227
 
222
228
  # Add metadata
229
+ depth.name = f"{depth_type}_depth_{location}"
223
230
  depth.attrs.update(
224
231
  {"long_name": f"{depth_type} depth at {location}-points", "units": "m"}
225
232
  )
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: roms-tools
3
- Version: 2.5.0
3
+ Version: 2.6.1
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>
6
6
  License: Apache-2
@@ -32,8 +32,11 @@ Requires-Dist: PyYAML
32
32
  Requires-Dist: pyamg
33
33
  Requires-Dist: bottleneck
34
34
  Requires-Dist: regionmask
35
+ Requires-Dist: xgcm
36
+ Requires-Dist: numba
35
37
  Provides-Extra: dask
36
38
  Requires-Dist: dask[diagnostics]; extra == "dask"
39
+ Dynamic: license-file
37
40
 
38
41
  # ROMS-Tools
39
42
  [![Conda version](https://img.shields.io/conda/vn/conda-forge/roms-tools.svg)](https://anaconda.org/conda-forge/roms-tools)
@@ -46,37 +49,45 @@ Requires-Dist: dask[diagnostics]; extra == "dask"
46
49
  > [!Warning]
47
50
  > **This project is still in an early phase of development.**
48
51
  >
49
- > The [python API](https://roms-tools.readthedocs.io/en/latest/api.html) is not yet stable.
52
+ > The [Python API](https://roms-tools.readthedocs.io/en/latest/api.html) is not yet stable.
50
53
  > Therefore whilst you are welcome to try out using the package, we cannot yet guarantee backwards compatibility.
51
54
  > We expect to reach a more stable version in Q1 2025.
52
55
 
53
56
  ## Overview
54
57
 
55
- A suite of Python tools for setting up a [ROMS](https://github.com/CESR-lab/ucla-roms) simulation.
58
+ A suite of Python tools for setting up and analyzing a [UCLA-ROMS](https://github.com/CESR-lab/ucla-roms) simulation.
56
59
 
57
60
  ## Installation
58
61
 
59
- ### Installation from conda forge
62
+ ### ⚡️ **Installation from Conda-Forge**
63
+
64
+ To install `ROMS-Tools` with all dependencies, including `xesmf` and `dask`, use:
60
65
 
61
66
  ```bash
62
67
  conda install -c conda-forge roms-tools
63
68
  ```
64
69
 
65
- This command installs `ROMS-Tools` along with its `dask` dependency.
70
+ > [!Note]
71
+ > Installation from Conda-Forge is the recommended installation method to ensure all features of `ROMS-Tools` are available.
72
+
73
+ ### 📦 **Installation from PyPI (pip)**
66
74
 
67
- ### Installation from pip
75
+ You can also install `ROMS-Tools` from `pip`:
68
76
 
69
77
  ```bash
70
78
  pip install roms-tools
71
79
  ```
72
80
 
73
- If you want to use `ROMS-Tools` together with dask (which we recommend), you can
74
- install `ROMS-Tools` along with the additional dependency via:
81
+ If you want to use `ROMS-Tools` with `dask` (recommended for parallel and out-of-core computation), install it with the additional dependency:
75
82
 
76
83
  ```bash
77
84
  pip install roms-tools[dask]
78
85
  ```
79
86
 
87
+ > [!Note]
88
+ > The PyPI versions of `ROMS-Tools` do not include `xesmf`, so some features will be unavailable.
89
+
90
+
80
91
  ### Installation from GitHub
81
92
 
82
93
  To obtain the latest development version, first clone the source repository:
@@ -89,7 +100,7 @@ cd roms-tools
89
100
  Next, install and activate the following conda environment:
90
101
 
91
102
  ```bash
92
- conda env create -f ci/environment.yml
103
+ conda env create -f ci/environment-with-xesmf.yml
93
104
  conda activate romstools-test
94
105
  ```
95
106
 
@@ -99,7 +110,7 @@ Finally, install `ROMS-Tools` in the same environment:
99
110
  pip install -e .
100
111
  ```
101
112
 
102
- If you want to use `ROMS-Tools` together with dask (which we recommend), you can
113
+ If you want to use `ROMS-Tools` with `dask` (recommended for parallel and out-of-core computation), you can
103
114
  install `ROMS-Tools` along with the additional dependency via:
104
115
 
105
116
  ```bash
@@ -1,27 +1,30 @@
1
+ ci/environment-with-xesmf.yml,sha256=c8x2YFBBpZvy6pnlUMTO1-8myyKsVm0Y-IWPigT3PKo,217
1
2
  ci/environment.yml,sha256=Ehxy6nYiVQXoS7EGlmNm2G0ZPHg6VFBGY1IflApIhIY,207
2
3
  roms_tools/__init__.py,sha256=jRghiteCoPjJvJjkFI36ocGyqzcTN5m-5eCa_DNQ9Dw,988
3
4
  roms_tools/download.py,sha256=W6S_DFVJDXat2w9MfyyHyushrswbpUI2hxegSuua1XE,6248
4
- roms_tools/plot.py,sha256=OPmoqDsl34P0hO-pmlw2Y7oastqhDeSr7LZeTluHBvM,13230
5
- roms_tools/regrid.py,sha256=OBlW-KnQfXmxSZ5MwNoroxU51sI8-3ZRQhEPX3maj1A,5173
6
- roms_tools/utils.py,sha256=rahrge6sA_D9ndvkXV5qU7x8Kj3MxqHT84ZhzjYHSPg,13153
7
- roms_tools/vertical_coordinate.py,sha256=iNYdj7FIuCs867eOraqwbHc4gtSr8bj_-KRt-PyoMZA,6984
8
- roms_tools/analysis/roms_output.py,sha256=ZqET2iUgnYOIGKomJ_aLK8jDaczOek8BE77uMyJePQY,22729
5
+ roms_tools/plot.py,sha256=33ft1wN0kc_vIvyy_sIoY-nc0k4THXWLc_k7wEavNq8,17578
6
+ roms_tools/regrid.py,sha256=av9fROSNxlDeczOB544zUjFRUTiUKO42wbfZ90mpuD0,10476
7
+ roms_tools/utils.py,sha256=eveBkWuDsXNJADFMWFgRMHdbXkZlTyVK9dN2YAnjYJ4,13323
8
+ roms_tools/vertical_coordinate.py,sha256=uIxZl7rwY-fSCqXWhm6TXrOsLK4pMOMXOZB8VuP9xwg,7253
9
+ roms_tools/analysis/roms_output.py,sha256=DUSmT2YRoqd1fowuPnoCxdukuO_NC3ONphMWsu43_nE,36560
10
+ roms_tools/analysis/utils.py,sha256=K1Z1VyZUWKth1GMT8dumE1uUVcxrcO6rAm0Yfh8DtIg,7207
9
11
  roms_tools/setup/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- roms_tools/setup/boundary_forcing.py,sha256=UwtxlSgKDerGiChKQm7-55Ib-bG4VIE2nX3I9ye8O9E,43705
11
- roms_tools/setup/datasets.py,sha256=o727Ck3bQbPeKn4Cr2l_pmDd1FyY8Ht51iuYblb_ILQ,85569
12
+ roms_tools/setup/boundary_forcing.py,sha256=LpNBurvcUhiemmubglI5aEgbOuPpjCDBj3C8XmRV60k,43609
13
+ roms_tools/setup/datasets.py,sha256=WDEkMbLrzmdHxU5G9x_ECJASYVpmPa2i3oXWg9Rvxc4,84822
12
14
  roms_tools/setup/fill.py,sha256=YQes_9uADZ-XZ6dBqXyvG7OAp7UrWhX-p3pR1gD6Od4,11120
13
- roms_tools/setup/grid.py,sha256=Wal6BhmD8uDz89hoK2QdKBbU7KUAhfduq3cDm8HnEFE,50047
14
- roms_tools/setup/initial_conditions.py,sha256=l7GiUYBod55SRjxuF3McqALreTOll6d2H4v3YqjXOy4,36253
15
+ roms_tools/setup/grid.py,sha256=DWNPXoG2D76u6QMjOf_f5byvzGXT8gFOfiantUvnVjg,49408
16
+ roms_tools/setup/initial_conditions.py,sha256=uVLkqpo1l1uw_LNjugypNVX2Tio5Hmi4txJoGC7P8G8,36012
15
17
  roms_tools/setup/mask.py,sha256=IK2SrVnMJwZjE4jNFtzMQhp1c5c8SUO45OIpCIrNSis,3413
16
- roms_tools/setup/nesting.py,sha256=ftpGBQONHWDBnfGpNv-XpeF1RIo0m0ac9qMztAH2lrI,26568
17
- roms_tools/setup/river_forcing.py,sha256=_kJgETgRP10s5xZT-aRPFVzMvjmazkHtLFQu65h5fPs,33135
18
- roms_tools/setup/surface_forcing.py,sha256=xtd5gD5iMChxM1C-RhNbNtqRC-Gv8YmIrNCkkVo-rLU,24075
19
- roms_tools/setup/tides.py,sha256=TAAP48oJ1g25PKsaNFwEIDTkatxLac-QpFyWlxdciRQ,27177
20
- roms_tools/setup/topography.py,sha256=dd3Zp5_1pPcpN1GlYOcJez3ulumrcG4MJTgIg6SnBDI,14114
18
+ roms_tools/setup/nesting.py,sha256=j8l2zVCfhxNNtN4ZiSpipSlPXYmaoZWIPw6zImafsuk,26511
19
+ roms_tools/setup/river_forcing.py,sha256=G-WoajtMloqS9gzt3aERSC8NObvC5ODi8XD_Q0jhYFU,32804
20
+ roms_tools/setup/surface_forcing.py,sha256=HwIiA0qS64gBcq2ktqZx8ZhTIFRjweRZZe3haMTjCOg,23980
21
+ roms_tools/setup/tides.py,sha256=2eFzQMVnlcHsG83AEhTUfGgQbO0CqI_pDb8YeZ5APTU,27088
22
+ roms_tools/setup/topography.py,sha256=s1dSF0ZWCNdrZ25yv-pUcCgufxRmGgy3yr_VhdRM7LU,14126
21
23
  roms_tools/setup/utils.py,sha256=S9_alsNEORLjEA74LVbgaxhWyVKa-PqFSPida9MQNxw,40911
22
24
  roms_tools/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- roms_tools/tests/test_regrid.py,sha256=-hFsULcJOJs90UdHrEcZa455vMZfcmXeFEFt8mnCVyo,1885
24
- roms_tools/tests/test_analysis/test_roms_output.py,sha256=vB4mADDp8pauUFA3pO2PjfuzYyOKx6su269J18xzS-s,15106
25
+ roms_tools/tests/test_regrid.py,sha256=-wzZ31BkUdSn81jq5NF1wnuaBRfd0aiYgQZEv5E_h9w,4682
26
+ roms_tools/tests/test_vertical_coordinate.py,sha256=4D2jruuxBwUYk1fSeaJKICgSjzpixhjd03Y4lyivMkQ,2348
27
+ roms_tools/tests/test_analysis/test_roms_output.py,sha256=EtxS9b5JHoREch99jbhs4QDg_3zmXDmVzXplbVrFocA,18811
25
28
  roms_tools/tests/test_setup/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
29
  roms_tools/tests/test_setup/test_boundary_forcing.py,sha256=gET86PiGnMBejTBe69-inXpaEZL8YH4FMqyT_b8V-Zk,21183
27
30
  roms_tools/tests/test_setup/test_datasets.py,sha256=EInjmCLFNWJoO8nIQJhDtmFmMFmjcrr5L_5vJYm-qno,16435
@@ -29,7 +32,7 @@ roms_tools/tests/test_setup/test_fill.py,sha256=gDHuM58d3ECQE317ZntChYt4hWCfo4eV
29
32
  roms_tools/tests/test_setup/test_grid.py,sha256=e1S8TYt21TVczaEfyeYoAU-qxUhAgiugkHA3EDAGtIQ,14095
30
33
  roms_tools/tests/test_setup/test_initial_conditions.py,sha256=4LiULWmuktHoOty94asiFXgGNysag2okiosxG00om9M,15697
31
34
  roms_tools/tests/test_setup/test_nesting.py,sha256=WUhyP9mlMYwAJQgbgqjEU1zOyb8QD3XMgSZvHR_9LE8,18764
32
- roms_tools/tests/test_setup/test_river_forcing.py,sha256=kkbIeCELfLCjvx2xT5_uP_naZq3g0uXbW7PK4shkYQo,24068
35
+ roms_tools/tests/test_setup/test_river_forcing.py,sha256=on3j7pSMESVlFHKXNVBL4H7qqMc_DmMupAtDcUmZ014,23827
33
36
  roms_tools/tests/test_setup/test_surface_forcing.py,sha256=uZAZLbX6zK_e5CYOVZvZLp_i28A1o372naeaOeF83vE,27626
34
37
  roms_tools/tests/test_setup/test_tides.py,sha256=ACFXytda3Am984QMKGxtML00KPX1LvLWlSL0FpZTqyc,8085
35
38
  roms_tools/tests/test_setup/test_topography.py,sha256=EAF-zCHfo6XnXQfBTrSZLuZDVzegWHHlrf9oBmvY0hM,4963
@@ -946,16 +949,16 @@ roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatolo
946
949
  roms_tools/tests/test_setup/test_data/initial_conditions_with_bgc_from_climatology.zarr/zooC/0.0.0.0,sha256=t8ItMb1eQSD9ZijnctYDpcZSvDigD2-5YYGHMEMmnHM,194
947
950
  roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/.zattrs,sha256=RBNvo1WzZ4oRRq0W9-hknpT7T8If536DEMBg9hyq_4o,2
948
951
  roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/.zgroup,sha256=I4N0bme0vMJ2Kz8QDwbD-i1fFJq1qOXaXTNSFGSgGVk,24
949
- roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/.zmetadata,sha256=f-y-IgLl25pRtOCGZI_F7Sol9wUwZiI7iXGohzo9whs,6141
952
+ roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/.zmetadata,sha256=yUONMD7prhzTzs4Haer6nX06txMntOJilUf6iaBMEJU,6133
950
953
  roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/abs_time/.zarray,sha256=AVrYaEeCVeJWUi2FbvisrHwjFyifr4Vt3Yag7Q-n33g,312
951
954
  roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/abs_time/.zattrs,sha256=0hG3RGr8ZCkuViKEvgrkYvnehkAk3wndb4vesT1jYeI,177
952
955
  roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/abs_time/0,sha256=PvO30V_gimagXglEZjQSDgwcOrEIoWmt9JQbY4toiic,48
953
956
  roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/nriver/.zarray,sha256=zti2U0p_i_zbPjPqTErqhxNnmnUtoQPZ_4r1-9yDH7Y,312
954
957
  roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/nriver/.zattrs,sha256=Ng-_DbPNix2DMxTo-GGKyyBnH6mo3teb2SuqtQWmokE,109
955
958
  roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/nriver/0,sha256=irfTfL897AhvCrDL98Vo7ZX6zJZhKFiktdZNWOdDlSU,64
956
- roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/river_location/.zarray,sha256=jYVuViCHVLNS6VB-K_4O32zkhyPcFnoUdLM8pA1nGXk,339
957
- roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/river_location/.zattrs,sha256=Ulaw9zPnPcNer1cdhavwQtQ_tUPPTDzTrQGcHP8u9y4,149
958
- roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/river_location/0.0,sha256=_gdp3GhMsDlFGIuL7bmmlXcm1aD6AFF1fAmIjanpwWI,196
959
+ roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/river_flux/.zarray,sha256=jYVuViCHVLNS6VB-K_4O32zkhyPcFnoUdLM8pA1nGXk,339
960
+ roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/river_flux/.zattrs,sha256=Ulaw9zPnPcNer1cdhavwQtQ_tUPPTDzTrQGcHP8u9y4,149
961
+ roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/river_flux/0.0,sha256=_gdp3GhMsDlFGIuL7bmmlXcm1aD6AFF1fAmIjanpwWI,196
959
962
  roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/river_name/.zarray,sha256=IiztAgS5VBT0bsRnDObags8I7F_tyQbMajEszHXfHb8,364
960
963
  roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/river_name/.zattrs,sha256=EPrut8rW6fC_MGEIOeqFacMyRlxf36MZsFCgP-nZ9d4,84
961
964
  roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/river_name/0,sha256=fuD1GoUrOX7tb_9WSj42rwDVUExgniEIJ9XrblUos0E,95
@@ -973,7 +976,7 @@ roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/tracer_n
973
976
  roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/tracer_name/0,sha256=m5RTy6Ka6ScsKdL_pma6qpevroqCf8LJzuYXCFl9Mds,48
974
977
  roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/.zattrs,sha256=jFoQJqWC46fw5uLFNg8B7WYcGSGnc9XJAWTk3ZKejOY,29
975
978
  roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/.zgroup,sha256=I4N0bme0vMJ2Kz8QDwbD-i1fFJq1qOXaXTNSFGSgGVk,24
976
- roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/.zmetadata,sha256=FZTi-ZnRzmPH_XNilKJIiDIbJ9clP29eBHwKFgMxiEY,6901
979
+ roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/.zmetadata,sha256=zKm4eTj9Anuc0qm_Ip8PXeBofwHA5cnl9J1CQyVlT7Q,6893
977
980
  roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/abs_time/.zarray,sha256=bRSAng1vaRGTtFKNWhv1GcxwVKYhRsJnjbtncEbdWNA,314
978
981
  roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/abs_time/.zattrs,sha256=gDDHVjAFysUhH72DUxR7UwPLMOXFxalOA1fCWa6ImCQ,177
979
982
  roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/abs_time/0,sha256=SZIHK8deA_aE9wtgz1iLQ8ybjbVQK4Ym1FEsVryztu0,112
@@ -983,9 +986,9 @@ roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/month/0,sha256
983
986
  roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/nriver/.zarray,sha256=zti2U0p_i_zbPjPqTErqhxNnmnUtoQPZ_4r1-9yDH7Y,312
984
987
  roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/nriver/.zattrs,sha256=Ng-_DbPNix2DMxTo-GGKyyBnH6mo3teb2SuqtQWmokE,109
985
988
  roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/nriver/0,sha256=irfTfL897AhvCrDL98Vo7ZX6zJZhKFiktdZNWOdDlSU,64
986
- roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/river_location/.zarray,sha256=jYVuViCHVLNS6VB-K_4O32zkhyPcFnoUdLM8pA1nGXk,339
987
- roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/river_location/.zattrs,sha256=Ulaw9zPnPcNer1cdhavwQtQ_tUPPTDzTrQGcHP8u9y4,149
988
- roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/river_location/0.0,sha256=_gdp3GhMsDlFGIuL7bmmlXcm1aD6AFF1fAmIjanpwWI,196
989
+ roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/river_flux/.zarray,sha256=jYVuViCHVLNS6VB-K_4O32zkhyPcFnoUdLM8pA1nGXk,339
990
+ roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/river_flux/.zattrs,sha256=Ulaw9zPnPcNer1cdhavwQtQ_tUPPTDzTrQGcHP8u9y4,149
991
+ roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/river_flux/0.0,sha256=_gdp3GhMsDlFGIuL7bmmlXcm1aD6AFF1fAmIjanpwWI,196
989
992
  roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/river_name/.zarray,sha256=IiztAgS5VBT0bsRnDObags8I7F_tyQbMajEszHXfHb8,364
990
993
  roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/river_name/.zattrs,sha256=EPrut8rW6fC_MGEIOeqFacMyRlxf36MZsFCgP-nZ9d4,84
991
994
  roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/river_name/0,sha256=fuD1GoUrOX7tb_9WSj42rwDVUExgniEIJ9XrblUos0E,95
@@ -1063,8 +1066,8 @@ roms_tools/tests/test_setup/test_data/tidal_forcing.zarr/v_Re/.zattrs,sha256=2z7
1063
1066
  roms_tools/tests/test_setup/test_data/tidal_forcing.zarr/v_Re/0.0.0,sha256=33Gl8otBmgqVarmAnZuEqTYS2_hVJUJh-iN1HzvaDuo,96
1064
1067
  roms_tools/tests/test_tiling/test_partition.py,sha256=b6EepZndVDv1B6Qt5_MbDfrFF2LtR0BF7i1t30xHEvA,7977
1065
1068
  roms_tools/tiling/partition.py,sha256=ZxDNGIKXZf_7eEzw9cxGP2XR_WBhZ4WCeIMl7_IdskA,12302
1066
- roms_tools-2.5.0.dist-info/LICENSE,sha256=yiff76E4xRioW2bHhlPpyYpstmePQBx2bF8HhgQhSsg,11318
1067
- roms_tools-2.5.0.dist-info/METADATA,sha256=Ob7eifjJJFHDeaNbl52ARWLzMPP7yEZFabCVC_PEc_o,4244
1068
- roms_tools-2.5.0.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
1069
- roms_tools-2.5.0.dist-info/top_level.txt,sha256=aAf4T4nYQSkay5iKJ9kmTjlDgd4ETdp9OSlB4sJdt8Y,19
1070
- roms_tools-2.5.0.dist-info/RECORD,,
1069
+ roms_tools-2.6.1.dist-info/licenses/LICENSE,sha256=yiff76E4xRioW2bHhlPpyYpstmePQBx2bF8HhgQhSsg,11318
1070
+ roms_tools-2.6.1.dist-info/METADATA,sha256=-nmxtLvdMwgledQl2Fuf1ir4Se9NsYEi5wTWx8rMQGo,4698
1071
+ roms_tools-2.6.1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
1072
+ roms_tools-2.6.1.dist-info/top_level.txt,sha256=aAf4T4nYQSkay5iKJ9kmTjlDgd4ETdp9OSlB4sJdt8Y,19
1073
+ roms_tools-2.6.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.2)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5