Skip to content
cfd-lab:~/en/posts/2026-05-28-streamline-pa…● online

Translated from the author's Korean original. Read the original (한국어)

NOTE #055DAY THU 유체역학DATE 2026.05.28UPDATED 2026.10.19READ 6 min read#Flow-Visualization#Streamline#Material-Derivative#Euler-Lagrange#Flow-Phenomena

Three Portraits of a Flow — Why Streamlines, Pathlines, and Streaklines Diverge

An ink ribbon is a streakline. Steady flow still accelerates through the convective term, so a zero local term does not mean the throat speed stays put.

A thread of ink went into a river, and a photo caught it. At the same instant, the track of one leaf was drawn. The two lines differed. The flow is one, and the pictures are two. Streamlines, pathlines, and streaklines split where time enters, and that split meets the material derivative (the rate of change seen while riding with the fluid).

Drop the contraction slider to 0.25 and parcel speed near the throat jumps to four times.

Nothing in this field depends on time, so ∂u/∂t = 0 at every fixed point. Yet the pink parcel still accelerates into the throat — all of it from the convective term u·∂u/∂x.

The ∂u/∂t\partial u/\partial t bar still sits on zero. Every bit of the acceleration comes from the blue convective term. The local term is zero, and the parcel still speeds up.

One Flow, Three Different Pictures#

There is more than one way to draw a flow. In the lab, three are common.

Connect the velocity directions at every point at one instant. Tag one parcel and follow its footprints. Release dye from one spot and photograph the ribbon. The flow is the same, and the results are not always the same.

Time is where they split. When the flow changes in time (unsteady), the three pictures drift apart. When it does not (steady), the three overlap exactly.

Streamlines, Pathlines, Streaklines — Three Definitions#

Let us pin down each curve with a formula. Write the velocity field as u(x,t)\mathbf{u}(\mathbf{x}, t).

Streamline: at one frozen instant tt, the curve tangent to the velocity at every point.

dxu=dyv\frac{dx}{u} = \frac{dy}{v}

Here u,vu, v are the velocity components at that instant. It is a snapshot with time held still.

Pathline: the actual track of a single parcel integrated forward in time.

dxdt=u(x,t)\frac{d\mathbf{x}}{dt} = \mathbf{u}(\mathbf{x}, t)

Think of it as one leaf's travel diary.

Streakline: the line joining the current positions of every parcel that has passed through a fixed point x0\mathbf{x}_0. Smoke rising from a chimney, or a ribbon of dye, is exactly this. A dye filament released in a pipe is the same kind of line. The dye in the moment a water filament breaks up is this ribbon, not a streamline.

They Coincide Only in Steady Flow#

A steady flow is one whose velocity field does not depend on time, that is ∂u/∂t=0\partial \mathbf{u} / \partial t = 0. Then, once a parcel passes a point, every later parcel walks the same road — the road does not change with time.

So the pathline and the streakline become identical. The streamline is the same at every instant too, so all three overlap. The "clean streamline picture" we see in textbooks quietly stands on the assumption of steadiness.

In unsteady flow that assumption breaks. The road of an earlier parcel differs from a later one, and the instantaneous tangent direction shifts moment to moment. That is why the three curves spread.

Euler, Lagrange, and the Material Derivative#

At the root of this split lie two viewpoints: the Eulerian one (observing at a fixed point in space) and the Lagrangian one (observing while following a parcel). The streamline is Eulerian; the pathline is Lagrangian.

The bridge between the two is the material derivative.

DϕDt=∂ϕ∂t+(u⋅∇)ϕ\frac{D\phi}{Dt} = \frac{\partial \phi}{\partial t} + (\mathbf{u}\cdot\nabla)\phi

Here ϕ\phi is any field quantity, the first term on the right is the local rate of change, and the second is the convective rate. The first means "change in time at a fixed point," the second "change because the parcel has moved elsewhere."

This is where intuition stumbles. Even in steady flow with ∂u/∂t=0\partial \mathbf{u}/\partial t = 0, a parcel can still accelerate. Picture a narrowing nozzle. At a fixed point the speed never changes in time. Yet a parcel sucked into the throat keeps speeding up. All of that acceleration comes from the convective term u ∂u/∂xu\,\partial u/\partial x.

The factor of four at a contraction of 0.25, and the local-term bar stuck at zero, already showed up on the slider above. What is new here is that the convective term alone makes that factor of four.

Python — Drawing the Three Curves in an Oscillating Flow#

Let us draw the three curves at once. We use a flow whose transverse velocity is a wave propagating downstream: u=Uu = U, v=V0cos⁡(ωt−kx)v = V_0\cos(\omega t - k x) with k=ω/Uk = \omega/U. In this flow the three curves take cleanly different shapes.

