Predefined processes

Predefined processes are provided in this page. Those extracted by the literature cite their according resource. Note that by default all processes utilize the globally-exported predefined variables of ConceptualClimateModels.jl.

Temperature

ConceptualClimateModels.BasicRadiationBalanceType
BasicRadiationBalance(; T, f, ASR, OLR, c_T = 5e8)

Create the equation

\[c_T \frac{dT}{dt} = ASR - OLR + f\]

representing the most basic radiative energy balance at the top of the atmosphere setting a global mean temperature, see e.g., any introductory article (North et al., 1981; Ghil, 1981). ASR is the absorbed solar radiation, which defaults to S*(1 - α) in the default processes. S is the received insolation, by default equal to solar_constant, but could e.g., be any astronomical forcing such as AstronomicalForcingDeSaedeleer. α is the albedo and f any additional forcing such as CO2Forcing. OLR defaults to A + B*T. c_T is the heat capacity of the system in J/K/m². However, for convenience, the parameter added to the final equation is τ_T which is the timescale in seconds, i.e., c_T/solar_constant.

source

Temperature difference

ConceptualClimateModels.ΔTLinearRelaxationFunction
ΔTLinearRelaxation(; ΔT, T, τ = 5e6, A = 36.53, B = 0.658)

Create the equation

\[\tau_{\Delta T}\frac{\Delta T}{dt} = \Delta T_{ref}(T) - \Delta T\]

which exponentially relaxes the equator-to-pole temperature difference ΔT to its reference value $\Delta T_{ref}(T) = A - B*(T - 275.15)$, i.e., it decreases linearly with global mean temperature $T$ (in Kelvin). The default values for A, B are obtained from Equation (2) of (Gaskell et al., 2022). We also fitted paleoclimate data of (Osman et al., 2021) and found very similar results, A = 35.8, B = -1.11 for north hemisphere and A = 27.4, b = -0.513 for south.

Here ΔT is defined as the temperature difference between average temperatures at (0, 30) and (60, 90) latitudes. The timescale is taken as 2 months, although if τ = 0 is given, the equation $\Delta T ~ \Delta T_{ref}(T)$ is created instead.

source
ConceptualClimateModels.ΔTStommelModelFunction
ΔTStommelModel(; ΔT=ΔT, ΔS=ΔS, η1 = 2, η2 = 1, η3 = 0.3)

Create the equations

\[\dot{\Delta T} = \eta_1 - \Delta T - |\Delta T - \Delta S| \Delta T \dot{\Delta S} = \eta_2 - \eta_3\Delta S - |\Delta T - \Delta S| \Delta S\]

which are the two equations of the Stommel box model for Atlantic thermohaline circulation (Stommel, 1961), here presented in nondimensionalized form (Lohmann et al., 2021), so that temperature and sality are normalized by their coefficients $a_T, a_S$ relating them to the density of water

\[\rho = \rho_0 [1 - a_T(T - T_0) + a_S(S-S_0)]\]

for some reference values.

source

Longwave radiation

ConceptualClimateModels.LinearOLRFunction
LinearOLR(; OLR, T, A = -277.0, B = 1.8)

Create the equation OLR ~ A + B*T. This is a linearized outgoing longwave radiation (OLR), and is the same equation as (7) of (North et al., 1981): $OLR = A + BT$ with $T$ temperature in Kelvin and $A, B$ constants. However, default $A, B$ are fitted from current CERES all sky OLR and using ERA5 data for the 2-meter temperature. We assume T in Kelvin. This linear approximation is quite accurate for temporally averaged data $T \in (220, 280)$ however drops drastically in accuracy after that due to the nonlinear effects of clouds (as evident by observational data).

(Koll and Cronin, 2018) provide a "proof" of the linearity of the clear sky OLR due to spectral properties of water vapor.

We note a big difference between current CERES data and the values reported in (North et al., 1981): here A=214.67 (assuming $T$ in Celcius) and B=1.8 versus the values A=203.3 and B=2.09 in (North et al., 1981).

If instead of all sky, if we fit the clear sky CERES data, we get A = -326.0, B = 2.09. Interestingly, coefficient B here is the same as that reported by (North et al., 1981), but A=244.88 (assuming T in Celcius) is not.

source
ConceptualClimateModels.EmissivityStefanBoltzmanOLRFunction
EmissivityStefanBoltzmanOLR(; ε, T)

Create the equation OLR ~ ε*σ*T^4 where σ is the Stefan Boltzmann constant and ε the effective emissivity, also known as the "grayness" of the system, or the deviation it has from being a perfect black body (Ghil, 1981). ε then needs to be parameterized itself to include greenhouse or other climate effects.

source
ConceptualClimateModels.SoedergrenClearSkyEmissivityFunction
SoedergrenClearSkyEmissivity(; ε, T, CO2, RH = 0.8, H_H20 = 2.0)

Create Eq. 10 of (Södergren et al., 2018), which is the same as Eq. 21 of (Barker and Ross, 1999) for the effective emissivity of clear sky atmosphere:

