feat: super-Gaussian-preserving Fokker-Planck operator for Vlasov-1D#313
Conversation
Add a Dougherty-type drift-diffusion collision operator whose equilibrium is a super-Gaussian f ~ exp(-beta*|v-vbar|^m) instead of a Maxwellian (terms.fokker_planck.type: super_gaussian, exponent m). Use it to maintain a Langdon/DLM inverse-bremsstrahlung-heated distribution against collisional maxwellianization during Landau-damping / LPI runs. Design notes: - The drift coefficient is the exact finite difference of the equilibrium potential phi = beta*|v-vbar|^m across each cell edge, so the sampled super-Gaussian is the exact fixed point of the Chang-Cooper scheme (the midpoint form is exact only at m=2 and drifts secularly otherwise). - beta comes from the energy-conservation closure n/(m*<|v-vbar|^m>) (the generalization of the LB/Dougherty beta = 1/(2T)), refined by a Newton solve of the delta-weighted discrete energy-flux condition, reusing the self_consistent_beta config knobs. A sampled super-Gaussian is an exact root, so there is no secular drift at equilibrium. - m=2 reduces to chang_cooper_dougherty step for step. - Conservation: density exact; energy exact at equilibrium with a one-time O(nu*dt) transient offset from operator splitting; momentum exact for distributions symmetric about vbar (documented caveat for skewed f). Also generalizes find_self_consistent_beta to super-Gaussian targets (m parameter, default 2.0 preserves existing behavior) and updates the stale fokker_planck type table in the vlasov1d config docs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Interesting. It very much seems to be in the same spirit as configuring the Krook operator to relax to the initialized super-Gaussian. But this is better physics-grounded since we have the conservation properties that Jon was talking about for vfp1d. I am wondering for SRS sims, if the momentum leak would matter since we usually have the hot electron tail. I am not sure about this, but would this operator also end up eroding that hot electron tail to maintain the symmetric super-Gaussian? Just asking, even though the hot tail stuff doesn't matter as much for studying threshold shifts |
|
I think it will be a minor loss of conservation so it should probably just be negligible... we'll find out! |
|
I guess we'll see. |
|
Just put the PR through claude. Its pointing out if the gradients through this operator have been tested to work or not? Claude's comment with some edits: The design is clean — the exact-Δφ Chang–Cooper construction making the sampled super-Gaussian the exact discrete fixed point is nicely done, and the conservation limitations ( Worth confirming before merge: since this operator will likely end up inside optimization loops, is the gradient through it exercised anywhere? It now carries an |
|
im not sure but I am a bit scared of having that inside the solve. it'd be best to avoid having to do a nonlinear solve like that, it might be very expensive. |
…step Measured drift with the continuum closure alone is ~5e-7 dT/T per collision time at nv=128 (m=3), not ~1e-5; one Newton step of the discrete energy-flux condition reduces it to machine level (~4e-16), so recommend max_steps: 1. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Updated comment as a whole from a previous, now deleted, PR comment: Just verified the non-linear solve and the effect of removing it with Claude. I guess we can still have the non-linear solve since its optional and only required at certain cases (very long, high nu_fp runs). For our runs, having it off wouldn't have much of an effect since the secular temperature/variance drift its trying to remove is already small (more in Claude's comment). Claude's comment with some edits: Why the solve is optional — the connection: the Newton solve exists for one purpose: it refines β so the sampled super-Gaussian is the exact discrete fixed point, removing a small secular temperature drift (a slow monotonic creep in ⟨(v−v̄)²⟩ from the O(dv²) error in the cheap closure β = n/(m·⟨|v−v̄|ᵐ⟩)). So "do we need the solve?" collapses to "is that drift big enough to matter for us?" — and it isn't:
(ν_fp = 1e-5.) The drift stays ~1e-5–3e-5 across our full run range — orders of magnitude below anything that moves a threshold; it wouldn't reach ~1e-3 until ~1.9 ns (nv=128). Key point: turning the solve off costs only that tiny drift — it does not cost shape maintenance. The super-Gaussian order Update (re: the |
Summary
Adds a collision operator for$f_0 \propto \exp(-\beta|v-\bar v|^m)$ instead of a Maxwellian:
vlasov1dwhose equilibrium is a super-GaussianThis is the 1D-1V counterpart of maintaining a Langdon/DLM inverse-bremsstrahlung-heated distribution: the standard LB/Dougherty operators actively maxwellianize a super-Gaussian background, which is unwanted in Landau-damping / LPI studies with DLM distributions. This operator maintains a prescribed order
m(it does not generatemdynamically — no heating/e-e competition as in the VFP-1D IB operator; a prescribedm(x,t)from Matte's fit is a possible follow-up).Design
C_edge = D·Δφ/dvwithφ = β|v-v̄|^m, rather than the midpoint derivative. Chang-Cooper's fixed point satisfiesf_{i+1}/f_i = exp(-C·dv/D), so this makes the sampled super-Gaussian the exact discrete equilibrium. (The midpoint form is exact only at m=2 and causes secular temperature drift otherwise.)β = n/(m·⟨|v-v̄|^m⟩)— the generalization of the LB/Doughertyβ = 1/(2T), which it equals at m=2 — refined by a Newton solve of the δ-weighted discrete energy-flux conditionΣₑ vₑ(w·f̃(w) + Δf) = 0. A sampled super-Gaussian is an exact root of this condition, so the discrete equilibrium is exactly stationary (no secular drift, verified < 1e-8 over 100 collision times). The Newton reuses the existingself_consistent_betaconfig knobs.m=2reduces tochang_cooper_doughertystep for step (tested).find_self_consistent_betais generalized to super-Gaussian targets (mparameter, default 2.0 preserves existing behavior bitwise).Conservation properties
self_consistent_betaenabled); off-equilibrium transients carry a one-time O(ν·dt) offset from operator splitting (β frozen from fⁿ during the implicit step) — first-order convergence in dt verified in tests; negligible at production ν·dt.C ∝ v-v̄cancellation doesn't generalize). Documented in the config reference.Testing
tests/test_vlasov1d/test_super_gaussian_fp.py: SG fixed point (m=3, 4), no secular drift at equilibrium, Maxwellian→SG relaxation with O(dt) energy-error convergence, Dougherty control (maxwellianizes the same IC), shifted-SG momentum conservation, m=2 ≡ Dougherty, self-consistent-β unit test.ergoExoon the FP-conservation config withtype: super_gaussian: kurtosis 3.00 → 2.44 toward the m=3 target 2.418, density conserved to 1e-14.Note:
test_config_regression.pyhas 3 pre-existing failures onmain(stale baselines from thevminfeature), unrelated to this PR and being fixed separately.🤖 Generated with Claude Code