Source code for climlab.radiation.water_vapor

from __future__ import division
import numpy as np
from climlab.process.diagnostic import DiagnosticProcess
from climlab import constants as const
from climlab.utils.thermo import clausius_clapeyron


[docs] class FixedRelativeHumidity(DiagnosticProcess): def __init__(self, relative_humidity=0.77, qStrat=5.E-6, **kwargs): '''Compute water vapor mixing ratio profile Assuming constant relative humidity. relative_humidity is the specified RH. Same value is applied everywhere. qStrat is the minimum specific humidity, ensuring that there is some water vapor in the stratosphere. The attribute RH_profile can be modified to set different vertical profiles of relative humidity (see daughter class ManabeWaterVapor() ).''' super(FixedRelativeHumidity, self).__init__(**kwargs) newinput = ['relative_humidity', 'qStrat', 'RH_profile',] self.declare_input(newinput) self.relative_humidity = relative_humidity self.qStrat = qStrat self.RH_profile = self.relative_humidity * np.ones_like(self.Tatm) # go ahead and set the initial q based on initial temperature self.add_diagnostic('q', 0.*self.Tatm) self._compute() def _compute(self): es = clausius_clapeyron(self.Tatm) e = self.RH_profile * es # convert to specific humidity (assume dilute) qH2O = e/self.lev * const.Rd / const.Rv # mixing ratio can't be smaller than qStrat # (need some water in the stratosphere!) q = np.maximum(self.qStrat, qH2O) # Just set this directly here q_adjustment = q - self.q self.q += q_adjustment return {}
[docs] class ManabeWaterVapor(FixedRelativeHumidity): def __init__(self, **kwargs): '''Compute water vapor mixing ratio profile following Manabe and Wetherald JAS 1967 Fixed surface relative humidity and a specified fractional profile. relative_humidity is the specified surface RH qStrat is the minimum specific humidity, ensuring that there is some water vapor in the stratosphere.''' super(ManabeWaterVapor, self).__init__(**kwargs) p = self.lev Q = p / const.ps self.RH_profile = self.relative_humidity * ((Q - 0.02) / (1-0.02)) self._compute() # call this again so the diagnostic is correct initially