\[\varepsilon = 1 - \exp(0.082 - (2.38*0.1*e_s*RH*H_{H2O} + 40.3*CO2*1e-6)^{0.294})\]

with $e_s$ the saturation_vapor_pressure. The equation assumes CO2 concentration is in ppm and vapor pressure in kPa hence the conversion factors 0.1 and 1e-6.

Physically wrong equation

Be advised: this process is included for reference only. It should not be used because it is physically wrong. Emissivity increases with temperature, while it should decrease: higher temperature → stronger greenhouse effect → smaller effective emissivity required for higher temperature to have the same OLR as per the basic equation $OLR = ε σ Τ^4$.

source

Shortwave radiation

ConceptualClimateModels.DirectAlbedoAdditionType
DirectAlbedoAddition(; α, α_bg = 0.1, other_albedo_variables = (α_ice, α_clouds))

Create the equation α ~ α_bg + other_albedo_variables..., meaning that planetary albedo α is a direct sum of all specified albedos.

source
ConceptualClimateModels.CoAlbedoProductType
CoAlbedoProduct(; α, albedo_variables = (α_ice, α_cloud))

Create the equation 1 - α ~ prod(a -> (1 - a), albedo_variables) meaning that the co-albedo is the product of the co-albedos of all albedo variables. This would be e.g., the planetary albedo if all components were uniform layers, while the bottom-most layer (surface) had perfect absorption and all other layers had 0 absorption and finite reflection.

source
ConceptualClimateModels.SeparatedClearAllSkyAlbedoFunction
SeparatedClearAllSkyAlbedo(; α, α_cloud, C, α_clr = 0.15)

Create the equation α ~ α_cloud*C + α_clr*(1 - C).

(Bender et al., 2017) argue that one can assume a separation between clear-sky and cloud albedo, so that α = α_cloud*C + α_clr*(1 - C) with C the cloud fraction and α_clr the clear sky albedo. They further cite (Cess, 1976) to facilitate the claim Additionally, Eq. (20) of (Barker and Ross, 1999) provides an identical expression.

In most cases you want to provide a variable with its own process for α_clr.

source

Ice/snow

ConceptualClimateModels.IceAlbedoFeedbackType
IceAlbedoFeedback(; T, α_ice,
    max = 0.45, min = 0.1, Tscale = 10, Tfreeze = 275.15, τ = 0
)

Create an equation that assigns ice albedo α_ice to a hyperbolic tangent of temperature T. This represents an approximately linear decrease with T, as ice melts over part of the earth, while it is constant for all T for which the earth would be either entirely ice covered (T < Tfreeze - scale) or ice free (T > Tfreeze).

In essence this is a TanhProcess with the given keywords as parameters with reference temperature Tref = Tfreeze - scale/2.

This albedo is the most common used large-scale feedback in energy balance models, e.g., (Ghil, 1981), although it is typically taken as a piece-wise linear function. There is little change with using a hyperbolic tangent instead, while the tanh offers a differentiable flow.

The timescale τ if not zero will make an ExpRelaxation process relaxing to the hyperbolic tangent.

source

Water vapor

Insolation

ConceptualClimateModels.AstronomicalForcingDeSaedeleerFunction
AstronomicalForcingDeSaedeleer(; S = S, extensive = false)

Create the equation S ~ astronomical_forcing_desaedeleer(t, extensive) which is Eq. (1) of (de Saedeleer et al., 2013):

S = \sum_i s_i \sin(\omega_i t) + c_i \cos(\omega_i t)

where the values of $\omega_i, s_i, c_i$ come from (Berger, 1978) who performed a spectral expansion of the insolation. The validity range of this approximation is [-1, 0] Myr.

In the summation $i$ goes up to 35 if extensive, otherwise up to 8. The components are sorted according to magnitude of the spectral line, so the default version has only the 8 most important spectra lines.

Note that in contrast to Eq. (1) of (de Saedeleer et al., 2013) we do not normalize $f$ and its value is in W/m² (the mean value is still deducted). Additionally, the values of $\omega_i$ have been adjusted to expect time in units of seconds.

source

Forcings

ConceptualClimateModels.CO2ForcingType
CO2Forcing(; f, CO2, CO2f = 3.7)

Create the equation $f ~ CO2f \log_2(CO2/400)$ which describes the forcing added to the TOA energy balance due to CO2 concentrations, assumming the OLR expression is calibrated for 0 added forcing at 400 ppm which is the default for OLR expressions provided by ConceptualClimateModels.jl.

The default value of $f$ comes from Eq. (3.2) of (Bastiaansen et al., 2023) which cites IPCC-5, while (Etminan et al., 2016) report practically the same value assuming a constant $f$ (note here the log is base 2). In reality $f$ depends on $CO2$ and other greenhouse gases concentrations due to spectral overlaps, see (Etminan et al., 2016) Sec. 4.

source

Clouds

ConceptualClimateModels.CloudAlbedoExponentialFunction
CloudAlbedoExponential(
    α_cloud, C, a = 2.499219232848238, b = 17.596369331717433
)

