From 264cb33b3635e54f8d9958b829c0d0660b25258c Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Sun, 7 Aug 2016 14:31:18 -0500 Subject: [PATCH] Address #690 comments --- data/fission_Q_data_endfb71.h5 | Bin 67543 -> 67543 bytes docs/source/io_formats/fission_energy.rst | 7 ++--- openmc/data/endf_utils.py | 5 ++-- openmc/data/fission_energy.py | 35 +++++++++------------- src/tally.F90 | 12 ++++---- 5 files changed, 25 insertions(+), 34 deletions(-) diff --git a/data/fission_Q_data_endfb71.h5 b/data/fission_Q_data_endfb71.h5 index 89e51b70783034b40ce4e207fdb3e34b5d5d33cc..7cc5a86b5249c1abacfbf23bf777639825164c9b 100644 GIT binary patch delta 8209 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/** - Nuclides are named by concatenating their Z and their A numbers. For - example, U235 is named 92235. Metastable nuclides are appended with an - '_m' and their metastable number. For example, the first excited isomer - of Am-242 is named 95242_m1. + Nuclides are named by concatenating their atomic symbol and mass number. For + example, 'U235' or 'Pu239'. Metastable nuclides are appended with an + '_m' and their metastable number. For example, 'Am242_m1' :Datasets: - **data** (*double[][][]*) -- The energy release coefficients. The first axis indexes the component type. The second axis specifies diff --git a/openmc/data/endf_utils.py b/openmc/data/endf_utils.py index bfd9ae5c85..1a77c60a5e 100644 --- a/openmc/data/endf_utils.py +++ b/openmc/data/endf_utils.py @@ -12,9 +12,8 @@ import re def read_float(float_string): """Parse ENDF 6E11.0 formatted string into a float.""" assert len(float_string) == 11 - pattern = '([\s\\-]\d+\\.\d+)([\\+\\-]\d+)' - mantissa, exponent = re.match(pattern, float_string).groups() - return float(mantissa + 'e' + exponent) + pattern = r'([\s\-]\d+\.\d+)([\+\-]\d+)' + return float(re.sub(pattern, r'\1e\2', float_string)) def read_CONT_line(line): diff --git a/openmc/data/fission_energy.py b/openmc/data/fission_energy.py index 334231a9f6..60cc435646 100644 --- a/openmc/data/fission_energy.py +++ b/openmc/data/fission_energy.py @@ -6,8 +6,9 @@ import h5py import numpy as np from numpy.polynomial.polynomial import Polynomial -from .function import Tabulated1D, Sum +from .data import ATOMIC_SYMBOL from .endf_utils import read_float, read_CONT_line, identify_nuclide +from .function import Tabulated1D, Sum import openmc.checkvalue as cv if sys.version_info[0] >= 3: @@ -70,11 +71,11 @@ def _extract_458_data(filename): labels = ('EFR', 'ENP', 'END', 'EGP', 'EGD', 'EB', 'ENU', 'ER', 'ET') # Associate each set of values and uncertainties with its label. - value = dict() - uncertainty = dict() - for i in range(len(labels)): - value[labels[i]] = data[2*i::18] - uncertainty[labels[i]] = data[2*i + 1::18] + value = {} + uncertainty = {} + for i, label in enumerate(labels): + value[label] = data[2*i::18] + uncertainty[label] = data[2*i + 1::18] # In ENDF/B-7.1, data for 2nd-order coefficients were mistakenly not # converted from MeV to eV. Check for this error and fix it if present. @@ -94,13 +95,6 @@ def _extract_458_data(filename): for coeffs in value.values(): coeffs[2] *= 1e-6 for coeffs in uncertainty.values(): coeffs[2] *= 1e-6 - # Perform the sanity check again... just in case. - for coeffs in value.values(): - second_order = coeffs[2] - if abs(second_order) * 1e12 > 1e8: - raise ValueError("Encountered a ludicrously large second-" - "order polynomial coefficient.") - # Convert eV to MeV. for coeffs in value.values(): for i in range(len(coeffs)): @@ -112,8 +106,8 @@ def _extract_458_data(filename): return value, uncertainty -def write_compact_458_library(endf_files, output_name=None, comment=None, - verbose=False): +def write_compact_458_library(endf_files, output_name='fission_Q_data.h5', + comment=None, verbose=False): """Read ENDF files, strip the MF=1 MT=458 data and write to small HDF5. Parameters @@ -130,7 +124,6 @@ def write_compact_458_library(endf_files, output_name=None, comment=None, """ # Open the output file. - if output_name is None: output_name = 'fission_Q_data.h5' out = h5py.File(output_name, 'w', libver='latest') # Write comments, if given. This commented out comment is the one used for @@ -179,7 +172,7 @@ def write_compact_458_library(endf_files, output_name=None, comment=None, value, uncertainty = data # Make a group for this isomer. - name = str(ident['Z']) + str(ident['A']) + name = ATOMIC_SYMBOL[ident['Z']] + str(ident['A']) if ident['LISO'] != 0: name += '_m' + str(ident['LISO']) nuclide_group = out.create_group(name) @@ -447,7 +440,7 @@ class FissionEnergyRelease(object): and p.emission_mode == 'prompt'] else: raise ValueError('IncidentNeutron data has no fission ' - 'reaction.') + 'reaction.') if len(nu_prompt) == 0: raise ValueError('Nu data is needed to compute fission energy ' 'release with the Sher-Beck format.') @@ -533,7 +526,7 @@ class FissionEnergyRelease(object): elif group.attrs['format'].decode() == 'Sher-Beck': obj.form = 'Sher-Beck' obj.prompt_neutrons = Tabulated1D.from_hdf5( - group['prompt_neutrons']) + group['prompt_neutrons']) else: raise ValueError('Unrecognized energy release format') @@ -565,14 +558,14 @@ class FissionEnergyRelease(object): components = [s.decode() for s in fin.attrs['component order']] - nuclide_name = str(incident_neutron.atomic_number) + nuclide_name = ATOMIC_SYMBOL[incident_neutron.atomic_number] nuclide_name += str(incident_neutron.mass_number) if incident_neutron.metastable != 0: nuclide_name += '_m' + str(incident_neutron.metastable) if nuclide_name not in fin: return None - data = {c : fin[nuclide_name + '/data'][i, 0, :] + data = {c: fin[nuclide_name + '/data'][i, 0, :] for i, c in enumerate(components)} return cls._from_dictionary(data, incident_neutron) diff --git a/src/tally.F90 b/src/tally.F90 index ab630ceb25..a949313bd3 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -710,7 +710,7 @@ contains score = p % absorb_wgt * & nuc % reactions(nuc % index_fission(1)) % Q_value * & micro_xs(p % event_nuclide) % fission / & - micro_xs(p % event_nuclide) % absorption + micro_xs(p % event_nuclide) % absorption * flux end if end associate else @@ -724,7 +724,7 @@ contains score = p % last_wgt * & nuc % reactions(nuc % index_fission(1)) % Q_value * & micro_xs(p % event_nuclide) % fission / & - micro_xs(p % event_nuclide) % absorption + micro_xs(p % event_nuclide) % absorption * flux end if end associate end if @@ -785,7 +785,7 @@ contains score = p % absorb_wgt & * nuc % fission_q_prompt % evaluate(p % last_E) & * micro_xs(p % event_nuclide) % fission & - / micro_xs(p % event_nuclide) % absorption + / micro_xs(p % event_nuclide) % absorption * flux end if end associate else @@ -799,7 +799,7 @@ contains score = p % last_wgt & * nuc % fission_q_prompt % evaluate(p % last_E) & * micro_xs(p % event_nuclide) % fission & - / micro_xs(p % event_nuclide) % absorption + / micro_xs(p % event_nuclide) % absorption * flux end if end associate end if @@ -844,7 +844,7 @@ contains score = p % absorb_wgt & * nuc % fission_q_recov % evaluate(p % last_E) & * micro_xs(p % event_nuclide) % fission & - / micro_xs(p % event_nuclide) % absorption + / micro_xs(p % event_nuclide) % absorption * flux end if end associate else @@ -858,7 +858,7 @@ contains score = p % last_wgt & * nuc % fission_q_recov % evaluate(p % last_E) & * micro_xs(p % event_nuclide) % fission & - / micro_xs(p % event_nuclide) % absorption + / micro_xs(p % event_nuclide) % absorption * flux end if end associate end if