From b8d9fe461f22e59437af10023a20eaf8cd92bbe4 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Wed, 16 Nov 2016 21:47:07 -0500 Subject: [PATCH] Resolving @paulromano comments --- openmc/data/data.py | 6 ++++ openmc/material.py | 17 ++++----- openmc/plotter.py | 85 +++++++++++++++------------------------------ 3 files changed, 40 insertions(+), 68 deletions(-) diff --git a/openmc/data/data.py b/openmc/data/data.py index a3e7158126..92be7cadee 100644 --- a/openmc/data/data.py +++ b/openmc/data/data.py @@ -186,3 +186,9 @@ K_BOLTZMANN = 8.6173324e-5 # Used for converting units in ACE data EV_PER_MEV = 1.0e6 + +# Avogadro's constant from CODATA 2010 +AVOGADRO = 6.02214129E23 + +# Neutron mass from CODATA 2010 in units of amu +NEUTRON_MASS = 1.008664916 diff --git a/openmc/material.py b/openmc/material.py index 16d1fd1477..ece75be19e 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -664,17 +664,12 @@ class Material(object): sum_percent = 0. awrs = [] - n = -1 - for nuclide in nuclides.items(): - n += 1 - lib = library.get_by_material(nuclide[0]) - if lib is not None: - nuc = openmc.data.IncidentNeutron.from_hdf5(lib['path']) - awrs.append(nuc.atomic_weight_ratio) - if not percent_in_atom: - nuc_densities[n] = -nuc_densities[n] / awrs[-1] + for n, nuclide in enumerate(nuclides.items()): + awr = openmc.data.atomic_mass(nuclide[0]) + if awr is not None: + awrs.append(awr / openmc.data.NEUTRON_MASS) else: - raise ValueError(nuclide[0] + " not in library") + raise ValueError(nuclide[0] + " is invalid") # Now that we have the awr, lets finish calculating densities sum_percent = np.sum(nuc_densities) @@ -686,7 +681,7 @@ class Material(object): sum_percent += x * awrs[n] sum_percent = 1. / sum_percent density = -density * sum_percent * \ - sc.Avogadro / sc.value('neutron mass in u') * 1.E-24 + openmc.data.AVOGADRO / openmc.data.NEUTRON_MASS * 1.E-24 nuc_densities = density * nuc_densities nuclides = OrderedDict() diff --git a/openmc/plotter.py b/openmc/plotter.py index b8eda28e66..f0275dda61 100644 --- a/openmc/plotter.py +++ b/openmc/plotter.py @@ -15,42 +15,18 @@ UNITY_MT = -1 XI_MT = -2 # MTs to combine to generate associated plot_types -PLOT_TYPES_MT = {'total': (2, 3,), - 'scatter': (2, 4, 11, 16, 17, 22, 23, 24, 25, 28, 29, 30, - 32, 33, 34, 35, 36, 37, 41, 42, 44, 45, 152, - 153, 154, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 183, 184, 190, 194, 196, 198, 199, 200, - 875, 891), - 'elastic': (2,), - 'inelastic': (4, 11, 16, 17, 22, 23, 24, 25, 28, 29, 30, - 32, 33, 34, 35, 36, 37, 41, 42, 44, 45, 152, - 153, 154, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 183, 184, 190, 194, 196, 198, 199, 200, - 875, 891), - 'fission': (18,), - 'absorption': (27,), 'capture': (101,), - 'nu-fission': (18,), - 'nu-scatter': (2, 4, 11, 16, 17, 22, 23, 24, 25, 28, 29, 30, - 32, 33, 34, 35, 36, 37, 41, 42, 44, 45, 152, - 153, 154, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 183, 184, 190, 194, 196, 198, 199, 200, - 875, 891), - 'unity': (UNITY_MT,), - 'slowing-down power': (2, 4, 11, 16, 17, 22, 23, 24, 25, 28, - 29, 30, 32, 33, 34, 35, 36, 37, 41, 42, - 44, 45, 152, 153, 154, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 183, - 184, 190, 194, 196, 198, 199, 200, 875, - 891, XI_MT), - 'damage': (444,)} +_INELASTIC = [mt for mt in openmc.data.SUM_RULES[3] if mt not in [5, 27]] +PLOT_TYPES_MT = {'total': openmc.data.SUM_RULES[1], + 'scatter': [2] + _INELASTIC, + 'elastic': [2], + 'inelastic': _INELASTIC, + 'fission': [18], + 'absorption': [27], 'capture': [101], + 'nu-fission': [18], + 'nu-scatter': [2] + _INELASTIC, + 'unity': [UNITY_MT], + 'slowing-down power': [2] + _INELASTIC + [XI_MT], + 'damage': [444]} # Operations to use when combining MTs the first np.add is used in reference # to zero PLOT_TYPES_OP = {'total': (np.add,), @@ -84,8 +60,7 @@ PLOT_TYPES_LINEAR = {'nu-fission / fission', 'nu-scatter / scatter', def plot_xs(this, types, divisor_types=None, temperature=294., axis=None, - energy_range=(1.E-5, 20.E6), sab_name=None, cross_sections=None, - enrichment=None, **kwargs): + sab_name=None, cross_sections=None, enrichment=None, **kwargs): """Creates a figure of continuous-energy cross sections for this item Parameters @@ -106,8 +81,6 @@ def plot_xs(this, types, divisor_types=None, temperature=294., axis=None, axis : matplotlib.axes, optional A previously generated axis to use for plotting. If not specified, a new axis and figure will be generated. - energy_range : tuple of floats - Energy range (in eV) to plot the cross section within sab_name : str, optional Name of S(a,b) library to apply to MT=2 data when applicable; only used for items which are instances of openmc.Element or openmc.Nuclide @@ -212,10 +185,10 @@ def plot_xs(this, types, divisor_types=None, temperature=294., axis=None, ylabel = 'Macroscopic Cross Section [1/cm]' ax.set_ylabel(ylabel) ax.legend(loc='best') - ax.set_xlim(energy_range) + # Set to the most likely expected range + ax.set_xlim((1.E-5, 20.E6)) if this.name is not None: - title = 'Cross Section for ' + this.name - ax.set_title(title) + ax.set_title('Cross Section for ' + this.name) return fig @@ -246,7 +219,7 @@ def calculate_xs(this, types, temperature=294., sab_name=None, Returns ------- - energy_grid : numpy.array + energy_grid : numpy.ndarray Energies at which cross sections are calculated, in units of eV data : numpy.ndarray Cross sections calculated at the energy grid described by energy_grid @@ -302,7 +275,7 @@ def _calculate_xs_element(this, types, temperature=294., sab_name=None, Returns ------- - energy_grid : numpy.array + energy_grid : numpy.ndarray Energies at which cross sections are calculated, in units of eV data : numpy.ndarray Macroscopic cross sections calculated at the energy grid described @@ -381,7 +354,7 @@ def _calculate_xs_nuclide(this, types, temperature=294., sab_name=None, Returns ------- - energy_grid : numpy.array + energy_grid : numpy.ndarray Energies at which cross sections are calculated, in units of eV data : numpy.ndarray Cross sections calculated at the energy grid described by @@ -405,6 +378,7 @@ def _calculate_xs_nuclide(this, types, temperature=294., sab_name=None, mts.append((line,)) yields.append((False,)) ops.append(()) + print(mts) # Load the library library = openmc.data.DataLibrary.from_xml(cross_sections) @@ -427,7 +401,7 @@ def _calculate_xs_nuclide(this, types, temperature=294., sab_name=None, for t in range(len(data_Ts)): # Take off the "K" and convert to a float data_Ts[t] = float(data_Ts[t][:-1]) - min_delta = np.finfo(np.float64).max + min_delta = float('inf') closest_t = -1 for t in data_Ts: if abs(data_Ts[t] - T) < min_delta: @@ -496,7 +470,6 @@ def _calculate_xs_nuclide(this, types, temperature=294., sab_name=None, funcs.append(nuc[mt].xs[nucT]) elif mt in nuc: if yield_check: - found_it = False for prod in nuc[mt].products: if prod.particle == 'neutron' and \ prod.emission_mode == 'total': @@ -504,9 +477,8 @@ def _calculate_xs_nuclide(this, types, temperature=294., sab_name=None, [nuc[mt].xs[nucT], prod.yield_], [np.multiply]) funcs.append(func) - found_it = True break - if not found_it: + else: for prod in nuc[mt].products: if prod.particle == 'neutron' and \ prod.emission_mode == 'prompt': @@ -514,11 +486,10 @@ def _calculate_xs_nuclide(this, types, temperature=294., sab_name=None, [nuc[mt].xs[nucT], prod.yield_], [np.multiply]) funcs.append(func) - found_it = True break - if not found_it: - # Assume the yield is 1 - funcs.append(nuc[mt].xs[nucT]) + else: + # Assume the yield is 1 + funcs.append(nuc[mt].xs[nucT]) else: funcs.append(nuc[mt].xs[nucT]) elif mt == UNITY_MT: @@ -557,7 +528,7 @@ def _calculate_xs_material(this, types, temperature=294., cross_sections=None): Returns ------- - energy_grid : numpy.array + energy_grid : numpy.ndarray Energies at which cross sections are calculated, in units of eV data : numpy.ndarray Macroscopic cross sections calculated at the energy grid described @@ -602,8 +573,8 @@ def _calculate_xs_material(this, types, temperature=294., cross_sections=None): # Condense the data for every nuclide # First create a union energy grid energy_grid = E[0] - for n in range(1, len(E)): - energy_grid = np.union1d(energy_grid, E[n]) + for grid in E[1:]: + energy_grid = np.union1d(energy_grid, grid) # Now we can combine all the nuclidic data data = np.zeros((len(types), len(energy_grid)))