The Outlet Is Open, Yet the Wave Comes Back — NSCBC and the Price of σ
At a non-reflecting outlet, one coefficient sets both reflection and pressure drift
The outlet is open. The wave comes back anyway. Handle the outflow boundary of a compressible code with a casual extrapolation, run a flame or a turbulent patch, and an oscillation with no physical cause grows in the middle of the domain. Measure its period and it usually matches the domain length divided by the speed of sound. Your computational box has quietly become a resonator. Today we look at what a boundary can actually compute, what it has to invent, and what a single coefficient controlling that invention costs you.
The Edge of the Box Is Not Physics#
A physical domain has no edge. Space continues past the combustor exit. A grid, though, has to stop somewhere, and the last cell has no neighbor. Without a neighbor there is no derivative, and without a derivative there is no governing equation to advance.
In RANS codes the problem stayed hidden for a long time. Turbulent and artificial viscosity are large, so a badly manufactured wave at the boundary dies within a few cells. LES and DNS change the accounting. Artificial viscosity is near zero and turbulent viscosity is at a minimum. Whatever error the boundary creates does not dissipate — it crosses the domain and comes back.
The recipe Poinsot and Lele assembled in 1992 inverts the approach. Instead of extrapolating variables at the boundary, you count the waves crossing it and fix each amplitude. It extends the Euler characteristic boundary conditions (ECBC) to Navier–Stokes with its viscous terms, hence NSCBC — Navier–Stokes Characteristic Boundary Conditions. Not a single line of extrapolation is used.
What a Boundary Can Count, and What It Must Invent#
Put the boundary at . Recast the -direction terms as waves and the continuity equation reads:
Here is density, the velocity components, and collects the contributions normal to the boundary. That vector is the product of the characteristic analysis, and inside it live the wave amplitudes .
is the local speed of sound () and the pressure. is the amplitude variation of the acoustic wave running in the negative direction, the one running positive. The remaining three ride along with the fluid: carries entropy, and carry the transverse velocities and , all three moving at .
The whole game is in the sign of those speeds. If a wave leaves the domain, its amplitude is computable from interior points. If it enters, that information is nowhere in the solution. You have to invent it. The number of entering waves is exactly the number of physical boundary conditions the problem allows.
Push the Mach number in the diagram below. Which way each of the five characteristics crosses the boundary changes as you drag.
Raise from to and the incoming flips direction, dropping the required condition count from one to zero. Flip the sign negative and the same face becomes an inlet, where the count jumps to four. If a code that runs happily at subsonic outflow diverges when the exit goes supersonic, it is usually imposing one condition more than this ledger permits.
LODI — the Rule That Manufactures an Amplitude#
Inventing an incoming amplitude needs a justification. At each boundary point NSCBC builds a local one-dimensional inviscid system, dropping every transverse, viscous, and reaction term. Those are the LODI relations.
LODI relations are not physical conditions, and they are not the equations you actually solve. They exist only to estimate the incoming . The procedure is three steps: delete each conservation equation whose variable is physically imposed, use the matching LODI relation to write the unknown in terms of the known ones, then advance the remaining equations for everything else.
A perfectly non-reflecting outlet makes the simplest possible choice here — it declares that no acoustic wave arrives from outside.
Zero incoming wave, zero reflection. It looks clean. But notice that the outer pressure appears nowhere in that statement.
What σ = 0 Costs: Pressure That Never Returns to p∞#
No means the boundary has no idea what the pressure is supposed to be. Heat released inside the domain raises the pressure, and nothing anywhere pulls that offset back. The problem stops being well posed.
The fix from Rudy and Strikwerda is to stop setting the incoming wave to zero and instead tie it to the pressure difference:
is a characteristic domain length, the maximum Mach number, and is the only free parameter in the whole prescription. At you are back to perfectly non-reflecting. Raise and the boundary starts dragging the pressure toward .
Try it in the simulation below. The duct is closed on the left and open on the right. Hit fire pulse to launch a pressure wave, then move the sigma slider.
Watch two things. First, when the pulse reaches the outlet, does the red curve — the incoming amplitude — rise? That bump is the reflection. Second, turn up source q and watch the pressure history at the bottom: at the white curve settles above the line and stays there. You killed the reflection and lost the pressure.
The Narrow Window Between Two Failures#
sits between two failures that pull in opposite directions.
| Treatment | What the outlet does | How it fails |
|---|---|---|
| B1 (extrapolation + Riemann invariants) | Extrapolate velocity and density, relax pressure only | Spurious waves manufactured by extrapolation |
| B2 (NSCBC, ) | Mean pressure never anchored to | |
| B3 (NSCBC, ) | Reflection once is large | |
| B4 (reflecting outlet) | Pressure fixed, | Total reflection — the box is a resonator |
Small lets the mean pressure drift; large stiffens the boundary until it throws acoustic energy back inside. The values Poinsot and Lele actually used were , and for the equivalent coefficient in the extrapolation-based B1. Neither number comes from theory. Both were picked from between the two failures.
The frequency dependence shows why it is a compromise. For an acoustic wave of angular frequency , this boundary reflects with
Lower frequencies reflect more. So is really a filter that grabs low frequencies and lets high ones through. Mean pressure is the component, so it gets grabbed; the acoustics you want to evacuate pass. The window where that separation works is narrow.
Measuring Reflection and Offset in Code#
For one-dimensional linear acoustics the state splits exactly into two characteristic amplitudes: , traveling at . Choose and each one shifts exactly one cell per step, so every wiggle on screen comes from the boundary condition rather than the scheme.
import numpy as np
N, C, L = 240, 1.0, 1.0
DX = L / N
DT = DX / C # exact one-cell shift: no scheme diffusion
def outlet_relax_k(sigma, mach=0.0):
"""NSCBC relaxation coefficient K = sigma (1 - M^2) c / L"""
return sigma * (1.0 - mach ** 2) * C / L
def duct_step(ap, am, am_b, k_relax, q):
"""A+ one cell right, A- one cell left. At the outlet A- must be invented."""
ap[1:] = ap[:-1].copy()
ap[0] = 0.0
am[:-1] = am[1:].copy()
p_b = 0.5 * (ap[-1] + am[-1])
am_b -= DT * k_relax * p_b # L1 = K (p - p_inf)
am[-1] = am_b
ap[0] = am[0] # closed end at x = 0 (u = 0)
ap += q * DT # weak uniform heat release
am += q * DT
return am_b
def measure_outlet(sigma, q, steps, pulse):
ap, am, am_b = np.zeros(N), np.zeros(N), 0.0
x = (np.arange(N) + 0.5) * DX
if pulse:
ap += np.exp(-((x - 0.30) / 0.09) ** 2)
k = outlet_relax_k(sigma)
refl = 0.0
for n in range(steps):
am_b = duct_step(ap, am, am_b, k, q)
if pulse and n > 0.85 * N:
refl = max(refl, np.abs(am[:-8]).max())
return refl, float(np.mean(0.5 * (ap + am)))
for sigma in (0.0, 0.25, 1.0, 4.0, 10.0):
r, _ = measure_outlet(sigma, q=0.0, steps=650, pulse=True)
_, p = measure_outlet(sigma, q=0.3, steps=6000, pulse=False)
print(f"sigma={sigma:5.2f} reflected={r * 100:5.1f}% mean p - p_inf={p:+.4f}")What it prints:
sigma= 0.00 reflected= 0.0% mean p - p_inf=+0.3000
sigma= 0.25 reflected= 1.9% mean p - p_inf=+0.0007
sigma= 1.00 reflected= 7.3% mean p - p_inf=+0.0006
sigma= 4.00 reflected= 24.5% mean p - p_inf=+0.0227
sigma=10.00 reflected= 46.8% mean p - p_inf=-0.1142At the reflection is gone completely, and the 0.3 offset built by the heat release sits there untouched. At reflection is under 2% and the pressure is held within 0.0007 of . So far, as expected.
The surprise is the last two rows. Pushing to 4 and 10 raises reflection to 25% and 47%, which is unsurprising — but the pressure offset gets worse again. A boundary that stiff starts ringing on its own, and the ringing moves the mean. Raising is not a trade where you buy pressure control with reflection. Past a certain point you lose both.
Waves the Grid Invented Travel the Wrong Way#
Physical acoustics are not the only thing reflecting off the boundary. Components with wavelengths shorter than about four mesh spacings are not solutions of Navier–Stokes at all; they are artifacts of the discretization. Poinsot and Lele called these "q waves" to separate them from the physical "p waves."
Their signature is group velocity. Even for the one-dimensional advection equation at speed , the group velocity of short wavelengths has the opposite sign to . The flow moves right, and the numerical error crawls upstream to the left. Worse, grows with the order of the spatial scheme, so high-order codes are more exposed, not less.
That is why a boundary treatment has to be judged with two reflection coefficients: for physical waves and for numerical ones. Any usable treatment needs under all circumstances; one that claims to be non-reflecting also needs . Simply starting a run from an initial field with steep gradients generates q waves, and in a DNS nothing removes them afterward.
One Line for Choosing an Outlet Condition#
is not a tuning knob. It is a coordinate between two failures — an unanchored pressure at one end, a resonating computational box at the other. The reason 0.25 keeps getting recommended is that it grabs the low frequencies and passes everything else.
When an outlet starts oscillating for no visible reason, work in this order. Count the incoming characteristics at that face and check that the number of conditions you impose matches. Then check whether the oscillation period is a multiple of — if it is, you are looking at boundary reflection, not physics. Finally, lower . If the oscillation shrinks, the boundary was the cause; if the mean pressure starts wandering off, you have crossed into the failure on the other side.
Related
Share if you found it helpful.