Field–particle collisions
src/operators/field_particle.jl
Public
Runes2P.FieldParticleOperator — Type
FieldParticleOperator(grid, plasma, settings=CollisionSettings();
modes=3, scheme=:exponential_fitting, pitch_rule=:cell_center)Model field-particle term of the linearized electron-electron collisions, of rank modes per radius. It conserves parallel momentum exactly, and it reproduces the matrix elements of the Landau field-particle operator between the first modes Laguerre modes of the l = 1 part of f, as the improved Sugama operator does (Sugama et al., Phys. Plasmas 26, 102108 (2019), doi:10.1063/1.5115440), with the like-species ratios of S. P. Hirshman and D. J. Sigmar, Nucl. Fusion 21, 1079 (1981), doi:10.1088/0029-5515/21/9/003:
C_fp(f) = Σ_ab g_a A_ab (ℓ_b · f), ℓ_b = C_eeᵀ (m ∘ L_b), g_a = f_M ℓ_a / Δ𝒱,per radius, a, b = 0, …, modes - 1.
C_eeis the discreteelectron_electron_operatorwithscheme.mis the parallel momentum of each cell,m_ij = 𝒱'_ij Δp_i p_i w_j, with the pitch weightsw_jofpitch_moment_weights(; pitch_rule).L_b = L_b^{(3/2)}(x²)are the Laguerre polynomials of the Braginskii expansion,x² = (γ - 1)/Θat the cold-electron temperature (L_0 = 1,L_1 = 5/2 - x²).ℓ_b · fis the rate at whichC_eechanges the moment(m ∘ L_b) · f, soℓ_0 · fis the momentumC_eeremoves.g_ais the Maxwellianf_M ∝ exp(-(γ-1)/Θ)timesℓ_aper unit phase-space volumeΔ𝒱_ij = 𝒱'_ij Δp_i Δξ_j, made particle-free by subtracting its density timesf_M. In the continuum limitg_a ∝ C_ee(p ξ L_a f_M):g_0is the shifted Maxwellian of the model operator of Hirshman and Sigmar (1976), andg_1its heat-flux counterpart.Ais fixed by the matrix elementsT_bd = ℓ_b · φ_dofC_eebetween the modesφ_d = p ξ L_d f_M: the field-particle elements becomeR_bd T_bd, withRthe Landau ratiosN^{bd}/M^{bd}for like species (R_0d = R_b0 = -1,R_11 = -27/59). Row 0 makesm · (C_ee f + C_fp f) = 0for everyfto round-off.
With modes = 1 this is the Hirshman-Sigmar (and Sugama 2009) momentum-restoring model. It is exact for a shifted Maxwellian and gives 0.5172 σL at Z = 1 against the Spitzer-Härm 0.5816 σL. The heat-flux mode closes most of the gap, the third mode the rest (test/test_field_particle.jl).
The ratios R are those of the nonrelativistic Landau operator, so the term is accurate for a nonrelativistic bulk (T ≪ mₑc²). The default pitch_rule = :cell_center (w_j = ξ_j Δξ_j) is the left eigenvector of the discrete pitch scattering, so the modes are exact first Legendre modes on the grid and the conductivity does not depend on the pitch resolution (to 1e-5). With :linear, the moment of current_density, it converges to the same value at second order in the pitch cell width. The normalization of f_M cancels. On a pitch grid symmetric about ξ = 0 the term vanishes on any f even in ξ. Needs collision mode :full, where the bulk is part of f, and cold electrons at every radius. The pitch grids may differ between radii, with the same cell counts at every radius. The momentum faces are the same at every radius, as AdvectionDiffusion requires.
Runes2P.FieldParticleTerm — Type
FieldParticleTerm(unknown, operator::FieldParticleOperator; plasma=nothing, settings=nothing)The momentum-conserving field-particle term FieldParticleOperator applied to the kinetic unknown unknown, added to its own equation. It couples all cells of a radius, so it is :matrix_free, with a Jacobian of rank modes per radius (low_rank_jacobian) that the block preconditioner of GMRES and SparseLU take by a Woodbury update. Linear in f.
plasma is the source of the plasma that the functionals and the restoring shapes follow: a PlasmaSource, a PlasmaState or a function of time that returns one, as for the FokkerPlanckTerm. They are rebuilt with set_field_particle_coefficients! and settings (by default those the operator was built with) when the plasma values of a radius change. The Woodbury factors of the solvers are taken from low_rank_jacobian at each factorization, so they follow.
A plasma that reads unknowns (PlasmaFromUnknowns) is always taken at the state at the start of the step (prepare_step!), the lagged treatment of the FokkerPlanckTerm. The derivative of the term with respect to the temperature and the density at a radius is a dense column of all cells of that radius, which has no place in the low-rank Jacobian of the term. Such a term evaluated on its own keeps the coefficients of its last preparation, or those of operator when it was never prepared.
Runes2P.apply! — Method
apply!(df, op::FieldParticleOperator, f; scale=1)Add scale times the field-particle term of f (3D array on the operator's grid) to df.
Runes2P.electron_electron_operator — Method
electron_electron_operator(grid, plasma, settings; scheme=:exponential_fitting,
p_lower_boundary=:zero_flux, p_upper_boundary=:outflow,
p_zero_boundary=:outflow)Test-particle operator of the electron-electron collisions alone: slowing down, pitch-angle scattering and, in settings.mode = :full, energy diffusion Θγν_s, from the free electrons of plasma with the thermal factors of the mode (:full or :superthermal). Bound electrons and ions are left out. Both ends of the momentum grid have no flux (the friction points inwards at p_max, and the slowing down vanishes at p = 0), so the operator conserves particles. p_zero_boundary sets only the ghost cells of the four-point schemes below p = 0 on a grid from p = 0; a grid with p_min > 0 takes p_lower_boundary instead (AdvectionDiffusion). The coefficients take the number type of the plasma, so a plasma with derivative parts gives the derivatives of the operator. The operator declares no radial transport and no cross diffusion (radial_transport = false, cross_diffusion = false), as fokker_planck_operator: its stencil couples neither the radii nor the corners of the 3×3 block in p and ξ.
Runes2P.parallel_momentum — Method
parallel_momentum(op::FieldParticleOperator, f)Parallel momentum Σ m_ij f_ij of f per radius (the moment the operator conserves): the parallel momentum per volume times the spatial Jacobian V' = r, in units of mₑc per m² for f in m⁻³.
Runes2P.set_field_particle_coefficients! — Method
set_field_particle_coefficients!(op::FieldParticleOperator, plasma, settings=CollisionSettings())Rebuild the functionals and the restoring shapes of op from plasma (the cold-electron temperature and density, the Coulomb logarithm) for a plasma that changes with time.