pub struct SinglePolePenn { /* private fields */ }Expand description
The single-pole Penn model built from one optical ELF. See the module docs for the equations, the units and the integration tolerance.
Implementations§
Source§impl SinglePolePenn
impl SinglePolePenn
Sourcepub fn new(elf: OpticalElf) -> Self
pub fn new(elf: OpticalElf) -> Self
The model for elf, with Fermi energy zero and the default tolerance.
Sourcepub fn with_exchange(self, exchange: ExchangeCorrection) -> Self
pub fn with_exchange(self, exchange: ExchangeCorrection) -> Self
Switch the exchange correction on (it is off by default).
Sourcepub fn exchange(&self) -> Option<ExchangeCorrection>
pub fn exchange(&self) -> Option<ExchangeCorrection>
The exchange correction, if enabled.
Sourcepub fn exchange_applies_at(&self, energy_ev: f64) -> bool
pub fn exchange_applies_at(&self, energy_ev: f64) -> bool
Whether the exchange correction applies at kinetic energy energy_ev.
Sourcepub fn with_fermi_energy_ev(
self,
fermi_ev: f64,
) -> Result<Self, ElectronDataError>
pub fn with_fermi_energy_ev( self, fermi_ev: f64, ) -> Result<Self, ElectronDataError>
Set the Fermi energy (eV, finite and non-negative). Energies passed to
the model are then kinetic energies above the Fermi level, and the
kinematics use T' = T + E_F (S2017 eq. (2)).
Sourcepub fn with_relative_tolerance(
self,
rel_tol: f64,
) -> Result<Self, ElectronDataError>
pub fn with_relative_tolerance( self, rel_tol: f64, ) -> Result<Self, ElectronDataError>
Set the relative integration tolerance, in [1e-12, 1e-2].
Sourcepub fn optical_elf(&self) -> &OpticalElf
pub fn optical_elf(&self) -> &OpticalElf
The optical ELF the model is built from.
Sourcepub fn fermi_energy_ev(&self) -> f64
pub fn fermi_energy_ev(&self) -> f64
The Fermi energy, eV.
Sourcepub fn relative_tolerance(&self) -> f64
pub fn relative_tolerance(&self) -> f64
The relative integration tolerance.
Sourcepub fn loss_function(&self, q_per_m: f64, loss_ev: f64) -> f64
pub fn loss_function(&self, q_per_m: f64, loss_ev: f64) -> f64
Im[-1/ε(q, ω)] in the SPA (S2017 eq. (13)), at momentum transfer
q (as a wavenumber, m⁻¹, so the momentum is ħq) and energy loss
ω (eV). Zero where S2017 eq. (11) has no root (ħ²q²/2m >= ω) and
where ω₀ falls outside the tabulated range. At q = 0 it is the
optical ELF.
Sourcepub fn diimfp_per_m_ev(
&self,
energy_ev: f64,
loss_ev: f64,
) -> Result<f64, ElectronDataError>
pub fn diimfp_per_m_ev( &self, energy_ev: f64, loss_ev: f64, ) -> Result<f64, ElectronDataError>
The DIIMFP p(T, ω) (S2017 eq. (2), nonrelativistic) at kinetic
energy energy_ev above the Fermi level and energy loss loss_ev,
in m⁻¹ eV⁻¹. Zero for ω <= 0 or ω > T, and, with the exchange
correction applying at this energy, for ω > T'/2 (module docs; no
binding energy, B = 0).
Sourcepub fn diimfp_with_binding_per_m_ev(
&self,
energy_ev: f64,
loss_ev: f64,
binding_ev: f64,
) -> Result<f64, ElectronDataError>
pub fn diimfp_with_binding_per_m_ev( &self, energy_ev: f64, loss_ev: f64, binding_ev: f64, ) -> Result<f64, ElectronDataError>
The DIIMFP at kinetic energy energy_ev above the Fermi level and
energy loss loss_ev, m⁻¹ eV⁻¹, for a loss that ionises a shell of
binding energy binding_ev (finite, non-negative) and so emits an
electron of kinetic energy W = ω - B. B enters only through the
exchange correction, where it applies: the Born-Ochkur denominator is
T' - W = T' - ω + B and the loss is limited to ω <= (T' + B)/2
(dV2022 eqs. (32), (34), (35); module docs). Without exchange the
result does not depend on B; with B = 0 it is
Self::diimfp_per_m_ev.
Sourcepub fn imfp_and_stopping(
&self,
energy_ev: f64,
) -> Result<InelasticPoint, ElectronDataError>
pub fn imfp_and_stopping( &self, energy_ev: f64, ) -> Result<InelasticPoint, ElectronDataError>
The inverse IMFP (m⁻¹) and the stopping power (eV/m) at kinetic
energy energy_ev above the Fermi level. Both are zero where no loss
is allowed (below the first energy at which a pole of the tabulated
range fits inside the kinematic limits).
Sourcepub fn imfp_and_stopping_with_binding(
&self,
energy_ev: f64,
binding_ev: f64,
) -> Result<InelasticPoint, ElectronDataError>
pub fn imfp_and_stopping_with_binding( &self, energy_ev: f64, binding_ev: f64, ) -> Result<InelasticPoint, ElectronDataError>
As Self::imfp_and_stopping, for losses that ionise a shell of
binding energy binding_ev (finite, non-negative): with the exchange
correction applying, the Born-Ochkur denominator is T' - ω + B and
the losses run up to min((T' + B)/2, T)
(Self::diimfp_with_binding_per_m_ev). Without exchange it does not
depend on B. The loss range is not cut at B from below: an ELF that
should only act above the edge must start there (the model is zero
below the first tabulated energy).
Sourcepub fn imfp_m(&self, energy_ev: f64) -> Result<f64, ElectronDataError>
pub fn imfp_m(&self, energy_ev: f64) -> Result<f64, ElectronDataError>
The inelastic mean free path λ(E), m; infinite where no loss is
allowed.
Sourcepub fn stopping_power_ev_per_m(
&self,
energy_ev: f64,
) -> Result<f64, ElectronDataError>
pub fn stopping_power_ev_per_m( &self, energy_ev: f64, ) -> Result<f64, ElectronDataError>
The stopping power S(E), eV/m.
Sourcepub fn tabulate(
&self,
energies_ev: &[f64],
) -> Result<Vec<InelasticPoint>, ElectronDataError>
pub fn tabulate( &self, energies_ev: &[f64], ) -> Result<Vec<InelasticPoint>, ElectronDataError>
IMFP and stopping power on a grid of energies (eV above the Fermi level), in order. Sequential and deterministic.
Sourcepub fn bethe_inverse_imfp_per_m(
&self,
energy_ev: f64,
) -> Result<f64, ElectronDataError>
pub fn bethe_inverse_imfp_per_m( &self, energy_ev: f64, ) -> Result<f64, ElectronDataError>
The model’s own high-energy (Bethe) limit of the inverse IMFP, m⁻¹
(see the module docs): (1/(2π T')) ∫ dω_p ELF(ω_p) ln(8T'/(ω_p + k_F²/3)), over the whole table.
Sourcepub fn bethe_stopping_ev_per_m(
&self,
energy_ev: f64,
) -> Result<f64, ElectronDataError>
pub fn bethe_stopping_ev_per_m( &self, energy_ev: f64, ) -> Result<f64, ElectronDataError>
The nonrelativistic Bethe stopping power with W_max = T, the
electron density from the f-sum of the same ELF and the mean
excitation energy I of the same ELF (SumRuleReport,
bethe::stopping_power_ev_per_m), eV/m. With a Fermi energy, the
kinematic energy is T' = T + E_F and W_max = T.
Trait Implementations§
Source§impl Clone for SinglePolePenn
impl Clone for SinglePolePenn
Source§fn clone(&self) -> SinglePolePenn
fn clone(&self) -> SinglePolePenn
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for SinglePolePenn
impl RefUnwindSafe for SinglePolePenn
impl Send for SinglePolePenn
impl Sync for SinglePolePenn
impl Unpin for SinglePolePenn
impl UnsafeUnpin for SinglePolePenn
impl UnwindSafe for SinglePolePenn
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more