Source code for konrad.humidity

"""This module contains classes for handling humidity."""
import logging

from konrad.component import Component
from konrad.utils import prefix_dict_keys
from konrad.physics import relative_humidity2vmr, vmr2relative_humidity
from .stratosphere import *
from .relative_humidity import *


logger = logging.getLogger(__name__)


[docs]class FixedRH(Component): """Preserve the relative humidity profile under temperature changes."""
[docs] def __init__(self, rh_func=None, stratosphere_coupling=None): """Create a humidity handler. Parameters: rh_func (callable): Callable that describes the vertical relative humidity distribution. If `None`, assume a :class:`VerticallyUniform` relative humidity. stratosphere_coupling (callable): Callable that describes how the humidity should be treated in the stratosphere. """ if stratosphere_coupling is None: self._stratosphere_coupling = ColdPointCoupling() else: self._stratosphere_coupling = stratosphere_coupling if rh_func is None: self._rh_func = VerticallyUniform() else: self._rh_func = rh_func self._rh_profile = None
@property def netcdf_subgroups(self): return { "rh_func": self._rh_func, "stratosphere_coupling": self._stratosphere_coupling, }
[docs] def hash_attributes(self): # Make sure that non-``Component`` attributes do not break hashing. return hash( tuple( attr.hash_attributes() for attr in (self._rh_func, self._stratosphere_coupling) if hasattr(attr, "hash_attributes") ) )
@property def rh_func(self): return type(self._rh_func).__name__ @property def stratosphere_coupling(self): return type(self._stratosphere_coupling).__name__
[docs] def adjust_humidity(self, atmosphere, **kwargs): """Determine the humidity profile based on atmospheric state. Parameters: TODO: Write docstring. Returns: ndarray: Water vapor profile [VMR]. """ atmosphere["H2O"][-1, :] = relative_humidity2vmr( relative_humidity=self._rh_func(atmosphere, **kwargs), pressure=atmosphere["plev"], temperature=atmosphere["T"][-1], ) self._stratosphere_coupling.adjust_stratospheric_vmr(atmosphere)
[docs]class FixedVMR(Component): """Keep the water vapor volume mixing ratio constant."""
[docs] def __init__(self, *args, **kwargs): if len(args) + len(kwargs) > 0: # Allow arguments to be passed for consistent interface but # warn the user. logger.warning(f"All input arguments to {self} are ignored.") # Set both attributes for consistent user interface and netCDF output. self.rh_func = "FixedVMR" self.stratosphere_coupling = "FixedVMR"
[docs] def adjust_humidity(self, atmosphere, **kwargs): return