← Octo-TIGER / All test problemsStationary flux-limited diffusion

Marshak wave

An incoming radiation bath heats initially cold, stationary material through coupled nonlinear FLD and material energy exchange.

FLD method scope. Stationary grey radiation at physical light speed, CPU backend, backward Euler in time, and derived flux with the Levermore–Pomraning limiter. Analytic diffusion-limit references are supplied, but their differences include nonlinear-limiter and boundary-model effects; they are not exact solutions of this nonlinear FLD solver. Paired M1 RK1 and FLD timings use different stability limits and do not establish performance at matched error.

The experiment

Physical setup

The cube spans −1 to +1 in normalized units, with c = 1, Planck and Rosseland extinction 100, and equal radiation/material energy capacities. Initially E = 0 and material energy is 10−20. The material density and velocity remain fixed while its thermal energy evolves.

The left boundary supplies an incoming hemisphere flux of 1 through the FLD Robin condition cE/2 + D ∂E/∂n = 2. The right boundary is vacuum, cE/2 + D ∂E/∂n = 0; transverse faces reflect. M1 uses a moment boundary construction, so the two discrete boundary operators are not identical.

This case uses normalized units with c = 1, opacity 100, and equal material/radiation energy capacities. Hydrodynamics and gravity are disabled. The default cube spans −1 to +1, and the default final time is 1. Adaptive runs retain their actual leaf spacing in exported data.

The comparison

Comparison and interpretation

Analytic diffusion-limit reference; not an exact solution of nonlinear FLD. The Su–Olson solution supplies radiation energy, material energy, and the flux derived from its energy gradient for a semi-infinite linear diffusion problem:

∂tE − [1/(3χ)]∂x²E = χ(e−E),   ∂te = χ(E−e)
ξ = √3χ(x+1),   τ = χt,   Eref = 4u(ξ,τ),   eref = 4v(ξ,τ)
Fx,ref = −(4/√3)∂u/∂ξ,   Fy,ref = Fz,ref = 0

Here c = 1, χ = 100, and the equal-capacity parameter is ε = 1. The left Marshak condition is u − (2/√3)∂u/∂ξ = 1. Integral representations evaluate the analytic solution numerically. Exported reference values are sampled at cell centers; numerical fields are cell averages, adding a sampling difference.

The FLD calculation instead has a nonlinear flux limiter and a finite domain with a vacuum boundary on the right. These differences matter near the early front and when radiation reaches that boundary. Slice discrepancy norms therefore combine model, boundary, quadrature, sampling, and discretization differences; they are not an exact-FLD convergence test.

What this test measures

Inspect radiation and material heating, penetration depth, nonnegative energies, the derived flux bound, and energy change after accounting for boundary transport and material exchange. Finite-domain and limiter effects matter when interpreting model differences. Short paired runs exercise the implementation and reporting pipeline; they do not establish late-time benchmark accuracy.

Measured results

All resolutions

LevelGridBatch status
116³Ready

Analytic diffusion-limit reference comparison. The reference is exact for its stated linear diffusion equations, not for the nonlinear FLD limiter. Flux remains a derived diagnostic; no separate M1 momentum conservation test applies.

FLD backward Euler · 16³ cells

Central cell layer at z=dx/2; ray at y=z=dx/2.

FLD backward Euler with the Levermore-Pomraning limiter; stationary material and physical c = 1 in normalized units. Radiation flux is derived from the radiation-energy gradient; it is a diagnostic, not an evolved momentum variable. Analytic references describe the linear diffusion limit and need not solve nonlinear flux-limited diffusion exactly. M1 versus FLD differences compare distinct radiation models and are not analytic-reference errors.

