Dust
Aether.Dust.DustFluids — Type
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. Withfeedback = falsethe 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 = falseadvects 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) orHLLE()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)Aether.Dust.DustState — Type
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 combinationsw0::Any: primitive variables,(ρ, v1, v2, v3)per species; reconstruction reads thisF1::Any: x1 face fluxes, one cell longer in x1F2::Any: x2 face fluxes, one cell longer in x2F3::Any: x3 face fluxes, one cell longer in x3system::Any: theDustFluidsconfiguration
Aether.Dust.MutualDrag — Type
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: theDustFluidsconfigurationK::Any: stored first-solve rates: gask(slots 1:3), gas energy rate (4), speciesks (4 + 3(s-1) + c)
Aether.Dust.Pressureless — Type
struct PressurelessPressureless()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.