MeridionalMoistDiffusion¶
digraph inheritance87f02b259e { bgcolor=transparent; rankdir=LR; ratio=expand; size=""; "AdvectionDiffusion" [URL="climlab.dynamics.AdvectionDiffusion.html#climlab.dynamics.advection_diffusion.AdvectionDiffusion",dirType=back,fillcolor=white,fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=14,height=0.25,shape=box,style="setlinewidth(0.5),filled",target="_top",tooltip="A parent class for one dimensional implicit advection-diffusion modules."]; "ImplicitProcess" -> "AdvectionDiffusion" [arrowsize=0.5,dirType=back,style="setlinewidth(0.5)"]; "ImplicitProcess" [URL="climlab.process.implicit.html#climlab.process.implicit.ImplicitProcess",dirType=back,fillcolor=white,fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=14,height=0.25,shape=box,style="setlinewidth(0.5),filled",target="_top",tooltip="A parent class for modules that use implicit time discretization."]; "TimeDependentProcess" -> "ImplicitProcess" [arrowsize=0.5,dirType=back,style="setlinewidth(0.5)"]; "MeridionalAdvectionDiffusion" [URL="climlab.dynamics.MeridionalAdvectionDiffusion.html#climlab.dynamics.meridional_advection_diffusion.MeridionalAdvectionDiffusion",dirType=back,fillcolor=white,fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=14,height=0.25,shape=box,style="setlinewidth(0.5),filled",target="_top",tooltip="A parent class for meridional advection-diffusion processes."]; "AdvectionDiffusion" -> "MeridionalAdvectionDiffusion" [arrowsize=0.5,dirType=back,style="setlinewidth(0.5)"]; "MeridionalDiffusion" [URL="climlab.dynamics.MeridionalAdvectionDiffusion.html#climlab.dynamics.meridional_advection_diffusion.MeridionalDiffusion",dirType=back,fillcolor=white,fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=14,height=0.25,shape=box,style="setlinewidth(0.5),filled",target="_top",tooltip="A parent class for meridional diffusion-only processes,"]; "MeridionalAdvectionDiffusion" -> "MeridionalDiffusion" [arrowsize=0.5,dirType=back,style="setlinewidth(0.5)"]; "MeridionalHeatDiffusion" [URL="climlab.dynamics.MeridionalHeatDiffusion.html#climlab.dynamics.meridional_heat_diffusion.MeridionalHeatDiffusion",dirType=back,fillcolor=white,fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=14,height=0.25,shape=box,style="setlinewidth(0.5),filled",target="_top",tooltip="A 1D diffusion solver for Energy Balance Models."]; "MeridionalDiffusion" -> "MeridionalHeatDiffusion" [arrowsize=0.5,dirType=back,style="setlinewidth(0.5)"]; "MeridionalMoistDiffusion" [URL="#climlab.dynamics.meridional_moist_diffusion.MeridionalMoistDiffusion",dirType=back,fillcolor=white,fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=14,height=0.25,shape=box,style="setlinewidth(0.5),filled",target="_top"]; "MeridionalHeatDiffusion" -> "MeridionalMoistDiffusion" [arrowsize=0.5,dirType=back,style="setlinewidth(0.5)"]; "Process" [URL="climlab.process.process.html#climlab.process.process.Process",dirType=back,fillcolor=white,fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=14,height=0.25,shape=box,style="setlinewidth(0.5),filled",target="_top",tooltip="A generic parent class for all climlab process objects."]; "TimeDependentProcess" [URL="climlab.process.time_dependent_process.html#climlab.process.time_dependent_process.TimeDependentProcess",dirType=back,fillcolor=white,fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=14,height=0.25,shape=box,style="setlinewidth(0.5),filled",target="_top",tooltip="A generic parent class for all time-dependent processes."]; "Process" -> "TimeDependentProcess" [arrowsize=0.5,dirType=back,style="setlinewidth(0.5)"]; }Solver for the 1D meridional moist static energy diffusion equation on the sphere:
where \(f(T)\) is a temperature-dependent moisture amplification factor given by
which expresses the effect of latent heat on the near-surface moist static energy, where \(q^*(T)\) is the saturation specific humidity at temperature \(T\) and \(r\) is a relative humidity.
This class operates identically to MeridionalHeatDiffusion
but calculates \(f\)
automatically at each timestep and applies it to the diffusivity.
The magnitude of the moisture amplification is controlled by the input parameter relative_humidity (i.e. \(r\) in the equation above).
It can be used to implement a modified Energy Balance Model accounting for the effects of moisture on the heat transport efficiency.
Derivation of the moist diffusion equation¶
Assume that heat transport is down the gradient of moist static energy \(m = c_p T + L q + g Z\)
For an EBM we want to parameterize everything in terms of a surface temperature \(T_s\). So we write \(m_s = c_p T_s + L r q^*(T_s)\), where \(m_s\) is the moist static energy of near-surface air parcels, \(r\) is a near-surface relative humidity, and \(q^*\) is the saturation specific humidity at a reference surface pressure.
Now express this quantity in temperature units by defining a moist temperature
\(T_m\) is the temperature a dry air parcel would have that has the same total enthalpy as a moist air parcel at temperature \(T_s\)
The down-gradient heat transport parameterization can then be written
where \(D_m\) is the thermal diffusion coefficient for this moist model, in units of W/m2/K.
The equation we are trying to solve is thus
which we can write in terms of \(T_s\) only by substituting in for \(T_m\):
If we make the simplifying assumption that the relative humidity :math:`r` is constant (not a function of latitude), then
To a good approximation (see Hartmann’s book and others), the Clausius-Clapeyron relation for saturation specific humidity gives
Then using a chain rule we have
Plugging this into our model equation we get
This is now in a form that is compatible with our diffusion solver.
Just let
where
or, equivalently,
Given a temperature distribution \(T_s(\phi)\) at any given time, we can calculate the diffusion coefficient \(D(\phi)\) from this formula.
This calculation is implemented in the MeridionalMoistDiffusion
class.
- class climlab.dynamics.meridional_moist_diffusion.MeridionalMoistDiffusion(D=0.24, relative_humidity=0.8, **kwargs)[source]¶
Bases:
MeridionalHeatDiffusion
- Attributes:
- D
- K
- U
depth
Depth at grid centers (m)
depth_bounds
Depth at grid interfaces (m)
diagnostics
Dictionary access to all diagnostic variables
input
Dictionary access to all input variables
lat
Latitude of grid centers (degrees North)
lat_bounds
Latitude of grid interfaces (degrees North)
lev
Pressure levels at grid centers (hPa or mb)
lev_bounds
Pressure levels at grid interfaces (hPa or mb)
lon
Longitude of grid centers (degrees)
lon_bounds
Longitude of grid interfaces (degrees)
- prescribed_flux
timestep
The amount of time over which
step_forward()
is integrating in unit seconds.
Methods
add_diagnostic
(name[, value])Create a new diagnostic variable called
name
for this process and initialize it with the givenvalue
.add_input
(name[, value])Create a new input variable called
name
for this process and initialize it with the givenvalue
.add_subprocess
(name, proc)Adds a single subprocess to this process.
add_subprocesses
(procdict)Adds a dictionary of subproceses to this process.
compute
()Computes the tendencies for all state variables given current state and specified input.
compute_diagnostics
([num_iter])Compute all tendencies and diagnostics, but don't update model state.
declare_diagnostics
(diaglist)Add the variable names in
inputlist
to the list of diagnostics.declare_input
(inputlist)Add the variable names in
inputlist
to the list of necessary inputs.integrate_converge
([crit, verbose])Integrates the model until model states are converging.
integrate_days
([days, verbose])Integrates the model forward for a specified number of days.
integrate_years
([years, verbose])Integrates the model by a given number of years.
remove_diagnostic
(name)Removes a diagnostic from the
process.diagnostic
dictionary and also delete the associated process attribute.remove_subprocess
(name[, verbose])Removes a single subprocess from this process.
set_state
(name, value)Sets the variable
name
to a new statevalue
.set_timestep
([timestep, num_steps_per_year])Calculates the timestep in unit seconds and calls the setter function of
timestep()
step_forward
()Updates state variables with computed tendencies.
to_xarray
([diagnostics, timeave])Convert process variables to
xarray.Dataset
format.