Manufactured Gaussian plume verification

Purpose

This verification case compares TARSA against an analytical Gaussian plume solution in a uniform flow. It is used to verify the coupled 3-D advection + turbulent diffusion behaviour in a controlled, idealised configuration before moving to real-case validations.

The Gaussian runs use the same default numerics as ETEX and the demo cases:

  • Advection: DST–Koren (TVD MUSCL reconstruction) with a Koren–Sweby limiter
  • Time integration: SSP-RK3
  • Vertical diffusion: implicit (column-wise Thomas solver)
  • Splitting: second-order Strang splitting of advection and vertical diffusion

Configuration

We consider a Cartesian domain

\[[-1500,1500]\times[-400,400]\times[0,100]~\mathrm{m},\]

discretised on a uniform grid. The current reference configuration in validation_gaussian_multiresolution.jl uses 121×11×61 cells ($\Delta x=25~\mathrm{m}$, $\Delta y=80~\mathrm{m}$, $\Delta z\approx1.67~\mathrm{m}$).

The wind is purely along-wind ($u_x=5~\mathrm{m\,s^{-1}}$, $u_y=u_z=0$) and the turbulent diffusivity is constant ($K_z=0.05~\mathrm{m^2\,s^{-1}}$ by default). A compact volumetric source is placed in the central grid cell and scaled to match the analytical emission rate $Q$.

Boundary conditions follow the manufactured-test setup:

  • lateral boundaries treated as open ($C=0$),
  • reflecting lower boundary at $z=0$ (zero flux), consistent with the analytical image solution.

Starting from $C=0$, TARSA is integrated with the Strang-split DST–Koren + SSP-RK3 configuration. The time step is chosen from the CFL restriction; for the reference grid and wind speed a stable choice corresponds to $\mathrm{CFL}\approx 0.5$. The results below are reported at the end of the integration window $T_{\mathrm{end}}=900~\mathrm{s}$.

Results

The figures below reproduce the key diagnostics for this case.

Horizontal maps and normalised error

Map figure PDF: Horizontal maps and normalised error

Left: analytical solution; middle: TARSA solution; right: normalised absolute error

\[\frac{C_{\mathrm{plume}}-C_{\mathrm{FVM}}}{\max(C_{\mathrm{FVM}})}.\]

Cell-wise scatter (log–log)

Cell-wise comparison between analytical and TARSA solutions using $N=5551$ evaluated grid points. Both axes are logarithmic.

Scatter figure PDF: Cell-wise scatter (log–log){width=50%}

For the reference grid, the agreement is high over a wide dynamic range (points close to the 1:1 line). For this run, Pearson correlation is $r=0.982$ ($R^2=0.964$), with a small fractional bias (FB$=0.004$), a normalised mean square error NMSE$=0.285$, and a high figure of merit FM$=0.973$. The remaining spread at the highest values is primarily due to (i) discretisation near the emission cell and (ii) TVD limiting in the DST–Koren reconstruction, which introduces a small amount of limiter-related diffusion in regions of strong gradients to maintain boundedness. Deviations at extremely small concentrations correspond to cells where both solutions approach machine precision and log-space diagnostics become sensitive to roundoff.

Grid sensitivity

To assess sensitivity to spatial resolution, the multi-resolution script repeats the Gaussian plume experiment on coarse, reference and fine grids while keeping the physical domain and forcing identical. The agreement improves monotonically with resolution.

Grid$N_x\times N_y\times N_z$$N$$r$$R^2$FBNMSEREL$_{L2}$
coarse$81\times 9\times 41$25010.97660.95380.00720.38450.2325
reference$121\times 11\times 61$55510.98200.96430.00410.28450.1952
fine$161\times 13\times 81$98010.98500.97020.00280.23170.1740

Why this case matters

  • provides an analytical reference for the advection–diffusion core
  • serves as a regression test for the default explicit numerics (DST–Koren + SSP-RK3 + Strang + implicit vertical diffusion)
  • underpins the differentiability / gradient-check experiments that reuse the same manufactured configuration

How to run

Scripts

Folder: validation/GAUSSIAN

Main scripts:

  • validation/GAUSSIAN/validation_gaussian_explicit.jl
  • validation/GAUSSIAN/validation_gaussian_multiresolution.jl
  • validation/GAUSSIAN/validation_gaussian_plot.py

validation_gaussian_explicit.jl

  • defines analytical plume solution (including ground reflection)
  • runs TARSA forward with the explicit Strang-split configuration
  • writes fields and metrics consumed by the plotting script

validation_gaussian_multiresolution.jl

  • runs the same configuration on coarse, reference, fine grids
  • writes a summary CSV (e.g. gaussian_multiresolution_stats.csv) with metrics: R, R2, FB, NMSE, FM, RMSE, REL_L2

validation_gaussian_plot.py

  • produces the map triptych and scatter plot PDFs

Run

julia --project=. validation/GAUSSIAN/validation_gaussian_multiresolution.jl
julia --project=. validation/GAUSSIAN/validation_gaussian_explicit.jl
python validation/GAUSSIAN/validation_gaussian_plot.py --no-show