Recorded setup and run provenance
OriginOcto-TIGER application
DomainCube of side 2.000000e+00 (code length); centered at the origin
Resolution16³ cells; finest Δx = 1.250000e-01 (code length)
Final comparison time2.500000e-01 (code time)
Radiation modelFLD
Radiation integrationFLD backward Euler (first order in time)
Flux semanticsDerived FLD flux: F = -D grad E
Analytic referencesu-olson-linear-halfspace; linear diffusion-limit reference, not exact for the nonlinear FLD limiter
Reference norm scopeArea-weighted projected positive-side slice; no full-volume norm or convergence order inferred
Radiation backendcpu
Physical light speed1.000000e+00 (code speed)
Reduced-speed factor α1.000000e+00
Radiation transport speed1.000000e+00 (code speed)
Periodic boundariesoff
Hydrodynamicsoff
Gravityoff
Implicit radiation sourceon
Uniform gridon
CFL0.4
Timestep cap0.025000000000000001 (code time)
Output interval0.125 (code time)
{
  "background": 0.0,
  "c": 1.0,
  "case": "marshak",
  "cells": 16,
  "command": [
    "/home/dmarce1/workspace/octotiger/output/m1-fld-local-20261013-go/.campaign/launch-solver",
    "/home/dmarce1/workspace/octotiger/output/m1-fld-local-20261013-go/.campaign/runtime/octotiger",
    "--config_file=/home/dmarce1/workspace/octotiger/output/m1-fld-local-20261013-go/runs/l1/marshak/fld/marshak/l1/run.ini",
    "--hpx:threads=24"
  ],
  "comparison_signature": {
    "atomic_mass": "1",
    "atomic_number": "1",
    "cfl": "0.4",
    "code_to_cm": "1",
    "code_to_g": "1",
    "code_to_s": "1",
    "correct_am_hydro": "off",
    "disable_analytic": "on",
    "disable_diagnostics": "on",
    "eos": "IDEAL",
    "gravity": "off",
    "hard_dt": "0.025000000000000001",
    "hydro": "off",
    "hydro_device_kernel_type": "OFF",
    "hydro_host_kernel_type": "LEGACY",
    "monopole_device_kernel_type": "OFF",
    "multipole_device_kernel_type": "OFF",
    "n_species": "1",
    "omega": "0",
    "periodic": "off",
    "problem": "MARSHAK",
    "rad_implicit": "on",
    "radiation": "on",
    "radiation_algorithm_version": 1,
    "radiation_integrator": "backward_euler",
    "radiation_limiter": "levermore_pomraning",
    "radiation_model": "fld",
    "radiation_reduced_c_factor": "1",
    "stop_step": "1000000",
    "stop_time": "0.25",
    "unigrid": "on",
    "xscale": "1"
  },
  "config": {
    "atomic_mass": "1",
    "atomic_number": "1",
    "cfl": "0.4",
    "code_to_cm": "1",
    "code_to_g": "1",
    "code_to_s": "1",
    "correct_am_hydro": "off",
    "datadir": "/home/dmarce1/workspace/octotiger/output/m1-fld-local-20261013-go/runs/l1/marshak/fld/marshak/l1/",
    "disable_analytic": "on",
    "disable_diagnostics": "on",
    "disable_output": "off",
    "eos": "IDEAL",
    "gravity": "off",
    "hard_dt": "0.025000000000000001",
    "hydro": "off",
    "hydro_device_kernel_type": "OFF",
    "hydro_host_kernel_type": "LEGACY",
    "max_level": "1",
    "min_level": "1",
    "monopole_device_kernel_type": "OFF",
    "multipole_device_kernel_type": "OFF",
    "n_species": "1",
    "odt": "0.125",
    "omega": "0",
    "periodic": "off",
    "problem": "MARSHAK",
    "rad_implicit": "on",
    "radiation": "on",
    "radiation_backend": "cpu",
    "radiation_integrator": "backward_euler",
    "radiation_limiter": "levermore_pomraning",
    "radiation_model": "fld",
    "radiation_reduced_c_factor": "1",
    "stop_step": "1000000",
    "stop_time": "0.25",
    "unigrid": "on",
    "xscale": "1"
  },
  "conservation": [
    {
      "boundary": -0.1870285859489803,
      "boundary_fraction": -0.005844643310905635,
      "field": "er",
      "final": 0.09534729065598976,
      "final_fraction": 0.00297960283299968,
      "history_end_time": 0.25,
      "history_scope": "full_run",
      "history_start_time": 0.0,
      "initial": 0.0,
      "initial_fraction": 0.0,
      "integral_units": "code units",
      "max_abs_residual": 3.018468114346362e-10,
      "max_normalized_error": 9.432712857332382e-12,
      "normalization_basis": "bath_energy * volume",
      "normalization_scale": 32.0,
      "normalization_time": 0.0,
      "normalized_error": 9.432712857332382e-12,
      "normalized_residual": -9.432712857332382e-12,
      "raw_change": 0.09534729065598976,
      "residual": -3.018468114346362e-10,
      "source": -0.09168129499114373,
      "source_fraction": -0.0028650404684732417,
      "zero_initial_flux_relative_tolerance": 1.4210854715202004e-14
    }
  ],
  "dx": 0.125,
  "executable_sha256": "82854f6db866ae424dd0b4608d8c6b9b4828b28e4d5f30f48d358097d19ab303",
  "fld_diagnostics": {
    "accepted_steps": 10,
    "history_end_time": 0.24999999999999997,
    "history_start_time": 0.0,
    "maximum_nonlinear_residual": 2.6691109392129597e-11,
    "maximum_step_coupled_conservation_error": 4.28488596262099e-11,
    "radiation_energy_budget": {
      "boundary": -0.1870285859489803,
      "boundary_fraction": -0.005844643310905635,
      "field": "er",
      "final": 0.09534729065598976,
      "final_fraction": 0.00297960283299968,
      "history_end_time": 0.25,
      "history_scope": "full_run",
      "history_start_time": 0.0,
      "initial": 0.0,
      "initial_fraction": 0.0,
      "integral_units": "code units",
      "max_abs_residual": 3.018468114346362e-10,
      "max_normalized_error": 9.432712857332382e-12,
      "normalization_basis": "bath_energy * volume",
      "normalization_scale": 32.0,
      "normalization_time": 0.0,
      "normalized_error": 9.432712857332382e-12,
      "normalized_residual": -9.432712857332382e-12,
      "raw_change": 0.09534729065598976,
      "residual": -3.018468114346362e-10,
      "source": -0.09168129499114373,
      "source_fraction": -0.0028650404684732417,
      "zero_initial_flux_relative_tolerance": 1.4210854715202004e-14
    },
    "reference_exact_for_solver": false,
    "reference_kind": "linear-diffusion-limit",
    "reference_norm_scope": "projected-positive-side-slice",
    "retries": 0,
    "slice_reference_norms": {
      "er": {
        "L1": 0.006587277752761258,
        "L2": 0.02563794370823091,
        "Linf": 0.10251215168737529
      },
      "fx": {
        "L1": 0.0013044877808768877,
        "L2": 0.0048131628046003275,
        "Linf": 0.019180087753126473
      },
      "fy": {
        "L1": 2.9954818892011954e-20,
        "L2": 1.4619023220825133e-19,
        "Linf": 1.1091190887030908e-18
      },
      "fz": {
        "L1": 2.3398337288632596e-20,
        "L2": 1.2228005487010003e-19,
        "Linf": 7.394127258020605e-19
      },
      "material_egas": {
        "L1": 0.006682920953203164,
        "L2": 0.026067315382171823,
        "Linf": 0.10423531404492375
      }
    },
    "steps": [
      {
        "boundary_energy": 0.01910264583108567,
        "conservation_error": -4.28488596262099e-11,
        "dt": 0.025,
        "linear_iterations": 6,
        "linear_residual": 1.130238149646009e-13,
        "nonlinear_iterations": 2,
        "nonlinear_residual": 2.6691109392129597e-11,
        "retries": 0,
        "substeps": 1,
        "t": 0.0,
        "vcycles": 6
      },
      {
        "boundary_energy": 0.019010148215885966,
        "conservation_error": -3.228120247104676e-11,
        "dt": 0.025,
        "linear_iterations": 6,
        "linear_residual": 1.0447674398334772e-13,
        "nonlinear_iterations": 2,
        "nonlinear_residual": 1.611242389509826e-11,
        "retries": 0,
        "substeps": 1,
        "t": 0.025,
        "vcycles": 6
      },
      {
        "boundary_energy": 0.018920421001982296,
        "conservation_error": -3.133901345963902e-11,
        "dt": 0.025,
        "linear_iterations": 6,
        "linear_residual": 1.0488592899843095e-13,
        "nonlinear_iterations": 2,
        "nonlinear_residual": 1.564079421534359e-11,
        "retries": 0,
        "substeps": 1,
        "t": 0.05,
        "vcycles": 6
      },
      {
        "boundary_energy": 0.018831691338347868,
        "conservation_error": -3.042850663819742e-11,
        "dt": 0.025,
        "linear_iterations": 6,
        "linear_residual": 1.0612558216983024e-13,
        "nonlinear_iterations": 2,
        "nonlinear_residual": 1.518385937815392e-11,
        "retries": 0,
        "substeps": 1,
        "t": 0.07500000000000001,
        "vcycles": 6
      },
      {
        "boundary_energy": 0.018743659850309746,
        "conservation_error": -2.954604983288237e-11,
        "dt": 0.025,
        "linear_iterations": 6,
        "linear_residual": 1.0784580131924554e-13,
        "nonlinear_iterations": 2,
        "nonlinear_residual": 1.4740243747812798e-11,
        "retries": 0,
        "substeps": 1,
        "t": 0.1,
        "vcycles": 6
      },
      {
        "boundary_energy": 0.018656272499995293,
        "conservation_error": -2.8690425696412418e-11,
        "dt": 0.025,
        "linear_iterations": 6,
        "linear_residual": 1.0985017758509862e-13,
        "nonlinear_iterations": 2,
        "nonlinear_residual": 1.4309586501837224e-11,
        "retries": 0,
        "substeps": 1,
        "t": 0.125,
        "vcycles": 6
      },
      {
        "boundary_energy": 0.01856951612532212,
        "conservation_error": -2.786076037877719e-11,
        "dt": 0.025,
        "linear_iterations": 6,
        "linear_residual": 1.1202306966744195e-13,
        "nonlinear_iterations": 2,
        "nonlinear_residual": 1.3891582328895424e-11,
        "retries": 0,
        "substeps": 1,
        "t": 0.15,
        "vcycles": 6
      },
      {
        "boundary_energy": 0.018483384401261828,
        "conservation_error": -2.7056245746170503e-11,
        "dt": 0.025,
        "linear_iterations": 6,
        "linear_residual": 1.1425384767935286e-13,
        "nonlinear_iterations": 2,
        "nonlinear_residual": 1.348589469263306e-11,
        "retries": 0,
        "substeps": 1,
        "t": 0.175,
        "vcycles": 6
      },
      {
        "boundary_energy": 0.01839787217291142,
        "conservation_error": -2.6276122211632514e-11,
        "dt": 0.025,
        "linear_iterations": 6,
        "linear_residual": 1.1649126106473048e-13,
        "nonlinear_iterations": 2,
        "nonlinear_residual": 1.3092178383078412e-11,
        "retries": 0,
        "substeps": 1,
        "t": 0.19999999999999998,
        "vcycles": 6
      },
      {
        "boundary_energy": 0.01831297451187809,
        "conservation_error": -2.5519615275341307e-11,
        "dt": 0.025,
        "linear_iterations": 6,
        "linear_residual": 1.1879715176658092e-13,
        "nonlinear_iterations": 2,
        "nonlinear_residual": 1.271010553749452e-11,
        "retries": 0,
        "substeps": 1,
        "t": 0.22499999999999998,
        "vcycles": 6
      }
    ],
    "substeps": 10
  },
  "inx": 8,
  "length": 2.0,
  "level": 1,
  "marshak_capacity_ratio": 1.0,
  "marshak_opacity": 100.0,
  "movie_capture": {
    "hard_dt": 0.025,
    "odt": 0.125,
    "requested_snapshots": 3,
    "steps_per_output_check": 5
  },
  "origin": "Octo-TIGER application",
  "physical_c": 1.0,
  "radiation_algorithm_version": 1,
  "radiation_backend": "cpu",
  "radiation_equations": "stationary physical-c FLD",
  "radiation_flux_semantics": "derived_fld_flux",
  "radiation_integrator": "backward_euler",
  "radiation_limiter": "levermore_pomraning",
  "radiation_model": "fld",
  "radiation_reduced_c_factor": 1.0,
  "reference_exact_for_solver": false,
  "reference_kind": "linear-diffusion-limit",
  "reference_model": "su-olson-linear-halfspace",
  "reference_sampling": "cell-center point values",
  "status": "complete",
  "time": 0.25,
  "transport_c": 1.0,
  "units": {
    "c": 1.0,
    "energy_density": "normalized energy density",
    "flux": "normalized flux",
    "length": "normalized length",
    "system": "dimensionless",
    "time": "normalized time"
  },
  "validation_scope": "Su-Olson linear nonequilibrium half-space diffusion reference, with equal radiation/material capacities. Nonlinear flux limiting and the finite far boundary can differ from the reference; reported errors are slice differences, not full-volume convergence evidence."
}
FLD radiation energy, analytic diffusion-limit reference, and signed difference. Central cell layer at z=dx/2; ray at y=z=dx/2.
FLD radiation energy, analytic diffusion-limit reference, and signed difference. Central cell layer at z=dx/2; ray at y=z=dx/2. · PDF
Radiation energy and derived FLD flux against analytic diffusion-limit profiles, with signed differences. The reference does not include the nonlinear flux limiter.
Radiation energy and derived FLD flux against analytic diffusion-limit profiles, with signed differences. The reference does not include the nonlinear flux limiter. · PDF
Radiation and material energy relative to bath energy, compared with the Su–Olson analytic linear diffusion reference.
Radiation and material energy relative to bath energy, compared with the Su–Olson analytic linear diffusion reference. · PDF
Derived FLD flux maps
Derived FLD fx: numerical flux, analytic diffusion-reference flux, and signed difference.
Derived FLD fx: numerical flux, analytic diffusion-reference flux, and signed difference. · PDF
Derived FLD fy: numerical flux, analytic diffusion-reference flux, and signed difference.
Derived FLD fy: numerical flux, analytic diffusion-reference flux, and signed difference. · PDF
Derived FLD fz: numerical flux, analytic diffusion-reference flux, and signed difference.
Derived FLD fz: numerical flux, analytic diffusion-reference flux, and signed difference. · PDF

