Expand description
Doppler broadening by integrating the free-gas kernel over the resonance equation.
§What is integrated
SAMMY manual Eq. III B1.6/B1.7, in velocity space:
σ_D(E) = (1/(√π·E)) ∫ e^{−x²} w² · s(w) dx w = √E + u·x
s(w) = +σ(w²) w > 0
s(w) = −σ(w²) w < 0with u = √(k_B T / A) the thermal width in √eV. The w² weight is what
removes the 1/v² prefactor of the lab-frame convolution, so the
integrand is bounded wherever σ is.
s is ODD through w = 0: the negative-w half is the reflected branch,
the target overtaking the neutron. It is not a correction to be dropped at
low energy — it is what makes the integral correct there. SAMMY manual
Sec. III.B.1: “Negative velocities are included as needed, in order to
properly evaluate the integral at low values of E”. The share of the
kernel it carries is erfc(√E/u)/2, which is 24% at √E/u = 0.5 and 7.9%
at 1. crate::doppler builds the same odd extension for a sampled
table.
Differentiating at fixed source SPEED — the source energies do not move
with T, only the weight on them does — turns d/dT of e^{−x²} into
the same integrand times (x² − ½)/T. Value and derivative therefore
share every panel, and a derivative converged on those panels costs one
extra multiply per node rather than a second adaptive pass.
§Why there is no eligibility test
Every source energy is evaluated through
CrossSectionPlan::evaluate_one, which sums whichever ranges cover it
and dispatches SLBW, MLBW and Reich-Moore alike. So a window spanning two
ranges, or a Reich-Moore evaluation, needs nothing special: the
quadrature’s only job is to know where the structure is, which is a
question about breakpoints.
This matters beyond tidiness. An earlier revision chose between this integral and the sampled table per isotope, from the working grid and the temperature. Both are moved by a fit, so the choice could flip mid-fit and σ stepped where the two methods disagreed. Selecting a method by anything a fit can vary makes the forward model discontinuous in the parameter being fitted; selecting it by what the INPUT IS cannot.
§Quadrature
Gauss–Kronrod G10/K21 (QUADPACK qk21) with adaptive bisection: the panel
with the largest error estimate is split until the total error meets the
tolerance. Initial panel edges are the window ends, the zero crossing when
the window reaches it, each covering range’s bounds, the resonance
breakpoints, and every knot of an energy-dependent scattering radius
AP(E′) inside the window — each is a kink both rules would otherwise
straddle and mis-estimate.
Failures are hard, with one reported exception. A broadening that cannot
converge returns an error rather than a degraded number — except when
refinement has stopped helping at all, where QUADPACK qagse returns the
accuracy achieved (ier = 2) instead of refining until a budget stops it.
Those targets are counted on TierOneBroadening::roundoff_limited, so a
caller that needs the error certificate can see it was not met rather than
having to assume it was.
§Not implemented here
A range carrying a File-3 (MF=3) smooth background is integrated without it, because only File 2 is parsed and nothing can answer whether a range has one. Whichever change adds MF=3 parsing owes this.
Below a resolved range’s lower bound the dispatcher returns zero, while
crate::doppler extrapolates 1/v. The two therefore disagree about a
window reaching under that bound. Both are approximations of a File-3
background neither can see.
Structs§
- Quadrature
Budget - Hard limits of the adaptive quadrature. The defaults are the module constants; a smaller budget lets a test force a limit deterministically instead of hoping to construct a pathological source.
- Tier
OneBroadening - A converged tier-1 broadening of one channel over a whole grid.
Enums§
- Channel
- Which cross-section channel an integral broadens.
Constants§
- ABSOLUTE_
DERIVATIVE_ TOLERANCE_ BARN_ PER_ K - Absolute tolerance (barn/K) on each temperature derivative. A typical
derivative is
σ/T ≈ 1e-2 barn/K, so this sits two orders below the1e-6relative level its consumers work to. - ABSOLUTE_
TOLERANCE_ BARN - Absolute tolerance (barn) on each target integral, for energies where the cross-section itself is small and a relative test alone would chase noise.
- MAX_
ACTIVE_ PANELS - Most panels alive for one target. Real MLBW sources on real grids need tens; a limit two orders above that turns a runaway into an error instead of an out-of-memory.
- MAX_
DEPTH - Deepest bisection allowed. A panel of width
16/2^20 ≈ 1.5e-5inxis far narrower than any resonance the breakpoints did not already isolate, so reaching this means the integrand is not being resolved at all. - RELATIVE_
TOLERANCE - Relative tolerance on each target integral. Two orders below the
1e-6relative level of the anchors and finite-difference gates downstream, so quadrature error is not what those measure. - SUPPORT_
X - Half-width of the kernel support in units of
u, so the thermal window is[(√E − 8u)², (√E + 8u)²].erfc(8) ≈ 1.1e-29of the kernel mass lies outside it, far below any tolerance the integral works to.
Functions§
- broaden
- Tier-1 total cross-section at every target energy.
- broaden_
channel - Tier-1 cross-section of one channel at every target energy.
- broaden_
with_ budget - Value and (optionally) temperature derivative of one channel at every target energy, under an explicit quadrature budget.
- broaden_
with_ derivative - Tier-1 total cross-section and its exact temperature derivative (barn/K), both converged on the same panels.