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.specdataset import SpecDataset
logger = logging.getLogger(__name__)
[docs]
def read_dataset(dset):
"""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).
"""
vars_wavespectra = {"freq", "dir", "site", "efth", "lon", "lat"}
vars_ww3 = {"frequency", "direction", "station", "efth", "longitude", "latitude"}
vars_wwm = {"nfreq", "ndir", "nbstation", "AC", "lon", "lat"}
vars_ncswan = {
"frequency",
"direction",
"points",
"density",
"longitude",
"latitude",
}
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
else:
raise ValueError(
f"Cannot identify appropriate reader from dataset variables: {vars_dset}"
)
return func(dset)