Source code for foxes.input.yaml.windio.read_fields

import numpy as np
from numbers import Number

import foxes.variables as FV
import foxes.constants as FC


""" Mapping from windio to foxes variables
:group: input.yaml.windio
"""
wio2foxes = {
    "time": FC.TIME,
    "x": FV.X,
    "y": FV.Y,
    "height": FV.H,
    "wind_turbine": FC.TURBINE,
    "wind_direction": FV.WD,
    "wind_speed": FV.WS,
    "probability": FV.WEIGHT,
    "sector_probability": "sector_probability",
    "turbulence_intensity": FV.TI,
    "LMO": FV.MOL,
    "z0": FV.Z0,
    "reference_height": FV.H,
}

""" Mapping from foxes to windio variables
:group: input.yaml.windio
"""
foxes2wio = {d: k for k, d in wio2foxes.items()}


def _read_nondimensional_coordinate(name, wio_data, coords):
    """read nondimensional coordinate
    :group: input.yaml.windio
    """
    if isinstance(wio_data, Number):
        coords[wio2foxes[name]] = wio_data
        return True
    return False


def _read_dimensional_coordinate(name, wio_data, coords):
    """read dimensional coordinate
    :group: input.yaml.windio
    """
    if isinstance(wio_data, list):
        wio_data = np.array(wio_data)
    if isinstance(wio_data, np.ndarray) and len(wio_data.shape) == 1:
        coords[wio2foxes[name]] = wio_data
        return True
    return False


def _read_multi_dimensional_coordinate(name, wio_data, coords):
    """Read multi dimensional coordinate
    :group: input.yaml.windio
    """
    return _read_nondimensional_coordinate(
        name, wio_data, coords
    ) or _read_dimensional_coordinate(name, wio_data, coords)


def _read_nondimensional_data(name, wio_data, fields, dims):
    """read nondimensional data
    :group: input.yaml.windio
    """
    if isinstance(wio_data, Number):
        v = wio2foxes[name]
        fields[v] = wio_data
        dims[v] = []
        return True
    return False


def _read_dimensional_data(name, wio_data, fields, dims):
    """read dimensional data
    :group: input.yaml.windio
    """
    if isinstance(wio_data, dict) and "data" in wio_data and "dims" in wio_data:
        d = wio_data["data"]
        v = wio2foxes[name]
        fields[v] = d if isinstance(d, np.ndarray) else np.array(d)
        dims[v] = tuple([wio2foxes[c] for c in wio_data["dims"]])
        if len(dims[v]) != len(fields[v].shape):
            raise ValueError(
                f"Field '{name}': Dimensions {dims[v]} do not match shape {fields[v].shape}"
            )
        return True
    return False


def _read_multi_dimensional_data(name, wio_data, fields, dims):
    """Read multi dimensional data
    :group: input.yaml.windio
    """
    return _read_nondimensional_data(
        name, wio_data, fields, dims
    ) or _read_dimensional_data(name, wio_data, fields, dims)


[docs] def read_wind_resource_field( name, wio_data, coords, fields, dims, verbosity, ): """ Reads wind resource data into fields and dims Parameters ---------- name: str The windio variable name wio_data: object The windio data coords: dict The coordinates dict, filled on the fly fields: dict The fields dict, filled on the fly dims: dict The dimensions dict, filled on the fly verbosity: int The verbosity level, 0=silent Returns ------- success: bool Flag for successful data extraction :group: input.yaml.windio """ if name in [ "weibull_a", "weibull_k", "potential_temperature", "friction_velocity", "k", "epsilon", "ABL_height", "lapse_rate", "capping_inversion_thickness", "capping_inversion_strength", "tau_x", "tau_y", "fc", ]: if verbosity > 2: print(f" Ignoring variable '{name}'") return False if verbosity > 2: print(f" Reading variable '{name}'") if name in ["time", "wind_turbine"] and _read_multi_dimensional_coordinate( name, wio_data, coords ): return True elif name in [ "wind_direction", "wind_speed", "x", "y", "height", ] and ( _read_multi_dimensional_coordinate(name, wio_data, coords) or _read_multi_dimensional_data(name, wio_data, fields, dims) ): return True elif name in [ "probability", "sector_probability", "turbulence_intensity", "LMO", "z0", "reference_height", ] and _read_multi_dimensional_data(name, wio_data, fields, dims): return True else: raise NotImplementedError(f"No reading method implemented for field '{name}'")