Source code for climlab.radiation.rrtm.rrtmg

from __future__ import division
from __future__ import absolute_import
import numpy as np
from climlab import constants as const
from climlab.radiation.radiation import _Radiation_SW, _Radiation_LW
from .rrtmg_lw import RRTMG_LW
from .rrtmg_sw import RRTMG_SW, nbndsw


[docs] class RRTMG(_Radiation_SW, _Radiation_LW): '''Container to drive combined LW and SW radiation models. For some details about inputs and diagnostics, see the `radiation` module. ''' def __init__(self, # GENERAL, used in both SW and LW icld = 1, # Cloud overlap method, 0: Clear only, 1: Random, 2, Maximum/random] 3: Maximum irng = 1, # more monte carlo stuff idrv = 0, # whether to also calculate the derivative of flux with respect to surface temp permuteseed_sw = 150, # used for monte carlo clouds; must differ from permuteseed_lw by number of subcolumns permuteseed_lw = 300, # learn about these later... dyofyr = 0, # day of the year used to get Earth/Sun distance (if not adjes) # CLOUDS, SW see http://www.arm.gov/publications/proceedings/conf16/extended_abs/iacono_mj.pdf inflgsw = 2, # Flag for cloud optical properties # INFLAG = 0 direct specification of optical depths of clouds; # cloud fraction and cloud optical depth (gray) are # input for each cloudy layer # = 1 calculation of combined ice and liquid cloud optical depths (gray) # as in CCM2; cloud fraction and cloud water path are input for # each cloudy layer. # = 2 calculation of separate ice and liquid cloud optical depths, with # parameterizations determined by values of ICEFLAG and LIQFLAG. # Cloud fraction, cloud water path, cloud ice fraction, and # effective ice radius are input for each cloudy layer for all # parameterizations. If LIQFLAG = 1, effective liquid droplet radius # is also needed. inflglw = 2, iceflgsw = 1, # Flag for ice particle specification # ICEFLAG = 0 the optical depths (gray) due to ice clouds are computed as in CCM3. # = 1 the optical depths (non-gray) due to ice clouds are computed as closely as # possible to the method in E.E. Ebert and J.A. Curry, JGR, 97, 3831-3836 (1992). # = 2 the optical depths (non-gray) due to ice clouds are computed by a method # based on the parameterization used in the radiative transfer model Streamer # (reference, J. Key, Streamer User's Guide, Technical Report 96-01] Boston # University, 85 pp. (1996)), which is closely related to the parameterization # of water clouds due to Hu and Stamnes (see below). # = 3 the optical depths (non-gray) due to ice clouds are computed by a method # based on the parameterization given in Fu et al., J. Clim.,11,2223-2237 (1998). # specific definition of reic depends on setting of iceflglw: # iceflglw = 0, ice effective radius, r_ec, (Ebert and Curry, 1992)] # r_ec must be >= 10.0 microns # iceflglw = 1, ice effective radius, r_ec, (Ebert and Curry, 1992)] # r_ec range is limited to 13.0 to 130.0 microns # iceflglw = 2, ice effective radius, r_k, (Key, Streamer Ref. Manual] 1996) # r_k range is limited to 5.0 to 131.0 microns # iceflglw = 3, generalized effective size, dge, (Fu, 1996)] # dge range is limited to 5.0 to 140.0 microns # [dge = 1.0315 * r_ec] iceflglw = 1, liqflgsw = 1, # Flag for liquid droplet specification # LIQFLAG = 0 the optical depths (gray) due to water clouds are computed as in CCM3. # = 1 the optical depths (non-gray) due to water clouds are computed by a method # based on the parameterization of water clouds due to Y.X. Hu and K. Stamnes, # J. Clim., 6, 728-742 (1993). liqflglw = 1, tauc_sw = 0., # In-cloud optical depth tauc_lw = 0., # in-cloud optical depth ssac_sw = 0., # In-cloud single scattering albedo asmc_sw = 0., # In-cloud asymmetry parameter fsfc_sw = 0., # In-cloud forward scattering fraction (delta function pointing forward "forward peaked scattering") # AEROSOLS tauaer_sw = 0., # Aerosol optical depth (iaer=10 only), Dimensions, (ncol,nlay,nbndsw)] # (non-delta scaled) ssaaer_sw = 0., # Aerosol single scattering albedo (iaer=10 only), Dimensions, (ncol,nlay,nbndsw)] # (non-delta scaled) asmaer_sw = 0., # Aerosol asymmetry parameter (iaer=10 only), Dimensions, (ncol,nlay,nbndsw)] # (non-delta scaled) ecaer_sw = 0., # Aerosol optical depth at 0.55 micron (iaer=6 only), Dimensions, (ncol,nlay,naerec)] # (non-delta scaled) tauaer_lw = 0., # Aerosol optical depth at mid-point of LW spectral bands # new arguments for RRTMG_SW version 4.0 isolvar = 0, # ! Flag for solar variability method # ! -1 = (when scon .eq. 0.0): No solar variability # ! and no solar cycle (Kurucz solar irradiance # ! of 1368.22 Wm-2 only); # ! (when scon .ne. 0.0): Kurucz solar irradiance # ! scaled to scon and solar variability defined # ! (optional) by setting non-zero scale factors # ! for each band in bndsolvar # ! 0 = (when SCON .eq. 0.0): No solar variability # ! and no solar cycle (NRLSSI2 solar constant of # ! 1360.85 Wm-2 for the 100-50000 cm-1 spectral # ! range only), with facular and sunspot effects # ! fixed to the mean of Solar Cycles 13-24; # ! (when SCON .ne. 0.0): No solar variability # ! and no solar cycle (NRLSSI2 solar constant of # ! 1360.85 Wm-2 for the 100-50000 cm-1 spectral # ! range only), is scaled to SCON # ! 1 = Solar variability (using NRLSSI2 solar # ! model) with solar cycle contribution # ! determined by fraction of solar cycle # ! with facular and sunspot variations # ! fixed to their mean variations over the # ! average of Solar Cycles 13-24; # ! two amplitude scale factors allow # ! facular and sunspot adjustments from # ! mean solar cycle as defined by indsolvar # ! 2 = Solar variability (using NRLSSI2 solar # ! model) over solar cycle determined by # ! direct specification of Mg (facular) # ! and SB (sunspot) indices provided # ! in indsolvar (scon = 0.0 only) # ! 3 = (when scon .eq. 0.0): No solar variability # ! and no solar cycle (NRLSSI2 solar irradiance # ! of 1360.85 Wm-2 only); # ! (when scon .ne. 0.0): NRLSSI2 solar irradiance # ! scaled to scon and solar variability defined # ! (optional) by setting non-zero scale factors # ! for each band in bndsolvar indsolvar = np.zeros(2), # Facular and sunspot amplitude scale factors (isolvar=1), # or Mg and SB indices (isolvar=2) bndsolvar = np.zeros(nbndsw), # Solar variability scale factors for each shortwave band solcycfrac = 0., # Fraction of averaged solar cycle (0-1) at current time (isolvar=1) **kwargs): super(RRTMG, self).__init__(**kwargs) # Remove specific inputs from kwargs dictionary. # We want any changes implemented in the parent __init__ method to be preserved here remove_list = ['absorber_vmr','cldfrac','clwp','ciwp','r_liq','r_ice', 'emissivity','aldif','aldir','asdif','asdir','S0','coszen', 'eccentricity_factor','insolation',] for item in remove_list: if item in kwargs: ignored = kwargs.pop(item) # we need to convert insolation into _insolation so: # (we define getters and setters for this at the end) self._insolation = self.insolation # we repeat the above work to fix this issue for coszen self._coszen = self.coszen LW = RRTMG_LW(absorber_vmr = self.absorber_vmr, cldfrac = self.cldfrac, clwp = self.clwp, ciwp = self.ciwp, r_liq = self.r_liq, r_ice = self.r_ice, icld = icld, irng = irng, idrv = idrv, permuteseed = permuteseed_lw, emissivity = self.emissivity, inflglw = inflglw, iceflglw = iceflglw, liqflglw = liqflglw, tauc = tauc_lw, tauaer = tauaer_lw, **kwargs) SW = RRTMG_SW(absorber_vmr = self.absorber_vmr, cldfrac = self.cldfrac, clwp = self.clwp, ciwp = self.ciwp, r_liq = self.r_liq, r_ice = self.r_ice, icld = icld, irng = irng, permute = permuteseed_sw, aldif = self.aldif, aldir = self.aldir, asdif = self.asdif, asdir = self.asdir, S0 = self.S0, coszen = self.coszen, eccentricity_factor = self.eccentricity_factor, dyofyr = dyofyr, insolation = self.insolation, inflgsw = inflgsw, iceflgsw = iceflgsw, tauc = tauc_sw, ssac = ssac_sw, asmc = asmc_sw, fsfc = fsfc_sw, tauaer = tauaer_sw, ssaaer = ssaaer_sw, asmaer = asmaer_sw, ecaer = ecaer_sw, isolvar = isolvar, indsolvar = indsolvar, bndsolvar = bndsolvar, solcycfrac = solcycfrac, **kwargs) self.add_subprocess('SW', SW) self.add_subprocess('LW', LW ) self.add_input('icld', icld) self.add_input('irng', irng) self.add_input('idrv', idrv) self.add_input('permuteseed_sw', permuteseed_sw) self.add_input('permuteseed_lw', permuteseed_lw) self.add_input('dyofyr', dyofyr) self.add_input('inflgsw', inflgsw) self.add_input('inflglw', inflglw) self.add_input('iceflgsw', iceflgsw) self.add_input('iceflglw', iceflglw) self.add_input('liqflgsw', liqflgsw) self.add_input('liqflglw', liqflglw) self.add_input('tauc_sw', tauc_sw) self.add_input('tauc_lw', tauc_lw) self.add_input('ssac_sw', ssac_sw) self.add_input('asmc_sw', asmc_sw) self.add_input('fsfc_sw', fsfc_sw) self.add_input('tauaer_sw', tauaer_sw) self.add_input('ssaaer_sw', ssaaer_sw) self.add_input('asmaer_sw', asmaer_sw) self.add_input('ecaer_sw', ecaer_sw) self.add_input('tauaer_lw', tauaer_lw) self.add_input('isolvar', isolvar) self.add_input('indsolvar', indsolvar) self.add_input('bndsolvar', bndsolvar) self.add_input('solcycfrac', solcycfrac) @property def insolation(self): return self._insolation @insolation.setter def insolation(self, x): self._insolation = x # propagate to 'SW' if 'SW' in self.subprocess: self.subprocess['SW'].insolation = x @property def coszen(self): return self._coszen @coszen.setter def coszen(self, x): self._coszen = x # propagate to 'SW' if 'SW' in self.subprocess: self.subprocess['SW'].coszen = x