Accepted implicit solves

Accepted steps: 10; substeps: 10; timestep retries: 0; maximum nonlinear residual: 2.669111e-11; maximum absolute coupled energy error per accepted step: 4.284886e-11.

Projected-slice differences from the analytic reference

Area-weighted L1, L2, and maximum differences on the exported positive-side slice; these are not full-volume norms or a pure discretization error. No convergence order is inferred. Energy-density and flux units are those recorded in the slice-units download.

FieldL1 differenceL2 differenceMaximum difference
er6.587278e-032.563794e-021.025122e-01
fx1.304488e-034.813163e-031.918009e-02
fy2.995482e-201.461902e-191.109119e-18
fz2.339834e-201.222801e-197.394127e-19
material_egas6.682921e-032.606732e-021.042353e-01

Radiation energy conservation

All values below are dimensionless fractions of the fixed normalization scale at t_ref = 0.

FieldScaleQ(t_ref)/scaleQ(t)/scaleBoundary B/scaleSource S/scaleResidual R/scaleMaximum |R|/scale
erEbath V0.000000e+002.979603e-03-5.844643e-03-2.865040e-03-9.432713e-129.432713e-12
Radiation energy after signed boundary transport and material exchange. Flux moments are not conserved variables in FLD.
Radiation energy after signed boundary transport and material exchange. Flux moments are not conserved variables in FLD. · PDF

