Climate: units, equations and validation#
Conventions and model limits#
Solar and radiative fluxes are W/m^2. Global absorbed sunlight divides the solar constant by four through sphere geometry. Effective radiative temperature is not greenhouse surface temperature. A positive restoring coefficient means a stable negative net feedback in the convention C dT/dt = F - lambda T.
Heat capacity is J/(m^2 K); relaxation time is seconds. Temperature anomalies may be negative, unlike absolute temperatures used in Stefan-Boltzmann emission. CO2 forcing uses concentration ratios with both values in the same ppm units and a caller-supplied coefficient. The 5.35 example is an educational older logarithmic parameterization, not a claim about a current assessed best estimate.
The single-exponential carbon reservoir omits the multiple removal timescales of atmospheric carbon dioxide. Steric sea level is a constant-coefficient slab approximation; added water mass is distributed over a supplied fixed area.
Input contracts#
Algebraic models accept finite real scalars or nonempty arrays. Booleans, complex inputs, nonnumeric values and NaN/Inf are rejected. Physical bounds apply element by element; NumPy broadcasting applies between arguments. No unit metadata are carried in raw numbers. Bounds protect mathematical domains and obvious physical contradictions, but do not establish model applicability.
Equation and output map#
absorbed_solar#
earthsciencekit.climate.absorbed_solar()
Output: W/m^2. Global mean rather than local insolation; fixed bolometric albedo.
solar_constant * (1 - albedo) / 4
effective_temperature#
earthsciencekit.climate.effective_temperature()
Output: K. Single emitting level in equilibrium; not the surface temperature of a greenhouse atmosphere.
(absorbed_flux / (emissivity * SIGMA_SB))**0.25
outgoing_longwave#
earthsciencekit.climate.outgoing_longwave()
Output: W/m^2. Constant emissivity; not a spectral atmospheric radiative-transfer solver.
emissivity * SIGMA_SB * temperature**4
planck_feedback#
earthsciencekit.climate.planck_feedback()
Output: W/(m^2 K). Positive restoring magnitude in W per square metre per kelvin; other feedbacks are separate.
4 * emissivity * SIGMA_SB * temperature**3
co2_forcing#
earthsciencekit.climate.co2_forcing()
Output: W/m^2. User-supplied coefficient; an educational parameterization, not a current assessed forcing product.
coefficient * np.log(concentration / reference_concentration)
equilibrium_warming#
earthsciencekit.climate.equilibrium_warming()
Output: K. Stable linear response with a positive net restoring coefficient.
forcing / restoring
heat_capacity_column#
earthsciencekit.climate.heat_capacity_column()
Output: J/(m^2 K). Uniform slab with constant material properties.
density * heat_capacity * depth
response_timescale#
earthsciencekit.climate.response_timescale()
Output: s. One-box linear model; output is seconds.
areal_heat_capacity / restoring
step_temperature#
earthsciencekit.climate.step_temperature()
Output: K. Zero initial anomaly and constant parameters; no deep-ocean exchange.
forcing / restoring * (-np.expm1(-restoring * time / areal_heat_capacity))
heat_uptake#
earthsciencekit.climate.heat_uptake()
Output: J/m^2. One uniform layer; temperature_change is an anomaly.
areal_heat_capacity * temperature_change
ice_albedo#
earthsciencekit.climate.ice_albedo()
Output: 1. Illustrative smooth closure, not a calibrated satellite albedo retrieval.
warm_albedo + (cold_albedo - warm_albedo) * (1 - np.tanh((temperature - transition_temperature) / width)) / 2
carbon_airborne_fraction#
earthsciencekit.climate.carbon_airborne_fraction()
Output: 1. Same time interval and carbon mass units; feedback-driven values above one are not clipped.
atmospheric_increase / emissions
carbon_decay#
earthsciencekit.climate.carbon_decay()
Output: kg C. Not a realistic complete atmospheric CO2 impulse response, which has multiple timescales.
initial_excess * np.exp(-time / timescale)
thermal_expansion_sea_level#
earthsciencekit.climate.thermal_expansion_sea_level()
Output: m. Constant coefficient and uniform warming; salinity and pressure dependence are omitted.
expansion_coefficient * depth * temperature_change
water_equivalent_sea_level#
earthsciencekit.climate.water_equivalent_sea_level()
Output: m. Uniform ocean area and density; gravitational fingerprints and land motion are omitted.
water_mass / (ocean_area * water_density)
greenhouse_surface_temperature#
earthsciencekit.climate.greenhouse_surface_temperature()
Output: K. Blackbody surface, a grey isothermal layer transparent to sunlight; the layer is colder by 2**0.25.
(2 * absorbed_flux / ((2 - layer_emissivity) * SIGMA_SB))**0.25
daily_insolation#
earthsciencekit.climate.daily_insolation()
Output: W/m^2. Daily mean at the top of the atmosphere; declination fixed over the day; latitude and declination in radians.
h0 = arccos(clip(-tan(latitude) * tan(declination), -1, 1))
solar_constant * distance_ratio**2 / pi * (h0 * sin(latitude) * sin(declination) + cos(latitude) * cos(declination) * sin(h0))
radiative_convective_temperature#
earthsciencekit.climate.radiative_convective_temperature()
Output: K. Fixed tropospheric lapse rate through the emission level under an isothermal stratosphere at the skin temperature.
np.maximum(effective_temperature + lapse_rate * (emission_height - height), effective_temperature / 2**0.25)
equilibrium_solar_constant#
earthsciencekit.climate.equilibrium_solar_constant()
Output: W/m^2. Zero-dimensional greybody balance with the ice_albedo closure; branches with a negative slope are unstable.
4 * emissivity * SIGMA_SB * temperature**4 / (1 - ice_albedo(temperature, cold_albedo, warm_albedo, transition_temperature, width))
red_noise_spectrum#
earthsciencekit.climate.red_noise_spectrum()
Output: K^2/Hz. Two-sided spectrum of a linear one-box model under white-noise forcing; frequency in cycles per second.
forcing_spectrum / (restoring**2 + (2 * np.pi * frequency * areal_heat_capacity)**2)
methane_forcing#
earthsciencekit.climate.methane_forcing()
Output: W/m^2. Myhre et al. (1998) fit, concentrations in ppb, valid near present-day values.
f(M, N) = 0.47 * log(1 + 2.01e-5 * (M * N)**0.75 + 5.31e-15 * M * (M * N)**1.52)
0.036 * (sqrt(M) - sqrt(M0)) - (f(M, N0) - f(M0, N0))
nitrous_oxide_forcing#
earthsciencekit.climate.nitrous_oxide_forcing()
Output: W/m^2. Myhre et al. (1998) fit, concentrations in ppb, valid near present-day values.
0.12 * (sqrt(N) - sqrt(N0)) - (f(M0, N) - f(M0, N0))
gregory_regression#
earthsciencekit.climate.gregory_regression()
Output: [W/m^2, W/(m^2 K)]. Least-squares line through (temperature_change, imbalance) vectors; assumes constant forcing and feedback.
imbalance = forcing - restoring * temperature_change
Independent validation#
Every algebraic API has a fixed-value check, broadcasting check and invalid-input contracts. The climate tests also check that one greenhouse layer balances the top of the atmosphere, that daily insolation averages to a quarter of the solar constant, that the radiative-convective profile passes through the effective temperature, that every ice-albedo equilibrium closes the energy balance, that the red-noise spectrum integrates to its variance, that the Myhre formulas reproduce the IPCC values for 1750-1998, and that the Gregory regression recovers the parameters of a one-box run. The shared suite adds cross-model identities, energy/conservation checks and independent analytic solutions for dynamics. See Validation policy for the exact evidence and Numerical methods and sampled results for numerical conventions.