Skip to main content

Module continuous_doppler

Module continuous_doppler 

Source
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 < 0

with 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§

QuadratureBudget
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.
TierOneBroadening
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 the 1e-6 relative 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-5 in x is 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-6 relative 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-29 of 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.