Saved-state movie

Marshak · L1 · FLD backward Euler

3 stored states; 3 shown. Zero-order hold; no solution interpolation. Playback holds each saved numerical state over its time interval and includes endpoint holds.

Snapshot times: 0, 0.125, 0.25 normalized time.

Arrows show derived FLD diagnostic flux -D grad(E); radiation momentum is not evolved. Arrows have equal length and show direction only.

Final-time profiles compare FLD with a linear diffusion-limit analytic reference, not an exact solution of nonlinear flux-limited diffusion. The movie shows numerical states only.

Central z=0+ radiation energy slice with faint cell mesh and equal-length flux direction arrows. Arrows show derived FLD diagnostic flux -D grad(E); radiation momentum is not evolved. Fixed color limits; actual stored Silo times held without solution interpolation. Final-time profiles compare FLD with a linear diffusion-limit analytic reference, not an exact solution of nonlinear flux-limited diffusion. The movie shows numerical states only. The maps show the full simulation domain without cropping.

Download MP4 · Rendering and timing metadata · Full run report

All campaign movies

Data and reproducibility

Reading FLD diagnostics

The profiles include an analytic linear diffusion-limit reference for radiation energy and flux, plus material energy in Marshak. The reference omits the nonlinear limiter; the Marshak reference also assumes a semi-infinite domain. Reported slice discrepancies combine these model differences with discretization and reference-evaluation errors. Numerical flux is derived as F = −D∇E and satisfies |F| ≤ cE; it is not an evolved M1 momentum variable.

