Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use von Dreele approximation to Lynn & Seeger approximation for resonant elements #99

Open
pkienzle opened this issue Dec 20, 2024 · 0 comments

Comments

@pkienzle
Copy link
Collaborator

Resonance parameters from von Dreele (2024) DOI:10.1107/S1600576724005375

103-Rh has 100% natural abundance so natural Rh is a copy of 103-Rh.

113-Cd has 12.22%, which scales Re and Im for natural Cd.

b0 values for 103-Rh, Cd, 113-Cd, 239-Pu, 240-Pu were not provided in the paper. They can be determined by matching the b_c values at 2200 m/s recorded in nsf.py.

from periodictable.nsf import neutron_energy, _4PI_100
import numpy as np

resonant_isotopes = {
#    Iso: (b0      Re        Im        E0         G       A1 E1 A2 E2)
    "Rh": (??,   78.92,  6156.0,   1257.0,    156,      0, 0, 0, 0),
"103-Rh": (??,   78.92,  6156.0,   1257.0,    156,      0, 0, 0, 0),
# [PAK] 113Cd resonance from Volev (2013) DOI:10.1016/j.nimb.2013.01.030
# with b0 adjusted to match the thermal b_c.
# E0=178.70(10), Γ=113.5(1), gΓm=0.4800(15), λ0=(81.787/E0)**0.5, μ=(A+n)/(An)=1.0088
# Re=2*gΓm*λ0*μ/(8*π)*1e4=260.7(8), Im=2*gΓm*Γ*λ0*μ/(16*π)*1e4=14794(48)
    "Cd": (0.6657,  31.86,   1808.,   178.7,    113.5,    0, 0, 0, 0),
"113-Cd": (0.6949, 260.7,   14794.,   178.7,    113.5,    0, 0, 0 ,0),
    "Sm": (0.4099,  30.10,    949,     97.75,    65.14,   0, 0, 0, 0),
"149-Sm": (0.470,  216.4,    6830,     97.74,    65.15,   0, 0, 0, 0),
    "Eu": (0.7550,   8.55,    385.5,  321.01,    87.32,   7.14, 459.65, 1.25, -31.0),
"151-Eu": (0.731,   17.88,    807,    321.0,     87.35,   7.14, 459.64, 1.22, -30.5),
    "Gd": (0.6794,  72.72,   3866,     30.40,   105.60,   0, 0, 0, 0),
"155-Gd": (0.6820,  88.74,   4672.3,   28.069,  105.135,  0, 0, 0, 0),
"157-Gd": (0.6428, 379.9,   20178,     31.0194, 105.74,   0, 0, 0, 0),
    "Er": (0.8525,  12.08,    523.5,  460.30,    88.08,   0.6522, 584.42, 0, 0),
"167-Er": (0.5635,  52.42,   2281.9,  460.16,    87.93,   0.6481, 584.23, 0, 0),
    "Yb": (1.2273,   0.56,     36.2,  596.97,    66.165,  0, 0, 0, 0),
"168-Yb": (0.7046, 635.179, 21152.9,  596.9696,  66.1647, 0, 0, 0, 0),
"176-Lu": (0.8042,  25.55,    765,    141.36,    60.560,  0, 0, 0, 0),
"239-Pu": (??,   22.66,   1156.0,  296,      102.0,    0, 0, 0, 0),
"240-Pu": (??,   515.8,   8356.0, 1057,       32.4,    0, 0, 0, 0),
}

def init_resonance(table):
    for el in table:
        el.neutron.resonance = resonant_isotopes.get(str(el), None)
        for isonum in el.isotopes:
            iso = el[isonum]
            iso.neutron.resonance = resonant_isotopes.get(str(iso), None)

def scattering_by_wavelength(self, wavelength):
        r"""
        Return scattering length and total cross section for each wavelength.

        For select isotopes this returns the energy-dependent $\mathrm{Re}(b_c)$
        and $\mathrm{Im}(b_c)$ from low energy resonances. Total scattering is
        returned as $4\pi/100 |b_c|^2$ with no contribution for bound incoherent
        scattering. This is incorrect for odd-numbered isotopes.

        :Parameters:
            *wavelength* \: float(s) | |Ang|

        :Returns:
            *b_c* \: complex(s) | fm

            *sigma_s* \: float(s) | barn
        """
        coeff = self.resonance
        if coeff is None:
            ones = 1 if np.isscalar(wavelength) else np.ones_like(wavelength)
            return ones*self.b_c_complex, ones*self.total
        E = neutron_energy(wavelength)
        b0, Re, Im, E0, G, A1, E1, A2, E2 = coeff
        bp, bpp = b0, 0
        for Ak, Ek in ((1, E0), (A1, E1), (A2, E2)):
            if Ak == 0: break
            dE = (E - Ek)
            scale = Ak / (dE**2 + G**2/4)
            bp += Re * dE * scale
            bpp += Im * scale
        b_c = 10*(bp - 1j*bpp)
        # TODO: sigma_s should include an incoherent contribution?
        sigma_s = _4PI_100*abs(b_c)**2 # 1 barn = 1 fm^2 1e-2 barn/fm^2
        return b_c, sigma_s
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant