Source code for wavespectra.input.era5

"""Read ERA5 2D Wave Spectra NetCDF files"""
import numpy as np
from xarray.backends import BackendEntrypoint

from wavespectra.core.attributes import attrs, set_spec_attributes
from wavespectra.input.netcdf import read_netcdf


DEFAULT_FREQS = np.full(30, 0.03453) * (1.1 ** np.arange(0, 30))
DEFAULT_DIRS = (np.arange(7.5, 352.5 + 15, 15) + 180) % 360


[docs] def read_era5(filename_or_fileglob, chunks={}, freqs=None, dirs=None): """Read Spectra from ECMWF ERA5 netCDF format. Args: - filename_or_fileglob (str, list, filelike): filename, fileglob specifying multiple files, or filelike object to read. - chunks (dict): chunk sizes for dimensions in dataset. By default dataset is loaded using single chunk for all dimensions (see xr.open_mfdataset documentation). - freqs (list): list of frequencies. By default use all 30 ERA5 frequencies. - dirs (list): list of directions. By default use all 24 ERA5 directions. Returns: - dset (SpecDataset): spectra dataset object read from netcdf file. Note: - Frequency and diirection coordinates seem to have only integer positions which is why they are allowed to be specified as a parameter. - If file is large to fit in memory, consider specifying chunks for 'time' and/or 'station' dims. """ dset = read_netcdf( filename_or_fileglob, specname="d2fd", freqname="frequency", dirname="direction", lonname="longitude", latname="latitude", timename="time", chunks=chunks, ) return from_era5(dset, freqs=freqs, dirs=dirs)
def from_era5(dset, freqs=None, dirs=None): """Format ERA5 netcdf dataset to receive wavespectra accessor. Args: - dset (xr.Dataset): Dataset created from a SWAN netcdf file. Returns: - Formated dataset with the SpecDataset accessor in the `spec` namespace. """ # Convert ERA5 format to wavespectra format dset = 10**dset * np.pi / 180 dset = dset.fillna(0) dset[attrs.FREQNAME] = freqs if freqs else DEFAULT_FREQS dset[attrs.DIRNAME] = dirs if dirs else DEFAULT_DIRS # Setting standard attributes set_spec_attributes(dset) return dset class ERA5BackendEntrypoint(BackendEntrypoint): """ERA5 backend engine.""" def open_dataset( self, filename_or_obj, *, drop_variables=None, freqs=None, dirs=None, ): return read_era5(filename_or_obj, freqs=freqs, dirs=dirs) def guess_can_open(self, filename_or_obj): return False description = "Open ERA5 netcdf spectra files as a wavespectra dataset." url = "https://github.com/wavespectra/wavespectra"