Source code for pyLBL.atmosphere

"""Define how atmospheric inputs are handled."""

from re import match


# Map of molecule standard names to chemical formulae.
_standard_name_to_formula = {
    "carbon_dioxide": "CO2",
    "carbon_monoxide": "CO",
    "cfc11": "CFC11",
    "cfc12": "CFC12",
    "methane": "CH4",
    "nitrogen": "N2",
    "nitrous_oxide": "N2O",
    "oxygen": "O2",
    "ozone": "O3",
    "water_vapor": "H2O",
}


[docs]class Atmosphere(object): """Atmospheric data container with basic data discover methods. Attributes: dataset: Input xarray Dataset. pressure: xarray DataArray object for pressure [Pa]. temperature: xarray DataArray object for temperature [K]. gases: Dictionary of xarray DataArray objects for gas mole fractions [mol mol-1]. """ def __init__(self, dataset, mapping=None): """Initializes an atmosphere object by reading data from an input xarray Dataset. Args: dataset: xarray Dataset. mapping: User-specified mapping of dataset variable names. """ self.dataset = dataset # Find the pressure, temperature and gax mixing ratio variables. if mapping is None: self.pressure = _find_variable(dataset, "air_pressure") self.temperature = _find_variable(dataset, "air_temperature") self.gases = {x: y for x, y in _gases(dataset)} else: self.pressure = dataset[mapping["play"]] self.temperature = dataset[mapping["tlay"]] self.gases = {x: dataset[y] for x, y in mapping["mole_fraction"].items()}
def _find_variable(dataset, standard_name): """Finds a variable in a dataset by its standard name attribute. Args: dataset: xarray Dataset. standard_name: String standard name. Returns: xarray DataArray object. Raises: ValueError if standard name is not found in the dataset. """ for var in dataset.data_vars.values(): try: if var.attrs["standard_name"] == standard_name: return var except KeyError: continue raise ValueError(f"{standard_name} standard name not found in dataset.") def _gases(dataset): """Finds variables that represent gas mole fractions. Args: dataset: xarray Dataset. Yields: Gas name (i.e. "H2O") and xarray DataArray. """ for var in dataset.data_vars.values(): try: m = match("mole_fraction_of_([A-Za-z0-9_]+)?_in_air", var.attrs["standard_name"]) except KeyError: continue if m: yield _standard_name_to_formula[m.group(1)], var