lindhard/electron/inelastic/mod.rs
1//! Inelastic electron scattering from dielectric-function models.
2//!
3//! The simplest model is the **single-pole Penn algorithm** ([`penn`]): from a
4//! user-supplied optical energy-loss function
5//! ([`crate::electron::data::OpticalElf`]) it builds the momentum-dependent
6//! loss function, the differential inverse inelastic mean free path (DIIMFP),
7//! the inelastic mean free path and the stopping power, with nonrelativistic
8//! kinematics. [`sum_rules`] checks an optical ELF against the f-sum and
9//! perfect-screening sum rules, [`bethe`] gives the nonrelativistic Bethe
10//! stopping the model must approach at high energy, and [`drude`] is an
11//! analytic Drude-Lorentz ELF with closed-form sum rules, used as a synthetic
12//! fixture by the tests, examples and benchmarks.
13//!
14//! No optical data is committed for this module (`docs/data-provenance.md`):
15//! the valence ELF comes from the caller.
16//!
17//! [`inner_shell`] resolves the losses into a valence channel and
18//! inner-shell ionization channels (secondary energy `ω - B`), each from its
19//! own optical ELF, and the optional Born-Ochkur
20//! [`ExchangeCorrection`] makes the primary and the struck electron
21//! indistinguishable at low energy. [`shell_elf`] builds the inner-shell
22//! ELFs of the K, L1, L2 and L3 subshells from the hydrogenic
23//! photoionization formulas and a subshell binding-energy table; other
24//! shells come from the caller.
25//!
26//! [`table`] builds the inelastic energy-loss `CrossSectionTable` and a
27//! momentum-transfer sampler from the model.
28//!
29//! The **full Penn algorithm** ([`full_penn`]) expands the same optical ELF
30//! over the Lindhard dielectric functions of free-electron gases
31//! ([`lindhard_gas`]) and costs about a second per energy where the single
32//! pole costs milliseconds; [`model`] selects either per material and gives
33//! the string to record in the metadata of derived tables.
34//!
35//! The **Mermin-ELF model** ([`mermin`], [`mermin_fit`]) fits a sum of
36//! Mermin oscillators to the optical ELF (the MELF-GOS approach: amplitudes
37//! constrained non-negative, fit residuals and sum rules reported) and
38//! extends it to finite momentum with the Mermin relaxation-time dielectric
39//! function; it is the third option of [`model`] beside the single pole and
40//! the full Penn algorithm.
41//!
42//! Relativistic kinematics are later work.
43
44pub mod bethe;
45pub mod drude;
46pub mod full_penn;
47pub mod inner_shell;
48pub mod lindhard_gas;
49pub mod mermin;
50pub mod mermin_fit;
51pub mod model;
52pub mod penn;
53mod quadrature;
54pub mod shell_elf;
55pub mod sum_rules;
56pub mod table;
57
58pub use drude::{DrudeLorentz, DrudeLorentzOscillator};
59pub use full_penn::{
60 DiimfpEvaluation, DiimfpGrid, FullPenn, ImfpEvaluation, LossFunctionEvaluation,
61 DEFAULT_FULL_TOLERANCE, OMEGA_P_INTERVAL_BUDGET,
62};
63pub use inner_shell::{
64 Channel, ChannelDiimfp, ChannelInverseImfp, InnerShell, ShellResolvedChannels,
65};
66pub use lindhard_gas::{LindhardGas, LindhardPlasmon};
67pub use mermin::{MerminGas, MerminPenn, DEFAULT_MERMIN_TOLERANCE};
68pub use mermin_fit::{
69 fit_mermin_oscillators, FitWeighting, MerminFit, MerminFitOptions, MAX_OSCILLATORS,
70};
71pub use model::{PennAlgorithm, PennInelastic};
72pub use penn::{
73 born_ochkur_factor, ExchangeCorrection, InelasticPoint, SinglePolePenn,
74 DEFAULT_RELATIVE_TOLERANCE,
75};
76pub use shell_elf::{
77 hydrogenic_2p_oscillator_strength_density_per_ev,
78 hydrogenic_2s_oscillator_strength_density_per_ev,
79 hydrogenic_k_oscillator_strength_density_per_ev, hydrogenic_shell_elf, hydrogenic_shell_elfs,
80 ShellElfGrid,
81};
82pub use sum_rules::SumRuleReport;