Create the equation α_cloud ~ sinh(a*C)/b relating cloud albedo to cloud fraction C. This equation is exponential and not linear, as in observations. (Engström et al., 2015) (and also (Bender et al., 2017)) discuss this exponential relation in detail, and provide as explanation that cloud effective albedo increases with latitude (due to solar zenith changes) while cloud fraction also increases with latitude.

Note that here however we modify the equation α_cloud ~ exp(a*C - b) of (Engström et al., 2015) to utilize the hyperbolic sine, so that α_cloud = 0 when C = 0 as is physically necessary. Then, a, b are extracted by fitting CERES data, using as α_cloud the energetically consistent cloud albedo as defined by (Datseris and Stevens, 2021), further yearly averaged and within latitudes (-60, 60) as in (Bender et al., 2017). This albedo can be directly added to the clear sky albedo to produce the planetary albedo.

source
ConceptualClimateModels.BudykoOLRFunction
BudykoOLR(; OLR=OLR, T=T, C=C,
    BudykoOLR_A = -461.8068, BudykoOLR_B = 2.58978,
    BudykoOLR_Ac = -377.22741, BudykoOLR_Bc = 1.536171
)

Create the equation OLR ~ A + B*T - C*(Ac + Bc*T) for the dependence of OLR on both temperature and cloud fraction (in 0-1). This is the same as Eq. (1) of (Budyko, 1969). However, here T is expected in Kelvin, and the coefficients have been extracted by fitting into CERES data in the same way as in LinearOLR.

source

Generic processes

Processes that do not depend on any particular physical concept and instead provide a simple way to create new processes for a given climate variable:

ProcessBasedModelling.ParameterProcessType
ParameterProcess(variable, value = default_value(variable)) <: Process

The simplest process which equates a given variable to a constant value that is encapsulated in a parameter. If value isa Real, then a named parameter with the name of variable and _0 appended is created. Else, if valua isa Num then it is taken as the paremeter directly.

Example:

@variables T(t) = 0.5
proc = ParameterProcess(T)

will create the equation T ~ T_0, where T_0 is a @parameter with default value 0.5.

source
ProcessBasedModelling.TimeDerivativeType
TimeDerivative(variable, expression [, τ])

The second simplest process that equates the time derivative of the variable to the given expression while providing some conveniences over manually constructing an Equation.

It creates the equation τ_$(variable) Differential(t)(variable) ~ expression by constructing a new @parameter with default value τ (if τ is already a @parameter, it is used as-is). If τ is not given, then 1 is used at its place and no parameter is created.

Note that if iszero(τ), then the process variable ~ expression is created.

source
ProcessBasedModelling.ExpRelaxationType
ExpRelaxation(variable, expression [, τ]) <: Process

A common process for creating an exponential relaxation of variable towards the given expression, with timescale τ. It creates the equation:

τn*Differential(t)(variable) ~ expression - variable

Where τn is a new named @parameter with the value of τ and name τ_($(variable)). If instead τ is nothing, then 1 is used in its place (this is the default behavior). If iszero(τ), then the equation variable ~ expression is created instead.

The convenience function

ExpRelaxation(process, τ)

allows converting an existing process (or equation) into an exponential relaxation by using the rhs(process) as the expression in the equation above.

source
ProcessBasedModelling.AdditionProcessType
AdditionProcess(process, added...)

A convenience process for adding processes added to the rhs of the given process. added can be a single symbolic expression. Otherwise, added can be a Process or Equation, or multitude of them, in which case it is checked that the lhs_variable across all added components matches the process.

source
ConceptualClimateModels.TanhProcessType
TanhProcess(variable, driver, left, right, scale, reference) <: Process
TanhProcess(variable, driver; left, right, scale, reference) <: Process

A common process for when a variable has a tanh-dependence on a driver variable. The rest of the input arguments should be real numbers or @parameter named parameters.

The process creates the expression:

variable ~ left + (right - left)*(1 + tanh(2(driver - reference)/scale))*0.5

i.e., a tanh formula that goes from value left to value right as a function of driver over a range of scale being centered at reference.

If the values given to the parameters of the expression are real numbers, they become named parameters prefixed with the name of variable, then the name of the driver, and then _tanh_left, _tanh_right, _tanh_rate and _tanh_ref respectively. Use LiteralParameter for parameters you do not wish to rename.

source

Default processes

The list of default processes that are used by default in processes_to_coupledodes if one does not explicitly provide a list of default processes are:

# note; all variables that do not have a process here
# become parameters via `ParameterProcess` by default.
DEFAULT_CCM_PROCESSES = [
    BasicRadiationBalance(),
    # shortwave
    ASR ~ S*(1 - α)*solar_constant,
    IceAlbedoFeedback(),
    DirectAlbedoAddition(), # Albedo uses fact that cloud albedo is defined as additive
    S ~ 1, # don't make insolation a parameter by default
    # longwave
    BudykoOLR(),
    CO2Forcing(), # for default CO2 values this is zero forcing
    ParameterProcess(CO2),
    AbsoluteHumidityIGLCRH(),
    # misc
    C ~ default_value(C),
    ΔTLinearRelaxation(),
]