Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Definitions

There are four types of energy (per unit mass) that we need to keep track of in the fluid:

  1. I=cvTI = c_v T is the internal energy (valid for an ideal gas, see e.g. Vallis (2017)) -- this is a measure of the disorganized molecular-scale motion in the fluid

  2. Φ=gz\Phi = g z is the gravitational potential energy

  3. L=LvqL = L_v q is the latent energy associated with the evaporated water in the air (LvL_v is the latent heat of vaporization and qq is the specific humidity)

  4. K=12(u2+v2+w2)K = \frac{1}{2} \left(u^2 + v^2 + w^2 \right) is the kinetic energy of organized motion of the fluid

We’ll define the total energy per unit mass in the atmosphere as

E=I+Φ+L+K=cvT+gz+Lvq+12(u2+v2+w2)\begin{align*} E &= I + \Phi + L + K \\ &= c_v T + gz + L_v q + \frac{1}{2} \left(u^2 + v^2 + w^2 \right) \end{align*}

Budget equations for energy components

Potential energy

Latent energy

Internal energy

Kinetic energy

A total energy equation and global conservation

After some work and cancellation of various conversion terms:

DEDt=−α∇⋅(v⃗p)−α∇⋅F⃗rad+Dh\frac{DE}{Dt} = -\alpha \nabla \cdot \left( \vec{v} p \right) - \alpha \nabla \cdot \vec{F}_{rad} + D_h

with Dh=cpDT+LvDqD_h = c_p D_T + L_v D_q the net surface enthalpy flux and F⃗rad\vec{F}_{rad} the radiative flux.

Alternate form and Moist Static Energy

We can rewrite the first law of thermodynamics as

dQ=dI+pdα=dI+d(pα)−αdp=d(cvT+RT)−αdp=d(cpT)−αdp\begin{align*} dQ &= dI + p d\alpha \\ &= dI + d(p\alpha) - \alpha dp \\ &= d(c_v T + RT) - \alpha dp \\ &= d(c_p T ) - \alpha dp \end{align*}

where cpTc_p T is refered to as the sensible energy SS

Using this, we can define another form of total energy

E=S+Φ+L+K\mathcal{E} = S + \Phi + L + K

and we’ll find it useful to define the moist static energy mm as the first three terms of E\mathcal{E}:

m=S+Φ+L=cpT+gz+Lvqm = S + \Phi + L = c_p T + g z + L_v q

We’ll see from the data that KK is typically a small fraction of E\mathcal{E} so is often ignored in the total energy budget, and we will talk instead about fluxes of moist static energy rather than fluxes of total energy.

Merdional energy transport

Write the zonal- and time-averaged energy budget in pressure coordinates and flux form:

∂∂t[E‾]=−1acos⁡ϕ∂∂ϕ([vE‾]cos⁡ϕ)−∂∂p([ωE‾])+g[∂F⃗rad‾∂p]+[Dh‾]\frac{\partial}{\partial t} [\overline{\mathcal{E}}] = -\frac{1}{a \cos\phi} \frac{\partial}{\partial \phi} \left( [\overline{v\mathcal{E}}] \cos\phi \right) -\frac{\partial}{\partial p} \left( [\overline{\omega \mathcal{E}}] \right) + g \left[ \frac{\partial \overline{\vec{F}_{rad}}}{\partial p} \right] + [\overline{D_h}]

and we can decompose the meridional energy flux into its components:

[vE‾]=cp[vT‾]+g[vz‾]+Lv[vq‾]+[vK‾][\overline{v\mathcal{E}}] = c_p [\overline{vT}] + g [\overline{vz}] + L_v [\overline{vq}] + [\overline{vK}]

Finally we can decompose each component into mean meridional, stationary eddy, and transient eddy terms, e.g.

[vT‾]=[v‾][T‾]+[v∗‾ T∗‾]+[v′T′‾][\overline{vT}] = [\overline{v}][\overline{T}] + [\overline{v^*} ~\overline{T^*}] + [\overline{v^\prime T^\prime}]

and likewise for the other components.

The observed energy budget

We are going to make some plots of northward energy fluxes from the ERA5 data.

Loading...
Loading...
  2026-10-28T22:23:53.513790Z  WARN aws_smithy_http_client::client::tls::rustls_provider::build_connector: native root CA certificate loading errors: [Error { context: "failed to read PEM from file", kind: Io { inner: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }, path: "/etc/ssl/certs/sendmail.pem" } }, Error { context: "failed to read PEM from file", kind: Io { inner: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }, path: "/etc/pki/tls/certs/sendmail.pem" } }]
    at /home/conda/feedstock_root/build_artifacts/bld/rattler-build_icechunk_1785432413/build_env/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/aws-smithy-http-client-1.1.12/src/client/tls/rustls_provider.rs:73

Loading...
Loading...
2026-10-28 22:54:24,567 - tornado.application - ERROR - Uncaught exception GET /status/ws (10.16.2.49)
HTTPServerRequest(protocol='http', host='169.226.65.130:8787', method='GET', uri='/status/ws', version='HTTP/1.1', remote_ip='10.16.2.49')
Traceback (most recent call last):
  File "/network/rit/lab/snowclus/pixi/aug26/.pixi/envs/default/lib/python3.14/site-packages/tornado/websocket.py", line 965, in _accept_connection
    open_result = handler.open(*handler.open_args, **handler.open_kwargs)
  File "/network/rit/lab/snowclus/pixi/aug26/.pixi/envs/default/lib/python3.14/site-packages/tornado/web.py", line 3409, in wrapper
    return method(self, *args, **kwargs)
  File "/network/rit/lab/snowclus/pixi/aug26/.pixi/envs/default/lib/python3.14/site-packages/bokeh/server/views/ws.py", line 149, in open
    raise ProtocolError("Token is expired.")
