Vortex Core Singularity: 1/r

Four point vortices orbit and stir a field of tracers. The velocity blows up at every core; the weighted view of the same flow stays bounded.

Loading vortex simulator

Illustrative Browser ModelPoint-Vortex Demo

Point vortices induce a 1/r velocity that diverges at each core. This demo moves four point vortices with the exact Biot-Savart law and shows the velocity next to its r-weighted (k=-1) view, which is bounded. The weighting is a diagnostic: it does not change how the vortices move.

The Physics

Point Vortex Dynamics

In 2D inviscid flow, a point vortex with circulation Gamma induces a velocity field:

v(r) = Gamma / (2 * pi * r)

This is the Biot-Savart law. As r approaches 0 (the vortex core), the velocity diverges. Each vortex moves with the velocity induced by the others.

A Built-In Check

A counter-rotating pair at separation d translates at exactly

U = Gamma / (2 * pi * d)

The solver reproduces this to five digits (lib/simulation/vortexSolver.test.ts). Four point vortices are not turbulence: there is no Kolmogorov energy cascade in this model.

Velocity vs Weighted View

Velocity (k=0)

v = Gamma / (2 * pi * r)
  • - Diverges as r approaches 0
  • - Moves the vortices and the tracers
  • - Sets the solver timestep in both panels

Weighted view (k=-1)

sum_s v_s * r_s = sum_s Gamma_s / (2 * pi) * t_s
  • - Each source term weighted by its distance r_s
  • - Bounded by sum |Gamma_s| / (2 pi)
  • - A readout of the same run; the flow is unchanged

Note: an earlier version advected the vortices with the weighted field, which made every pairwise speed Gamma/(2 pi) regardless of distance. That is a different flow, not a change of calculus.

Benchmark Context

The spectraldns_vortex row of the local CASCADE suite is a synthetic toy, not a SpectralDNS run: one 2-D test function with a singular point, relabelled per domain, scored by how close the optimizer got to that point. Every 1/r row in that file shares the same value. It is a local benchmark, not citable, and this browser demo does not reproduce it.

Mathematical Note

The weight used here is the project's diagnostic factor r^(-k). For a 1/r term, k=-1 gives

(1/r) * r = 1

so the weighted readout is bounded. On r > 0 the same fact reads D_BG[r^-1] = e^-1, a constant log-slope. Neither statement removes the singularity: the velocity itself still diverges at each core.

Math checked against local simulation utilities. View more demos | All tools