The radiation energy ledger checks R = E(t) − E(t_ref) + B − S, with outward boundary energy B and material-to-radiation exchange S. Its fixed normalization is initial radiation energy, or bath energy times domain volume for cold Marshak heating. Coupled gas-plus-radiation errors per accepted implicit step are recorded separately in the solver diagnostics.

Nonlinear residuals, substeps, and retries are measured solver diagnostics. The short pilot checks the implementation and reporting pipeline; comparison of models is distinct from an accuracy benchmark or speedup at matched error.

Sources & provenance

Where this problem comes from

Su & Olson (1996), “Benchmark results for the non-equilibrium Marshak diffusion problem,” JQSRT 56, 337–351, gives the nonequilibrium diffusion benchmark. The local reference is implemented in src/test_problems/marshak/marshak.cpp; the run records source hashes for reproducibility.

Levermore & Pomraning (1981), “A flux-limited diffusion theory,” ApJ 248, 321–334, derives flux-limited diffusion and its classical diffusion limit. The saved run's reference metadata distinguishes the analytic linear diffusion equations from the nonlinear limiter evolved by this solver.

Radiation method context

M1 RK1 evolves radiation energy and flux moments with the retained first-order radiation update. FLD evolves radiation energy and stationary material thermal energy with a coupled backward-Euler solve; its flux F = −D∇E is reconstructed from energy with the Levermore–Pomraning limiter. The scalar implicit transport solve uses composite-grid multigrid and an iterative linear solver. Both time integrators are first order.

The FLD runner currently supports the stationary Gaussian scattering pulse and Marshak heating test on the CPU at physical light speed. Streaming wave/front, equilibrium sphere, and moving radiation hydrodynamics are unsupported for FLD. Flux diagnostics in FLD are not independently evolved M1 moments and have no separate M1 momentum conservation test. A difference between paired M1 and FLD solutions is a model comparison, not an analytic error. ADER2 has been removed from the current solver; historical result files retain their original provenance.

Skinner & Ostriker (2013) and Hanawa & Audit (2014) provide context for the M1 equations. The implementation and saved executable/source hashes identify the actual numerical methods used in this batch.

Reproducing this batch

Descriptions document the reviewed source implementation. Older or edited solver versions can use different profile constants or averaging rules; these are not all encoded in run.ini. Use the run metadata, executable hash, and saved batch source hashes to identify the implementation behind a result. A source path or descriptive formula alone is not proof of the executable's contents.