Repository navigation
Conservative Dougherty collision operator in the moving Hermite basis - #71
Open
rogeriojorge wants to merge 1 commit into
Open
rogeriojorge wants to merge 1 commit into
rogeriojorge wants to merge 1 commit into
Conversation
Adds C_ss = nu d_v.[(v - U_s) f + theta_s d_v f] with U_s, theta_s spatially local moments of the
same f, projected exactly onto the asymmetric, shifted and scaled Hermite basis for any (u_s, a_s):
(Cf)_n = nu sum_i [-n_i C_n + sqrt(2 n_i) delta_i C_{n-e_i} + (2 tau_i - 1) sqrt(n_i(n_i-1)) C_{n-2e_i}],
delta_i = (U_i - u_i)/a_i, tau_i = theta/a_i^2. Every source index is <= n, so no intermediate is
truncated. Density, momentum and energy are conserved to round-off at any N (only n <= 2 per axis
enter the moments), and a Maxwellian with matching U, theta is an exact equilibrium.
Pair collisions use m_s n_s nu_sr = m_r n_r nu_rs, u_sr = u_rs = (U_s + U_r)/2 and a common
T_sr (Greene's form, beta = 0), so R_sr + R_rs = 0 and Q_sr + Q_rs = 0.
Opt-in: simulation(..., collision_model="dougherty") with input_parameters["nu_dougherty"]
(scalar or Ns x Ns), or [collisions] model/nu in TOML. Separate from the hypercollision nu;
default off and the right-hand side is unchanged when off.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #66 (
highk/field-closure, moving-basis stack #56–#60). Stacked PRs get no CI here; the full suite was run locally (197 passed before the TOML test was added, 11/11 in the new file).What
A physical collision operator, the conservative Dougherty (Lenard–Bernstein with self-consistent moments) operator
C_ss = nu_ss d_v · [(v − U_s) f_s + theta_s d_v f_s], theta_s = tr P_s / (d m_s n_s)
where U_s and theta_s are spatially local moments of the same f_s (Hakim, Francisquez, Juno & Hammett, arXiv:1903.08062, eq. 3–8; d = velocity dimension as in Gkeyll).
Hermite projection (exact, any moving basis)
With xi = (v − u_s)/a_s per axis, delta_i = (U_i − u_i)/a_i, tau_i = theta/a_i², and psi_n = H_n e^{−xi²}/sqrt(pi 2^n n!):
d psi_n = −sqrt(2(n+1)) psi_{n+1}, xi psi_n = sqrt((n+1)/2) psi_{n+1} + sqrt(n/2) psi_{n−1}. Composing the stencils before any truncation gives
(C f)n = nu sum_i [ −n_i C_n + sqrt(2 n_i) delta_i C{n−e_i} + (2 tau_i − 1) sqrt(n_i(n_i−1)) C_{n−2e_i} ]
Every source index is <= n (lower-triangular), so the projection onto the retained modes is exact at any N; no intermediate is truncated and no closure enters. It holds for any (u_s, a_s), including the time-dependent basis of #56–#60.
Pair collisions (second part of the same commit)
m_s n_s nu_sr = m_r n_r nu_rs (pointwise), u_sr = u_rs = (U_s + U_r)/2, common
T_sr = (m_r T_s + m_s T_r)/(m_s + m_r) + m_s m_r |U_s − U_r|²/(2 d (m_s + m_r)). This is derived here from R_sr + R_rs = 0 and Q_sr + Q_rs = 0 and is Greene's form with beta = 0. Masses are m_s = 1/Omega_cs. Note: arXiv:1903.08062 leaves the cross-species coefficients to later work, and the Gkeyll collision-model docs page could not be reached, so the beta convention was not checked against Francisquez et al.; the conservation itself is tested.
Interface
simulation(..., collision_model="dougherty")(static) withinput_parameters["nu_dougherty"]: a scalar (self collisions of every species) or an (Ns, Ns) matrix (diagonal: nu_ss; upper triangle [s, r]: nu_sr; the lower triangle is ignored, nu_rs follows from momentum conservation).[collisions]withmodel = "dougherty"andnu = ....nu/collision_matrix. Defaultcollision_model=None: the RHS is unchanged (no term is added; bitwise-equality test).Tests (
tests/test_dougherty.py, CPU, ~17 s)[collisions]tableCost per RHS (laptop CPU, 4 threads, Ns = 2 with pair collisions)
The extra cost is one rFFT of the coefficient array plus the moment products.
Limits