diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5017be67964bf562dddc6adc320d69a8489baf10..6616fa3cae1ee62bfa12ed72d132081aa9d23bea 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,9 +1,24 @@
# NES CHANGELOG
+### 1.1.1
+* Release date: ???
+* Changes and new features:
+ * Improved time on **concatenate_netcdfs** function ([#55](https://earth.bsc.es/gitlab/es/NES/-/issues/55))
+ * Sum of Nes objects ([#48](https://earth.bsc.es/gitlab/es/NES/-/issues/48))
+ * Write 2D string data to save variables from shapefiles after doing a spatial join ([#49](https://earth.bsc.es/gitlab/es/NES/-/issues/49))
+ * Write by time step to avoid memory issues ([#57](https://earth.bsc.es/gitlab/es/NES/-/issues/57))
+ * Flux conservative horizontal interpolation ([#60](https://earth.bsc.es/gitlab/es/NES/-/issues/60))
+ * Bugs fixing:
+ * Bug on `cell_methods` serial write ([#53](https://earth.bsc.es/gitlab/es/NES/-/issues/53))
+ * Horizontal Interpolation Conservative: Improvement on memory usage when calculating the weight matrix ([#54](https://earth.bsc.es/gitlab/es/NES/-/issues/54))
+ * Bug on avoid_first_hours that where not filtered after read the dimensions ([#59](https://earth.bsc.es/gitlab/es/NES/-/issues/59))
+ * Bug while reading masked data.
+
### 1.1.0
* Release date: 2023/03/02
* Changes and new features:
* Improve Lat-Lon to Cartesian coordinates method (used in Providentia).
+ * Horizontal interpolation: Conservative
* Function to_shapefile() to create shapefiles from a NES object without losing data from the original grid and being able to select the time and level.
* Function from_shapefile() to create a new grid with data from a shapefile after doing a spatial join.
* Function create_shapefile() can now be used in parallel.
diff --git a/nes/create_nes.py b/nes/create_nes.py
index 33f0bf63eb76714623e9b906770014355a96ea7d..cfb0205fda0916e62ae37448ba660d4d0a2dc813 100644
--- a/nes/create_nes.py
+++ b/nes/create_nes.py
@@ -1,6 +1,7 @@
#!/usr/bin/env python
import warnings
+import sys
from netCDF4 import num2date
from mpi4py import MPI
import geopandas as gpd
@@ -8,7 +9,7 @@ from .nc_projections import *
def create_nes(comm=None, info=False, projection=None, parallel_method='Y', balanced=False,
- strlen=75, times=None, avoid_first_hours=0, avoid_last_hours=0, first_level=0, last_level=None,
+ times=None, avoid_first_hours=0, avoid_last_hours=0, first_level=0, last_level=None,
**kwargs):
"""
Create a Nes class from scratch.
@@ -87,6 +88,7 @@ def create_nes(comm=None, info=False, projection=None, parallel_method='Y', bala
if projection is None:
if parallel_method == 'Y':
warnings.warn("Parallel method cannot be 'Y' to create points NES. Setting it to 'X'")
+ sys.stderr.flush()
parallel_method = 'X'
elif parallel_method == 'T':
raise NotImplementedError("Parallel method T not implemented yet")
@@ -126,8 +128,7 @@ def from_shapefile(path, method=None, parallel_method='Y', **kwargs):
1. Create NES grid.
2. Create shapefile for grid.
- 3. Read shapefile from mask.
- 4. Spatial join to add shapefile variables to NES variables.
+ 3. Spatial join to add shapefile variables to NES variables.
Parameters
----------
@@ -148,10 +149,7 @@ def from_shapefile(path, method=None, parallel_method='Y', **kwargs):
# Create shapefile for grid
nessy.create_shapefile()
- # Read shapefile
- shapefile = gpd.read_file(path)
-
# Make spatial join
- nessy.spatial_join(shapefile, method=method)
+ nessy.spatial_join(path, method=method)
return nessy
diff --git a/nes/load_nes.py b/nes/load_nes.py
index 5bfd333fc4661ec1f9feffe82dfe4d726051b13e..2113b485281c8b298bd1d43c6b2b99a2566765e9 100644
--- a/nes/load_nes.py
+++ b/nes/load_nes.py
@@ -1,12 +1,16 @@
#!/usr/bin/env python
import os
+import sys
from mpi4py import MPI
from netCDF4 import Dataset
import warnings
-
+import numpy as np
from .nc_projections import *
+DIM_VAR_NAMES = ['lat', 'latitude', 'lat_bnds', 'lon', 'longitude', 'lon_bnds', 'time', 'time_bnds', 'lev', 'level',
+ 'cell_area', 'crs', 'rotated_pole', 'x', 'y', 'rlat', 'rlon', 'Lambert_conformal', 'mercator']
+
def open_netcdf(path, comm=None, xarray=False, info=False, parallel_method='Y', avoid_first_hours=0, avoid_last_hours=0,
first_level=0, last_level=None, balanced=False):
@@ -67,6 +71,7 @@ def open_netcdf(path, comm=None, xarray=False, info=False, parallel_method='Y',
elif __is_points(dataset):
if parallel_method == 'Y':
warnings.warn("Parallel method cannot be 'Y' to create points NES. Setting it to 'X'")
+ sys.stderr.flush()
parallel_method = 'X'
if __is_points_ghost(dataset):
# Points - GHOST
@@ -270,15 +275,53 @@ def concatenate_netcdfs(nessy_list, comm=None, info=False, parallel_method='Y',
nessy_first = nessy_list[0]
for i, aux_nessy in enumerate(nessy_list[1:]):
if isinstance(aux_nessy, str):
- aux_nessy = open_netcdf(aux_nessy,
- comm=comm,
- parallel_method=parallel_method,
- avoid_first_hours=avoid_first_hours,
- avoid_last_hours=avoid_last_hours,
- first_level=first_level,
- last_level=last_level,
- balanced=balanced
- )
- nessy_first.concatenate(aux_nessy)
+ nc_add = Dataset(filename=aux_nessy, mode='r')
+ for var_name, var_info in nc_add.variables.items():
+ if var_name not in DIM_VAR_NAMES:
+ nessy_first.variables[var_name] = {}
+ var_dims = var_info.dimensions
+ # Read data in 4 dimensions
+ if len(var_dims) < 2:
+ data = var_info[:]
+ elif len(var_dims) == 2:
+ data = var_info[nessy_first.read_axis_limits['y_min']:nessy_first.read_axis_limits['y_max'],
+ nessy_first.read_axis_limits['x_min']:nessy_first.read_axis_limits['x_max']]
+ data = data.reshape(1, 1, data.shape[-2], data.shape[-1])
+ elif len(var_dims) == 3:
+ if 'strlen' in var_dims:
+ data = var_info[nessy_first.read_axis_limits['y_min']:nessy_first.read_axis_limits['y_max'],
+ nessy_first.read_axis_limits['x_min']:nessy_first.read_axis_limits['x_max'],
+ :]
+ data_aux = np.empty(shape=(data.shape[0], data.shape[1]), dtype=np.object)
+ for lat_n in range(data.shape[0]):
+ for lon_n in range(data.shape[1]):
+ data_aux[lat_n, lon_n] = ''.join(
+ data[lat_n, lon_n].tostring().decode('ascii').replace('\x00', ''))
+ data = data_aux.reshape((1, 1, data_aux.shape[-2], data_aux.shape[-1]))
+ else:
+ data = var_info[nessy_first.read_axis_limits['t_min']:nessy_first.read_axis_limits['t_max'],
+ nessy_first.read_axis_limits['y_min']:nessy_first.read_axis_limits['y_max'],
+ nessy_first.read_axis_limits['x_min']:nessy_first.read_axis_limits['x_max']]
+ data = data.reshape(data.shape[-3], 1, data.shape[-2], data.shape[-1])
+ elif len(var_dims) == 4:
+ data = var_info[nessy_first.read_axis_limits['t_min']:nessy_first.read_axis_limits['t_max'],
+ nessy_first.read_axis_limits['z_min']:nessy_first.read_axis_limits['z_max'],
+ nessy_first.read_axis_limits['y_min']:nessy_first.read_axis_limits['y_max'],
+ nessy_first.read_axis_limits['x_min']:nessy_first.read_axis_limits['x_max']]
+ else:
+ raise TypeError("{} data shape is nto accepted".format(var_dims))
+
+ nessy_first.variables[var_name]['data'] = data
+ # Avoid some attributes
+ for attrname in var_info.ncattrs():
+ if attrname not in ['missing_value', '_FillValue']:
+ value = getattr(var_info, attrname)
+ if value in ['unitless', '-']:
+ value = ''
+ nessy_first.variables[var_name][attrname] = value
+ nc_add.close()
+
+ else:
+ nessy_first.concatenate(aux_nessy)
return nessy_first
diff --git a/nes/methods/__init__.py b/nes/methods/__init__.py
index 22c351a85dec0724f58fe1b70502c171b5286c7a..772adacfae71525d99d30e987a427decf012c3f5 100644
--- a/nes/methods/__init__.py
+++ b/nes/methods/__init__.py
@@ -1,3 +1,4 @@
from .vertical_interpolation import add_4d_vertical_info
from .vertical_interpolation import interpolate_vertical
from .horizontal_interpolation import interpolate_horizontal
+from .spatial_join import spatial_join
diff --git a/nes/methods/horizontal_interpolation.py b/nes/methods/horizontal_interpolation.py
index 897327fb04b2f6b288a939e868a5568a6e7c0518..ec3840ff9842a7d9857837d2c2c3f2182d24c888 100644
--- a/nes/methods/horizontal_interpolation.py
+++ b/nes/methods/horizontal_interpolation.py
@@ -4,6 +4,7 @@ import sys
import warnings
import numpy as np
import pandas as pd
+from geopandas import GeoSeries
import os
import nes
from mpi4py import MPI
@@ -13,6 +14,8 @@ from datetime import datetime
from warnings import warn
import copy
import pyproj
+import gc
+import psutil
# CONSTANTS
NEAREST_OPTS = ['NearestNeighbour', 'NearestNeighbours', 'nn', 'NN']
@@ -20,7 +23,7 @@ CONSERVATIVE_OPTS = ['Conservative', 'Area_Conservative', 'cons', 'conservative'
def interpolate_horizontal(self, dst_grid, weight_matrix_path=None, kind='NearestNeighbour', n_neighbours=4,
- info=False, to_providentia=False, only_create_wm=False, wm=None):
+ info=False, to_providentia=False, only_create_wm=False, wm=None, flux=False):
"""
Horizontal methods from one grid to another one.
@@ -33,7 +36,7 @@ def interpolate_horizontal(self, dst_grid, weight_matrix_path=None, kind='Neares
weight_matrix_path : str, None
Path to the weight matrix to read/create.
kind : str
- Kind of horizontal methods. Accepted values: ['NearestNeighbour', 'Conservative'].
+ Kind of horizontal interpolation. Accepted values: ['NearestNeighbour', 'Conservative'].
n_neighbours : int
Used if kind == NearestNeighbour. Number of nearest neighbours to interpolate. Default: 4.
info : bool
@@ -44,16 +47,18 @@ def interpolate_horizontal(self, dst_grid, weight_matrix_path=None, kind='Neares
Indicates if you want to only create the Weight Matrix.
wm : Nes
Weight matrix Nes File
+ flux : bool
+ Indicates if you want to calculate the weight matrix for flux variables
"""
if info and self.master:
print("Creating Weight Matrix")
# Obtain weight matrix
if self.parallel_method == 'T':
weights, idx = get_weights_idx_t_axis(self, dst_grid, weight_matrix_path, kind, n_neighbours,
- only_create_wm, wm)
+ only_create_wm, wm, flux)
elif self.parallel_method in ['Y', 'X']:
weights, idx = get_weights_idx_xy_axis(self, dst_grid, weight_matrix_path, kind, n_neighbours,
- only_create_wm, wm)
+ only_create_wm, wm, flux)
else:
raise NotImplemented("Parallel method {0} is not implemented yet for horizontal interpolations. Use 'T'".format(
self.parallel_method))
@@ -94,7 +99,7 @@ def interpolate_horizontal(self, dst_grid, weight_matrix_path=None, kind='Neares
# Apply weights
for var_name, var_info in self.variables.items():
if info and self.master:
- print("\t{var} horizontal methods".format(var=var_name))
+ print("\t{var} horizontal interpolation".format(var=var_name))
sys.stdout.flush()
src_shape = var_info['data'].shape
if isinstance(dst_grid, nes.PointsNes):
@@ -140,6 +145,7 @@ def interpolate_horizontal(self, dst_grid, weight_matrix_path=None, kind='Neares
else:
msg = "The final projection must be points to interpolate an experiment and get it in Providentia format."
warnings.warn(msg)
+ sys.stderr.flush()
else:
# Convert dimensions (time, lev, lat, lon) or (time, lat, lon) to (time, station) for interpolated variables
# and reshape data
@@ -194,7 +200,7 @@ def get_src_data(comm, var_data, idx, parallel_method):
# noinspection DuplicatedCode
-def get_weights_idx_t_axis(self, dst_grid, weight_matrix_path, kind, n_neighbours, only_create, wm):
+def get_weights_idx_t_axis(self, dst_grid, weight_matrix_path, kind, n_neighbours, only_create, wm, flux):
"""
To obtain the weights and source data index through the T axis.
@@ -207,13 +213,15 @@ def get_weights_idx_t_axis(self, dst_grid, weight_matrix_path, kind, n_neighbour
weight_matrix_path : str, None
Path to the weight matrix to read/create.
kind : str
- Kind of horizontal methods. Accepted values: ['NearestNeighbour', 'Conservative'].
+ Kind of horizontal interpolation. Accepted values: ['NearestNeighbour', 'Conservative'].
n_neighbours : int
Used if kind == NearestNeighbour. Number of nearest neighbours to interpolate. Default: 4.
only_create : bool
Indicates if you want to only create the Weight Matrix.
wm : Nes
Weight matrix Nes File
+ flux : bool
+ Indicates if you want to calculate the weight matrix for flux variables
Returns
-------
@@ -235,6 +243,7 @@ def get_weights_idx_t_axis(self, dst_grid, weight_matrix_path, kind, n_neighbour
if len(weight_matrix.lev['data']) != n_neighbours:
warn("The selected weight matrix does not have the same number of nearest neighbours." +
"Re-calculating again but not saving it.")
+ sys.stderr.flush()
weight_matrix = create_nn_weight_matrix(self, dst_grid, n_neighbours=n_neighbours)
else:
weight_matrix = True
@@ -245,8 +254,8 @@ def get_weights_idx_t_axis(self, dst_grid, weight_matrix_path, kind, n_neighbour
weight_matrix = create_nn_weight_matrix(self, dst_grid, n_neighbours=n_neighbours,
wm_path=weight_matrix_path)
elif kind in CONSERVATIVE_OPTS:
- weight_matrix = create_area_conservative_weight_matrix(self, dst_grid,
- wm_path=weight_matrix_path)
+ weight_matrix = create_area_conservative_weight_matrix(
+ self, dst_grid, wm_path=weight_matrix_path, flux=flux)
else:
raise NotImplementedError(kind)
else:
@@ -259,7 +268,7 @@ def get_weights_idx_t_axis(self, dst_grid, weight_matrix_path, kind, n_neighbour
if kind in NEAREST_OPTS:
weight_matrix = create_nn_weight_matrix(self, dst_grid, n_neighbours=n_neighbours)
elif kind in CONSERVATIVE_OPTS:
- weight_matrix = create_area_conservative_weight_matrix(self, dst_grid)
+ weight_matrix = create_area_conservative_weight_matrix(self, dst_grid, flux=flux)
else:
raise NotImplementedError(kind)
else:
@@ -288,7 +297,7 @@ def get_weights_idx_t_axis(self, dst_grid, weight_matrix_path, kind, n_neighbour
# noinspection DuplicatedCode
-def get_weights_idx_xy_axis(self, dst_grid, weight_matrix_path, kind, n_neighbours, only_create, wm):
+def get_weights_idx_xy_axis(self, dst_grid, weight_matrix_path, kind, n_neighbours, only_create, wm, flux):
"""
To obtain the weights and source data index through the X or Y axis.
@@ -301,13 +310,15 @@ def get_weights_idx_xy_axis(self, dst_grid, weight_matrix_path, kind, n_neighbou
weight_matrix_path : str, None
Path to the weight matrix to read/create.
kind : str
- Kind of horizontal methods. Accepted values: ['NearestNeighbour', 'Conservative'].
+ Kind of horizontal interpolation. Accepted values: ['NearestNeighbour', 'Conservative'].
n_neighbours : int
Used if kind == NearestNeighbour. Number of nearest neighbours to interpolate. Default: 4.
only_create : bool
Indicates if you want to only create the Weight Matrix.
wm : Nes
Weight matrix Nes File
+ flux : bool
+ Indicates if you want to calculate the weight matrix for flux variables
Returns
-------
@@ -317,6 +328,7 @@ def get_weights_idx_xy_axis(self, dst_grid, weight_matrix_path, kind, n_neighbou
if isinstance(dst_grid, nes.PointsNes) and weight_matrix_path is not None:
if self.master:
warn("To point weight matrix cannot be saved.")
+ sys.stderr.flush()
weight_matrix_path = None
if wm is not None:
@@ -334,6 +346,7 @@ def get_weights_idx_xy_axis(self, dst_grid, weight_matrix_path, kind, n_neighbou
if len(weight_matrix.lev['data']) != n_neighbours:
warn("The selected weight matrix does not have the same number of nearest neighbours." +
"Re-calculating again but not saving it.")
+ sys.stderr.flush()
weight_matrix = create_nn_weight_matrix(self, dst_grid, n_neighbours=n_neighbours)
else:
weight_matrix = True
@@ -345,7 +358,8 @@ def get_weights_idx_xy_axis(self, dst_grid, weight_matrix_path, kind, n_neighbou
else:
weight_matrix = True
elif kind in CONSERVATIVE_OPTS:
- weight_matrix = create_area_conservative_weight_matrix(self, dst_grid, wm_path=weight_matrix_path)
+ weight_matrix = create_area_conservative_weight_matrix(
+ self, dst_grid, wm_path=weight_matrix_path, flux=flux)
else:
raise NotImplementedError(kind)
@@ -355,7 +369,7 @@ def get_weights_idx_xy_axis(self, dst_grid, weight_matrix_path, kind, n_neighbou
if kind in NEAREST_OPTS:
weight_matrix = create_nn_weight_matrix(self, dst_grid, n_neighbours=n_neighbours)
elif kind in CONSERVATIVE_OPTS:
- weight_matrix = create_area_conservative_weight_matrix(self, dst_grid)
+ weight_matrix = create_area_conservative_weight_matrix(self, dst_grid, flux=flux)
else:
raise NotImplementedError(kind)
@@ -434,6 +448,8 @@ def create_nn_weight_matrix(self, dst_grid, n_neighbours=4, wm_path=None, info=F
Final projection Nes object.
n_neighbours : int
Used if kind == NearestNeighbour. Number of nearest neighbours to interpolate. Default: 4.
+ wm_path : str
+ Path where write the weight matrix
info: bool
Indicates if you want to print extra info during the methods process.
@@ -516,7 +532,7 @@ def create_nn_weight_matrix(self, dst_grid, n_neighbours=4, wm_path=None, info=F
return weight_matrix
-def create_area_conservative_weight_matrix(self, dst_nes, wm_path=None, info=False):
+def create_area_conservative_weight_matrix(self, dst_nes, wm_path=None, flux=False, info=False):
"""
To create the weight matrix with the area conservative method.
@@ -528,7 +544,8 @@ def create_area_conservative_weight_matrix(self, dst_nes, wm_path=None, info=Fal
Final projection Nes object.
wm_path : str
Path where write the weight matrix
-
+ flux : bool
+ Indicates if you want to calculate the weight matrix for flux variables
info: bool
Indicates if you want to print extra info during the methods process.
@@ -540,83 +557,94 @@ def create_area_conservative_weight_matrix(self, dst_nes, wm_path=None, info=Fal
if info and self.master:
print("\tCreating area conservative Weight Matrix")
sys.stdout.flush()
+
+ my_crs = pyproj.CRS.from_proj4("+proj=latlon") # Common projection for both shapefiles
+
# Get a portion of the destiny grid
if dst_nes.shapefile is None:
dst_nes.create_shapefile()
dst_grid = copy.deepcopy(dst_nes.shapefile)
- # Get the complete source grid
+ # Formatting Destination grid
+ dst_grid.to_crs(crs=my_crs, inplace=True)
+ dst_grid['FID_dst'] = dst_grid.index
+
+ # Preparing Source grid
if self.shapefile is None:
self.create_shapefile()
src_grid = copy.deepcopy(self.shapefile)
- if self.parallel_method == 'T':
- # All process has the same shapefile
- pass
- else:
+ # Formatting Source grid
+ src_grid.to_crs(crs=my_crs, inplace=True)
+
+ # Serialize index intersection function to avoid memory problems
+ if self.size > 1 and self.parallel_method != 'T':
src_grid = self.comm.gather(src_grid, root=0)
+ dst_grid = self.comm.gather(dst_grid, root=0)
if self.master:
src_grid = pd.concat(src_grid)
- src_grid = self.comm.bcast(src_grid)
-
- my_crs = pyproj.CRS.from_proj4("+proj=latlon")
- # Normalizing projections
- dst_grid.to_crs(crs=my_crs, inplace=True)
- dst_grid['FID_dst'] = dst_grid.index
- dst_grid = dst_grid.reset_index()
-
- # src_grid.to_crs(crs=pyproj.Proj(proj='geocent', ellps='WGS84', datum='WGS84').crs, inplace=True)
- src_grid.to_crs(crs=my_crs, inplace=True)
- src_grid['FID_src'] = src_grid.index
+ dst_grid = pd.concat(dst_grid)
+ if self.master:
+ src_grid['FID_src'] = src_grid.index
+ src_grid = src_grid.reset_index()
+ dst_grid = dst_grid.reset_index()
+ fid_src, fid_dst = dst_grid.sindex.query_bulk(src_grid.geometry, predicate='intersects')
+
+ # Calculate intersected areas and fractions
+ intersection_df = pd.DataFrame(columns=["FID_src", "FID_dst"])
+
+ intersection_df['FID_src'] = np.array(src_grid.loc[fid_src, 'FID_src'], dtype=np.uint32)
+ intersection_df['FID_dst'] = np.array(dst_grid.loc[fid_dst, 'FID_dst'], dtype=np.uint32)
+
+ intersection_df['geometry_src'] = src_grid.loc[fid_src, 'geometry'].values
+ intersection_df['geometry_dst'] = dst_grid.loc[fid_dst, 'geometry'].values
+ del src_grid, dst_grid, fid_src, fid_dst
+ # Split the array into smaller arrays in order to scatter the data among the processes
+ intersection_df = np.array_split(intersection_df, self.size)
+ else:
+ intersection_df = None
- src_grid = src_grid.reset_index()
+ intersection_df = self.comm.scatter(intersection_df, root=0)
if info and self.master:
print("\t\tGrids created and ready to interpolate")
sys.stdout.flush()
-
- # Get intersected areas
- inp, res = dst_grid.sindex.query_bulk(src_grid.geometry, predicate='intersects')
-
- # Calculate intersected areas and fractions
- intersection = pd.DataFrame(columns=["FID_src", "FID_dst"])
- intersection['INP'] = np.array(inp, dtype=np.uint32)
- intersection['RES'] = np.array(res, dtype=np.uint32)
- intersection['FID_src'] = np.array(src_grid.loc[inp, 'FID_src'], dtype=np.uint32)
- intersection['FID_dst'] = np.array(dst_grid.loc[res, 'FID_dst'], dtype=np.uint32)
-
- intersection['geometry_src'] = src_grid.loc[inp, 'geometry'].values
- intersection['geometry_dst'] = dst_grid.loc[res, 'geometry'].values
-
if True:
# No Warnings Zone
warnings.filterwarnings('ignore')
- intersection['intersect_area'] = intersection.apply(
- lambda x: x['geometry_src'].intersection(x['geometry_dst']).buffer(0).area, axis=1)
- intersection.drop(intersection[intersection['intersect_area'] <= 0].index, inplace=True)
+ # intersection_df['weight'] = np.array(intersection_df.apply(
+ # lambda x: x['geometry_src'].intersection(x['geometry_dst']).buffer(0).area / x['geometry_src'].area,
+ # axis=1), dtype=np.float64)
+ if flux:
+ intersection_df['weight'] = np.array(intersection_df.apply(
+ lambda x: (x['geometry_src'].intersection(x['geometry_dst']).buffer(0).area / x['geometry_src'].area) *
+ (nes.Nes.calculate_geometry_area([x['geometry_src']])[0] /
+ nes.Nes.calculate_geometry_area([x['geometry_dst']])[0]),
+ axis=1), dtype=np.float64)
+ else:
+ intersection_df['weight'] = np.array(intersection_df.apply(
+ lambda x: x['geometry_src'].intersection(x['geometry_dst']).buffer(0).area / x['geometry_src'].area,
+ axis=1), dtype=np.float64)
- intersection["src_area"] = src_grid.loc[intersection['FID_src'], 'geometry'].area.values
+ intersection_df.drop(columns=["geometry_src", "geometry_dst"], inplace=True)
+ gc.collect()
warnings.filterwarnings('default')
- intersection['weight'] = intersection['intersect_area'] / intersection["src_area"]
-
# Format & Clean
- intersection.drop(columns=["geometry_src", "geometry_dst", "src_area", "intersect_area"], inplace=True)
-
if info and self.master:
print("\t\tWeights calculated. Formatting weight matrix.")
sys.stdout.flush()
# Initialising weight matrix
if self.parallel_method != 'T':
- intersection = self.comm.gather(intersection, root=0)
+ intersection_df = self.comm.gather(intersection_df, root=0)
if self.master:
if self.parallel_method != 'T':
- intersection = pd.concat(intersection)
- intersection = intersection.set_index(['FID_dst', intersection.groupby('FID_dst').cumcount()]).rename_axis(
+ intersection_df = pd.concat(intersection_df)
+ intersection_df = intersection_df.set_index(['FID_dst', intersection_df.groupby('FID_dst').cumcount()]).rename_axis(
('FID', 'level')).sort_index()
- intersection.rename(columns={"FID_src": "idx"}, inplace=True)
+ intersection_df.rename(columns={"FID_src": "idx"}, inplace=True)
weight_matrix = dst_nes.copy()
weight_matrix.time = [datetime(year=2000, month=1, day=1, hour=0, second=0, microsecond=0)]
weight_matrix._time = [datetime(year=2000, month=1, day=1, hour=0, second=0, microsecond=0)]
@@ -629,7 +657,7 @@ def create_area_conservative_weight_matrix(self, dst_nes, wm_path=None, info=Fal
weight_matrix.set_communicator(MPI.COMM_SELF)
- weight_matrix.set_levels({'data': np.arange(intersection.index.get_level_values('level').max() + 1),
+ weight_matrix.set_levels({'data': np.arange(intersection_df.index.get_level_values('level').max() + 1),
'dimensions': ('lev',),
'units': '',
'positive': 'up'})
@@ -653,7 +681,7 @@ def create_area_conservative_weight_matrix(self, dst_nes, wm_path=None, info=Fal
# Filling Weight matrix variables
for aux_lev in weight_matrix.lev['data']:
- aux_data = intersection.xs(level='level', key=aux_lev)
+ aux_data = intersection_df.xs(level='level', key=aux_lev)
weight_matrix.variables['weight']['data'][0, aux_lev, aux_data.index] = aux_data.loc[:, 'weight'].values
weight_matrix.variables['idx']['data'][0, aux_lev, aux_data.index] = aux_data.loc[:, 'idx'].values
# Re-shaping
diff --git a/nes/methods/spatial_join.py b/nes/methods/spatial_join.py
new file mode 100644
index 0000000000000000000000000000000000000000..33df0914e5e3f10f77bd00376aa8f77ec93d3fce
--- /dev/null
+++ b/nes/methods/spatial_join.py
@@ -0,0 +1,278 @@
+#!/usr/bin/env python
+
+import sys
+import warnings
+import geopandas as gpd
+from geopandas import GeoDataFrame
+import nes
+import numpy as np
+import pandas as pd
+from shapely.geos import TopologicalError
+
+
+def spatial_join(self, ext_shp, method=None, var_list=None, info=False):
+ """
+ Compute overlay intersection of two GeoPandasDataFrames.
+
+ Parameters
+ ----------
+ self : nes.Nes
+ ext_shp : GeoPandasDataFrame or str
+ File or path from where the data will be obtained on the intersection.
+ method : str
+ Overlay method. Accepted values: ['nearest', 'intersection', 'centroid'].
+ var_list : List or None or str
+ Variables that will be included in the resulting shapefile.
+ info : bool
+ Indicates if you want to print the process info or no
+ """
+ if self.master and info:
+ print("Starting spatial join")
+ if isinstance(var_list, str):
+ # Transforming string (variable name) to a list with length 0
+ var_list = [var_list]
+
+ # Create source shapefile if it does not exist
+ if self.shapefile is None:
+ if self.master and info:
+ print("\tCreating shapefile")
+ sys.stdout.flush()
+ self.create_shapefile()
+
+ ext_shp = prepare_external_shapefile(self, ext_shp=ext_shp, var_list=var_list, info=info)
+
+ if method == 'nearest':
+ # Nearest centroids to the shapefile polygons
+ spatial_join_nearest(self, ext_shp=ext_shp, info=info)
+ elif method == 'intersection':
+ # Intersect the areas of the shapefile polygons, outside the shapefile there will be NaN
+ spatial_join_intersection(self, ext_shp=ext_shp, info=info)
+ elif method == 'centroid':
+ # Centroids that fall on the shapefile polygons, outside the shapefile there will be NaN
+ spatial_join_centroid(self, ext_shp=ext_shp, info=info)
+
+ else:
+ accepted_values = ['nearest', 'intersection', 'centroid']
+ raise NotImplementedError('{0} is not implemented. Choose from: {1}'.format(method, accepted_values))
+
+ return None
+
+
+def prepare_external_shapefile(self, ext_shp, var_list, info=False):
+ """
+ Prepare the external shapefile.
+
+ It is high recommended to pass ext_shp parameter as string because it will clip the external shapefile to the rank.
+
+ 1. Read if it is not already read
+ 2. Filter variables list
+ 3. Standardize projections
+
+ Parameters
+ ----------
+ self : nes.Nes
+ ext_shp : GeoDataFrame or str
+ External shapefile or path to it
+ var_list : List[str] or None
+ External shapefile variables to be computed
+ info : bool
+ Indicates if you want to print the information
+
+ Returns
+ -------
+ GeoDataFrame
+ External shapefile
+ """
+ if isinstance(ext_shp, str):
+ # Reading external shapefile
+ if self.master and info:
+ print("\tReading external shapefile")
+ # ext_shp = gpd.read_file(ext_shp, include_fields=var_list, mask=self.shapefile.geometry)
+ ext_shp = gpd.read_file(ext_shp, include_fields=var_list, bbox=get_bbox(self))
+ else:
+ msg = "WARNING!!! "
+ msg += "External shapefile already read. If you pass the path to the shapefile instead of the opened shapefile "
+ msg += "a best usage of memory is performed because the external shape will be clipped while reading."
+ warnings.warn(msg)
+ sys.stderr.flush()
+ ext_shp.reset_index(inplace=True)
+ if var_list is not None:
+ ext_shp = ext_shp.loc[:, var_list + ['geometry']]
+ self.comm.Barrier()
+ if self.master and info:
+ print("\t\tReading external shapefile done!")
+ # Standardizing projection
+ ext_shp = ext_shp.to_crs(self.shapefile.crs)
+
+ return ext_shp
+
+
+def get_bbox(self):
+ """
+ Obtain the bounding box of the rank data
+
+ (lon_min, lat_min, lon_max, lat_max)
+
+ Parameters
+ ----------
+ self : nes.Nes
+
+ Returns
+ -------
+ tuple
+ Bounding box
+ """
+ bbox = (self.lon_bnds['data'].min(), self.lat_bnds['data'].min(),
+ self.lon_bnds['data'].max(), self.lat_bnds['data'].max(), )
+ return bbox
+
+
+def spatial_join_nearest(self, ext_shp, info=False):
+ """
+ Perform the spatial join using the nearest method
+
+ Parameters
+ ----------
+ self : nes.Nes
+ ext_shp : GeoDataFrame
+ External shapefile
+ info : bool
+ Indicates if you want to print the information
+ """
+ if self.master and info:
+ print("\tNearest spatial joint")
+ sys.stdout.flush()
+ grid_shp = self.get_centroids_from_coordinates()
+ # From geodetic coordinates (e.g. 4326) to meters (e.g. 4328) to use sjoin_nearest
+ # TODO: Check if the projection 4328 does not distort the coordinates too much
+ # https://gis.stackexchange.com/questions/372564/
+ # userwarning-when-trying-to-get-centroid-from-a-polygon-geopandas
+ # ext_shp = ext_shp.to_crs('EPSG:4328')
+ # grid_shp = grid_shp.to_crs('EPSG:4328')
+
+ # Calculate spatial joint by distance
+ aux_grid = gpd.sjoin_nearest(grid_shp, ext_shp, distance_col='distance')
+
+ # Get data from closest shapes to centroids
+ del aux_grid['geometry'], aux_grid['index_right']
+ self.shapefile.loc[aux_grid.index, aux_grid.columns] = aux_grid
+
+ var_list = list(ext_shp.columns)
+ var_list.remove('geometry')
+ for var_name in var_list:
+ self.shapefile.loc[:, var_name] = np.array(self.shapefile.loc[:, var_name], dtype=ext_shp[var_name].dtype)
+
+ return None
+
+
+def spatial_join_centroid(self, ext_shp, info=False):
+ """
+ Perform the spatial join using the centroid method
+
+ Parameters
+ ----------
+ self : nes.Nes
+ ext_shp : GeoDataFrame
+ External shapefile
+ info : bool
+ Indicates if you want to print the information
+ """
+ if self.master and info:
+ print("\tCentroid spatial join")
+ sys.stdout.flush()
+ if info and self.master:
+ print("\t\tCalculating centroids")
+ sys.stdout.flush()
+ # Get centroids
+ grid_shp = self.get_centroids_from_coordinates()
+
+ # Calculate spatial joint
+ if info and self.master:
+ print("\t\tCalculating centroid spatial join")
+ sys.stdout.flush()
+ aux_grid = gpd.sjoin(grid_shp, ext_shp, predicate='within')
+
+ # Get data from shapes where there are centroids, rest will be NaN
+ del aux_grid['geometry'], aux_grid['index_right']
+ self.shapefile.loc[aux_grid.index, aux_grid.columns] = aux_grid
+
+ var_list = list(ext_shp.columns)
+ var_list.remove('geometry')
+ for var_name in var_list:
+ self.shapefile.loc[:, var_name] = np.array(self.shapefile.loc[:, var_name], dtype=ext_shp[var_name].dtype)
+
+ return None
+
+
+def spatial_join_intersection(self, ext_shp, info=False):
+ """
+ Perform the spatial join using the intersection method
+
+ Parameters
+ ----------
+ self : nes.Nes
+ ext_shp : GeoDataFrame
+ External shapefile
+ info : bool
+ Indicates if you want to print the information
+ """
+ var_list = list(ext_shp.columns)
+ var_list.remove('geometry')
+
+ grid_shp = self.shapefile
+
+ grid_shp['FID_grid'] = grid_shp.index
+ grid_shp = grid_shp.reset_index()
+ # Get intersected areas
+ # inp, res = ext_shp.sindex.query_bulk(grid_shp.geometry, predicate='intersects')
+ inp, res = grid_shp.sindex.query_bulk(ext_shp.geometry, predicate='intersects')
+
+ if info:
+ print('\t\tRank {0:03d}: {1} intersected areas found'.format(self.rank, len(inp)))
+ sys.stdout.flush()
+ # Calculate intersected areas and fractions
+ intersection = pd.DataFrame(columns=['FID', 'ext_shp_id', 'weight'])
+ intersection['FID'] = np.array(grid_shp.loc[res, 'FID_grid'], dtype=np.uint32)
+ intersection['ext_shp_id'] = np.array(inp, dtype=np.uint32)
+
+ if len(intersection) > 0:
+ if True:
+ # No Warnings Zone
+ counts = intersection['FID'].value_counts()
+ warnings.filterwarnings('ignore')
+ intersection.loc[:, 'weight'] = 1.
+
+ for i, row in intersection.iterrows():
+ if isinstance(i, int) and i % 1000 == 0 and info:
+ print('\t\t\tRank {0:03d}: {1:.3f} %'.format(self.rank, i * 100 / len(intersection)))
+ sys.stdout.flush()
+ # Filter to do not calculate percentages over 100% grid cells spatial joint
+ if counts[row['FID']] > 1:
+ try:
+ intersection.loc[i, 'weight'] = grid_shp.loc[res[i], 'geometry'].intersection(
+ ext_shp.loc[inp[i], 'geometry']).area / grid_shp.loc[res[i], 'geometry'].area
+ except TopologicalError:
+ # If for some reason the geometry is corrupted it should work with the buffer function
+ ext_shp.loc[[inp[i]], 'geometry'] = ext_shp.loc[[inp[i]], 'geometry'].buffer(0)
+ intersection.loc[i, 'weight'] = grid_shp.loc[res[i], 'geometry'].intersection(
+ ext_shp.loc[inp[i], 'geometry']).area / grid_shp.loc[res[i], 'geometry'].area
+ # intersection['intersect_area'] = intersection.apply(
+ # lambda x: x['geometry_grid'].intersection(x['geometry_ext']).area, axis=1)
+ intersection.drop(intersection[intersection['weight'] <= 0].index, inplace=True)
+
+ warnings.filterwarnings('default')
+
+ # Choose the biggest area from intersected areas with multiple options
+ intersection.sort_values('weight', ascending=False, inplace=True)
+ intersection = intersection.drop_duplicates(subset='FID', keep="first")
+ intersection = intersection.sort_values('FID').set_index('FID')
+
+ for var_name in var_list:
+ self.shapefile.loc[intersection.index, var_name] = np.array(
+ ext_shp.loc[intersection['ext_shp_id'], var_name])
+ else:
+ for var_name in var_list:
+ self.shapefile.loc[:, var_name] = np.nan
+ for var_name in var_list:
+ self.shapefile.loc[:, var_name] = np.array(self.shapefile.loc[:, var_name], dtype=ext_shp[var_name].dtype)
+ return None
diff --git a/nes/nc_projections/default_nes.py b/nes/nc_projections/default_nes.py
index a5cdb8af2f83571d2f81aef7e09b4e1cb9f2d313..ab85ea16d5a155e33beb00ab42dd8bb57c48aa17 100644
--- a/nes/nc_projections/default_nes.py
+++ b/nes/nc_projections/default_nes.py
@@ -9,15 +9,13 @@ from xarray import open_dataset
from netCDF4 import Dataset, num2date, date2num
from mpi4py import MPI
from cfunits import Units
-from numpy.ma.core import MaskError
+from shapely.geos import TopologicalError
import geopandas as gpd
from shapely.geometry import Polygon, Point
from copy import deepcopy, copy
import datetime
import pyproj
-from ..methods import vertical_interpolation
-from ..methods import horizontal_interpolation
-from ..methods import cell_measures
+from ..methods import vertical_interpolation, horizontal_interpolation, cell_measures, spatial_join
from ..nes_formats import to_netcdf_cams_ra
@@ -69,7 +67,7 @@ class Nes(object):
write_axis_limits : dict
Dictionary with the 4D limits of the rank data to write.
t_min, t_max, z_min, z_max, y_min, y_max, x_min and x_max.
- time : List
+ time : List[datetime]
List of time steps of the rank data.
lev : dict
Vertical levels dictionary with the portion of 'data' corresponding to the rank values.
@@ -79,12 +77,12 @@ class Nes(object):
Longitudes dictionary with the portion of 'data' corresponding to the rank values.
global_attrs : dict
Global attributes with the attribute name as key and data as values.
- _var_dim : None, tuple
- Tuple with the name of the Y and X dimensions for the variables.
- _lat_dim : None, tuple
- Tuple with the name of the dimensions of the Latitude values.
- _lon_dim : None, tuple
- Tuple with the name of the dimensions of the Longitude values.
+ _var_dim : None or tuple
+ Name of the Y and X dimensions for the variables.
+ _lat_dim : None or tuple
+ Name of the dimensions of the Latitude values.
+ _lon_dim : None or tuple
+ Name of the dimensions of the Longitude values.
"""
def __init__(self, comm=None, path=None, info=False, dataset=None, xarray=False, parallel_method='Y',
avoid_first_hours=0, avoid_last_hours=0, first_level=0, last_level=None, create_nes=False,
@@ -102,7 +100,7 @@ class Nes(object):
Indicates if you want to get reading/writing info.
dataset: Dataset
NetCDF4-python Dataset to initialize the class.
- xarray: bool:
+ xarray: bool
(Not working) Indicates if you want to use xarray as default.
parallel_method : str
Indicates the parallelization method that you want. Default over Y axis
@@ -116,11 +114,11 @@ class Nes(object):
Number of hours to remove from last time steps.
first_level : int
Index of the first level to use.
- last_level : int, None
+ last_level : int or None
Index of the last level to use. None if it is the last.
create_nes : bool
Indicates if you want to create the object from scratch (True) or through an existing file.
- times : List, None
+ times : List[datetime] or None
List of times to substitute the current ones while creation.
kwargs :
Projection dependent parameters to create it from scratch
@@ -154,6 +152,7 @@ class Nes(object):
# Define parallel method
self.parallel_method = parallel_method
+ self.serial_nc = None # Place to store temporally the serial Nes instance
# Get minor and major axes of Earth
self.earth_radius = self.get_earth_radius('WGS84')
@@ -191,6 +190,10 @@ class Nes(object):
# Set NetCDF attributes
self.global_attrs = self.__get_global_attributes(create_nes)
+ # Set string length
+ # 75 is the standard value used in GHOST data
+ self.strlen = 75
+
else:
if dataset is not None:
@@ -243,6 +246,9 @@ class Nes(object):
# Set NetCDF attributes
self.global_attrs = self.__get_global_attributes()
+ # Get string length
+ self.strlen = self._get_strlen()
+
# Writing options
self.zip_lvl = 0
@@ -253,6 +259,16 @@ class Nes(object):
self.vertical_var_name = None
+ # Filtering (portion of the filter coordinates function)
+ idx = self.get_idx_intervals()
+ self._time = self._time[idx['idx_t_min']:idx['idx_t_max']]
+ self._lev['data'] = self._lev['data'][idx['idx_z_min']:idx['idx_z_max']]
+
+ self.hours_start = 0
+ self.hours_end = 0
+ self.last_level = None
+ self.first_level = None
+
@staticmethod
def new(comm=None, path=None, info=False, dataset=None, xarray=False, create_nes=False, balanced=False,
parallel_method='Y', avoid_first_hours=0, avoid_last_hours=0, first_level=0, last_level=None):
@@ -269,7 +285,7 @@ class Nes(object):
Indicates if you want to get reading/writing info.
dataset: Dataset
NetCDF4-python Dataset to initialize the class.
- xarray: bool:
+ xarray: bool
(Not working) Indicates if you want to use xarray as default.
avoid_first_hours : int
Number of hours to remove from first time steps.
@@ -283,7 +299,7 @@ class Nes(object):
Balanced dataset cannot be written in chunking mode.
first_level : int
Index of the first level to use.
- last_level : int, None
+ last_level : int or None
Index of the last level to use. None if it is the last.
create_nes : bool
Indicates if you want to create the object from scratch (True) or through an existing file.
@@ -295,6 +311,37 @@ class Nes(object):
return new
+ def _get_strlen(self, strlen=75):
+ """
+ Get the strlen
+
+ Parameters
+ ----------
+ strlen : int
+ Max length of the string
+ """
+
+ if 'strlen' in self.netcdf.dimensions:
+ strlen = self.netcdf.dimensions['strlen'].size
+ else:
+ strlen = strlen
+
+ return strlen
+
+ def set_strlen(self, strlen=75):
+ """
+ Set the strlen
+
+ Parameters
+ ----------
+ strlen : int
+ Max length of the string
+ """
+
+ self.strlen = strlen
+
+ return None
+
def __del__(self):
"""
To delete the Nes object and close all the open datasets.
@@ -318,6 +365,7 @@ class Nes(object):
del self.lat_bnds
del self._lon_bnds
del self.lon_bnds
+ del self.strlen
del self.shapefile
for cell_measure in self.cell_measures.keys():
if self.cell_measures[cell_measure]['data'] is not None:
@@ -342,7 +390,7 @@ class Nes(object):
"""
d = self.__dict__
- state = {k: d[k] for k in d if k not in ['comm', 'variables', 'netcdf']}
+ state = {k: d[k] for k in d if k not in ['comm', 'variables', 'netcdf', 'cell_measures']}
return state
@@ -360,6 +408,35 @@ class Nes(object):
return None
+ def __add__(self, other):
+ """
+ Sum two NES objects
+
+ Parameters
+ ----------
+ other : Nes
+ Nes to be summed
+
+ Returns
+ -------
+ Nes
+ Summed Nes object
+ """
+ nessy = self.copy(copy_vars=True)
+ for var_name in other.variables.keys():
+ if var_name not in nessy.variables.keys():
+ # Create New variable
+ nessy.variables[var_name] = deepcopy(other.variables[var_name])
+ else:
+ nessy.variables[var_name]['data'] += other.variables[var_name]['data']
+ return nessy
+
+ def __radd__(self, other):
+ if other == 0 or other is None:
+ return self
+ else:
+ return self.__add__(other)
+
def copy(self, copy_vars=False):
"""
Copy the Nes object.
@@ -379,9 +456,12 @@ class Nes(object):
nessy = deepcopy(self)
nessy.netcdf = None
if copy_vars:
- nessy.variables = nessy._get_lazy_variables()
+ nessy.set_communicator(self.comm)
+ nessy.variables = deepcopy(self.variables)
+ nessy.cell_measures = deepcopy(self.cell_measures)
else:
nessy.variables = {}
+ nessy.cell_measures = {}
return nessy
@@ -456,6 +536,22 @@ class Nes(object):
return None
+ def set_time(self, time_list):
+ """
+ Modify the original level values with new ones.
+
+ Parameters
+ ----------
+ time_list : List[datetime]
+ List of time steps
+ """
+ if self.parallel_method == 'T':
+ raise TypeError("Cannot set time on a 'T' parallel method")
+ self._time = deepcopy(time_list)
+ self.time = deepcopy(time_list)
+
+ return None
+
def set_time_bnds(self, time_bnds):
"""
Modify the original time bounds values with new ones.
@@ -480,15 +576,18 @@ class Nes(object):
msg += "The given time bounds list has a different length than the time array. "
msg += "(time:{0}, bnds:{1}). Time bounds will not be set.".format(len(self._time), len(time_bnds))
warnings.warn(msg)
+ sys.stderr.flush()
else:
msg = 'WARNING!!! '
msg += 'There is at least one element in the time bounds to be set that is not a datetime object. '
msg += 'Time bounds will not be set.'
warnings.warn(msg)
+ sys.stderr.flush()
return None
- def create_single_spatial_bounds(self, coordinates, inc, spatial_nv=2, inverse=False):
+ @staticmethod
+ def create_single_spatial_bounds(coordinates, inc, spatial_nv=2, inverse=False):
"""
Calculate the vertices coordinates.
@@ -499,7 +598,7 @@ class Nes(object):
inc : float
Increment between centre values.
spatial_nv : int
- Non mandatory parameter that informs the number of vertices that the boundaries must have. Default: 2.
+ Non-mandatory parameter that informs the number of vertices that the boundaries must have. Default: 2.
inverse : bool
For some grid latitudes.
@@ -538,20 +637,14 @@ class Nes(object):
inc_lat = np.abs(np.mean(np.diff(self._lat['data'])))
lat_bnds = self.create_single_spatial_bounds(self._lat['data'], inc_lat, spatial_nv=2)
- self._lat_bnds = {}
- self._lat_bnds['data'] = deepcopy(lat_bnds)
- self.lat_bnds = {}
- self.lat_bnds['data'] = lat_bnds[self.read_axis_limits['y_min']:self.read_axis_limits['y_max'],
- :]
+ self._lat_bnds = {'data': deepcopy(lat_bnds)}
+ self.lat_bnds = {'data': lat_bnds[self.read_axis_limits['y_min']:self.read_axis_limits['y_max'], :]}
inc_lon = np.abs(np.mean(np.diff(self._lon['data'])))
lon_bnds = self.create_single_spatial_bounds(self._lon['data'], inc_lon, spatial_nv=2)
- self._lon_bnds = {}
- self._lon_bnds['data'] = deepcopy(lon_bnds)
- self.lon_bnds = {}
- self.lon_bnds['data'] = lon_bnds[self.read_axis_limits['x_min']:self.read_axis_limits['x_max'],
- :]
+ self._lon_bnds = {'data': deepcopy(lon_bnds)}
+ self.lon_bnds = {'data': lon_bnds[self.read_axis_limits['x_min']:self.read_axis_limits['x_max'], :]}
return None
@@ -563,9 +656,9 @@ class Nes(object):
Returns
-------
- lon_bnds_mesh : numpy.array
+ lon_bnds_mesh : numpy.ndarray
Longitude boundaries in the mesh format
- lat_bnds_mesh : numpy.array
+ lat_bnds_mesh : numpy.ndarray
Latitude boundaries in the mesh format
"""
if self.size > 1:
@@ -595,17 +688,17 @@ class Nes(object):
lon_bnds_mesh[1:, 1:] = self.lon_bnds['data'][:, :, 2]
lon_bnds_mesh[1:, :-1] = self.lon_bnds['data'][:, :, 3]
else:
- raise RuntimeError("Invalid number of vertices: {0}".format(self.lat_bnds['data'].shape[-1] ))
+ raise RuntimeError("Invalid number of vertices: {0}".format(self.lat_bnds['data'].shape[-1]))
return lon_bnds_mesh, lat_bnds_mesh
def free_vars(self, var_list):
"""
- Erase the selected variables from the variables information.
+ Erase the selected variables from the variables' information.
Parameters
----------
- var_list : List, str, list
+ var_list : List or str
List (or single string) of the variables to be loaded.
"""
@@ -632,7 +725,7 @@ class Nes(object):
Parameters
----------
- var_list : List, str
+ var_list : List or str
List (or single string) of the variables to be loaded.
"""
@@ -976,7 +1069,7 @@ class Nes(object):
self.set_time_bnds(aux_time_bounds)
elif type_op == 'withoutt0':
- for var_name, var_info in self.variables.items ():
+ for var_name, var_info in self.variables.items():
if var_info['data'] is None:
self.load(var_name)
if op == 'mean':
@@ -1191,10 +1284,10 @@ class Nes(object):
rows_sum = 0
for proc in range(self.size):
- fid_dist[proc] = {'x_min': None, 'x_max': None,
- 'y_min': None, 'y_max': None,
- 'z_min': None, 'z_max': None,
- 't_min': None, 't_max': None}
+ fid_dist[proc] = {'x_min': 0, 'x_max': None,
+ 'y_min': 0, 'y_max': None,
+ 'z_min': 0, 'z_max': None,
+ 't_min': 0, 't_max': None}
if proc < procs_rows_extended:
aux_rows = procs_len + 1
else:
@@ -1359,7 +1452,10 @@ class Nes(object):
"""
Close the NetCDF with netcdf4-python.
"""
-
+ if (hasattr(self, 'serial_nc')) and (self.serial_nc is not None):
+ if self.master:
+ self.serial_nc.close()
+ self.serial_nc = None
if (hasattr(self, 'netcdf')) and (self.netcdf is not None):
self.netcdf.close()
self.netcdf = None
@@ -1423,6 +1519,7 @@ class Nes(object):
"""
units = self.__parse_time_unit(time.units)
+
if not hasattr(time, 'calendar'):
calendar = 'standard'
else:
@@ -1477,7 +1574,6 @@ class Nes(object):
if self.master:
nc_var = self.netcdf.variables['time']
time_data, units, calendar = self.__parse_time(nc_var)
-
time = num2date(time_data, units, calendar=calendar)
time = [aux.replace(second=0, microsecond=0) for aux in time]
else:
@@ -1536,9 +1632,9 @@ class Nes(object):
Returns
-------
lat_bnds : List
- List of latitude bounds of the NetCDF data.
+ Latitude bounds of the NetCDF data.
lon_bnds : List
- List of longitude bounds of the NetCDF data.
+ Longitude bounds of the NetCDF data.
"""
if self.is_xarray:
@@ -1548,13 +1644,11 @@ class Nes(object):
if self.master:
if not create_nes:
if 'lat_bnds' in self.netcdf.variables.keys():
- lat_bnds = {}
- lat_bnds['data'] = self.netcdf.variables['lat_bnds'][:]
+ lat_bnds = {'data': self.netcdf.variables['lat_bnds'][:]}
else:
lat_bnds = None
if 'lon_bnds' in self.netcdf.variables.keys():
- lon_bnds = {}
- lon_bnds['data'] = self.netcdf.variables['lon_bnds'][:]
+ lon_bnds = {'data': self.netcdf.variables['lon_bnds'][:]}
else:
lon_bnds = None
else:
@@ -1581,21 +1675,21 @@ class Nes(object):
Returns
-------
- cell_measures : dict
+ dict
Dictionary of cell measures of the NetCDF data.
"""
- cell_measures = {}
+ c_measures = {}
if self.master:
if not create_nes:
if 'cell_area' in self.netcdf.variables.keys():
- cell_measures['cell_area'] = {}
- cell_measures['cell_area']['data'] = self.netcdf.variables['cell_area'][:]
- cell_measures = self.comm.bcast(cell_measures, root=0)
+ c_measures['cell_area'] = {}
+ c_measures['cell_area']['data'] = self.netcdf.variables['cell_area'][:]
+ c_measures = self.comm.bcast(c_measures, root=0)
self.free_vars(['cell_area'])
- return cell_measures
+ return c_measures
def _get_coordinate_dimension(self, possible_names):
"""
@@ -1795,29 +1889,57 @@ class Nes(object):
self.read_axis_limits['x_min']:self.read_axis_limits['x_max']]
data = data.reshape(1, 1, data.shape[-2], data.shape[-1])
elif len(var_dims) == 3:
- data = nc_var[self.read_axis_limits['t_min']:self.read_axis_limits['t_max'],
- self.read_axis_limits['y_min']:self.read_axis_limits['y_max'],
- self.read_axis_limits['x_min']:self.read_axis_limits['x_max']]
- data = data.reshape(data.shape[-3], 1, data.shape[-2], data.shape[-1])
+ if 'strlen' in var_dims:
+ data = nc_var[self.read_axis_limits['y_min']:self.read_axis_limits['y_max'],
+ self.read_axis_limits['x_min']:self.read_axis_limits['x_max'],
+ :]
+ data_aux = np.empty(shape=(data.shape[0], data.shape[1]), dtype=np.object)
+ for lat_n in range(data.shape[0]):
+ for lon_n in range(data.shape[1]):
+ data_aux[lat_n, lon_n] = ''.join(
+ data[lat_n, lon_n].tostring().decode('ascii').replace('\x00', ''))
+ data = data_aux.reshape((1, 1, data_aux.shape[-2], data_aux.shape[-1]))
+ else:
+ data = nc_var[self.read_axis_limits['t_min']:self.read_axis_limits['t_max'],
+ self.read_axis_limits['y_min']:self.read_axis_limits['y_max'],
+ self.read_axis_limits['x_min']:self.read_axis_limits['x_max']]
+ data = data.reshape(data.shape[-3], 1, data.shape[-2], data.shape[-1])
elif len(var_dims) == 4:
data = nc_var[self.read_axis_limits['t_min']:self.read_axis_limits['t_max'],
self.read_axis_limits['z_min']:self.read_axis_limits['z_max'],
self.read_axis_limits['y_min']:self.read_axis_limits['y_max'],
self.read_axis_limits['x_min']:self.read_axis_limits['x_max']]
- # elif len(var_dims) == 5:
- # data = nc_var[self.read_axis_limits['t_min']:self.read_axis_limits['t_max'],
- # :,
- # self.read_axis_limits['z_min']:self.read_axis_limits['z_max'],
- # self.read_axis_limits['y_min']:self.read_axis_limits['y_max'],
- # self.read_axis_limits['x_min']:self.read_axis_limits['x_max']]
+ elif len(var_dims) == 5:
+ if 'strlen' in var_dims:
+ data = nc_var[self.read_axis_limits['t_min']:self.read_axis_limits['t_max'],
+ self.read_axis_limits['z_min']:self.read_axis_limits['z_max'],
+ self.read_axis_limits['y_min']:self.read_axis_limits['y_max'],
+ self.read_axis_limits['x_min']:self.read_axis_limits['x_max'],
+ :]
+ data_aux = np.empty(shape=(data.shape[0], data.shape[1], data.shape[2], data.shape[3]), dtype=np.object)
+ for time_n in range(data.shape[0]):
+ for lev_n in range(data.shape[1]):
+ for lat_n in range(data.shape[2]):
+ for lon_n in range(data.shape[3]):
+ data_aux[time_n, lev_n, lat_n, lon_n] = ''.join(
+ data[time_n, lev_n, lat_n, lon_n].tostring().decode('ascii').replace('\x00', ''))
+ data = data_aux
+ else:
+ # data = nc_var[self.read_axis_limits['t_min']:self.read_axis_limits['t_max'],
+ # :,
+ # self.read_axis_limits['z_min']:self.read_axis_limits['z_max'],
+ # self.read_axis_limits['y_min']:self.read_axis_limits['y_max'],
+ # self.read_axis_limits['x_min']:self.read_axis_limits['x_max']]
+ raise NotImplementedError('Error with {0}. Only can be read netCDF with 4 dimensions or less'.format(
+ var_name))
else:
raise NotImplementedError('Error with {0}. Only can be read netCDF with 4 dimensions or less'.format(
var_name))
+
# Missing to nan
- try:
- data[data.shapefile == True] = np.nan
- except (AttributeError, MaskError, ValueError):
- pass
+ if np.ma.is_masked(data):
+ # This operation is done because sometimes the missing value is lost during the calculation
+ data[data.mask] = np.nan
return data
@@ -2025,10 +2147,10 @@ class Nes(object):
rows_sum = 0
for proc in range(self.size):
- fid_dist[proc] = {'x_min': None, 'x_max': None,
- 'y_min': None, 'y_max': None,
- 'z_min': None, 'z_max': None,
- 't_min': None, 't_max': None}
+ fid_dist[proc] = {'x_min': 0, 'x_max': None,
+ 'y_min': 0, 'y_max': None,
+ 'z_min': 0, 'z_max': None,
+ 't_min': 0, 't_max': None}
if proc < procs_rows_extended:
aux_rows = procs_len + 1
else:
@@ -2075,6 +2197,9 @@ class Nes(object):
netcdf.createDimension('lon', len(self._lon['data']))
netcdf.createDimension('lat', len(self._lat['data']))
+ # Create string length dimension
+ netcdf.createDimension('strlen', self.strlen)
+
return None
def _create_dimension_variables(self, netcdf):
@@ -2089,7 +2214,7 @@ class Nes(object):
# TIMES
time_var = netcdf.createVariable('time', np.float64, ('time',), zlib=self.zip_lvl > 0, complevel=self.zip_lvl)
- time_var.units = 'hours since {0}'.format( self._time[0].strftime('%Y-%m-%d %H:%M:%S'))
+ time_var.units = 'hours since {0}'.format(self._time[0].strftime('%Y-%m-%d %H:%M:%S'))
time_var.standard_name = 'time'
time_var.calendar = 'standard'
time_var.long_name = 'time'
@@ -2181,6 +2306,10 @@ class Nes(object):
for var_name in self.variables.keys():
self.variables[var_name]['cell_measures'] = 'area: cell_area'
+ if self.info:
+ print("Rank {0:03d}: Cell measures done".format(self.rank))
+ return None
+
def _create_variables(self, netcdf, chunking=False):
"""
Create the netCDF file variables.
@@ -2194,101 +2323,237 @@ class Nes(object):
"""
for i, (var_name, var_dict) in enumerate(self.variables.items()):
- if var_dict['data'] is not None:
+
+ if isinstance(var_dict['data'], int) and var_dict['data'] == 0:
+ var_dims = ('time', 'lev',) + self._var_dim
+ var_dtype = np.float32
+ else:
+ # Get dimensions
+ if var_dict['data'] is None or len(var_dict['data'].shape) == 4:
+ var_dims = ('time', 'lev',) + self._var_dim
+ else:
+ var_dims = self._var_dim
+
+ # Get data type
+ if 'dtype' in var_dict.keys():
+ var_dtype = var_dict['dtype']
+ if var_dict['data'] is not None and var_dtype != var_dict['data'].dtype:
+ msg = "WARNING!!! "
+ msg += "Different data types for variable {0}. ".format(var_name)
+ msg += "Input dtype={0}. Data dtype={1}.".format(var_dtype, var_dict['data'].dtype)
+ warnings.warn(msg)
+ sys.stderr.flush()
+ try:
+ var_dict['data'] = var_dict['data'].astype(var_dtype)
+ except Exception as e: # TODO: Detect exception
+ print(e)
+ raise TypeError("It was not possible to cast the data to the input dtype.")
+ else:
+ var_dtype = var_dict['data'].dtype
+
+ # Transform objects into strings
+ if var_dtype == np.dtype(object):
+ var_dict['data'] = var_dict['data'].astype(str)
+ var_dtype = var_dict['data'].dtype
+
+ # Convert list of strings to chars for parallelization
+ if not np.issubdtype(var_dtype, np.number):
+ try:
+ # Get unicode
+ unicode_type = len(max(var_dict['data'].flatten(), key=len))
+
+ if ((var_dict['data'].dtype == np.dtype(' 0, complevel=self.zip_lvl)
+ else:
+ if self.balanced:
+ raise NotImplementedError("A balanced data cannot be chunked.")
+ if self.master:
+ chunk_size = var_dict['data'].shape
+ else:
+ chunk_size = None
+ chunk_size = self.comm.bcast(chunk_size, root=0)
+ var = netcdf.createVariable(var_name, var_dtype, var_dims,
+ zlib=self.zip_lvl > 0, complevel=self.zip_lvl,
+ chunksizes=chunk_size)
+ if self.info:
+ print("Rank {0:03d}: Var {1} created ({2}/{3})".format(
+ self.rank, var_name, i + 1, len(self.variables)))
+ if self.size > 1:
+ var.set_collective(True)
if self.info:
- print("Rank {0:03d}: Writing {1} var ({2}/{3})".format(
+ print("Rank {0:03d}: Var {1} collective ({2}/{3})".format(
self.rank, var_name, i + 1, len(self.variables)))
- try:
- if not chunking:
- var = netcdf.createVariable(var_name, var_dict['data'].dtype, ('time', 'lev',) + self._var_dim,
- zlib=self.zip_lvl > 0, complevel=self.zip_lvl)
- else:
- if self.balanced:
- raise NotImplementedError("A balanced data cannot be chunked.")
- if self.master:
- chunk_size = var_dict['data'].shape
- else:
- chunk_size = None
- chunk_size = self.comm.bcast(chunk_size, root=0)
- var = netcdf.createVariable(var_name, var_dict['data'].dtype, ('time', 'lev',) + self._var_dim,
- zlib=self.zip_lvl > 0, complevel=self.zip_lvl,
- chunksizes=chunk_size)
- if self.info:
- print("Rank {0:03d}: Var {1} created ({2}/{3})".format(
- self.rank, var_name, i + 1, len(self.variables)))
- if self.size > 1:
- var.set_collective(True)
+
+ for att_name, att_value in var_dict.items():
+ if att_name == 'data':
+
+ if att_value is not None:
+ if self.info:
+ print("Rank {0:03d}: Filling {1})".format(self.rank, var_name))
+ if isinstance(att_value, int) and att_value == 0:
+ var[self.write_axis_limits['t_min']:self.write_axis_limits['t_max'],
+ self.write_axis_limits['z_min']:self.write_axis_limits['z_max'],
+ self.write_axis_limits['y_min']:self.write_axis_limits['y_max'],
+ self.write_axis_limits['x_min']:self.write_axis_limits['x_max']] = 0
+
+ elif len(att_value.shape) == 5:
+ if 'strlen' in var_dims:
+ var[self.write_axis_limits['t_min']:self.write_axis_limits['t_max'],
+ self.write_axis_limits['z_min']:self.write_axis_limits['z_max'],
+ self.write_axis_limits['y_min']:self.write_axis_limits['y_max'],
+ self.write_axis_limits['x_min']:self.write_axis_limits['x_max'],
+ :] = att_value
+ else:
+ raise NotImplementedError('It is not possible to write 5D variables.')
+
+ elif len(att_value.shape) == 4:
+ var[self.write_axis_limits['t_min']:self.write_axis_limits['t_max'],
+ self.write_axis_limits['z_min']:self.write_axis_limits['z_max'],
+ self.write_axis_limits['y_min']:self.write_axis_limits['y_max'],
+ self.write_axis_limits['x_min']:self.write_axis_limits['x_max']] = att_value
+
+ elif len(att_value.shape) == 3:
+ if 'strlen' in var_dims:
+ var[self.write_axis_limits['y_min']:self.write_axis_limits['y_max'],
+ self.write_axis_limits['x_min']:self.write_axis_limits['x_max'],
+ :] = att_value
+ else:
+ raise NotImplementedError('It is not possible to write 3D variables.')
+
if self.info:
- print("Rank {0:03d}: Var {1} collective ({2}/{3})".format(
+ print("Rank {0:03d}: Var {1} data ({2}/{3})".format(
self.rank, var_name, i + 1, len(self.variables)))
+ elif att_name not in ['chunk_size', 'var_dims', 'dimensions', 'dtype']:
+ var.setncattr(att_name, att_value)
+
+ self._set_var_crs(var)
+ if self.info:
+ print("Rank {0:03d}: Var {1} completed ({2}/{3})".format(
+ self.rank, var_name, i + 1, len(self.variables)))
+ return None
+
+ def append_time_step_data(self, i_time):
+ """
+ Fill the netCDF data for the indicated index time.
- for att_name, att_value in var_dict.items():
- if att_name == 'data':
+ Parameters
+ ----------
+ i_time : int
+ index of the time step to write
+ """
+ if self.serial_nc is not None:
+ try:
+ data = self._gather_data(self.variables)
+ except KeyError:
+ # Key Error means string data
+ data = self.__gather_data_py_object(self.variables)
+ if self.master:
+ self.serial_nc.variables = data
+ self.serial_nc.append_time_step_data(i_time)
+ self.comm.Barrier()
+ else:
+ for i, (var_name, var_dict) in enumerate(self.variables.items()):
+ for att_name, att_value in var_dict.items():
+ if att_name == 'data':
+
+ if att_value is not None:
if self.info:
print("Rank {0:03d}: Filling {1})".format(self.rank, var_name))
- try:
- var[self.write_axis_limits['t_min']:self.write_axis_limits['t_max'],
+ var = self.netcdf.variables[var_name]
+ if isinstance(att_value, int) and att_value == 0:
+ var[i_time,
self.write_axis_limits['z_min']:self.write_axis_limits['z_max'],
self.write_axis_limits['y_min']:self.write_axis_limits['y_max'],
- self.write_axis_limits['x_min']:self.write_axis_limits['x_max']] = att_value
- except ValueError:
- var[self.write_axis_limits['t_min']:self.write_axis_limits['t_max'],
- 0,
+ self.write_axis_limits['x_min']:self.write_axis_limits['x_max']] = 0
+ elif len(att_value.shape) == 4:
+ var[i_time,
+ self.write_axis_limits['z_min']:self.write_axis_limits['z_max'],
self.write_axis_limits['y_min']:self.write_axis_limits['y_max'],
self.write_axis_limits['x_min']:self.write_axis_limits['x_max']] = att_value
- # msg = "*WARNING* '{0}' variable is a 3D field. Setting it on first (0) layer.".format(
- # var_name)
- # warn(msg)
- except IndexError:
- raise IndexError("Different shapes. out_shape={0}, data_shp={1}".format(
- var[self.write_axis_limits['t_min']:self.write_axis_limits['t_max'],
- self.write_axis_limits['z_min']:self.write_axis_limits['z_max'],
- self.write_axis_limits['y_min']:self.write_axis_limits['y_max'],
- self.write_axis_limits['x_min']:self.write_axis_limits['x_max']].shape,
- att_value.shape))
+
+ elif len(att_value.shape) == 3:
+ raise NotImplementedError('It is not possible to write 3D variables.')
+ else:
+ raise NotImplementedError("SHAPE APPEND ERROR: {0}".format(att_value.shape))
if self.info:
- print("Rank {0:03d}: Var {1} data ({2}/{3})".format(self.rank, var_name, i + 1,
- len(self.variables)))
- elif att_name not in ['chunk_size', 'var_dims', 'dimensions']:
- var.setncattr(att_name, att_value)
- self._set_var_crs(var)
- if self.info:
- print("Rank {0:03d}: Var {1} completed ({2}/{3})".format(self.rank, var_name, i + 1,
- len(self.variables)))
- except Exception as e:
- print("**ERROR** an error has occurred while writing the '{0}' variable".format(var_name))
- # print("**ERROR** an error has occurredred while writing the '{0}' variable".format(var_name),
- # file=sys.stderr)
- raise e
- else:
- msg = 'WARNING!!! '
- msg += 'Variable {0} was not loaded. It will not be written.'.format(var_name)
- warnings.warn(msg)
+ print("Rank {0:03d}: Var {1} data ({2}/{3})".format(
+ self.rank, var_name, i + 1, len(self.variables)))
+ else:
+ raise ValueError("Cannot append None Data for {0}".format(var_name))
+ else:
+ # Metadata already writen
+ pass
return None
- def _create_centre_coordinates(self):
- """
- Must be implemented on inner class.
+ def _create_centre_coordinates(self, **kwargs):
"""
+ Calculate centre latitudes and longitudes from grid details.
- return None
+ Must be implemented on inner classes
- def _create_metadata(self, netcdf):
- """
- Must be implemented on inner class.
+ Returns
+ ----------
+ centre_lat : dict
+ Dictionary with data of centre latitudes in 1D
+ centre_lon : dict
+ Dictionary with data of centre longitudes in 1D
"""
return None
- def _set_crs(self, netcdf):
+ def _create_metadata(self, netcdf):
"""
Must be implemented on inner class.
-
- Parameters
- ----------
- netcdf : Dataset
- netcdf4-python Dataset.
"""
return None
@@ -2306,7 +2571,7 @@ class Nes(object):
return None
- def __to_netcdf_py(self, path, chunking=False):
+ def __to_netcdf_py(self, path, chunking=False, keep_open=False):
"""
Create the NetCDF using netcdf4-python methods.
@@ -2338,8 +2603,6 @@ class Nes(object):
# Create cell measures
self._create_cell_measures(netcdf)
- if self.info:
- print("Rank {0:03d}: Cell measures done".format(self.rank))
# Create variables
self._create_variables(netcdf, chunking=chunking)
@@ -2353,15 +2616,18 @@ class Nes(object):
netcdf.setncattr(att_name, att_value)
netcdf.setncattr('Conventions', 'CF-1.7')
- netcdf.close()
+ if keep_open:
+ self.netcdf = netcdf
+ else:
+ netcdf.close()
return None
def __to_netcdf_cams_ra(self, path):
return to_netcdf_cams_ra(self, path)
- def to_netcdf(self, path, compression_level=0, serial=False, info=False,
- chunking=False, type='NES'):
+ def to_netcdf(self, path, compression_level=0, serial=False, info=False, chunking=False, type='NES',
+ keep_open=False):
"""
Write the netCDF output file.
@@ -2376,37 +2642,50 @@ class Nes(object):
info : bool
Indicates if you want to print the information of each writing step by stdout Default: False.
chunking : bool
- Indicates if you want a chunked netCDF output. Only available with non serial writes. Default: False.
+ Indicates if you want a chunked netCDF output. Only available with non-serial writes. Default: False.
+ type : str
+ Type to NetCDf to write. 'CAMS_RA' or 'NES'
"""
-
+ nc_type = type
old_info = self.info
self.info = info
-
+ self.serial_nc = None
self.zip_lvl = compression_level
if self.is_xarray:
raise NotImplementedError("Writing with xarray not implemented")
else:
# if serial:
if serial and self.size > 1:
- data = self._gather_data()
+ try:
+ data = self._gather_data(self.variables)
+ except KeyError:
+ data = self.__gather_data_py_object(self.variables)
+ try:
+ c_measures = self._gather_data(self.cell_measures)
+ except KeyError:
+ c_measures = self.__gather_data_py_object(self.cell_measures)
if self.master:
new_nc = self.copy(copy_vars=False)
new_nc.set_communicator(MPI.COMM_SELF)
new_nc.variables = data
+ new_nc.cell_measures = c_measures
if type == 'NES':
- new_nc.__to_netcdf_py(path)
+ new_nc.__to_netcdf_py(path, keep_open=keep_open)
elif type == 'CAMS_RA':
new_nc.__to_netcdf_cams_ra(path)
else:
raise ValueError(
- "Unknown NetCDF type '{0}'. Use 'CAMS_RA' or 'NES'; default='NES'".format(type))
+ "Unknown NetCDF type '{0}'. Use 'CAMS_RA' or 'NES'; default='NES'".format(nc_type))
+ self.serial_nc = new_nc
+ else:
+ self.serial_nc = True
else:
- if type == 'NES':
- self.__to_netcdf_py(path, chunking=chunking)
- elif type == 'CAMS_RA':
+ if nc_type == 'NES':
+ self.__to_netcdf_py(path, chunking=chunking, keep_open=keep_open)
+ elif nc_type == 'CAMS_RA':
self.__to_netcdf_cams_ra(path)
else:
- raise ValueError("Unknown NetCDF type '{0}'. Use 'CAMS_RA' or 'NES'; default='NES'".format(type))
+ raise ValueError("Unknown NetCDF type '{0}'. Use 'CAMS_RA' or 'NES'; default='NES'".format(nc_type))
self.info = old_info
@@ -2522,17 +2801,27 @@ class Nes(object):
Dictionary with the grib2 keys.
grib_template_path : str
Path to the grib2 file to use as template.
+ lat_flip : bool
+ Indicates if the latitude values (and data) has to be flipped
info : bool
Indicates if you want to print extra information during the process.
"""
# if serial:
if self.parallel_method in ['X', 'Y'] and self.size > 1:
- data = self._gather_data()
+ try:
+ data = self._gather_data(self.variables)
+ except KeyError:
+ data = self.__gather_data_py_object(self.variables)
+ try:
+ c_measures = self._gather_data(self.cell_measures)
+ except KeyError:
+ c_measures = self.__gather_data_py_object(self.cell_measures)
if self.master:
new_nc = self.copy(copy_vars=False)
new_nc.set_communicator(MPI.COMM_SELF)
new_nc.variables = data
+ new_nc.cell_measures = c_measures
new_nc.__to_grib2(path, grib_keys, grib_template_path, lat_flip=lat_flip, info=info)
else:
self.__to_grib2(path, grib_keys, grib_template_path, lat_flip=lat_flip, info=info)
@@ -2548,50 +2837,55 @@ class Nes(object):
shapefile : GeoPandasDataFrame
Shapefile dataframe.
"""
+
+ if self.shapefile is None:
- if self._lat_bnds is None or self._lon_bnds is None:
- self.create_spatial_bounds()
-
- # Reshape arrays to create geometry
- aux_shape = (self.lat_bnds['data'].shape[0], self.lon_bnds['data'].shape[0], 4)
- lon_bnds_aux = np.empty(aux_shape)
- lon_bnds_aux[:, :, 0] = self.lon_bnds['data'][np.newaxis, :, 0]
- lon_bnds_aux[:, :, 1] = self.lon_bnds['data'][np.newaxis, :, 1]
- lon_bnds_aux[:, :, 2] = self.lon_bnds['data'][np.newaxis, :, 1]
- lon_bnds_aux[:, :, 3] = self.lon_bnds['data'][np.newaxis, :, 0]
-
- lon_bnds = lon_bnds_aux
- del lon_bnds_aux
-
- lat_bnds_aux = np.empty(aux_shape)
- lat_bnds_aux[:, :, 0] = self.lat_bnds['data'][:, np.newaxis, 0]
- lat_bnds_aux[:, :, 1] = self.lat_bnds['data'][:, np.newaxis, 0]
- lat_bnds_aux[:, :, 2] = self.lat_bnds['data'][:, np.newaxis, 1]
- lat_bnds_aux[:, :, 3] = self.lat_bnds['data'][:, np.newaxis, 1]
-
- lat_bnds = lat_bnds_aux
- del lat_bnds_aux
-
- aux_b_lats = lat_bnds.reshape((lat_bnds.shape[0] * lat_bnds.shape[1], lat_bnds.shape[2]))
- aux_b_lons = lon_bnds.reshape((lon_bnds.shape[0] * lon_bnds.shape[1], lon_bnds.shape[2]))
-
- # Create dataframe cointaining all polygons
- geometry = []
- for i in range(aux_b_lons.shape[0]):
- geometry.append(Polygon([(aux_b_lons[i, 0], aux_b_lats[i, 0]),
- (aux_b_lons[i, 1], aux_b_lats[i, 1]),
- (aux_b_lons[i, 2], aux_b_lats[i, 2]),
- (aux_b_lons[i, 3], aux_b_lats[i, 3]),
- (aux_b_lons[i, 0], aux_b_lats[i, 0])]))
- fids = np.arange(len(self._lat['data']) * len(self._lon['data']))
- fids = fids.reshape((len(self._lat['data']), len(self._lon['data'])))
- fids = fids[self.read_axis_limits['y_min']:self.read_axis_limits['y_max'],
- self.read_axis_limits['x_min']:self.read_axis_limits['x_max']]
- gdf = gpd.GeoDataFrame(index=pd.Index(name='FID', data=fids.ravel()),
- geometry=geometry,
- crs="EPSG:4326")
- self.shapefile = gdf
-
+ if self._lat_bnds is None or self._lon_bnds is None:
+ self.create_spatial_bounds()
+
+ # Reshape arrays to create geometry
+ aux_shape = (self.lat_bnds['data'].shape[0], self.lon_bnds['data'].shape[0], 4)
+ lon_bnds_aux = np.empty(aux_shape)
+ lon_bnds_aux[:, :, 0] = self.lon_bnds['data'][np.newaxis, :, 0]
+ lon_bnds_aux[:, :, 1] = self.lon_bnds['data'][np.newaxis, :, 1]
+ lon_bnds_aux[:, :, 2] = self.lon_bnds['data'][np.newaxis, :, 1]
+ lon_bnds_aux[:, :, 3] = self.lon_bnds['data'][np.newaxis, :, 0]
+
+ lon_bnds = lon_bnds_aux
+ del lon_bnds_aux
+
+ lat_bnds_aux = np.empty(aux_shape)
+ lat_bnds_aux[:, :, 0] = self.lat_bnds['data'][:, np.newaxis, 0]
+ lat_bnds_aux[:, :, 1] = self.lat_bnds['data'][:, np.newaxis, 0]
+ lat_bnds_aux[:, :, 2] = self.lat_bnds['data'][:, np.newaxis, 1]
+ lat_bnds_aux[:, :, 3] = self.lat_bnds['data'][:, np.newaxis, 1]
+
+ lat_bnds = lat_bnds_aux
+ del lat_bnds_aux
+
+ aux_b_lats = lat_bnds.reshape((lat_bnds.shape[0] * lat_bnds.shape[1], lat_bnds.shape[2]))
+ aux_b_lons = lon_bnds.reshape((lon_bnds.shape[0] * lon_bnds.shape[1], lon_bnds.shape[2]))
+
+ # Create dataframe cointaining all polygons
+ geometry = []
+ for i in range(aux_b_lons.shape[0]):
+ geometry.append(Polygon([(aux_b_lons[i, 0], aux_b_lats[i, 0]),
+ (aux_b_lons[i, 1], aux_b_lats[i, 1]),
+ (aux_b_lons[i, 2], aux_b_lats[i, 2]),
+ (aux_b_lons[i, 3], aux_b_lats[i, 3]),
+ (aux_b_lons[i, 0], aux_b_lats[i, 0])]))
+ fids = np.arange(len(self._lat['data']) * len(self._lon['data']))
+ fids = fids.reshape((len(self._lat['data']), len(self._lon['data'])))
+ fids = fids[self.read_axis_limits['y_min']:self.read_axis_limits['y_max'],
+ self.read_axis_limits['x_min']:self.read_axis_limits['x_max']]
+ gdf = gpd.GeoDataFrame(index=pd.Index(name='FID', data=fids.ravel()),
+ geometry=geometry,
+ crs="EPSG:4326")
+ self.shapefile = gdf
+
+ else:
+ gdf = self.shapefile
+
return gdf
def write_shapefile(self, path):
@@ -2659,6 +2953,7 @@ class Nes(object):
if lev is None:
msg = 'No vertical level has been specified. The first one will be selected.'
warnings.warn(msg)
+ sys.stderr.flush()
idx_lev = 0
else:
if lev not in self.lev['data']:
@@ -2669,6 +2964,7 @@ class Nes(object):
if time is None:
msg = 'No time has been specified. The first one will be selected.'
warnings.warn(msg)
+ sys.stderr.flush()
idx_time = 0
else:
if time not in self.time:
@@ -2690,8 +2986,8 @@ class Nes(object):
"""
Add variables data to shapefile.
- var_list : List
- List (or single string) of the variables to be loaded and saved in the shapefile.
+ var_list : List or str
+ Variables to be loaded and saved in the shapefile.
idx_lev : int
Index of vertical level for which the data will be saved in the shapefile.
idx_time : int
@@ -2703,129 +2999,6 @@ class Nes(object):
return None
- def spatial_join(self, ext_shp, method=None, var_list=None, info=False):
- """
- Compute overlay intersection of two GeoPandasDataFrames.
-
- Parameters
- ----------
- ext_shp : GeoPandasDataFrame, str
- File or path from where the data will be obtained on the intersection.
- method : str
- Overlay method. Accepted values: ['nearest', 'intersection', 'centroid'].
- var_list : List, None
- Variables that will be included in the resulting shapefile.
- """
- if isinstance(ext_shp, str):
- ext_shp = gpd.read_file(ext_shp)
-
- # Create shapefile if it does not exist
- if self.shapefile is None:
- msg = 'Shapefile does not exist. It will be created now.'
- warnings.warn(msg)
- grid_shp = self.create_shapefile()
- else:
- grid_shp = self.shapefile
- grid_shp = copy(grid_shp)
-
- # Get variables of interest from shapefile
- if var_list is not None:
- if isinstance(var_list, str):
- var_list = [var_list]
- ext_shp = ext_shp.loc[:, var_list + ['geometry']]
- else:
- var_list = ext_shp.columns.to_list()
- var_list.remove('geometry')
-
- ext_shp = ext_shp.to_crs(grid_shp.crs)
-
- # Nearest centroids to the shapefile polygons
- if method == 'nearest':
- if self.master and info:
- print("Nearest spatial joint")
- # Get centroids
- centroids_gdf = self.get_centroids_from_coordinates()
-
- # From geodetic coordinates (e.g. 4326) to meters (e.g. 4328) to use sjoin_nearest
- # TODO: Check if the projection 4328 does not distort the coordinates too much
- # https://gis.stackexchange.com/questions/372564/userwarning-when-trying-to-get-centroid-from-a-polygon-geopandas
- ext_shp = ext_shp.to_crs('EPSG:4328')
- centroids_gdf = centroids_gdf.to_crs('EPSG:4328')
-
- # Calculate spatial joint by distance
- aux_grid = gpd.sjoin_nearest(centroids_gdf, ext_shp, distance_col='distance')
-
- # Get data from closest shapes to centroids
- del aux_grid['geometry'], aux_grid['index_right']
- self.shapefile.loc[aux_grid.index, aux_grid.columns] = aux_grid
-
- # Intersect the areas of the shapefile polygons, outside the shapefile there will be NaN
- elif method == 'intersection':
- if self.master and info:
- print("Intersection spatial joint")
- grid_shp['FID_grid'] = grid_shp.index
- grid_shp = grid_shp.reset_index()
- # Get intersected areas
- # inp, res = shapefile.sindex.query_bulk(self.shapefile.geometry, predicate='intersects')
- inp, res = grid_shp.sindex.query_bulk(ext_shp.geometry, predicate='intersects')
-
- if self.master and info:
- print('Rank {0:03d}: {1} intersected areas found'.format(self.rank, len(inp)))
-
- # Calculate intersected areas and fractions
- intersection = pd.DataFrame()
- intersection['FID'] = np.array(grid_shp.loc[res, 'FID_grid'], dtype=np.uint32)
- intersection['ext_shp_id'] = np.array(inp, dtype=np.uint32)
-
- # intersection['geometry_ext'] = ext_shp.loc[inp, 'geometry'].values
- # intersection['geometry_grid'] = grid_shp.loc[res, 'geometry'].values
- if True:
- # No Warnings Zone
- counts = intersection['FID'].value_counts()
- warnings.filterwarnings('ignore')
-
- intersection.loc[:, 'weight'] = 1.
- for i, row in intersection.iterrows():
- if i % 1000 == 0 and self.master and info:
- print('\tRank {0:03d}: {1:.3f} %'.format(self.rank, i*100 / len(intersection)))
- # Filter to do not calculate percentages over 100% grid cells spatial joint
- if counts[row['FID']] > 1:
- intersection.loc[i, 'weight'] = grid_shp.loc[res[i], 'geometry'].intersection(
- ext_shp.loc[inp[i], 'geometry']).area / grid_shp.loc[res[i], 'geometry'].area
- # intersection['intersect_area'] = intersection.apply(
- # lambda x: x['geometry_grid'].intersection(x['geometry_ext']).area, axis=1)
- intersection.drop(intersection[intersection['weight'] <= 0].index, inplace=True)
-
- warnings.filterwarnings('default')
-
- # Choose the biggest area from intersected areas with multiple options
- intersection.sort_values('weight', ascending=False, inplace=True)
- intersection = intersection.drop_duplicates(subset='FID', keep="first")
- intersection = intersection.sort_values('FID').set_index('FID')
-
- for var_name in var_list:
- self.shapefile.loc[intersection.index, var_name] = np.array(
- ext_shp.loc[intersection['ext_shp_id'], var_name])
-
- # Centroids that fall on the shapefile polygons, outside the shapefile there will be NaN
- elif method == 'centroid':
-
- # Get centroids
- centroids_gdf = self.get_centroids_from_coordinates()
-
- # Calculate spatial joint
- aux_grid = gpd.sjoin(centroids_gdf, ext_shp, predicate='within')
-
- # Get data from shapes where there are centroids, rest will be NaN
- del aux_grid['geometry'], aux_grid['index_right']
- self.shapefile.loc[aux_grid.index, aux_grid.columns] = aux_grid
-
- else:
- accepted_values = ['nearest', 'intersection', 'centroid']
- raise NotImplementedError('{0} is not implemented. Choose from: {1}'.format(method, accepted_values))
-
- return None
-
def get_centroids_from_coordinates(self):
"""
Get centroids from geographical coordinates.
@@ -2854,7 +3027,7 @@ class Nes(object):
return centroids_gdf
- def __gather_data_py_object(self):
+ def __gather_data_py_object(self, data_to_gather):
"""
Gather all the variable data into the MPI rank 0 to perform a serial write.
@@ -2864,7 +3037,7 @@ class Nes(object):
Variables dictionary with all the data from all the ranks.
"""
- data_list = deepcopy(self.variables)
+ data_list = deepcopy(data_to_gather)
for var_name in data_list.keys():
try:
# noinspection PyArgumentList
@@ -2924,28 +3097,33 @@ class Nes(object):
return data_list
- def _gather_data(self):
+ def _gather_data(self, data_to_gather):
"""
Gather all the variable data into the MPI rank 0 to perform a serial write.
Returns
-------
- data_list: dict
- Variables dictionary with all the data from all the ranks.
+ data_to_gather: dict
+ Variables to gather.
"""
- data_list = deepcopy(self.variables)
+ data_list = deepcopy(data_to_gather)
for var_name in data_list.keys():
if self.info and self.master:
print("Gathering {0}".format(var_name))
- shp_len = len(data_list[var_name]['data'].shape)
- try:
- # Collect local array sizes using the high-level mpi4py gather
+ if data_list[var_name]['data'] is None:
+ data_list[var_name]['data'] = None
+ elif isinstance(data_list[var_name]['data'], int) and data_list[var_name]['data'] == 0:
+ data_list[var_name]['data'] = 0
+ else:
+ shp_len = len(data_list[var_name]['data'].shape)
+ # Collect local array sizes using the gather communication pattern
rank_shapes = np.array(self.comm.gather(data_list[var_name]['data'].shape, root=0))
sendbuf = data_list[var_name]['data'].flatten()
sendcounts = np.array(self.comm.gather(len(sendbuf), root=0))
if self.master:
- recvbuf = np.empty(sum(sendcounts), dtype=type(sendbuf[0]))
+ # recvbuf = np.empty(sum(sendcounts), dtype=type(sendbuf[0]))
+ recvbuf = np.empty(sum(sendcounts), dtype=type(sendbuf.max()))
else:
recvbuf = None
self.comm.Gatherv(sendbuf=sendbuf, recvbuf=(recvbuf, sendcounts), root=0)
@@ -2997,16 +3175,6 @@ class Nes(object):
data_list[var_name]['data'] = np.stack(recvbuf)
else:
data_list[var_name]['data'] = np.concatenate(recvbuf, axis=axis)
- except Exception as e:
- print("**ERROR** an error has occurred while gathering the '{0}' variable.\n".format(var_name))
- sys.stderr.write("**ERROR** an error has occurred while gathering the '{0}' variable.\n".format(
- var_name))
- print(e)
- sys.stderr.write(str(e))
- # print(e, file=sys.stderr)
- sys.stderr.flush()
- self.comm.Abort(1)
- raise e
return data_list
@@ -3062,7 +3230,7 @@ class Nes(object):
self : Nes
Source Nes object.
new_levels : List
- List of new vertical levels.
+ New vertical levels.
new_src_vertical
kind : str
Vertical methods type.
@@ -3076,7 +3244,7 @@ class Nes(object):
self, new_levels, new_src_vertical=new_src_vertical, kind=kind, extrapolate=extrapolate, info=info)
def interpolate_horizontal(self, dst_grid, weight_matrix_path=None, kind='NearestNeighbour', n_neighbours=4,
- info=False, to_providentia=False, only_create_wm=False, wm=None):
+ info=False, to_providentia=False, only_create_wm=False, wm=None, flux=False):
"""
Horizontal methods from the current grid to another one.
@@ -3098,11 +3266,31 @@ class Nes(object):
Indicates if you want to only create the Weight Matrix.
wm : Nes
Weight matrix Nes File
+ flux : bool
+ Indicates if you want to calculate the weight matrix for flux variables
"""
return horizontal_interpolation.interpolate_horizontal(
self, dst_grid, weight_matrix_path=weight_matrix_path, kind=kind, n_neighbours=n_neighbours, info=info,
- to_providentia=to_providentia, only_create_wm=only_create_wm, wm=wm)
+ to_providentia=to_providentia, only_create_wm=only_create_wm, wm=wm, flux=flux)
+
+ def spatial_join(self, ext_shp, method=None, var_list=None, info=False):
+ """
+ Compute overlay intersection of two GeoPandasDataFrames.
+
+ Parameters
+ ----------
+ ext_shp : GeoPandasDataFrame or str
+ File or path from where the data will be obtained on the intersection.
+ method : str
+ Overlay method. Accepted values: ['nearest', 'intersection', 'centroid'].
+ var_list : List or None
+ Variables that will be included in the resulting shapefile.
+ info : bool
+ Indicates if you want to print the process info or no
+ """
+
+ return spatial_join(self, ext_shp=ext_shp, method=method, var_list=var_list, info=info)
def calculate_grid_area(self):
"""
@@ -3114,8 +3302,13 @@ class Nes(object):
Source projection Nes Object.
"""
- grid_area = cell_measures.calculate_grid_area(self)
-
+ if 'cell_area' not in self.cell_measures.keys():
+ grid_area = cell_measures.calculate_grid_area(self)
+ grid_area = grid_area.reshape([self.lat['data'].shape[0], self.lon['data'].shape[-1]])
+ self.cell_measures['cell_area'] = {'data': grid_area}
+ else:
+ grid_area = self.cell_measures['cell_area']['data']
+
return grid_area
@staticmethod
diff --git a/nes/nc_projections/latlon_nes.py b/nes/nc_projections/latlon_nes.py
index cfcb11dae3619e336abbc0978e18ede3be9bfd2f..b044d984c227d7493607e9524735bf0b245f4db0 100644
--- a/nes/nc_projections/latlon_nes.py
+++ b/nes/nc_projections/latlon_nes.py
@@ -272,14 +272,3 @@ class LatLonNes(Nes):
"""
return super(LatLonNes, self).to_grib2(path, grib_keys, grib_template_path, lat_flip=lat_flip, info=info)
-
- def calculate_grid_area(self):
- """
- Get coordinate bounds and call function to calculate the area of each cell of a grid.
-
- """
- grid_area = super().calculate_grid_area()
- self.cell_measures['cell_area'] = {'data': grid_area.reshape([self.lon_bnds['data'].shape[0],
- self.lon_bnds['data'].shape[1]])}
-
- return None
diff --git a/nes/nc_projections/lcc_nes.py b/nes/nc_projections/lcc_nes.py
index 585acbe11a338e65a382ddb1a3d2c544d4325725..b5a679e8da977eb675bc79c586faa29dcc4112f7 100644
--- a/nes/nc_projections/lcc_nes.py
+++ b/nes/nc_projections/lcc_nes.py
@@ -1,6 +1,7 @@
#!/usr/bin/env python
import warnings
+import sys
import numpy as np
import pandas as pd
from cfunits import Units
@@ -168,6 +169,7 @@ class LCCNes(Nes):
else:
msg = 'There is no variable called Lambert_conformal, projection has not been defined.'
warnings.warn(msg)
+ sys.stderr.flush()
projection_data = None
return projection_data
@@ -465,35 +467,40 @@ class LCCNes(Nes):
Shapefile dataframe.
"""
- # Get latitude and longitude cell boundaries
- if self._lat_bnds is None or self._lon_bnds is None:
- self.create_spatial_bounds()
-
- # Reshape arrays to create geometry
- aux_b_lats = self.lat_bnds['data'].reshape((self.lat_bnds['data'].shape[0] * self.lat_bnds['data'].shape[1],
- self.lat_bnds['data'].shape[2]))
- aux_b_lons = self.lon_bnds['data'].reshape((self.lon_bnds['data'].shape[0] * self.lon_bnds['data'].shape[1],
- self.lon_bnds['data'].shape[2]))
-
- # Get polygons from bounds
- geometry = []
- for i in range(aux_b_lons.shape[0]):
- geometry.append(Polygon([(aux_b_lons[i, 0], aux_b_lats[i, 0]),
- (aux_b_lons[i, 1], aux_b_lats[i, 1]),
- (aux_b_lons[i, 2], aux_b_lats[i, 2]),
- (aux_b_lons[i, 3], aux_b_lats[i, 3]),
- (aux_b_lons[i, 0], aux_b_lats[i, 0])]))
-
- # Create dataframe cointaining all polygons
- fids = np.arange(self._lat['data'].shape[0] * self._lat['data'].shape[1])
- fids = fids.reshape((self._lat['data'].shape[0], self._lat['data'].shape[1]))
- fids = fids[self.read_axis_limits['y_min']:self.read_axis_limits['y_max'],
- self.read_axis_limits['x_min']:self.read_axis_limits['x_max']]
- gdf = gpd.GeoDataFrame(index=pd.Index(name='FID', data=fids.ravel()),
- geometry=geometry,
- crs="EPSG:4326")
- self.shapefile = gdf
+ if self.shapefile is None:
+
+ # Get latitude and longitude cell boundaries
+ if self._lat_bnds is None or self._lon_bnds is None:
+ self.create_spatial_bounds()
+
+ # Reshape arrays to create geometry
+ aux_b_lats = self.lat_bnds['data'].reshape((self.lat_bnds['data'].shape[0] * self.lat_bnds['data'].shape[1],
+ self.lat_bnds['data'].shape[2]))
+ aux_b_lons = self.lon_bnds['data'].reshape((self.lon_bnds['data'].shape[0] * self.lon_bnds['data'].shape[1],
+ self.lon_bnds['data'].shape[2]))
+
+ # Get polygons from bounds
+ geometry = []
+ for i in range(aux_b_lons.shape[0]):
+ geometry.append(Polygon([(aux_b_lons[i, 0], aux_b_lats[i, 0]),
+ (aux_b_lons[i, 1], aux_b_lats[i, 1]),
+ (aux_b_lons[i, 2], aux_b_lats[i, 2]),
+ (aux_b_lons[i, 3], aux_b_lats[i, 3]),
+ (aux_b_lons[i, 0], aux_b_lats[i, 0])]))
+
+ # Create dataframe cointaining all polygons
+ fids = np.arange(self._lat['data'].shape[0] * self._lat['data'].shape[1])
+ fids = fids.reshape((self._lat['data'].shape[0], self._lat['data'].shape[1]))
+ fids = fids[self.read_axis_limits['y_min']:self.read_axis_limits['y_max'],
+ self.read_axis_limits['x_min']:self.read_axis_limits['x_max']]
+ gdf = gpd.GeoDataFrame(index=pd.Index(name='FID', data=fids.ravel()),
+ geometry=geometry,
+ crs="EPSG:4326")
+ self.shapefile = gdf
+ else:
+ gdf = self.shapefile
+
return gdf
def get_centroids_from_coordinates(self):
@@ -524,12 +531,3 @@ class LCCNes(Nes):
return centroids_gdf
- def calculate_grid_area(self):
- """
- Get coordinate bounds and call function to calculate the area of each cell of a grid.
- """
- grid_area = super(LCCNes, self).calculate_grid_area()
- self.cell_measures['cell_area'] = {'data': grid_area.reshape([self.lon_bnds['data'].shape[0],
- self.lon_bnds['data'].shape[1]])}
-
- return None
diff --git a/nes/nc_projections/mercator_nes.py b/nes/nc_projections/mercator_nes.py
index e6ccf187b683ff7d2f17db3cd7657545b024ace7..b752e8d575454b54e43d10caced0949c0219a344 100644
--- a/nes/nc_projections/mercator_nes.py
+++ b/nes/nc_projections/mercator_nes.py
@@ -1,6 +1,7 @@
#!/usr/bin/env python
import warnings
+import sys
import numpy as np
import pandas as pd
from cfunits import Units
@@ -164,6 +165,7 @@ class MercatorNes(Nes):
else:
msg = 'There is no variable called mercator, projection has not been defined.'
warnings.warn(msg)
+ sys.stderr.flush()
projection_data = None
return projection_data
@@ -441,35 +443,40 @@ class MercatorNes(Nes):
Shapefile dataframe.
"""
- # Get latitude and longitude cell boundaries
- if self._lat_bnds is None or self._lon_bnds is None:
- self.create_spatial_bounds()
-
- # Reshape arrays to create geometry
- aux_b_lats = self.lat_bnds['data'].reshape((self.lat_bnds['data'].shape[0] * self.lat_bnds['data'].shape[1],
- self.lat_bnds['data'].shape[2]))
- aux_b_lons = self.lon_bnds['data'].reshape((self.lon_bnds['data'].shape[0] * self.lon_bnds['data'].shape[1],
- self.lon_bnds['data'].shape[2]))
-
- # Get polygons from bounds
- geometry = []
- for i in range(aux_b_lons.shape[0]):
- geometry.append(Polygon([(aux_b_lons[i, 0], aux_b_lats[i, 0]),
- (aux_b_lons[i, 1], aux_b_lats[i, 1]),
- (aux_b_lons[i, 2], aux_b_lats[i, 2]),
- (aux_b_lons[i, 3], aux_b_lats[i, 3]),
- (aux_b_lons[i, 0], aux_b_lats[i, 0])]))
-
- # Create dataframe cointaining all polygons
- fids = np.arange(self._lat['data'].shape[0] * self._lat['data'].shape[1])
- fids = fids.reshape((self._lat['data'].shape[0], self._lat['data'].shape[1]))
- fids = fids[self.read_axis_limits['y_min']:self.read_axis_limits['y_max'],
- self.read_axis_limits['x_min']:self.read_axis_limits['x_max']]
- gdf = gpd.GeoDataFrame(index=pd.Index(name='FID', data=fids.ravel()),
- geometry=geometry,
- crs="EPSG:4326")
- self.shapefile = gdf
+ if self.shapefile is None:
+
+ # Get latitude and longitude cell boundaries
+ if self._lat_bnds is None or self._lon_bnds is None:
+ self.create_spatial_bounds()
+
+ # Reshape arrays to create geometry
+ aux_b_lats = self.lat_bnds['data'].reshape((self.lat_bnds['data'].shape[0] * self.lat_bnds['data'].shape[1],
+ self.lat_bnds['data'].shape[2]))
+ aux_b_lons = self.lon_bnds['data'].reshape((self.lon_bnds['data'].shape[0] * self.lon_bnds['data'].shape[1],
+ self.lon_bnds['data'].shape[2]))
+
+ # Get polygons from bounds
+ geometry = []
+ for i in range(aux_b_lons.shape[0]):
+ geometry.append(Polygon([(aux_b_lons[i, 0], aux_b_lats[i, 0]),
+ (aux_b_lons[i, 1], aux_b_lats[i, 1]),
+ (aux_b_lons[i, 2], aux_b_lats[i, 2]),
+ (aux_b_lons[i, 3], aux_b_lats[i, 3]),
+ (aux_b_lons[i, 0], aux_b_lats[i, 0])]))
+
+ # Create dataframe cointaining all polygons
+ fids = np.arange(self._lat['data'].shape[0] * self._lat['data'].shape[1])
+ fids = fids.reshape((self._lat['data'].shape[0], self._lat['data'].shape[1]))
+ fids = fids[self.read_axis_limits['y_min']:self.read_axis_limits['y_max'],
+ self.read_axis_limits['x_min']:self.read_axis_limits['x_max']]
+ gdf = gpd.GeoDataFrame(index=pd.Index(name='FID', data=fids.ravel()),
+ geometry=geometry,
+ crs="EPSG:4326")
+ self.shapefile = gdf
+ else:
+ gdf = self.shapefile
+
return gdf
def get_centroids_from_coordinates(self):
@@ -499,14 +506,3 @@ class MercatorNes(Nes):
crs="EPSG:4326")
return centroids_gdf
-
- def calculate_grid_area(self):
- """
- Get coordinate bounds and call function to calculate the area of each cell of a grid.
- """
-
- grid_area = super(MercatorNes, self).calculate_grid_area()
- self.cell_measures['cell_area'] = {'data': grid_area.reshape([self.lon_bnds['data'].shape[0],
- self.lon_bnds['data'].shape[1]])}
-
- return None
diff --git a/nes/nc_projections/points_nes.py b/nes/nc_projections/points_nes.py
index 9c3d859b48ad1c157095d42b570e9977ddd1f0e0..756fe3c67a5f0c691b6a1fd01f32789752a7ee86 100644
--- a/nes/nc_projections/points_nes.py
+++ b/nes/nc_projections/points_nes.py
@@ -7,7 +7,6 @@ import pandas as pd
from copy import deepcopy
import geopandas as gpd
from netCDF4 import date2num, stringtochar
-from numpy.ma.core import MaskError
from .default_nes import Nes
@@ -31,7 +30,7 @@ class PointsNes(Nes):
"""
def __init__(self, comm=None, path=None, info=False, dataset=None, xarray=False, parallel_method='X',
avoid_first_hours=0, avoid_last_hours=0, first_level=0, last_level=None, create_nes=False,
- times=None, strlen=75, **kwargs):
+ times=None, **kwargs):
"""
Initialize the PointsNes class.
@@ -68,10 +67,6 @@ class PointsNes(Nes):
# Dimensions screening
self.lat = self._get_coordinate_values(self._lat, 'X')
self.lon = self._get_coordinate_values(self._lon, 'X')
- self.strlen = strlen
- else:
- # Dimensions screening
- self.strlen = self._get_strlen()
# Complete dimensions
self._station = {'data': np.arange(len(self._lon['data']))}
@@ -311,10 +306,9 @@ class PointsNes(Nes):
var_name))
# Missing to nan
- try:
- data[data.mask == True] = np.nan
- except (AttributeError, MaskError, ValueError):
- pass
+ if np.ma.is_masked(data):
+ # This operation is done because sometimes the missing value is lost during the calculation
+ data[data.mask] = np.nan
return data
@@ -343,6 +337,7 @@ class PointsNes(Nes):
msg += "Input dtype={0}. Data dtype={1}.".format(var_dtype,
var_dict['data'].dtype)
warnings.warn(msg)
+ sys.stderr.flush()
try:
var_dict['data'] = var_dict['data'].astype(var_dtype)
except Exception as e: # TODO: Detect exception
@@ -368,20 +363,32 @@ class PointsNes(Nes):
var_dims = ('time',) + self._var_dim
# Convert list of strings to chars for parallelization
- try:
- unicode_type = len(max(var_dict['data'], key=len))
- if ((var_dict['data'].dtype == np.dtype('\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " geometry | \n",
+ "
\n",
+ " \n",
+ " FID | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " POLYGON ((-180.00000 -90.00000, -179.89999 -90... | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " POLYGON ((-179.89999 -90.00000, -179.80002 -90... | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " POLYGON ((-179.79999 -90.00000, -179.70001 -90... | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " POLYGON ((-179.69998 -90.00000, -179.60001 -90... | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " POLYGON ((-179.60001 -90.00000, -179.50000 -90... | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 6479995 | \n",
+ " POLYGON ((179.50000 89.89999, 179.60001 89.899... | \n",
+ "
\n",
+ " \n",
+ " 6479996 | \n",
+ " POLYGON ((179.60001 89.89999, 179.69998 89.899... | \n",
+ "
\n",
+ " \n",
+ " 6479997 | \n",
+ " POLYGON ((179.70001 89.89999, 179.79999 89.899... | \n",
+ "
\n",
+ " \n",
+ " 6479998 | \n",
+ " POLYGON ((179.80002 89.89999, 179.89999 89.899... | \n",
+ "
\n",
+ " \n",
+ " 6479999 | \n",
+ " POLYGON ((179.89999 89.89999, 180.00000 89.899... | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
6480000 rows × 1 columns
\n",
+ ""
+ ],
"text/plain": [
- "{'data': masked_array(\n",
- " data=[[16.350338, 16.43293 , 16.515146, ..., 16.515146, 16.43293 ,\n",
- " 16.350338],\n",
- " [16.527426, 16.610239, 16.692677, ..., 16.692677, 16.610243,\n",
- " 16.527426],\n",
- " [16.704472, 16.787508, 16.870167, ..., 16.870167, 16.78751 ,\n",
- " 16.704472],\n",
- " ...,\n",
- " [58.32095 , 58.472683, 58.62431 , ..., 58.62431 , 58.472683,\n",
- " 58.32095 ],\n",
- " [58.426285, 58.5782 , 58.730026, ..., 58.730026, 58.5782 ,\n",
- " 58.426285],\n",
- " [58.530792, 58.6829 , 58.83492 , ..., 58.83492 , 58.682903,\n",
- " 58.530792]],\n",
- " mask=False,\n",
- " fill_value=1e+20,\n",
- " dtype=float32),\n",
- " 'dimensions': ('rlat', 'rlon'),\n",
- " 'long_name': 'latitude',\n",
- " 'units': 'degrees_north',\n",
- " 'standard_name': 'latitude',\n",
- " 'coordinates': 'lon lat'}"
+ " geometry\n",
+ "FID \n",
+ "0 POLYGON ((-180.00000 -90.00000, -179.89999 -90...\n",
+ "1 POLYGON ((-179.89999 -90.00000, -179.80002 -90...\n",
+ "2 POLYGON ((-179.79999 -90.00000, -179.70001 -90...\n",
+ "3 POLYGON ((-179.69998 -90.00000, -179.60001 -90...\n",
+ "4 POLYGON ((-179.60001 -90.00000, -179.50000 -90...\n",
+ "... ...\n",
+ "6479995 POLYGON ((179.50000 89.89999, 179.60001 89.899...\n",
+ "6479996 POLYGON ((179.60001 89.89999, 179.69998 89.899...\n",
+ "6479997 POLYGON ((179.70001 89.89999, 179.79999 89.899...\n",
+ "6479998 POLYGON ((179.80002 89.89999, 179.89999 89.899...\n",
+ "6479999 POLYGON ((179.89999 89.89999, 180.00000 89.899...\n",
+ "\n",
+ "[6480000 rows x 1 columns]"
]
},
- "execution_count": 4,
+ "execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "source_grid.lat"
+ "source_grid = open_netcdf(path=source_path)\n",
+ "source_grid.create_shapefile()"
]
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Flux units: m-2.kg.s-1\n"
+ ]
+ }
+ ],
+ "source": [
+ "source_grid.keep_vars(var_name)\n",
+ "print('Flux units: {0}'.format(source_grid.variables[var_name]['units']))\n",
+ "source_grid.load()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
+ "image/png": "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\n",
"text/plain": [
- "{'data': masked_array(\n",
- " data=[[-22.181265, -22.016672, -21.851799, ..., 41.851795, 42.016666,\n",
- " 42.18126 ],\n",
- " [-22.27818 , -22.113186, -21.947905, ..., 41.9479 , 42.113174,\n",
- " 42.27817 ],\n",
- " [-22.375267, -22.209873, -22.04419 , ..., 42.044186, 42.209873,\n",
- " 42.375263],\n",
- " ...,\n",
- " [-67.57767 , -67.397064, -67.21535 , ..., 87.21534 , 87.39706 ,\n",
- " 87.57766 ],\n",
- " [-67.90188 , -67.72247 , -67.54194 , ..., 87.54194 , 87.72246 ,\n",
- " 87.90187 ],\n",
- " [-68.228035, -68.04982 , -67.870514, ..., 87.87051 , 88.04982 ,\n",
- " 88.228035]],\n",
- " mask=False,\n",
- " fill_value=1e+20,\n",
- " dtype=float32),\n",
- " 'dimensions': ('rlat', 'rlon'),\n",
- " 'long_name': 'longitude',\n",
- " 'units': 'degrees_east',\n",
- " 'standard_name': 'longitude',\n",
- " 'coordinates': 'lon lat'}"
+ ""
]
},
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
}
],
"source": [
- "source_grid.lon"
+ "plot_data(source_grid, var_name)"
]
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Rank 000: Loading O3 var (1/1)\n",
- "Rank 000: Loaded O3 var ((37, 24, 271, 351))\n"
+ "nox_no total flux: 1.0672498547137366e-06\n",
+ "nox_no total mass: 113.08470916748047\n"
]
}
],
"source": [
- "source_grid.keep_vars('O3')\n",
- "source_grid.load()"
+ "# Flux to mass\n",
+ "cell_area = source_grid.calculate_grid_area()\n",
+ "\n",
+ "for var_aux in source_grid.variables.keys():\n",
+ " print(\"{0} total flux: {1}\".format(var_aux, source_grid.variables[var_aux]['data'].sum()))\n",
+ " source_grid.variables[var_aux]['data'] *= cell_area\n",
+ " source_grid.variables[var_aux]['units'] = 'kg.s-1'\n",
+ " print(\"{0} total mass: {1}\".format(var_aux, source_grid.variables[var_aux]['data'].sum()))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_data(source_grid, var_name)"
]
},
{
@@ -153,9 +273,110 @@
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": 10,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " geometry | \n",
+ "
\n",
+ " \n",
+ " FID | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " POLYGON ((-11.58393 32.47507, -11.54169 32.478... | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " POLYGON ((-11.54169 32.47851, -11.49944 32.481... | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " POLYGON ((-11.49944 32.48192, -11.45719 32.485... | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " POLYGON ((-11.45719 32.48533, -11.41494 32.488... | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " POLYGON ((-11.41494 32.48871, -11.37268 32.492... | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 157604 | \n",
+ " POLYGON ((6.95490 46.70274, 7.00684 46.69873, ... | \n",
+ "
\n",
+ " \n",
+ " 157605 | \n",
+ " POLYGON ((7.00684 46.69873, 7.05878 46.69470, ... | \n",
+ "
\n",
+ " \n",
+ " 157606 | \n",
+ " POLYGON ((7.05878 46.69470, 7.11071 46.69066, ... | \n",
+ "
\n",
+ " \n",
+ " 157607 | \n",
+ " POLYGON ((7.11071 46.69066, 7.16264 46.68659, ... | \n",
+ "
\n",
+ " \n",
+ " 157608 | \n",
+ " POLYGON ((7.16264 46.68659, 7.21456 46.68250, ... | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
157609 rows × 1 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " geometry\n",
+ "FID \n",
+ "0 POLYGON ((-11.58393 32.47507, -11.54169 32.478...\n",
+ "1 POLYGON ((-11.54169 32.47851, -11.49944 32.481...\n",
+ "2 POLYGON ((-11.49944 32.48192, -11.45719 32.485...\n",
+ "3 POLYGON ((-11.45719 32.48533, -11.41494 32.488...\n",
+ "4 POLYGON ((-11.41494 32.48871, -11.37268 32.492...\n",
+ "... ...\n",
+ "157604 POLYGON ((6.95490 46.70274, 7.00684 46.69873, ...\n",
+ "157605 POLYGON ((7.00684 46.69873, 7.05878 46.69470, ...\n",
+ "157606 POLYGON ((7.05878 46.69470, 7.11071 46.69066, ...\n",
+ "157607 POLYGON ((7.11071 46.69066, 7.16264 46.68659, ...\n",
+ "157608 POLYGON ((7.16264 46.68659, 7.21456 46.68250, ...\n",
+ "\n",
+ "[157609 rows x 1 columns]"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"lat_1 = 37\n",
"lat_2 = 43\n",
@@ -168,7 +389,8 @@
"x_0 = -807847.688\n",
"y_0 = -797137.125\n",
"dst_nes = create_nes(comm=None, info=False, projection='lcc', lat_1=lat_1, lat_2=lat_2, lon_0=lon_0, lat_0=lat_0,\n",
- " nx=nx, ny=ny, inc_x=inc_x, inc_y=inc_y, x_0=x_0, y_0=y_0, times=source_grid.get_full_times())"
+ " nx=nx, ny=ny, inc_x=inc_x, inc_y=inc_y, x_0=x_0, y_0=y_0, times=source_grid.get_full_times())\n",
+ "dst_nes.create_shapefile()\n"
]
},
{
@@ -187,75 +409,60 @@
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": 11,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "CPU times: user 1min 48s, sys: 1.42 s, total: 1min 49s\n",
+ "Wall time: 1min 49s\n"
+ ]
+ }
+ ],
"source": [
- "interp_nes = source_grid.interpolate_horizontal(dst_grid=dst_nes, kind='Conservative')"
+ "%time interp_nes = source_grid.interpolate_horizontal(dst_grid=dst_nes, kind='Conservative')"
]
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
+ "image/png": "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\n",
"text/plain": [
- "{'data': array([[32.49460816, 32.49803615, 32.50144726, ..., 32.52460207,\n",
- " 32.52130788, 32.51799681],\n",
- " [32.53024662, 32.5336765 , 32.5370895 , ..., 32.5602571 ,\n",
- " 32.55696109, 32.55364819],\n",
- " [32.5658877 , 32.56931947, 32.57273435, ..., 32.59591474,\n",
- " 32.59261692, 32.58930218],\n",
- " ...,\n",
- " [46.60231473, 46.60653579, 46.6107361 , ..., 46.63924881,\n",
- " 46.63519229, 46.63111499],\n",
- " [46.63791957, 46.64214277, 46.6463452 , ..., 46.67487234,\n",
- " 46.67081377, 46.66673441],\n",
- " [46.67352141, 46.67774674, 46.68195131, ..., 46.71049289,\n",
- " 46.70643226, 46.70235083]])}"
+ "