exo_k.two_stream.two_stream_toon
Created in Jan 2021.
@author: jeremy leconte
Module Contents
- exo_k.two_stream.two_stream_toon.solve_2stream_nu_xsec(source_nu, tau_nu, dtau_nu, omega0_nu, g_asym_nu, flux_top_dw_nu, alb_surf_nu, mu0=0.5, flux_at_level=False, mu_star=None, stellar_mode='diffusive', planck_correction_factor=None)[source]
Deals with the spectral axis.
- Parameters:
source_nu (numpy.ndarray) – \(\pi B(T)\) (Planck function) at each of the Nlay+1 level interfaces. Shape: (Nlev+1, Nw).
tau_nu (numpy.ndarray) – Cumulative optical depth of the previous levels, start at 0. The last value tau[-1] is equals to the optical depth of the column. Shape: (Nlev+1, Nw).
dtau_nu (numpy.ndarray) – Optical depth of each level, for each band. Shape: (Nlev, Nw).
omega0_nu (numpy.ndarray) – Single scattering albedo of each level for each band. Shape: (Nlev, Nw).
g_asym_nu (numpy.ndarray) – Asymmetry factor. Shape: (Nlev, Nw).
flux_top_dw_nu (numpy.ndarray) – Top down flux, either diffusive or collimated. Shape: (Nw,).
alb_surf_nu (numpy.ndarray) – Surface albedo. Emissivity is assumed to be 1.-alb_surf. Shape: (Nw,).
mu0 (float) –
\(\mu_0\) is the incident direction of the observer. It is used as an effective angle.
\(\frac{1}{2}\) yields the hemispheric mean approximation.
\(\frac{1}{\sqrt(3)}\) yields the quadrature approximation
flux_at_level (bool) –
If
flux_at_levelisTrue, fluxes are calculated at the level surfaces.If
False, fluxes are computed at the middle of the layers.
The top of atmosphere flux is always computed at the top of the uppermost layer (1st level).
mu_star (Optional[float]) – \(\mu_*\) is the incident direction of the solar beam. Used when the incoming diffuse flux is treated as a source term.
stellar_mode (Literal['diffusive', 'collimated']) –
When flux_top_dw_nu is provided, set the method to be used to take it into account.
diffusive: Incoming diffuse flux at the upper boundary.collimated: Incoming diffuse flux is treated as a source term.
planck_correction_factor (Optional[float]) – Allow setting the epsilon used to rewrite the equations , from Chaverot et al. (2022).
- Returns:
flux_up (
np.ndarray) – Shape: (Nlev, Nw).flux_dw (
np.ndarray) – Shape: (Nlev, Nw).flux_net (
np.ndarray) – Shape: (Nlev, Nw).J4pi (
np.ndarray) – Shape: (Nlev, Nw, Ng).
- Return type:
Tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon.solve_2stream_nu_corrk(source_nu, tau_nu, dtau_nu, omega0_nu, g_asym_nu, flux_top_dw_nu, alb_surf_nu, mu0=0.5, flux_at_level=False, mu_star=None, stellar_mode='diffusive', planck_correction_factor=None)[source]
Deals with the spectral axis.
- Parameters:
source_nu (numpy.ndarray) – \(\pi B(T)\) (Planck function) at each of the Nlay+1 level interfaces. Shape: (Nlev+1, Nw).
tau_nu (numpy.ndarray) – Cumulative optical depth of the previous levels, start at 0. The last value tau[-1] is equals to the optical depth of the column. Shape: (Nlev+1, Nw, Ng).
dtau_nu (numpy.ndarray) – Optical depth of each level, for each band. Shape: (Nlev, Nw, Ng).
omega0_nu (numpy.ndarray) – Single scattering albedo of each level, for each band. Shape: (Nlev, Nw, Ng).
g_asym_nu (numpy.ndarray) – Asymmetry factor. Shape: (Nlev, Nw, Ng).
flux_top_dw_nu (numpy.ndarray) – Top down flux, either diffusive or collimated. Shape: (Nw,).
alb_surf_nu (numpy.ndarray) – Surface albedo. Emissivity is assumed to be 1.-alb_surf. Shape: (Nw,).
mu0 (float) –
\(\mu_0\) is the incident direction of the observer. It is used as an effective angle.
\(\frac{1}{2}\) yields the hemispheric mean approximation.
\(\frac{1}{\sqrt(3)}\) yields the quadrature approximation
flux_at_level (bool) –
If
flux_at_levelisTrue, fluxes are calculated at the level surfaces.If
False, fluxes are computed at the middle of the layers.
The top of atmosphere flux is always computed at the top of the uppermost layer (1st level).
mu_star (Optional[float]) – \(\mu_*\) is the incident direction of the solar beam. Used when the incoming diffuse flux is treated as a source term.
stellar_mode (Literal['diffusive', 'collimated']) – Dictate how flux_top_dw_nu is taken it into account. -
diffusive: Incoming diffuse flux at the upper boundary. -collimated: Incoming diffuse flux is treated as a source term.planck_correction_factor (Optional[float]) – Allow setting the epsilon used to rewrite the equations , from Chaverot et al. (2022).
- Returns:
flux_up (
np.ndarray) – Shape: (Nlev, Nw, Ng).flux_dw (
np.ndarray) – Shape: (Nlev, Nw, Ng).flux_net (
np.ndarray) – Shape: (Nlev, Nw, Ng).J4pi (
np.ndarray) – Shape: (Nlev, Nw, Ng).
- Return type:
Tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon.solve_2stream(source, tau, dtau, omega0, g_asym, flux_top_dw, alb_surf, mu0, flux_at_level, mu_star, stellar_mode, planck_correction_factor)[source]
Solve the 2-stream equations over a bin.
After Toon et al. (JGR, 1989). Equation numbers refer to this article.
alb_surf= \(R_{sfc}\),emis_surf= \(\varepsilon\) =1 - alb_surf= \(1 - R_{sfc}\),- Parameters:
source (numpy.ndarray) – Shape: (Nlev+1,).
tau (numpy.ndarray) – Shape: (Nlev+1,).
dtau (numpy.ndarray) – Shape: (Nlev,).
omega0 (numpy.ndarray) – Shape: (Nlev,).
g_asym (numpy.ndarray) – Shape: (Nlev,).
mu0 (float)
flux_top_dw (float)
alb_surf (float)
flux_at_level (bool)
mu_star (Optional[float])
stellar_mode (Literal['diffusive', 'collimated'])
planck_correction_factor (Optional[float]) – Allow setting the epsilon used to rewrite the equations , from Chaverot et al. (2022).
- Returns:
flux_up (
np.ndarray) – Shape: (Nlev+1,).flux_dw (
np.ndarray) – Shape: (Nlev+1,).flux_net (
np.ndarray) – Shape: (Nlev+1,).J4pi (
np.ndarray) – Shape: (Nlev+1,).
- Return type:
Tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon.c_planck(source, dtau, gamma_1, gamma_2)[source]
c_up/dw is for c+/- without direct beam scattering.
_top is for tau equal 0 (top of the layer) _bot is for tau=dtau (bottom of the layer) removed a pi factor because source is pi*B :param source: Shape: (Nlev+1,) :param dtau: Shape: (Nlev,) :param gamma_1: Shape: (Nlev,) :param gamma_2: Shape: (Nlev,)
- Returns:
c_up_top (
np.ndarray) – Shape: (Nlev,)c_dw_top (
np.ndarray) – Shape: (Nlev,)c_up_bot (
np.ndarray) – Shape: (Nlev,)c_dw_bot (
np.ndarray) – Shape: (Nlev,)
- Parameters:
source (numpy.ndarray)
dtau (numpy.ndarray)
gamma_1 (numpy.ndarray)
gamma_2 (numpy.ndarray)
- Return type:
Tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon._c_star_denominator(l, mu_star, eps_frac=1e-12)[source]
Compute the denominator for equations (23) and (24). We use the following reference: https://github.com/NCAR/iCESM1.2/blob/355f7b2c77f1b49004145f6b975617c0917d18ce/models/atm/cam/src/chemistry/mozart/mo_ps2str.F90#L236C1-L238C47 This allow to properly implement “In practice, if the equality happens to occur, this problem can be eliminated by simply choosing a slightly different value of mu0” (Toon & al 1989)
- Parameters:
l (numpy.ndarray) – lambda_toon value
mu_star (float) – \(\mu_{*}\)
eps_frac (float)
- Return type:
- exo_k.two_stream.two_stream_toon.c_star(flux_collimated_top_down, taucum, dtau, gamma_1, gamma_2, gamma_3, gamma_4, omega_0, mu_star)[source]
Compute the values of \(C^{+}(0), C^{-}(0),C^{+}(\tau)\) and \(C^{-}(\tau)\) for the solar radiation part.
Follow the equations (23) and (24).
- Parameters:
flux_collimated_top_down (float)
taucum (numpy.ndarray) – Shape: (Nlev+1,).
dtau (numpy.ndarray) – Shape: (Nlev,).
gamma_1 (numpy.ndarray) – \(\gamma_{1}\) Shape: (Nlev,).
gamma_2 (numpy.ndarray) – \(\gamma_{2}\) Shape: (Nlev,).
gamma_3 (numpy.ndarray) – \(\gamma_{3}\) Shape: (Nlev,).
gamma_4 (numpy.ndarray) – \(\gamma_{3}\) Shape: (Nlev,).
omega_0 (numpy.ndarray) – \(\omega_{0}\) Shape: (Nlev,).
mu_star (float) – \(\mu_{*}\)
- Returns:
$C^```{+}`(0)$– Shape: (Nlev,).$C^```{-}`(0)$– Shape: (Nlev,).$C^```{+}`(tau)$– Shape: (Nlev,).$C^```{-}`(tau)$– Shape: (Nlev,).
- Return type:
Tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon.c_planck_mid(source, dtau, gamma_1, gamma_2)[source]
Compute \(C^\pm\) at the middle of the layer, i.e. at tau=dtau/2, ie \(C^\pm(\frac{\tau}{2})\).
c_up/dw is for c+/- without direct beam scattering.
- Parameters:
source (numpy.ndarray) – Shape: (Nlev+1,).
dtau (numpy.ndarray) – Shape: (Nlev,).
gamma_1 (numpy.ndarray) – \(\gamma_1\) Shape: (Nlev,).
gamma_2 (numpy.ndarray) – \(\gamma_2\) Shape: (Nlev,).
- Returns:
$C^```{+}`(frac```{tau}````{2}`)$– Shape: (Nlev,).$C^```{-}`(frac```{tau}````{2}`)$– Shape: (Nlev,).
- Return type:
Tuple[numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon.c_star_mid(flux_collimated_top_down, taucum, dtau, gamma_1, gamma_2, gamma_3, gamma_4, omega_0, mu_star)[source]
Compute \(C^\pm\) at the middle of the layer, i.e. at tau=dtau/2, ie \(C^\pm(\frac{\tau}{2})\).
- Parameters:
flux_collimated_top_down (float)
taucum (numpy.ndarray) – Shape: (Nlev+1,).
dtau (numpy.ndarray) – Shape: (Nlev,).
gamma_1 (numpy.ndarray) – \(\gamma_1\) Shape: (Nlev,).
gamma_2 (numpy.ndarray) – \(\gamma_2\) Shape: (Nlev,).
gamma_3 (numpy.ndarray) – \(\gamma_3\) Shape: (Nlev,).
gamma_4 (numpy.ndarray) – \(\gamma_{3}\) Shape: (Nlev,).
omega_0 (numpy.ndarray) – \(\omega_0\) Shape: (Nlev,).
mu_star (float) – \(\mu_*\)
- Returns:
$C^```{+}`(frac```{tau}````{2}`)$– Shape: (Nlev,).$C^```{-}`(frac```{tau}````{2}`)$– Shape: (Nlev,).
- Return type:
Tuple[numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon.mid_factor_toon(dtau, gamma_1, gamma_2)[source]
Factors to recover the flux at mid layer.
- Parameters:
dtau (numpy.ndarray) – Shape: (Nlev,).
gamma_1 (numpy.ndarray) – \(\gamma_1\) Shape: (Nlev,).
gamma_2 (numpy.ndarray) – \(\gamma_2\) Shape: (Nlev,).
- Returns:
\(\text{factor}_{1,\frac{1}{2}}\) (
np.ndarray)\(\text{factor}_{2,\frac{1}{2}}\) (
np.ndarray)
- Return type:
Tuple[numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon.s_planck(omega0, bb_source, planck_correction_factor)[source]
Implement equation (15).
- Parameters:
omega0 (numpy.ndarray) – Shape: (Nlev,).
bb_source (numpy.ndarray) – Shape: (Nlev,).
planck_correction_factor (float)
- Returns:
\(S^+\) (
np.ndarray) – Shape: (Nlev,).\(S^-\) (
np.ndarray) – Shape: (Nlev,).
- Return type:
Tuple[numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon.s_star(omega0, gamma_3, gamma_4, taucum, flux_collimated_top_down, mu_star)[source]
Implement equations (13) and (14).
- Parameters:
omega0 (numpy.ndarray) – Shape: (Nlev,).
gamma_3 (numpy.ndarray) – Shape: (Nlev,).
gamma_4 (numpy.ndarray) – Shape: (Nlev,).
taucum (numpy.ndarray) – Shape: (Nlev+1,).
flux_collimated_top_down (float)
mu_star (float)
- Returns:
\(S^+\) (
np.ndarray) – Shape: (Nlev,).\(S^-\) (
np.ndarray) – Shape: (Nlev,).
- Return type:
Tuple[numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon._gamma_planck(omega0, g_asym, mu0, planck_correction_factor)[source]
Compute the value for \(\gamma_1\) and \(\gamma_2\) using Table 1.
- Parameters:
omega0 (numpy.ndarray) – Shape: (Nlev,)
g_asym (numpy.ndarray) – Shape: (Nlev,)
mu0 (float)
planck_correction_factor (float)
- Returns:
- \(\gamma_1\)np.ndarray
Shape: (Nlev,)
- \(\gamma_2\)np.ndarray
Shape: (Nlev,)
- Return type:
Tuple[numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon._gamma_star(g_asym, mu0, mu_star)[source]
Compute the value of \(\gamma_{3,4}\), following Toon et al.
At this moment, we made the choice to use the value for the quadrature method and identifying the factor \(\sqrt{3}\) to \(\frac{1}{mu0}\) in our code. Moreover, these factor are not subject to the planck_correction_factor.
Notes
For this function, \(\mu_0\) should have the same meaning as \(\mu_1\) in the article.
- Parameters:
g_asym (numpy.ndarray) – Shape: (Nlev,).
mu0 (float)
mu_star (float)
- Returns:
\(\gamma_3\) (
np.ndarray) – Shape: (Nlev,).\(\gamma_4\) (
np.ndarray) – Shape: (Nlev,).
- Return type:
Tuple[numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon._gammas_toon(omega0, g_asym, mu0, mu_star, planck_correction_factor, stellar_mode)[source]
Compute the value for \(\gamma_1\), \(\gamma_2\), \(\gamma_3\) and \(\gamma_4\).
- Parameters:
omega0 (numpy.ndarray) – Shape: (Nlev,)
g_asym (numpy.ndarray) – Shape: (Nlev,)
mu0 (float)
mu_star (float)
planck_correction_factor (float)
stellar_mode (Literal['diffusive', 'collimated'])
- Returns:
- \(\gamma_1\)np.ndarray
Shape: (Nlev,)
- \(\gamma_2\)np.ndarray
Shape: (Nlev,)
- \(\gamma_3\)np.ndarray
Shape: (Nlev,)
- \(\gamma_4\)np.ndarray
Shape: (Nlev,)
- Return type:
Tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon.lambda_toon2(gamma_1, gamma_2)[source]
Compute \(\lambda^2\) from eq 21 of Toon et al.
- Parameters:
gamma_1 (numpy.ndarray) – \(\gamma_1\), Shape: (Nlev,).
gamma_2 (numpy.ndarray) – \(\gamma_2\), Shape: (Nlev,).
- Returns:
\(\left( \gamma_1^2 - \gamma_2^2 \right)\) – Shape: (Nlev,).
- Return type:
np.ndarray
- exo_k.two_stream.two_stream_toon.lambda_toon(gamma_1, gamma_2)[source]
Compute \(\lambda\) from eq 21 of Toon et al.
- Parameters:
gamma_1 (numpy.ndarray) – \(\gamma_1\) Shape: (Nlev,).
gamma_2 (numpy.ndarray) – \(\gamma_2\) Shape: (Nlev,).
- Returns:
\(\left( \gamma_1^2 - \gamma_2^2 \right)^\frac{1}{2}\) – Shape: (Nlev,).
- Return type:
np.ndarray
- exo_k.two_stream.two_stream_toon.lambda_GAMMA(gamma_1, gamma_2)[source]
Compute \(\lambda\) and \(\Gamma\) from eq 21 and 22 of Toon et al.
Notes
Toon and al. provide two formulas for \(\Gamma\) at equation (22):
\(\frac{\gamma_2}{\gamma_1 + \lambda}\)
\(\frac{\gamma_1 - \lambda}{\gamma_2}\)
We choose two use the first one.
- Parameters:
gamma_1 – \(\gamma_1\) Shape: (Nlev,)
gamma_2 – \(\gamma_2\) Shape: (Nlev,)
- Returns:
\(\lambda\) (
np.ndarray) – Shape: (Nlev,)\(\Gamma\) (
np.ndarray) – Shape: (Nlev,)
- Return type:
Tuple[numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon.e_i_toon(dtau, gamma_1, gamma_2)[source]
\(e_i\) factors defined in eq 44.
- Parameters:
dtau (numpy.ndarray) – Shape: (Nlev,)
gamma_1 (numpy.ndarray) – \(\gamma_1\) Shape: (Nlev,)
gamma_2 (numpy.ndarray) – \(\gamma_2\) Shape: (Nlev,)
- Returns:
\(e_{1}\) (
np.ndarray) – Shape: (Nlev,)\(e_{2}\) (
np.ndarray) – Shape: (Nlev,)\(e_{3}\) (
np.ndarray) – Shape: (Nlev,)\(e_{4}\) (
np.ndarray) – Shape: (Nlev,)
- Return type:
Tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon.matrix_toon_tridiag(Nlev, taucum, dtau, omega_0, gamma_1, gamma_2, gamma_3, gamma_4, source, mu0, mu_star, flux_diffuse_top_dw, flux_collimated_top_dw, alb_surf, flux_at_level)[source]
Compute the up/dw/net fluxes and J4pi.
- Parameters:
Nlev (int) – Number of levels.
taucum (numpy.ndarray) – Shape: (Nlev+1,)=(Nlay,).
dtau (numpy.ndarray) – Shape: (Nlev,).
omega_0 (numpy.ndarray) – Shape: (Nlev,).
source (numpy.ndarray) – Shape: (Nlev,).
gamma_1 (numpy.ndarray) – Shape: (Nlev,).
gamma_2 (numpy.ndarray) – Shape: (Nlev,).
gamma_3 (numpy.ndarray) – Shape: (Nlev,). Required in collimated mode.
gamma_4 (numpy.ndarray) – Shape: (Nlev,). Required in collimated mode.
mu0 (float)
mu_star (float)
flux_diffuse_top_dw (float) – Top downward flux to be treated as a diffusive flux (ie, boundary condition).
flux_collimated_top_dw (Optional[float]) – Top downward flux to be treated as a collimated flux. Can be seen as \(\mu_0\pi Fs\) in toon.
alb_surf (float) – Shape: (Nlev,).
flux_at_level (bool)
- Returns:
- \(F_{up}\): np.ndarray
Upper flux at the bottom of the Nlay layers. Shape: (Nlev+1,)=(Nlay,).
- \(F_{dw}\): np.ndarray
Down flux at the bottom of the Nlay layers. Shape: (Nlev+1,)=(Nlay,).
- \(F_{net}\): np.ndarray
Net flux at the bottom of the Nlay layers. Shape: (Nlev+1,)=(Nlay,).
- \(4\pi J_n\): np.ndarray
J4pi at the bottom of the Nlay layers. Take into account the contribution from the incident flux. Shape: (Nlev+1,)=(Nlay,).
- Return type:
Tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray, numpy.ndarray]
- exo_k.two_stream.two_stream_toon.DTRIDGL(L, AF, BF, CF, DF)[source]
DIMENSION AF(L),BF(L),CF(L),DF(L),XK(L).
DIMENSION AS(2*L),DS(2*L)
!* THIS SUBROUTINE SOLVES A SYSTEM OF TRIDIAGIONAL MATRIX !* EQUATIONS. THE FORM OF THE EQUATIONS ARE: !* A(I)*X(I-1) + B(I)*X(I) + C(I)*X(I+1) = D(I) !======================================================================!
- Parameters:
L (int)
AF (numpy.ndarray) – Shape: (L,).
BF (numpy.ndarray) – Shape: (L,).
CF (numpy.ndarray) – Shape: (L,).
DF (numpy.ndarray) – Shape: (L,).
- Returns:
Y: np.ndarray
- Return type: