Source code for wavespectra.input.dataset

"""Construct the SpecArray accessor from existing dataset from known format."""

import logging

from wavespectra.input.ww3 import from_ww3
from wavespectra.input.wwm import from_wwm
from wavespectra.input.ncswan import from_ncswan
from wavespectra.input.era5 import from_era5
from wavespectra.input.ndbc import from_ndbc
from wavespectra.specdataset import SpecDataset

logger = logging.getLogger(__name__)


[docs] def read_dataset(dset, **kwargs): """Format and attach SpecArray accessor to an existing xarray dataset. Convenience function to define the SpecArray accessor for a dataset rather than a file. The function guesses the original file format based on variable names. Args: - dset (xr.Dataset): Spectra dataset with dimensions, coordinates and data_vars consistent any supported file format (currently WW3, SWAN and WWM). - **kwargs: Arbitrary keyword arguments passed to the specific reader. """ vars_wavespectra = {"freq", "dir", "site", "efth"} vars_ww3 = {"frequency", "direction", "station", "efth"} vars_wwm = {"nfreq", "ndir", "nbstation", "AC"} vars_era5 = {"frequency", "direction", "d2fd"} vars_ndbc = {"frequency", "spectral_wave_density"} vars_ncswan = {"frequency", "direction", "points", "density"} vars_dset = set(dset.variables.keys()).union(dset.dims) if not vars_wavespectra - vars_dset: logger.debug("Dataset already in wavespectra convention") return dset if not vars_ww3 - vars_dset: logger.debug("Dataset identified as ww3") func = from_ww3 elif not vars_ncswan - vars_dset: logger.debug("Dataset identified as ncswan") func = from_ncswan elif not vars_wwm - vars_dset: logger.debug("Dataset identified as wwm") func = from_wwm elif not vars_era5 - vars_dset: logger.debug("Dataset identified as era5") func = from_era5 elif not vars_ndbc - vars_dset: logger.debug("Dataset identified as ndbc") func = from_ndbc else: raise ValueError( f"Cannot identify appropriate reader from dataset variables: {vars_dset}" ) return func(dset, **kwargs)