bokeh.protocol.exceptions.ProtocolError: Token is expired.

The flux of sensible energy vTvT

CPU times: user 2.22 s, sys: 115 ms, total: 2.33 s
Wall time: 2.38 s
/network/rit/lab/snowclus/pixi/aug26/.pixi/envs/default/lib/python3.14/site-packages/distributed/client.py:3429: UserWarning: Sending large graph of size 62.99 MiB.
This may cause some slowdown.
Consider loading the data with Dask directly
 or using futures or delayed objects to embed the data into the graph without repetition.
See also https://docs.dask.org/en/stable/best-practices.html#load-data-with-dask for more information.
  warnings.warn(
CPU times: user 21min 2s, sys: 1min 17s, total: 22min 19s
Wall time: 32min 43s
<Figure size 800x1200 with 4 Axes>

Plot the mass-weighted vertical averages by season

<Figure size 600x800 with 4 Axes>

Latent energy fluxes

CPU times: user 793 ms, sys: 6.77 ms, total: 800 ms
Wall time: 796 ms
/network/rit/lab/snowclus/pixi/aug26/.pixi/envs/default/lib/python3.14/site-packages/distributed/client.py:3429: UserWarning: Sending large graph of size 53.62 MiB.
This may cause some slowdown.
Consider loading the data with Dask directly
 or using futures or delayed objects to embed the data into the graph without repetition.
See also https://docs.dask.org/en/stable/best-practices.html#load-data-with-dask for more information.
  warnings.warn(
CPU times: user 16min 30s, sys: 53.9 s, total: 17min 24s
Wall time: 27min 53s
<Figure size 800x1200 with 4 Axes>
<Figure size 600x800 with 4 Axes>

Potential energy fluxes

CPU times: user 822 ms, sys: 16.8 ms, total: 839 ms
Wall time: 833 ms
/network/rit/lab/snowclus/pixi/aug26/.pixi/envs/default/lib/python3.14/site-packages/distributed/client.py:3429: UserWarning: Sending large graph of size 53.62 MiB.
This may cause some slowdown.
Consider loading the data with Dask directly
 or using futures or delayed objects to embed the data into the graph without repetition.
See also https://docs.dask.org/en/stable/best-practices.html#load-data-with-dask for more information.
  warnings.warn(
CPU times: user 16min 28s, sys: 53.9 s, total: 17min 22s
Wall time: 27min 15s
<Figure size 600x800 with 4 Axes>

Moist static energy transport

Now compute the total flux

[vm‾]=cp[vT‾]+g[vZ‾]+Lv[vq‾][\overline{vm}] = c_p [\overline{vT}] + g [\overline{vZ}] + L_v [\overline{vq}]

where we have defined the moist static energy

m≡cpT+gZ+Lvqm \equiv c_p T + g Z + L_v q
<Figure size 800x1200 with 4 Axes>
<Figure size 600x800 with 4 Axes>

Contribution of kinetic energy to total flux

Is the term [vK‾][\overline{vK}] actually small enough to neglect compared to the other terms in the energy flux

[vE‾]=cp[vT‾]+g[vz‾]+Lv[vq‾]+[vK‾][\overline{v\mathcal{E}}] = c_p [\overline{vT}] + g [\overline{vz}] + L_v [\overline{vq}] + [\overline{vK}]

In other words, how good is the moist static energy flux approximation?

Let’s actually compute and plot [vK‾][\overline{vK}]

Kinetic energy formula

We have the definition

K=12(u2+v2+w2)K = \frac{1}{2} \left(u^2 + v^2 + w^2 \right)

Since the vertical component ww is typically several orders of magnitude smaller than uu and vv, we neglect it here. Thus we will compute the flux

vK≈v2(u2+v2)v K \approx \frac{v}{2} \left(u^2 + v^2 \right)

along with its averages and decompositions.

Computing kinetic energy flux from ERA5

CPU times: user 4.19 s, sys: 29.9 ms, total: 4.22 s
Wall time: 4.21 s
/network/rit/lab/snowclus/pixi/aug26/.pixi/envs/default/lib/python3.14/site-packages/distributed/client.py:3429: UserWarning: Sending large graph of size 53.62 MiB.
This may cause some slowdown.
Consider loading the data with Dask directly
 or using futures or delayed objects to embed the data into the graph without repetition.
See also https://docs.dask.org/en/stable/best-practices.html#load-data-with-dask for more information.
  warnings.warn(
CPU times: user 18min 58s, sys: 1min 3s, total: 20min 1s
Wall time: 29min 41s
<Figure size 800x1200 with 4 Axes>
<Figure size 600x800 with 4 Axes>

These are plotted in the same units as the moist static energy fluxes above for comparison. The MSE flux is of order 10 ºC m/s, while the kinetic energy flux is of order 0.1 ºC m/s.

The neglecting of the kinetic energy contribution to the total energy flux seems to be well justified.

Total energy transport

Here we will express the northward flux of energy in terms of the total integrated northward energy transport H\mathcal{H} as we defined in an earlier chapter.

For completeness, since we have already computed it, we will include the kinetic energy component.

<Figure size 600x800 with 4 Axes>
References
  1. Vallis, G. K. (2017). Atmospheric and Oceanic Fluid Dynamics: fundamentals and large-scale circulation (2nd ed.). Cambridge University Press.