import numpy as np
 
U, V0, omega = 1.0, 0.6, 2.0
k = omega / U
 
def velocity(x, t):
    """transverse wave traveling downstream: returns (u, v)"""
    return U, V0 * np.cos(omega * t - k * x)
 
def pathline(t0, t_end, dt=0.01):
    """track of the parcel released from the origin at time t0 (numerical)"""
    x, y, t = 0.0, 0.0, t0
    xs, ys = [x], [y]
    while t < t_end:
        u, v = velocity(x, t)
        x += u * dt; y += v * dt; t += dt
        xs.append(x); ys.append(y)
    return np.array(xs), np.array(ys)
 
def streakline(t_now, n=400):
    """dye ribbon at t_now: current positions of parcels released at s<=t_now"""
    s = np.linspace(0.0, t_now, n)
    x = U * (t_now - s)
    y = V0 * np.cos(omega * s) * (t_now - s)   # exact for this flow
    return x, y
 
def streamline_snapshot(t_now, x_max=10.0, n=400):
    """streamline through the origin at instant t_now"""
    x = np.linspace(0.0, x_max, n)
    y = (V0 / omega) * (np.sin(omega * t_now) - np.sin(omega * t_now - k * x))
    return x, y
 
t_now = 6.0
xp, yp = pathline(0.0, t_now)
xs, ys = streakline(t_now)
xl, yl = streamline_snapshot(t_now)
print(f"pathline end   : ({xp[-1]:.2f}, {yp[-1]:.2f})")
print(f"streakline span: y in [{ys.min():.2f}, {ys.max():.2f}]")
print(f"streamline span: y in [{yl.min():.2f}, {yl.max():.2f}]")

The output shows the three curves occupying entirely different territory. The pathline runs straight, the streamline is a shallow ripple of amplitude V0/ωV_0/\omega, and the streakline swings much wider. One flow, three different pictures.

The numbers in the code are U=1, V0=0.6, ω=2, and t_now=6. Because k=ω/U, k is 2. On a parcel, the phase ωt−kx cancels. With u fixed at U, x=Ut, so kx=ωt and v stays at the constant V0. The pathline is therefore not a curve. It is the straight line y=(V0/U)x=0.6x. At t=6 the end point is (6, 3.6). Integration with dt=0.01 walks that same straight line at every step, as long as the phase stays at zero.

The streamline formula multiplies (V0/ω) by a difference of sines. V0/ω=0.6/2=0.3. A sine difference lies between −2 and 2, so y cannot leave ±0.6. That bound is the width of the shallow ripple. Reaching the edge takes kx through more than one turn. With k=2 and x running from 0 to 10, the phase span is 20 radians, more than three turns. At t_now=6, ωt=12, so one snapshot covers that window. ±0.6 is not decoration on the formula. It is the edge this window actually reaches.

The streakline is y=V0 cos(ωs) times (t−s). The absolute value of the cosine never exceeds 1, and t−s grows up to 6. The upper bound on |y| is 0.6 times 6, that is 3.6. Six times the streamline limit of 0.6. The same V0, and only the streakline swings wide, because the spread in release time gets multiplied in. A contraction of 0.25 is an area ratio. For an incompressible fluid, speed is the inverse of area, so the throat is four times as fast. That factor of four is made entirely by the convective term, not the local term.

Shaking the Unsteadiness Yourself#

Now bring time to life and watch the three curves split. In the simulation below, adjust the amplitude V0V_0 and the frequency ω\omega.

Field: u = U, v = V₀·cos(ωt − kx) with k = ω/U. Drag V₀ to 0 and the three curves collapse onto the axis — they only ever agree when the flow is steady.

Pull V0V_0 down to zero and the three curves fold onto the axis — you are back in steady flow. Raise V0V_0 and ω\omega and the amber streamline ripples fast, the pink pathline runs straight, and the cyan streakline traces yet another waveform. The stronger the unsteadiness, the farther the three portraits drift.

An Ink Ribbon Read as a Streamline Gives the Wrong Direction#

Call the ink in a photo a streamline, and the velocity tangent gets read toward where the dye sits now. In unsteady flow those two are not the same. A streamline is a slice with time frozen. A streakline is the present of the parcels that passed one spot. The convective term of the material derivative D/Dt=∂/∂t+u⋅∇D/Dt = \partial/\partial t + \mathbf{u}\cdot\nabla produces acceleration even in steady flow. Write that the parcel has constant speed just because the local term is zero, and the nozzle's factor of four drops out.

If the flow is steady, the three overlap. If they differ, that is a sign the flow is changing in time. Before measuring the buoyancy that pulls smoke up a chimney, decide first whether that smoke is a streakline. Treat the ribbon as a streamline and the direction comes out wrong.

Share if you found it helpful.