diff --git a/openmc/data/resonance.py b/openmc/data/resonance.py index 5e4bd7129e..628ad184b5 100644 --- a/openmc/data/resonance.py +++ b/openmc/data/resonance.py @@ -430,7 +430,7 @@ class MultiLevelBreitWigner(ResonanceRange): # Determine penetration at modified energy for competitive reaction if gx > 0: - Ex = E + self.q[l]*(A + 1)/A + Ex = E + self.q_value[l]*(A + 1)/A rho = k*self.channel_radius[l](Ex) rhohat = k*self.scattering_radius[l](Ex) px[i], sx[i] = penetration_shift(l, rho) @@ -915,7 +915,9 @@ class Unresolved(ResonanceRange): Minimum energy of the unresolved resonance range in eV energy_max : float Maximum energy of the unresolved resonance range in eV - scatter : openmc.data.Function1D + channel : openmc.data.Function1D + Channel radii as a function of energy + scattering : openmc.data.Function1D Scattering radii as a function of energy Attributes @@ -923,6 +925,10 @@ class Unresolved(ResonanceRange): add_to_background : bool If True, file 3 contains partial cross sections to be added to the average unresolved cross sections calculated from parameters. + atomic_weight_ratio : float + Atomic weight ratio of the target nuclide + channel_radius : openmc.data.Function1D + Channel radii as a function of energy energies : Iterable of float Energies at which parameters are tabulated energy_max : float @@ -938,11 +944,13 @@ class Unresolved(ResonanceRange): """ - def __init__(self, target_spin, energy_min, energy_max, scatter): - super().__init__(target_spin, energy_min, energy_max, None, scatter) + def __init__(self, target_spin, energy_min, energy_max, channel, scattering): + super().__init__(target_spin, energy_min, energy_max, channel, + scattering) self.energies = None self.parameters = None self.add_to_background = False + self.atomic_weight_ratio = None @classmethod def from_endf(cls, file_obj, items, fission_widths): @@ -967,9 +975,9 @@ class Unresolved(ResonanceRange): """ # Read energy-dependent scattering radius if present energy_min, energy_max = items[0:2] - nro = items[4] + nro, naps = items[4:6] if nro != 0: - params, scattering_radius = get_tab1_record(file_obj) + params, ape = get_tab1_record(file_obj) # Get SPI, AP, and LSSF formalism = items[3] @@ -977,22 +985,23 @@ class Unresolved(ResonanceRange): items = get_cont_record(file_obj) target_spin = items[0] if nro == 0: - scattering_radius = items[1] + ap = Polynomial((items[1],)) add_to_background = (items[2] == 0) if not fission_widths and formalism == 1: # Case A -- fission widths not given, all parameters are # energy-independent NLS = items[4] - columns = ['L', 'J', 'd', 'amun', 'gn', 'gg', 'gf'] + columns = ['L', 'J', 'd', 'amun', 'gn0', 'gg'] records = [] for ls in range(NLS): items, values = get_list_record(file_obj) + awri = items[0] l = items[2] NJS = items[5] for j in range(NJS): - d, j, amun, gn, gg = values[6*j:6*j + 5] - records.append([l, j, d, amun, gn, gg, 0.0]) + d, j, amun, gn0, gg = values[6*j:6*j + 5] + records.append([l, j, d, amun, gn0, gg]) parameters = pd.DataFrame.from_records(records, columns=columns) energies = None @@ -1002,14 +1011,14 @@ class Unresolved(ResonanceRange): items, energies = get_list_record(file_obj) target_spin = items[0] if nro == 0: - scattering_radius = items[1] + ap = Polynomial((items[1],)) add_to_background = (items[2] == 0) NE, NLS = items[4:6] - l_values = np.zeros(NLS, int) - records = [[] for e in energies] - columns = ['L', 'J', 'd', 'amun', 'gn0', 'gg', 'gf'] + records = [] + columns = ['L', 'J', 'E', 'd', 'amun', 'amuf', 'gn0', 'gg', 'gf'] for ls in range(NLS): items = get_cont_record(file_obj) + awri = items[0] l = items[2] NJS = items[4] for j in range(NJS): @@ -1020,18 +1029,20 @@ class Unresolved(ResonanceRange): amun = values[2] gn0 = values[3] gg = values[4] - gf = values[6:] - for k, gf_i in enumerate(gf): - records[k].append([l, j, d, amun, gn0, gg, gf]) - parameters = [pd.DataFrame(r, columns=columns) for r in records] + gfs = values[6:] + for E, gf in zip(energies, gfs): + records.append([l, j, E, d, amun, muf, gn0, gg, gf]) + parameters = pd.DataFrame.from_records(records, columns=columns) elif formalism == 2: # Case C -- all parameters are energy-dependent NLS = items[4] - columns = ['L', 'J', 'E', 'd', 'gx', 'gn0', 'gg', 'gf'] + columns = ['L', 'J', 'E', 'd', 'amux', 'amun', 'amuf', 'gx', 'gn0', + 'gg', 'gf'] records = [] for ls in range(NLS): items = get_cont_record(file_obj) + awri = items[0] l = items[2] NJS = items[4] for j in range(NJS): @@ -1040,8 +1051,8 @@ class Unresolved(ResonanceRange): j = items[0] amux = values[2] amun = values[3] - amug = values[4] amuf = values[5] + energies = [] for k in range(1, ne + 1): E = values[6*k] d = values[6*k + 1] @@ -1049,13 +1060,35 @@ class Unresolved(ResonanceRange): gn0 = values[6*k + 3] gg = values[6*k + 4] gf = values[6*k + 5] - records.append([l, j, E, d, gx, gn0, gg, gf]) + energies.append(E) + records.append([l, j, E, d, amux, amun, amuf, gx, gn0, + gg, gf]) parameters = pd.DataFrame.from_records(records, columns=columns) - energies = None - urr = cls(target_spin, energy_min, energy_max, scattering_radius) + # Calculate channel radius from ENDF-102 equation D.14 + a = Polynomial((0.123 * (NEUTRON_MASS*awri)**(1./3.) + 0.08,)) + + # Determine scattering and channel radius + if nro == 0: + scattering_radius = ap + if naps == 0: + channel_radius = a + elif naps == 1: + channel_radius = ap + elif nro == 1: + scattering_radius = ape + if naps == 0: + channel_radius = a + elif naps == 1: + channel_radius = ape + elif naps == 2: + channel_radius = ap + + urr = cls(target_spin, energy_min, energy_max, channel_radius, + scattering_radius) urr.parameters = parameters urr.add_to_background = add_to_background + urr.atomic_weight_ratio = awri urr.energies = energies return urr