fusion_cross_section
- plasmapy.formulary.fusion.fusion_cross_section( ) Annotated[Quantity, Unit('m2')][source]
Calculate the fusion cross section \(σ(E)\) for a two reactant fusion reaction.
The cross section is evaluated from the Bosch-Hale Padé parametrization [Bosch and Hale, 1992]. For the reactions tabulated by Bosch and Hale the published coefficients are used; for the remaining reactions the same functional form is fit (Bosch and Hale eq 8 and 9) to ENDF/B evaluated cross sections (see Notes).
Each fit is valid only over a finite energy window, listed per reaction in the table under Notes, and this function never extrapolates beyond it. Every element of
energyis tested against that window after conversion to the center-of-mass frame, with both bounds counting as in range. Elements that fall outside it are returned asnanwhile the in-range elements are evaluated as usual, so an out-of-range energy is signalled in the returned array rather than by an exception, and the shape ofenergyis always preserved. A scalar energy outside the window returns a NaN scalar. If every element is out of range the result is entirely NaN and aUserWarningis issued, since that case usually means the energies are in the wrong units or the wrong reference frame.- Parameters:
energy (
Quantity) – The kinetic energy of the reactants, in units convertible to keV. Interpreted in the frame set byreference_frame: the center-of-mass energy of the reactants whenreference_frame="CM"(default), or the lab-frame kinetic energy of the projectile whenreference_frame="lab". Energies outside the valid range forreactionare returned asnan; see above and the table under Notes.reaction (
str) – The fusion reaction to evaluate. Must be one of the reaction keys listed in the table under Notes (for example,"D(t,n)A").reference_frame (
str, optional) –The frame in which
energyis supplied, using theX(a,b)Ynaming ofreaction(targetX, projectilea). Must be one of:"CM"(default) —energyis the center-of-mass energy and is used directly. Which reactant is labeled the target is irrelevant here, since the center-of-mass energy is symmetric in the two."lab"—energyis the lab-frame kinetic energy of projectileaon a stationary targetX, converted to the center-of-mass energy via \(E_\mathrm{cm} = E_\mathrm{lab}\, m_X / (m_X + m_a)\) before evaluation, with nuclear masses fromplasmapy.particles. Unlike the CM case, the target/projectile assignment matters: the conversion depends on the mass ratio, so"D(t,n)A"and a triton-target labeling of the same reaction give different center-of-mass energies for the sameenergy.
- Returns:
sigma – The fusion cross section, in SI units of square meters, with the same shape as
energy. Elements corresponding to energies outside the valid range forreactionarenan; a scalarenergyoutside that range gives a NaN scalar.- Return type:
- Raises:
ValueError – If
reactionhas no available coefficients; ifreference_frameis not"CM"or"lab"; or ifreference_frame="lab"and either reactant ofreactionhas no entry in the internal nuclide map, so that its mass cannot be looked up. An out-of-rangeenergyis not an error — it producesnaninstead.UnitTypeError – If
energydoes not have units convertible to keV.
- Warns:
`UserWarning` – If every element of
energylies outside the valid range forreaction, so that the returned cross section is entirelynan. A partially out-of-range input does not warn; check the result withnumpy.isnanto find the masked elements.
Notes
The available reactions, the source of their coefficients, and the energy range over which each fit is valid are:
Key
Reaction
Coefficient source
Valid energy range
"D(t,n)A"\(D + T \rightarrow n + \alpha\)
Bosch-Hale (Table IV)
0.5 – 550 keV
"3He(d,p)A"\({}^{3}\mathrm{He} + D \rightarrow p + \alpha\)
Bosch-Hale (Table IV)
0.3 – 900 keV
"D(d,p)T"\(D + D \rightarrow p + T\)
Bosch-Hale (Table IV)
0.5 – 5000 keV
"D(d,n)3He"\(D + D \rightarrow n + {}^{3}\mathrm{He}\)
Bosch-Hale (Table IV)
0.5 – 4900 keV
"3He(3He,2p)A"\({}^{3}\mathrm{He} + {}^{3}\mathrm{He} \rightarrow 2p + \alpha\)
ENDF/B fit
5.0 – 10000 keV
"3He(t,n+p)A"\({}^{3}\mathrm{He} + T \rightarrow n + p + \alpha\)
ENDF/B fit
1.0 – 10000 keV
"3He(t,d)A"\({}^{3}\mathrm{He} + T \rightarrow D + \alpha\)
ENDF/B fit
1.0 – 10000 keV
"T(t,2n)A"\(T + T \rightarrow 2n + \alpha\)
ENDF/B fit
0.5 – 9000 keV
"11B(p,a)2A"\({}^{11}\mathrm{B} + p \rightarrow 3\alpha\)
ENDF/B fit
200 – 5000 keV
The valid energy range in the last column is inclusive of both endpoints and is enforced on the center-of-mass energy, i.e. after the
reference_frame="lab"conversion has been applied. Energies outside it evaluate tonan, so the fits are never extrapolated past the data they were built from.The four Bosch-Hale reactions use the coefficients published in Table IV of Bosch and Hale [1992]; the ENDF/B rows use coefficients obtained by fitting the identical Padé form to ENDF/B data, as described below. A reaction is available only if its coefficients are present in the loaded table.
The Bosch-Hale parametrization writes the cross section in terms of the astrophysical \(S\)-function and the Gamow penetrability factor as
\[σ(E) = \frac{S(E)}{E \exp\left(B_G / \sqrt{E}\right)},\]where \(B_G\) is the Gamow factor for the reaction and \(S(E)\) is the slowly varying astrophysical \(S\)-function, represented by the Padé approximant
\[S(E) = \frac{A_1 + E\left(A_2 + E\left(A_3 + E\left(A_4 + E A_5\right)\right)\right)}{1 + E\left(B_1 + E\left(B_2 + E\left(B_3 + E B_4\right)\right)\right)}.\]For the four reactions in Table IV of Bosch and Hale [1992] the coefficients \(A_i\) and \(B_j\) are taken directly from the published fit. For the remaining reactions the coefficients are obtained by fitting this same functional form to evaluated cross sections from the ENDF/B library, as demonstrated below:
Starting from the tabulated ENDF cross section \(σ_{ENDF}(E)\), the strong exponential energy dependence is first removed by inverting the relation above to recover the \(S\)-function,
\[S(E) = σ_{ENDF}(E)\, E \exp\left(B_G / \sqrt{E}\right),\]using the analytically known \(B_G\) for that reaction. Because \(S(E)\) is smooth and slowly varying (unlike \(σ(E)\), which spans many orders of magnitude near threshold) it is far better conditioned for a rational-function fit. The Padé coefficients are then found by nonlinear least squares (
scipy.optimize.curve_fit) applied to the \(S(E)\) samples,\[\min_{A_i,\, B_j} \sum_k \left[S_{\mathrm{model}}(E_k; A_i, B_j) - S(E_k)\right]^2 .\]A few numerical steps keep this fit well behaved. Energies at or below the reaction threshold, where \(σ_{ENDF}(E) = 0\), are masked out before the \(S\)-function is formed, since the inversion is undefined there. The nonlinear solver is seeded from a linearized polynomial pre-fit — cross-multiplying the Padé form,
\[S(E)\left[1 + E\left(B_1 + \cdots\right)\right] = A_1 + E\left(A_2 + \cdots\right),\]gives a problem that is linear in the \(A_i\) and \(B_j\), whose least-squares solution provides a good starting point near the true minimum. Finally, the numerator and denominator coefficients differ by many orders of magnitude, so they are scaled before fitting to keep the Jacobian columns comparable and avoid an ill-conditioned solve. The resulting \(A_i\) and \(B_j\) are stored in the same format as the published coefficients and evaluated through exactly the same code path, so
fusion_cross_sectionbehaves identically for fitted and published reactions.Examples
>>> import astropy.units as u >>> fusion_cross_section(100 * u.keV, "D(t,n)A") <Quantity 3.42724517e-28 m2>