pub struct ScatteringTable { /* private fields */ }Expand description
Precomputed centre-of-mass scattering angle theta(eps, beta).
The table stores y = ln tan(theta/2) on a grid uniform in ln eps and
ln beta, and interpolates bilinearly in those coordinates. y is close to
linear in ln beta at both ends (tan(theta/2) ~ 1/beta as beta -> 0, and
theta ~ beta^-k for large beta), which is what makes bilinear
interpolation accurate. Since d theta = sin(theta) dy, an error dy in the
table value is at most dy radians in theta.
The angle depends on (eps, beta) and on the screening function only; Z1,
Z2 and the screening length enter through the reduced variables. The
table keeps its Potential so one table serves one (Z1, Z2, potential)
pair and converts to and from SI. It is built once and shared read-only
(&ScatteringTable is Sync).
§Error bound
At build time the interpolation error against direct quadrature is measured
at cell centres (where bilinear interpolation error peaks) on a
deterministic subset of cells. ScatteringTable::max_abs_error is the
largest absolute error in theta seen (radians) and
ScatteringTable::max_rel_error the largest relative error where
theta > 1e-6. These are empirical bounds from sampling, not proofs.
Outside the grid: beta >= beta_max returns 0.0; beta < beta_min is
clamped to beta_min; eps outside [eps_min, eps_max] returns None.
Implementations§
Source§impl ScatteringTable
impl ScatteringTable
Sourcepub fn build(potential: &Potential, spec: &TableSpec) -> Self
pub fn build(potential: &Potential, spec: &TableSpec) -> Self
Build a table by direct quadrature. Serial and deterministic.
Sourcepub fn max_abs_error(&self) -> f64
pub fn max_abs_error(&self) -> f64
Largest absolute theta error (radians) found against quadrature at
sampled cell centres.
Sourcepub fn max_rel_error(&self) -> f64
pub fn max_rel_error(&self) -> f64
Largest relative theta error found at sampled cell centres where
theta > 1e-6.
Sourcepub fn theta(&self, eps: f64, beta: f64) -> Option<f64>
pub fn theta(&self, eps: f64, beta: f64) -> Option<f64>
Interpolated centre-of-mass angle (radians), or None if eps is out
of the tabulated range.
Sourcepub fn half_angle_tan(&self, eps: f64, beta: f64) -> Option<f64>
pub fn half_angle_tan(&self, eps: f64, beta: f64) -> Option<f64>
Interpolated tan(theta / 2) (the stored quantity is its logarithm),
or None if eps is out of the tabulated range; 0.0 for
beta >= beta_max. ScatteringTable::theta is 2 atan of this.
The collision code needs sin and cos of theta / 2 (energy
transfer, lab angles), which follow from the tangent by algebra, so it
avoids the atan here and the trigonometric calls that would undo it.
Trait Implementations§
Source§impl Clone for ScatteringTable
impl Clone for ScatteringTable
Source§fn clone(&self) -> ScatteringTable
fn clone(&self) -> ScatteringTable
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 ScatteringTable
impl RefUnwindSafe for ScatteringTable
impl Send for ScatteringTable
impl Sync for ScatteringTable
impl Unpin for ScatteringTable
impl UnsafeUnpin for ScatteringTable
impl UnwindSafe for ScatteringTable
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