mlde-utils 0.2.2__tar.gz → 0.2.4__tar.gz
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.
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/PKG-INFO +3 -2
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/pyproject.toml +1 -1
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/__init__.py +3 -6
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/regrid.py +12 -2
- mlde_utils-0.2.4/src/mlde_utils/data/select_domain.py +100 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/shift_lon_break.py +3 -1
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils.egg-info/PKG-INFO +3 -2
- mlde_utils-0.2.2/src/mlde_utils/data/select_domain.py +0 -63
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/LICENSE +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/MANIFEST.in +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/README.md +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/setup.cfg +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/__init__.py +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/coarsen.py +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/constrain.py +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/diff.py +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/remapcon.py +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/resample.py +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/select_gcm_domain.py +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/split_by_year.py +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/sum.py +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/2.2km/uk/moose_grid.nc +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/2.2km-coarsened-27x/uk/moose_grid.nc +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/2.2km-coarsened-2x/uk/moose_grid.nc +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/2.2km-coarsened-4x/uk/moose_grid.nc +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/2.2km-coarsened-8x/uk/moose_grid.nc +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/60km/global/pr/moose_grid.nc +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/60km/global/vorticity850/moose_grid.nc +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/vorticity.py +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/training/__init__.py +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/training/dataset.py +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/transforms.py +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils.egg-info/SOURCES.txt +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils.egg-info/dependency_links.txt +0 -0
- {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: mlde_utils
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: A package for shared code between ML downscaling repos
|
|
5
5
|
Author-email: Henry Addison <henry.addison@bristol.ac.uk>
|
|
6
6
|
Project-URL: Homepage, https://github.com/henryaddison/mlde_utils
|
|
@@ -11,5 +11,6 @@ Classifier: Operating System :: OS Independent
|
|
|
11
11
|
Requires-Python: >=3.7
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
13
13
|
License-File: LICENSE
|
|
14
|
+
Dynamic: license-file
|
|
14
15
|
|
|
15
16
|
# Util code for ML downscaling emulator
|
|
@@ -37,7 +37,8 @@ class VariableMetadata:
|
|
|
37
37
|
domain,
|
|
38
38
|
resolution,
|
|
39
39
|
ensemble_member,
|
|
40
|
-
scenario
|
|
40
|
+
scenario,
|
|
41
|
+
collection,
|
|
41
42
|
):
|
|
42
43
|
self.base_dir = base_dir
|
|
43
44
|
self.variable = variable
|
|
@@ -46,11 +47,7 @@ class VariableMetadata:
|
|
|
46
47
|
self.domain = domain
|
|
47
48
|
self.scenario = scenario
|
|
48
49
|
self.ensemble_member = ensemble_member
|
|
49
|
-
|
|
50
|
-
if self.resolution.startswith("2.2km"):
|
|
51
|
-
self.collection = "land-cpm"
|
|
52
|
-
elif self.resolution.startswith("60km"):
|
|
53
|
-
self.collection = "land-gcm"
|
|
50
|
+
self.collection = collection
|
|
54
51
|
|
|
55
52
|
def __str__(self):
|
|
56
53
|
return "VariableMetadata: " + str(self.__dict__)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import iris
|
|
2
2
|
import iris.analysis
|
|
3
|
+
import logging
|
|
3
4
|
import xarray as xr
|
|
4
5
|
|
|
5
6
|
"""
|
|
@@ -43,7 +44,12 @@ class Regrid:
|
|
|
43
44
|
src_lat_name = "grid_latitude"
|
|
44
45
|
src_lon_name = "grid_longitude"
|
|
45
46
|
else:
|
|
46
|
-
|
|
47
|
+
logging.warning(
|
|
48
|
+
"Unrecognised grid system. Assuming lat-lon, GeogCS(6371229.0)"
|
|
49
|
+
)
|
|
50
|
+
src_coord_sys = iris.coord_systems.GeogCS(6371229.0)
|
|
51
|
+
src_lat_name = "latitude"
|
|
52
|
+
src_lon_name = "longitude"
|
|
47
53
|
|
|
48
54
|
if "latitude_longitude" in self.target_ds.variables:
|
|
49
55
|
target_grid_mapping = "latitude_longitude"
|
|
@@ -111,7 +117,11 @@ class Regrid:
|
|
|
111
117
|
["time", "bnds"],
|
|
112
118
|
ds[key].values,
|
|
113
119
|
ds[key].attrs,
|
|
114
|
-
{
|
|
120
|
+
{
|
|
121
|
+
k: ds["time"].encoding[k]
|
|
122
|
+
for k in ["units", "calendar"]
|
|
123
|
+
if k in ds["time"].encoding
|
|
124
|
+
},
|
|
115
125
|
)
|
|
116
126
|
for key in ["time_bnds"]
|
|
117
127
|
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import math
|
|
3
|
+
|
|
4
|
+
import numpy as np
|
|
5
|
+
|
|
6
|
+
from mlde_utils import cp_model_rotated_pole, platecarree
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger(__name__)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SelectDomain:
|
|
12
|
+
|
|
13
|
+
DOMAIN_CENTRES_LON_LAT = {
|
|
14
|
+
"london": (-0.118092, 51.509865),
|
|
15
|
+
"birmingham": (-1.898575, 52.489471),
|
|
16
|
+
"glasgow": (-4.25763000, 55.86515000),
|
|
17
|
+
"aberdeen": (-2.09814000, 57.14369000),
|
|
18
|
+
"scotland": (-4.20264580, 56.49067120),
|
|
19
|
+
"dublin": (-6.267494, 53.344105),
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
DOMAIN_CENTRES_RP_LONG_LAT = {
|
|
23
|
+
domain_name: cp_model_rotated_pole.transform_point(
|
|
24
|
+
*lon_lat, src_crs=platecarree
|
|
25
|
+
)
|
|
26
|
+
for domain_name, lon_lat in DOMAIN_CENTRES_LON_LAT.items()
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
def __init__(self, subdomain, grid="cpm", size=64) -> None:
|
|
30
|
+
self.subdomain = subdomain
|
|
31
|
+
self.grid = grid
|
|
32
|
+
self.size = size
|
|
33
|
+
|
|
34
|
+
def run(self, ds):
|
|
35
|
+
logger.info(f"Selecting subdomain {self.subdomain}")
|
|
36
|
+
if self.grid == "cpm":
|
|
37
|
+
centre_xy = self.DOMAIN_CENTRES_RP_LONG_LAT[self.subdomain]
|
|
38
|
+
query = dict(
|
|
39
|
+
grid_longitude=360.0 + centre_xy[0],
|
|
40
|
+
grid_latitude=centre_xy[1],
|
|
41
|
+
)
|
|
42
|
+
elif self.grid == "gcm":
|
|
43
|
+
centre_xy = self.DOMAIN_CENTRES_LON_LAT[self.subdomain]
|
|
44
|
+
query = dict(
|
|
45
|
+
longitude=centre_xy[0],
|
|
46
|
+
latitude=centre_xy[1],
|
|
47
|
+
)
|
|
48
|
+
else:
|
|
49
|
+
raise ValueError(f"Unknown grid type: {self.grid}")
|
|
50
|
+
|
|
51
|
+
centre_ds = ds.sel(query, method="nearest")
|
|
52
|
+
if self.grid == "cpm":
|
|
53
|
+
centre_long_idx = np.where(
|
|
54
|
+
ds.grid_longitude.values == centre_ds.grid_longitude.values
|
|
55
|
+
)[0].item()
|
|
56
|
+
centre_lat_idx = np.where(
|
|
57
|
+
ds.grid_latitude.values == centre_ds.grid_latitude.values
|
|
58
|
+
)[0].item()
|
|
59
|
+
elif self.grid == "gcm":
|
|
60
|
+
centre_long_idx = np.where(
|
|
61
|
+
ds.longitude.values == centre_ds.longitude.values
|
|
62
|
+
)[0].item()
|
|
63
|
+
centre_lat_idx = np.where(ds.latitude.values == centre_ds.latitude.values)[
|
|
64
|
+
0
|
|
65
|
+
].item()
|
|
66
|
+
else:
|
|
67
|
+
raise ValueError(f"Unknown grid type: {self.grid}")
|
|
68
|
+
|
|
69
|
+
radius = self.size - 1
|
|
70
|
+
left_length = math.floor(radius / 2.0)
|
|
71
|
+
right_length = math.ceil(radius / 2.0)
|
|
72
|
+
down_length = math.floor(radius / 2.0)
|
|
73
|
+
up_length = math.ceil(radius / 2.0)
|
|
74
|
+
|
|
75
|
+
if self.grid == "cpm":
|
|
76
|
+
ds = ds.sel(
|
|
77
|
+
grid_longitude=slice(
|
|
78
|
+
ds.grid_longitude[centre_long_idx - left_length].values,
|
|
79
|
+
ds.grid_longitude[centre_long_idx + right_length].values,
|
|
80
|
+
),
|
|
81
|
+
grid_latitude=slice(
|
|
82
|
+
ds.grid_latitude[centre_lat_idx - down_length].values,
|
|
83
|
+
ds.grid_latitude[centre_lat_idx + up_length].values,
|
|
84
|
+
),
|
|
85
|
+
)
|
|
86
|
+
elif self.grid == "gcm":
|
|
87
|
+
ds = ds.sel(
|
|
88
|
+
longitude=slice(
|
|
89
|
+
ds.longitude[centre_long_idx - left_length].values,
|
|
90
|
+
ds.longitude[centre_long_idx + right_length].values,
|
|
91
|
+
),
|
|
92
|
+
latitude=slice(
|
|
93
|
+
ds.latitude[centre_lat_idx - down_length].values,
|
|
94
|
+
ds.latitude[centre_lat_idx + up_length].values,
|
|
95
|
+
),
|
|
96
|
+
)
|
|
97
|
+
else:
|
|
98
|
+
raise ValueError(f"Unknown grid type: {self.grid}")
|
|
99
|
+
|
|
100
|
+
return ds
|
|
@@ -10,7 +10,9 @@ class ShiftLonBreak:
|
|
|
10
10
|
|
|
11
11
|
def run(self, ds):
|
|
12
12
|
orig_lon_attrs = ds[self.lon_name].attrs
|
|
13
|
-
ds
|
|
13
|
+
ds = ds.assign_coords(
|
|
14
|
+
{self.lon_name: (((ds.coords[self.lon_name] + 180) % 360) - 180)}
|
|
15
|
+
)
|
|
14
16
|
ds = ds.sortby(ds[self.lon_name])
|
|
15
17
|
ds[self.lon_name].attrs = orig_lon_attrs
|
|
16
18
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: mlde_utils
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: A package for shared code between ML downscaling repos
|
|
5
5
|
Author-email: Henry Addison <henry.addison@bristol.ac.uk>
|
|
6
6
|
Project-URL: Homepage, https://github.com/henryaddison/mlde_utils
|
|
@@ -11,5 +11,6 @@ Classifier: Operating System :: OS Independent
|
|
|
11
11
|
Requires-Python: >=3.7
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
13
13
|
License-File: LICENSE
|
|
14
|
+
Dynamic: license-file
|
|
14
15
|
|
|
15
16
|
# Util code for ML downscaling emulator
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import math
|
|
3
|
-
|
|
4
|
-
import numpy as np
|
|
5
|
-
|
|
6
|
-
from mlde_utils import cp_model_rotated_pole, platecarree
|
|
7
|
-
|
|
8
|
-
logger = logging.getLogger(__name__)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class SelectDomain:
|
|
12
|
-
|
|
13
|
-
DOMAIN_CENTRES_LON_LAT = {
|
|
14
|
-
"london": (-0.118092, 51.509865),
|
|
15
|
-
"birmingham": (-1.898575, 52.489471),
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
DOMAIN_CENTRES_RP_LONG_LAT = {
|
|
19
|
-
domain_name: cp_model_rotated_pole.transform_point(
|
|
20
|
-
*lon_lat, src_crs=platecarree
|
|
21
|
-
)
|
|
22
|
-
for domain_name, lon_lat in DOMAIN_CENTRES_LON_LAT.items()
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
def __init__(self, subdomain, size=64) -> None:
|
|
26
|
-
self.subdomain = subdomain
|
|
27
|
-
self.size = size
|
|
28
|
-
|
|
29
|
-
def run(self, ds):
|
|
30
|
-
logger.info(f"Selecting subdomain {self.subdomain}")
|
|
31
|
-
|
|
32
|
-
centre_rp_lon_lat = self.DOMAIN_CENTRES_RP_LONG_LAT[self.subdomain]
|
|
33
|
-
centre_ds = ds.sel(
|
|
34
|
-
grid_longitude=360.0 + centre_rp_lon_lat[0],
|
|
35
|
-
grid_latitude=centre_rp_lon_lat[1],
|
|
36
|
-
method="nearest",
|
|
37
|
-
)
|
|
38
|
-
|
|
39
|
-
centre_long_idx = np.where(
|
|
40
|
-
ds.grid_longitude.values == centre_ds.grid_longitude.values
|
|
41
|
-
)[0].item()
|
|
42
|
-
centre_lat_idx = np.where(
|
|
43
|
-
ds.grid_latitude.values == centre_ds.grid_latitude.values
|
|
44
|
-
)[0].item()
|
|
45
|
-
|
|
46
|
-
radius = self.size - 1
|
|
47
|
-
left_length = math.floor(radius / 2.0)
|
|
48
|
-
right_length = math.ceil(radius / 2.0)
|
|
49
|
-
down_length = math.floor(radius / 2.0)
|
|
50
|
-
up_length = math.ceil(radius / 2.0)
|
|
51
|
-
|
|
52
|
-
ds = ds.sel(
|
|
53
|
-
grid_longitude=slice(
|
|
54
|
-
ds.grid_longitude[centre_long_idx - left_length].values,
|
|
55
|
-
ds.grid_longitude[centre_long_idx + right_length].values,
|
|
56
|
-
),
|
|
57
|
-
grid_latitude=slice(
|
|
58
|
-
ds.grid_latitude[centre_lat_idx - down_length].values,
|
|
59
|
-
ds.grid_latitude[centre_lat_idx + up_length].values,
|
|
60
|
-
),
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
return ds
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/2.2km/uk/moose_grid.nc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/60km/global/pr/moose_grid.nc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|