Dust

Aether.Dust.DustFluidsType
struct DustFluids{N, TS, RS, FT}
DustFluids(stopping_times; feedback = true, heating = true, drag = true,
           riemann_solver = Rusanov(), density_floor = 1e-12)

N pressureless dust species, one per entry of the tuple stopping_times, passed to Simulation(mesh; eos, dust = ...). Each stopping time is either a positive Real (a constant τ in code units) or a callable τ(x1, x2, x3, ρg, ρd, cs) of position, gas density, the species' own density, and gas sound speed — evaluated inline in the drag kernel at the exact stage state, which is both what the implicit solve requires and cheaper than any precomputed array. The species density serves constant-coefficient drag laws, ρg αg = ρd αd ≡ K (Lehmann & Wardle 2018 shocks): τ = ρd / K. On the GPU a callable compiles into the kernel: anything it captures must be a plain value.

  • feedback: the gas momentum (and energy) feels the drag back-reaction. With feedback = false the dust damps toward the gas but the gas is untouched (a test mode; total momentum is then intentionally not conserved).
  • heating: deposit the full frictional dissipation $\Sigma_i \alpha_i \rho_{d,i} |v_{d,i} - v_g|^2$ in the gas energy in addition to the drag work (ideal equations of state only; isothermal gas carries no energy variable and ignores it).
  • drag = false advects the species with no gas coupling at all — pressureless free streaming, which runs on the explicit RK steppers.
  • riemann_solver: Rusanov() (the Krapp et al. 2024 Appendix E flux, the robust default) or HLLE() with the pressureless signal speeds $\lambda^\pm = \max/\min(v_l, v_r, 0)$ — exactly upwind wherever both sides move the same way.
  • density_floor: applied in the dust conversions, in the mesh's float type.
using Aether

DustFluids((0.1, 1.0))

# output
DustFluids(2 species, τ = (0.1, 1.0), feedback = true, heating = true)
source
Aether.Dust.DustStateType
struct DustState{A5, S}
DustState(mesh, dust)

Conserved, primitive, and face-flux arrays for N pressureless dust species. Species s owns slots 4s - 3:4s containing (ρ, ρv1, ρv2, ρv3) or (ρ, v1, v2, v3), and the state carries its DustFluids configuration.

  • u0::Any: conserved variables, (ρ, ρv1, ρv2, ρv3) per species, layout (i, j, k, v, m)

  • u1::Any: second conserved register for the SSP-RK stage combinations

  • w0::Any: primitive variables, (ρ, v1, v2, v3) per species; reconstruction reads this

  • F1::Any: x1 face fluxes, one cell longer in x1

  • F2::Any: x2 face fluxes, one cell longer in x2

  • F3::Any: x3 face fluxes, one cell longer in x3

  • system::Any: the DustFluids configuration

source
Aether.Dust.MutualDragType
struct MutualDrag{D, A5}
MutualDrag(mesh, dust)

Stiff gas–dust drag using the closed-form O(N) arrowhead solve of Krapp et al. (2024, Eqs. 10 and 27–29). The species rates sum to the gas back-reaction, so total momentum is conserved to machine precision.

  • system::Any: the DustFluids configuration

  • K::Any: stored first-solve rates: gas k (slots 1:3), gas energy rate (4), species ks (4 + 3(s-1) + c)

source
Aether.Dust.PressurelessType
struct Pressureless
Pressureless()

The pressureless-fluid equation "of state" of a dust species — the value the dust flux path threads through the eos slot of the shared reconstruction and Riemann machinery. No pressure, no sound speed: the characteristics are the flow itself.

source