Skip to main content

build_shell_channel_tables

Function build_shell_channel_tables 

Source
pub fn build_shell_channel_tables(
    channels: &ShellResolvedChannels,
    material: &Material,
    options: &InelasticTableOptions,
    binding_provenance: &str,
) -> Result<ShellResolvedTables, InelasticTableError>
Expand description

Build the energy-loss tables of every channel of channels on the grid of options: the valence table, and for inner shell i the table of ShellResolvedChannels::shell_model (that shell’s own optical ELF with the valence model’s settings), wrapped with the shell’s identity, binding energy and binding_provenance (the origin of the binding energies, for example crate::electron::data::SubshellBindingTable::provenance).

Each table is built by build_inelastic_table, one after the other in channel order, so the result is bit-identical at any thread count. Its rate is the channel’s own λ⁻¹_j(E) and its rows the inverse CDF of that channel’s DIIMFP: the channel-first construction, in which a transport picks a channel with probability λ⁻¹_j / Σ λ⁻¹ and then draws the loss from that channel’s table (not the conditional channel choice of ShellResolvedChannels::sample_channel, which belongs with a loss drawn from the total DIIMFP; the two are not mixed).

Supported model. Single-pole Penn per channel only, without the exchange correction (rejected, as by build_inelastic_table); so the binding energy does not enter a shell’s DIIMFP, which is zero below the first energy of the shell’s ELF (at or above B by construction of ShellResolvedChannels::new). Each shell row is floored at B, which only removes the rounding of exp(ln W) at the edge. No full Penn or Mermin valence model is wired to shell channels, and the valence ELF must not already contain the shells (no partition rule is applied, see super::inner_shell).

Energy axis. As for build_inelastic_table, every table (valence and shells) is on the axis of options.axis: kinetic energies above the model’s Fermi energy (zero by default) with EnergyAxis::ModelFermiLevel, above the band bottom with EnergyAxis::BandBottom, each row then the model’s at T = E - E_F with E_F the Fermi energy of the model (the shell models share the valence model’s settings, so its Fermi energy) (module docs, “Energy axis”). See crate::electron::transport, “Energy reference of the inelastic table”, for how the transport reads them.