Note
Go to the end to download the full example code.
The decaying Taylor-Green vortex: an exact solution, animated
The steady Taylor-Green vortex array from
Vorticity with velocity vectors is actually the t = 0 slice of an exact,
time-dependent solution of the incompressible Navier-Stokes equations –
one of the few nontrivial cases where the equations can be solved in closed
form rather than only simulated, which is why it is a standard code-
validation case rather than a demonstration flow:
omega(x, y, t) = 2 sin(x) sin(y) exp(-2 nu t).
Viscosity does exactly one thing to this flow: it decays the whole pattern
uniformly in time, in place. The vortex array does not drift, merge, or
change shape – every cell shrinks toward zero at the same exponential rate
exp(-2 nu t) at once, because the spatial structure sin(x) sin(y) is
itself an eigenfunction of the Laplacian, so diffusion multiplies it by a
scalar rather than reshaping it. That is a special property of this flow, not
of viscous decay generally, and is exactly why it has a closed form at all.
The colour scale is fixed to the t = 0 amplitude across every frame
(FrameQuadMesh’s shared-norm behaviour, the same
mechanism A standing wave, actually standing: room modes in time relies on) so the
decay reads as fading toward the neutral midpoint rather than as a rescaled
colour bar quietly doing the work instead.

Live figure — pick a tool, then zoom, pan, point-pick or annotate. Nothing is active until a tool is selected.
View this figure’s Vega-Lite export ↗ — the raw JSON spec(s), rendered live by a real Vega-Lite engine.
import os
import tempfile
import numpy as np
import plotpress
NU = 0.05 # kinematic viscosity (normalized)
g = np.linspace(0.0, 2.0 * np.pi, 140)
X, Y = np.meshgrid(g, g)
spatial = 2.0 * np.sin(X) * np.sin(Y)
N_FRAMES = 36
t = np.linspace(0.0, 15.0, N_FRAMES) # 1.5 decay times (tau = 1/2nu = 10)
vorticity = np.stack([spatial * np.exp(-2.0 * NU * ti) for ti in t])
lim = float(np.abs(vorticity[0]).max())
fig, ax = plotpress.subplots(figsize=(6.6, 6.0))
mesh = ax.pcolormesh_frames(g, g, vorticity, slider_values=t, slider_label="t",
cmap="coolwarm", vmin=-lim, vmax=lim)
bar = fig.colorbar(mesh, ax=ax)
bar.set_title("omega")
ax.set_aspect("equal")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_title("Exact decay: the pattern fades in place, it does not drift")
fig.tight_layout()
gif_path = os.path.join(tempfile.gettempdir(), "plotpress_taylor_green_decay.gif")
fig.save(gif_path, fps=12)
Total running time of the script: (0 minutes 9.717 seconds)