Collisions
src/physics/coulomb_logarithm.jl
Public
Runes2P.coulomb_logarithm — Method
coulomb_logarithm(collision, model, p, free_electron_density, temperature)Coulomb logarithm for :electron_electron or :electron_ion collisions at momentum p (units of mₑc), the free-electron density free_electron_density [m⁻³] and the temperature temperature [eV]. model is :energy_dependent, :thermal or :relativistic (the constant relativistic value, DREAM's CONSTANT).
Runes2P.relativistic_coulomb_logarithm — Method
relativistic_coulomb_logarithm(free_electron_density, temperature)Relativistic Coulomb logarithm 14.6 + ½ ln(T/(n/10²⁰)) (DREAM lnLambda_c) for the free-electron density free_electron_density (n) [m⁻³] and the temperature temperature (T) [eV], zero for a vanishing density.
Runes2P.thermal_coulomb_logarithm — Method
thermal_coulomb_logarithm(free_electron_density, temperature)Thermal Coulomb logarithm 14.9 - ½ ln(n/10²⁰) + ln(T/keV) for the free-electron density free_electron_density (n) [m⁻³] and the temperature temperature (T) [eV], zero for a vanishing density.
src/physics/collision_frequencies.jl
Public
Runes2P.CollisionModel — Type
CollisionModel(plasma, settings; faces=nothing)Collision frequencies for a background plasma. Radius-dependent quantities (free and bound electron densities, Bessel functions, atomic parameters of the charge states) are evaluated once; the frequencies are then evaluated at any momentum with slowing_down_frequency, deflection_frequency and parallel_diffusion_frequency. The Coulomb logarithm is evaluated in each call, since the energy-dependent model depends on the momentum.
With faces, one vector of momentum faces per radius in units of mₑc as set_fokker_planck_coefficients! gives them, the factors that depend on the momentum and the charge state alone are tabulated once per momentum grid, at its faces and cell centres: the bremsstrahlung cross section, and the Bethe stopping and the bound-electron scattering with their screening weights. The coefficient builders read them by the index of a face or a centre. A tabulated value is the number that the direct evaluation gives, so the coefficients are the same; the functions of a momentum evaluate directly. A faces list whose length differs from the number of radii throws a DimensionMismatch.
Runes2P.CollisionSettings — Type
CollisionSettings(; mode, screening, coulomb_logarithm, screened_diffusion, ion_size_table,
screening_window, screening_window_start, screening_window_end, bremsstrahlung,
bremsstrahlung_diffusion, bremsstrahlung_constant, bound_friction, ionization_threshold,
ionization_threshold_width, secondary_widths, secondary_spectrum, ionization_cross_section_form)The defaults of mode, screening, coulomb_logarithm, screened_diffusion and bound_friction are those of DREAM's CollisionHandler. The defaults of ion_size_table, screening_window, bremsstrahlung, bremsstrahlung_diffusion and bremsstrahlung_constant depart from DREAM (see the docs page Comparison with DREAM). The remaining options have no counterpart in DREAM.
mode::full(relativistic Maxwellian targets, adds energy diffusion),:superthermal(cold target electrons) or:ultra_relativistic.screening::partial(Hesslow et al. 2018),:completeor:none(DREAM'sPARTIALLY_SCREENED,COMPLETELY_SCREENED,NON_SCREENED).coulomb_logarithm::thermal,:energy_dependentor:relativistic(seecoulomb_logarithm).screened_diffusion: energy diffusion from the fullν_s(:maxwellian) or from the free-electron part only (:zero).ion_size_table::hesslowuses Table 1 of Hesslow et al. 2018 as intended;:dreamreproduces DREAM's lookup, whose charge list has one argon entry too few (affects Ar¹⁷⁺, Xe³⁺, Xe¹⁷⁺, W³⁺ and W⁶⁰⁺).screening_window: momenta where partial screening applies. With:excitation_energythe bound-electron parts of charge statej(the Bethe term ofν_s, theg_j(p)ofν_D) are weighted by a smooth step in the kinetic energy(γ - 1) mₑc², 0 belowscreening_window_start · I_jand 1 abovescreening_window_end · I_j, withI_jthe mean excitation energy. Below the window the frequencies are those of complete screening. The default factors 1 and 4 (a choice of this package; see the docs page Choices of this package) place the window of Ar⁺ and Ar²⁺ at p ≈ 0.03 to 0.06 (Hesslow et al. PRL 2017 and JPP 2019).:dreamapplies partial screening at all momenta, as DREAM does. The weight depends only onpandI_j, so it holds unchanged when the densities become unknowns.bremsstrahlung::stopping_power, the radiative energy loss of an electron on the nuclei of all charge states as a slowing down (DREAM'sBREMSSTRAHLUNG_MODE_STOPPING_POWER): the non-screened formula 4BN of Koch and Motz (Rev. Mod. Phys. 31, 920, 1959),ν_s = n Z² α r₀² c φ_rad(p)/βper charge state (bremsstrahlung_cross_section), on the nuclei only, as in DREAM: there is no electron-electron bremsstrahlung, so the stopping lies below ESTAR for hydrogen by 1.21 at 212 keV and 1.55 at 1.11 MeV, tending toZ(Z + 1)/Z². It is the default (a choice of this package; see the docs page Choices of this package).:neglectleaves the loss out, as DREAM does by default.bremsstrahlung_diffusion: whether the energy diffusionν_∥ = Θγν_sofmode = :fullwithscreened_diffusion = :maxwelliantakes the radiative stopping ofbremsstrahlung.:none(the default, a choice of this package; see the docs page Choices of this package): the radiative stopping is a pure drag, as in the model of M. Hoppe et al., Comput. Phys. Commun. 268, 108098 (2021), doi:10.1016/j.cpc.2021.108098, eqs. 8, 9, 14 and 15, so a Maxwellian at the temperature of the bulk loses its bremsstrahlung power, which tends to that of Gould's formula at low temperature (GOULD_BREMSSTRAHLUNG_PREFACTOR).:dream: the code of DREAM (src/Equations/ParallelDiffusionFrequency.cpp:59-66), whoseν_∥rescales the wholeν_s, so the radiative drag gets a thermal energy diffusion, a Maxwellian at the temperature of the bulk radiates nothing, and a tail atΘ_effloses1 − Θ/Θ_effof its bremsstrahlung. The DREAM comparisons with the stopping power on take:dream.bremsstrahlung_constant: the constant term of the formula 4BN in the stopping power,:koch_motz(the default),4/3as in Koch and Motz, or:dream,1as DREAM's integer division writes it (src/Equations/SlowingDownFrequency.cpp:234), for the comparisons with DREAM that run with the stopping power on (bremsstrahlung_cross_section).bound_friction: the slowing down on the bound electrons of each charge state with partial screening.:bethe(the default, DREAM's model) is the Bethe term of Hesslow et al. with the weight ofscreening_window.:ionization_splitsplits it into the energy loss of the ionization of the charge state, from the cross section of the kinetic ionization (ionization_cross_section), and the rest, the excitation, floored at zero:\[ν_j = e(p)\, ν_{\mathrm{ion},j} + \max\left(w_j(p)\, ν_{\mathrm{Bethe},j} − e(p)\, ν_{\mathrm{ion},j},\, 0\right), \qquad ν_{\mathrm{ion},j} = \frac{γ}{p^2} n_j σ_j(p) v \frac{I_j + ⟨E_s⟩_j}{m_e c^2},\]
with the ionization energy
I_jof NIST (ionization_energy), the mean energy of every secondary⟨E_s⟩_jup to(E − I_j)/2in the spectrumsecondary_spectrum(no cut: every secondary joins the cold electrons) and the envelopee(p)of the hot region of the kinetic ionization.fthen paysI_j + ⟨E_s⟩_jfor each ionization it causes, also from the ionization potential up to the mean excitation energy, where the defaultscreening_windowgives no Bethe friction. Elements need a fit of the cross section, and withsecondary_spectrum = :opala width of the secondary spectrum (SECONDARY_SPECTRUM_WIDTHS,secondary_widths). With the momentum faces of each radius given to the model (CollisionModel(plasma, settings; faces), asset_fokker_planck_coefficients!does), the ionization part is tabulated once per momentum grid and charge state at the faces.ionization_threshold: the factor of the thermal momentump₀ = factor √(2T/mₑc²)at the threshold of the kinetic ionization, which the region of theKineticIonizationTermof the system takes as well; 0 (the default) for a kinetic ionization over the whole grid. Below the threshold the ionization is that of the cold electrons, whose binding energy the cold electrons pay (RadiatedPowerTermwithkinetic_ionization), sofpays none there. The envelopee(p)of the faces is a cubic smooth step from(1 − ionization_threshold_width) p₀to(1 + ionization_threshold_width) p₀, a numerical width that keeps the coefficients smooth when the threshold crosses a face. The default is 0.1 (a choice of this package; see the docs page Choices of this package); DREAM has no counterpart. Withscreened_diffusion = :maxwellianthe energy diffusionΘγν_stakes the split as well, as it takes the Bethe term.secondary_widths: widthsĒ[eV] of the secondary spectrum per element, added toSECONDARY_SPECTRUM_WIDTHSfor:ionization_split.secondary_spectrum: the spectrum of the secondaries of⟨E_s⟩_j::beb(the default, a choice of this package; see the docs page Choices of this package), the binary-encounter-Bethe spectrum of Kim and Rudd with the ionization energy of each charge state as its binding energy (beb_mean_secondary_energy), which needs no width;:opal, Opal et al. with the width of the neutral element for every charge state (mean_secondary_energy).ionization_cross_section_form: theformofionization_cross_sectionin the friction ofbound_friction = :ionization_split::chianti(the default),:dreamor:bethe. A system pairs it with theionization_cross_section_formof itsKineticIonizationTerm, sofpays for the ionizations that term counts.
Runes2P.bremsstrahlung_cross_section — Method
bremsstrahlung_cross_section(p; constant=:koch_motz)The radiative energy-loss cross section of an electron of momentum p (units of mₑc) on a bare nucleus, in units of α r₀² Z²: the formula 4BN of H. W. Koch and J. W. Motz, Rev. Mod. Phys. 31, 920 (1959), doi:10.1103/RevModPhys.31.920, without screening, as DREAM's src/Equations/SlowingDownFrequency.cpp:194-237. It tends to 16/3 for p → 0 (H. Bethe and W. Heitler, Proc. R. Soc. Lond. A 146, 83 (1934), doi:10.1098/rspa.1934.0140) and to 4(ln 2γ − 1/3) for γ ≫ 1 (W. Heitler, The Quantum Theory of Radiation, 3rd ed., 1954).
DREAM's line 234 writes the constant 4/3 of the formula as an integer division, which is 1 in C++, so DREAM's stopping power is 6.3 to 6.5 % above this one for 0.1 ≤ p ≤ 1, 3.1 % at p = 10 and 1.7 % at p = 100. Runes2P keeps 4/3; constant = :dream gives DREAM's value from p ≈ 0.1, within about 0.02 %, for the comparisons with DREAM. Below it constant = :dream does not reproduce DREAM: DREAM takes the integral term ∫₀^X ln(1 + x)/x dx from a Steffen spline on 50 points in 0 ≤ X ≤ 10 (SlowingDownFrequency.cpp:66-80), and its stopping power is 3.2 % below that of constant = :dream at p = 0.001, 2.8 % above this one. DREAM returns 0 at p = 0; the limit is 16/3, and the slowing-down frequency is 0 there anyway.
Runes2P.deflection_frequency — Method
deflection_frequency(model, ir, p)Pitch-angle scattering (deflection) frequency ν_D [s⁻¹] at radius index ir and momentum p (in units of mₑc); the collisional pitch diffusion is Dᵠᵠ = ν_D (1 - ξ²)/2.
Runes2P.ion_size — Method
ion_size(Z, Z0; table=:hesslow)Effective ion size ā_j in units of the reduced Compton wavelength (2/α · a_j): DFT values from Hesslow et al. (2018) Table 1 where available, else their eq. 2.28.
Runes2P.mean_excitation_energy — Method
mean_excitation_energy(Z, Z0)Mean excitation energy [eV] of charge state Z0 of element Z (DREAM SlowingDownFrequency::GetAtomicParameter). Up to Z = 18 the tabulated values of Sauer, Sabin and Oddershede (2018). For Z = 19 to 86 DREAM's extended table, a semi-empirical electron-density model (DREAM tools/Generate_MeanExcitationEnergy.py), which is not hydrogenic for one and two bound electrons: 5123.6 eV for K¹⁸⁺ against 14.99 Z² = 5411 eV. Beyond Z = 86 the analytic formula of Sauer, Sabin and Oddershede.
Runes2P.p3_slowing_down_frequency_at_zero — Method
p3_slowing_down_frequency_at_zero(model, ir)lim_{p→0} p³ ν_s [s⁻¹, with p in units of mₑc], which sets the particle flux through p = 0. As DREAM's SlowingDownFrequency::GetP3NuSAtZero, the value uses the prefactor 4π r₀² c in every mode. In :ultra_relativistic mode, where ν_s ∝ 1/p and the analytic limit is 0, it therefore returns the :superthermal value. The friction of that mode is the constant drift Aᵖ = -4π r₀² c lnΛ n, which brings electrons to p = 0 in a finite time. With DREAM's value, on a grid that applies the flux through p = 0, they leave the grid at p = 0: the sink is 1/Δp₁² times the inflow through the first interior face at equal f, so the first cell absorbs. With the analytic limit the first cell would collect them without bound.
DREAM's hot-tail grid applies the flux and lets electrons leave at p = 0; its runaway grid does not (src/Settings/Equations/f_hot.cpp:96, src/Settings/Equations/f_re.cpp:87, src/Settings/Equations/distribution.cpp:234-237), so in the ultra-relativistic mode, which DREAM runs on a runaway grid from p = 0 (examples/init_f_re), the first cell collects the electrons the friction brings there. Runes2P applies the flux through p = 0 by default (p_zero_boundary = :outflow of AdvectionDiffusion), and p_zero_boundary = :zero_flux leaves it out, as DREAM's runaway grid.
Runes2P.parallel_diffusion_frequency — Method
parallel_diffusion_frequency(model, ir, p)Parallel (energy) diffusion frequency ν_∥ [s⁻¹] at radius index ir and momentum p (in units of mₑc), Dᵖᵖ = ν_∥; nonzero only in :full mode. With screened_diffusion = :maxwellian it is Θγ times the collisional part of ν_s, and with bremsstrahlung_diffusion = :dream times the whole ν_s (CollisionSettings).
Runes2P.slowing_down_frequency — Method
slowing_down_frequency(model, ir, p)Slowing-down frequency ν_s [s⁻¹] at radius index ir and momentum p (in units of mₑc); the collisional friction is Aᵖ = -p ν_s. With bremsstrahlung = :stopping_power it adds, per charge state of density n and nuclear charge Z, n Z² α r₀² c φ(p) γ/p with the cross section φ of bremsstrahlung_cross_section, as DREAM's src/Equations/SlowingDownFrequency.cpp:204-207 and :236 (where DREAM's φ differs by its integer division, see there).