Source code for gldas.grid

import numpy as np
from pygeogrids.grids import BasicGrid
from netCDF4 import Dataset
import os

[docs]def subgrid4bbox(grid, min_lon, min_lat, max_lon, max_lat): """ Select a spatial subset for the grid by bound box corner points Parameters ---------- grid: BasicGrid or CellGrid Grid object to trim. min_lon: float Lower left corner longitude min_lat: float Lower left corner latitude max_lon: float Upper right corner longitude max_lat: float Upper right corner latitude Returns ------- subgrid: BasicGrid or CellGrid Subset of the input grid. """ gpis, lons, lats, _ = grid.get_grid_points() assert len(gpis) == len(lats) == len(lons) bbox_gpis = gpis[ np.where( (lons <= max_lon) & (lons >= min_lon) & (lats <= max_lat) & (lats >= min_lat) ) ] return grid.subgrid_from_gpis(bbox_gpis)
[docs]def GLDAS025Grids(only_land=False): """ Create global 0.25 DEG gldas grids (origin in bottom left) Parameters --------- only_land : bool, optional (default: False) Uses the land mask to reduce the GLDAS 0.25DEG land grid to land points only. Returns -------- grid : pygeogrids.CellGrid Either a land grid or a global grid """ resolution = 0.25 glob_lons = np.arange( -180 + resolution / 2, 180 + resolution / 2, resolution ) glob_lats = np.arange( -90 + resolution / 2, 90 + resolution / 2, resolution ) lon, lat = np.meshgrid(glob_lons, glob_lats) glob_grid = BasicGrid(lon.flatten(), lat.flatten()).to_cell_grid( cellsize=5.0 ) if only_land: ds = Dataset( os.path.join( os.path.abspath(os.path.dirname(__file__)), "GLDASp4_landmask_025d.nc4", ) ) land_lats = ds.variables["lat"][:] land_mask = ds.variables["GLDAS_mask"][:].flatten().filled() == 0.0 dlat = glob_lats.size - land_lats.size land_mask = np.concatenate((np.ones(dlat * glob_lons.size), land_mask)) land_points = np.ma.masked_array( glob_grid.get_grid_points()[0], land_mask ) land_grid = glob_grid.subgrid_from_gpis( land_points[~land_points.mask].filled() ) return land_grid else: return glob_grid
[docs]def GLDAS025Cellgrid(): """Alias to create a global 0.25 DEG grid without gaps w. 5 DEG cells """ return GLDAS025Grids(only_land=False)
[docs]def GLDAS025LandGrid(): """Alias to create a global 0.25 DEG grid over land only w. 5 DEG cells """ return GLDAS025Grids(only_land=True)
[docs]def load_grid(land_points=True, bbox=None): """ Load gldas grid. Parameters ---------- land_points : bool, optional (default: True) Reshuffle only land points bbox : tuple, optional (default: True) (min_lat, min_lon, max_lat, max_lon) Bounding box to limit reshuffling to. """ if land_points: subgrid = GLDAS025LandGrid() if bbox is not None: subgrid = subgrid4bbox(subgrid, *bbox) else: if bbox is not None: subgrid = subgrid4bbox(GLDAS025Cellgrid(), *bbox) else: subgrid = None return subgrid