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.
- ci/environment-with-xesmf.yml +16 -0
- roms_tools/analysis/roms_output.py +521 -187
- roms_tools/analysis/utils.py +169 -0
- roms_tools/plot.py +351 -214
- roms_tools/regrid.py +161 -9
- roms_tools/setup/boundary_forcing.py +22 -22
- roms_tools/setup/datasets.py +40 -44
- roms_tools/setup/grid.py +28 -28
- roms_tools/setup/initial_conditions.py +23 -31
- roms_tools/setup/nesting.py +3 -3
- roms_tools/setup/river_forcing.py +22 -23
- roms_tools/setup/surface_forcing.py +14 -13
- roms_tools/setup/tides.py +7 -7
- roms_tools/setup/topography.py +2 -2
- roms_tools/tests/test_analysis/test_roms_output.py +299 -188
- roms_tools/tests/test_regrid.py +85 -2
- roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/.zmetadata +2 -2
- roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/.zmetadata +2 -2
- roms_tools/tests/test_setup/test_river_forcing.py +47 -51
- roms_tools/tests/test_vertical_coordinate.py +73 -0
- roms_tools/utils.py +11 -7
- roms_tools/vertical_coordinate.py +7 -0
- {roms_tools-2.5.0.dist-info → roms_tools-2.6.1.dist-info}/METADATA +22 -11
- {roms_tools-2.5.0.dist-info → roms_tools-2.6.1.dist-info}/RECORD +33 -30
- {roms_tools-2.5.0.dist-info → roms_tools-2.6.1.dist-info}/WHEEL +1 -1
- /roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/{river_location → river_flux}/.zarray +0 -0
- /roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/{river_location → river_flux}/.zattrs +0 -0
- /roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/{river_location → river_flux}/0.0 +0 -0
- /roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/{river_location → river_flux}/.zarray +0 -0
- /roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/{river_location → river_flux}/.zattrs +0 -0
- /roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/{river_location → river_flux}/0.0 +0 -0
- {roms_tools-2.5.0.dist-info → roms_tools-2.6.1.dist-info/licenses}/LICENSE +0 -0
- {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["
|
|
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=
|
|
403
|
-
end_time=
|
|
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
|
-
|
|
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=
|
|
444
|
-
end_time=
|
|
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,
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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,
|
|
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=
|
|
572
|
-
end_time=
|
|
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=
|
|
585
|
-
end_time=
|
|
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=
|
|
594
|
-
end_time=
|
|
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=
|
|
606
|
-
end_time=
|
|
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=
|
|
616
|
-
end_time=
|
|
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=
|
|
628
|
-
end_time=
|
|
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=
|
|
640
|
-
end_time=
|
|
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=
|
|
652
|
-
end_time=
|
|
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=
|
|
662
|
-
end_time=
|
|
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=
|
|
672
|
-
end_time=
|
|
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=
|
|
682
|
-
end_time=
|
|
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=
|
|
692
|
-
end_time=
|
|
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
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: roms-tools
|
|
3
|
-
Version: 2.
|
|
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
|
[](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 [
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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`
|
|
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`
|
|
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=
|
|
5
|
-
roms_tools/regrid.py,sha256=
|
|
6
|
-
roms_tools/utils.py,sha256=
|
|
7
|
-
roms_tools/vertical_coordinate.py,sha256=
|
|
8
|
-
roms_tools/analysis/roms_output.py,sha256=
|
|
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=
|
|
11
|
-
roms_tools/setup/datasets.py,sha256=
|
|
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=
|
|
14
|
-
roms_tools/setup/initial_conditions.py,sha256=
|
|
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=
|
|
17
|
-
roms_tools/setup/river_forcing.py,sha256=
|
|
18
|
-
roms_tools/setup/surface_forcing.py,sha256=
|
|
19
|
-
roms_tools/setup/tides.py,sha256=
|
|
20
|
-
roms_tools/setup/topography.py,sha256=
|
|
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=-
|
|
24
|
-
roms_tools/tests/
|
|
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=
|
|
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=
|
|
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/
|
|
957
|
-
roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/
|
|
958
|
-
roms_tools/tests/test_setup/test_data/river_forcing_no_climatology.zarr/
|
|
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=
|
|
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/
|
|
987
|
-
roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/
|
|
988
|
-
roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/
|
|
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.
|
|
1067
|
-
roms_tools-2.
|
|
1068
|
-
roms_tools-2.
|
|
1069
|
-
roms_tools-2.
|
|
1070
|
-
roms_tools-2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/roms_tools/tests/test_setup/test_data/river_forcing_with_bgc.zarr/{river_location → river_flux}/0.0
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|