From 62f8dbfc02b3732e90fa69ca77e36cd57c1b523e Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 30 Sep 2016 12:19:22 -0400 Subject: [PATCH] Clean up tally namespace --- openmc/__init__.py | 1 + openmc/arithmetic.py | 27 +++++----- openmc/filter.py | 4 +- openmc/tallies.py | 116 +++++++++++++++++++++---------------------- 4 files changed, 75 insertions(+), 73 deletions(-) diff --git a/openmc/__init__.py b/openmc/__init__.py index 2aeacd689..48f43be91 100644 --- a/openmc/__init__.py +++ b/openmc/__init__.py @@ -1,3 +1,4 @@ +from openmc.arithmetic import * from openmc.cell import * from openmc.lattice import * from openmc.element import * diff --git a/openmc/arithmetic.py b/openmc/arithmetic.py index 95890566e..3962afc60 100644 --- a/openmc/arithmetic.py +++ b/openmc/arithmetic.py @@ -4,7 +4,7 @@ from collections import Iterable import numpy as np -from openmc import Filter, Nuclide +import openmc from openmc.filter import _FILTER_TYPES import openmc.checkvalue as cv @@ -171,7 +171,7 @@ class CrossNuclide(object): string = '' # If the Summary was linked, the left nuclide is a Nuclide object - if isinstance(self.left_nuclide, Nuclide): + if isinstance(self.left_nuclide, openmc.Nuclide): string += '(' + self.left_nuclide.name # If the Summary was not linked, the left nuclide is the ZAID else: @@ -180,7 +180,7 @@ class CrossNuclide(object): string += ' ' + self.binary_op + ' ' # If the Summary was linked, the right nuclide is a Nuclide object - if isinstance(self.right_nuclide, Nuclide): + if isinstance(self.right_nuclide, openmc.Nuclide): string += self.right_nuclide.name + ')' # If the Summary was not linked, the right nuclide is the ZAID else: @@ -191,13 +191,13 @@ class CrossNuclide(object): @left_nuclide.setter def left_nuclide(self, left_nuclide): cv.check_type('left_nuclide', left_nuclide, - (Nuclide, CrossNuclide, AggregateNuclide)) + (openmc.Nuclide, CrossNuclide, AggregateNuclide)) self._left_nuclide = left_nuclide @right_nuclide.setter def right_nuclide(self, right_nuclide): cv.check_type('right_nuclide', right_nuclide, - (Nuclide, CrossNuclide, AggregateNuclide)) + (openmc.Nuclide, CrossNuclide, AggregateNuclide)) self._right_nuclide = right_nuclide @binary_op.setter @@ -330,14 +330,14 @@ class CrossFilter(object): @left_filter.setter def left_filter(self, left_filter): cv.check_type('left_filter', left_filter, - (Filter, CrossFilter, AggregateFilter)) + (openmc.Filter, CrossFilter, AggregateFilter)) self._left_filter = left_filter self._bins['left'] = left_filter.bins @right_filter.setter def right_filter(self, right_filter): cv.check_type('right_filter', right_filter, - (Filter, CrossFilter, AggregateFilter)) + (openmc.Filter, CrossFilter, AggregateFilter)) self._right_filter = right_filter self._bins['right'] = right_filter.bins @@ -550,8 +550,8 @@ class AggregateNuclide(object): # Append each nuclide in the aggregate to the string string = '{0}('.format(self.aggregate_op) - names = [nuclide.name if isinstance(nuclide, Nuclide) else str(nuclide) - for nuclide in self.nuclides] + names = [nuclide.name if isinstance(nuclide, openmc.Nuclide) + else str(nuclide) for nuclide in self.nuclides] string += ', '.join(map(str, names)) + ')' return string @@ -567,15 +567,15 @@ class AggregateNuclide(object): def name(self): # Append each nuclide in the aggregate to the string - names = [nuclide.name if isinstance(nuclide, Nuclide) else str(nuclide) - for nuclide in self.nuclides] + names = [nuclide.name if isinstance(nuclide, openmc.Nuclide) + else str(nuclide) for nuclide in self.nuclides] string = '(' + ', '.join(map(str, names)) + ')' return string @nuclides.setter def nuclides(self, nuclides): cv.check_iterable_type('nuclides', nuclides, - (basestring, Nuclide, CrossNuclide)) + (basestring, openmc.Nuclide, CrossNuclide)) self._nuclides = nuclides @aggregate_op.setter @@ -700,7 +700,8 @@ class AggregateFilter(object): @aggregate_filter.setter def aggregate_filter(self, aggregate_filter): - cv.check_type('aggregate_filter', aggregate_filter, (Filter, CrossFilter)) + cv.check_type('aggregate_filter', aggregate_filter, + (openmc.Filter, CrossFilter)) self._aggregate_filter = aggregate_filter @bins.setter diff --git a/openmc/filter.py b/openmc/filter.py index 5e7f30417..4c5d6c261 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -8,7 +8,7 @@ from xml.etree import ElementTree as ET import numpy as np -from openmc import Mesh +import openmc import openmc.checkvalue as cv @@ -506,7 +506,7 @@ class MeshFilter(Filter): @mesh.setter def mesh(self, mesh): - cv.check_type('filter mesh', mesh, Mesh) + cv.check_type('filter mesh', mesh, openmc.Mesh) self._mesh = mesh self.bins = mesh.id diff --git a/openmc/tallies.py b/openmc/tallies.py index 8a6e3c5e0..05ece4d08 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -13,10 +13,7 @@ from xml.etree import ElementTree as ET import numpy as np -from openmc import Trigger, Nuclide -from openmc.arithmetic import CrossScore, CrossNuclide, CrossFilter, \ - AggregateScore, AggregateNuclide, AggregateFilter -import openmc.filter +import openmc import openmc.checkvalue as cv from openmc.clean_xml import clean_xml_indentation @@ -36,9 +33,10 @@ _PRODUCT_TYPES = ['tensor', 'entrywise'] # The following indicate acceptable types when setting Tally.scores, # Tally.nuclides, and Tally.filters -_SCORE_CLASSES = (basestring, CrossScore, AggregateScore) -_NUCLIDE_CLASSES = (basestring, Nuclide, CrossNuclide, AggregateNuclide) -_FILTER_CLASSES = (openmc.filter.Filter, CrossFilter, AggregateFilter) +_SCORE_CLASSES = (basestring, openmc.CrossScore, openmc.AggregateScore) +_NUCLIDE_CLASSES = (basestring, openmc.Nuclide, openmc.CrossNuclide, + openmc.AggregateNuclide) +_FILTER_CLASSES = (openmc.Filter, openmc.CrossFilter, openmc.AggregateFilter) # Valid types of estimators ESTIMATOR_TYPES = ['tracklength', 'collision', 'analog'] @@ -118,7 +116,7 @@ class Tally(object): self._nuclides = cv.CheckedList(_NUCLIDE_CLASSES, 'tally nuclides') self._scores = cv.CheckedList(_SCORE_CLASSES, 'tally scores') self._estimator = None - self._triggers = cv.CheckedList(Trigger, 'tally triggers') + self._triggers = cv.CheckedList(openmc.Trigger, 'tally triggers') self._num_realizations = 0 self._with_summary = False @@ -187,7 +185,7 @@ class Tally(object): string += '{0: <16}{1}'.format('\tNuclides', '=\t') for nuclide in self.nuclides: - if isinstance(nuclide, Nuclide): + if isinstance(nuclide, openmc.Nuclide): string += '{0} '.format(nuclide.name) else: string += '{0} '.format(nuclide) @@ -396,7 +394,8 @@ class Tally(object): @triggers.setter def triggers(self, triggers): cv.check_type('tally triggers', triggers, MutableSequence) - self._triggers = cv.CheckedList(Trigger, 'tally triggers', triggers) + self._triggers = cv.CheckedList(openmc.Trigger, 'tally triggers', + triggers) def add_trigger(self, trigger): """Add a tally trigger to the tally @@ -700,8 +699,8 @@ class Tally(object): return False # Return False if only one tally has a delayed group filter - tally1_dg = self.contains_filter(openmc.filter.DelayedGroupFilter) - tally2_dg = other.contains_filter(openmc.filter.DelayedGroupFilter) + tally1_dg = self.contains_filter(openmc.DelayedGroupFilter) + tally2_dg = other.contains_filter(openmc.DelayedGroupFilter) if sum([tally1_dg, tally2_dg]) == 1: return False @@ -1032,7 +1031,7 @@ class Tally(object): if len(self.nuclides) > 0: nuclides = '' for nuclide in self.nuclides: - if isinstance(nuclide, Nuclide): + if isinstance(nuclide, openmc.Nuclide): nuclides += '{0} '.format(nuclide.name) else: nuclides += '{0} '.format(nuclide) @@ -1070,7 +1069,7 @@ class Tally(object): Parameters ---------- - filter_type : openmc.filter.FilterMeta + filter_type : openmc.FilterMeta Type of the filter, e.g. MeshFilter Returns @@ -1096,7 +1095,7 @@ class Tally(object): Parameters ---------- - filter_type : openmc.filter.FilterMeta + filter_type : openmc.FilterMeta Type of the filter, e.g. MeshFilter Returns @@ -1122,7 +1121,7 @@ class Tally(object): # Also check to see if the desired filter is wrapped up in an # aggregate - elif isinstance(test_filter, AggregateFilter): + elif isinstance(test_filter, openmc.AggregateFilter): if isinstance(test_filter.aggregate_filter, filter_type): filter_found = test_filter break @@ -1140,7 +1139,7 @@ class Tally(object): Parameters ---------- - filter_type : openmc.filter.FilterMeta + filter_type : openmc.FilterMeta Type of the filter, e.g. MeshFilter filter_bin : int or tuple The bin is an integer ID for 'material', 'surface', 'cell', @@ -1191,7 +1190,7 @@ class Tally(object): for i, test_nuclide in enumerate(self.nuclides): # If the Summary was linked, then values are Nuclide objects - if isinstance(test_nuclide, Nuclide): + if isinstance(test_nuclide, openmc.Nuclide): if test_nuclide.name == nuclide: nuclide_index = i break @@ -1250,7 +1249,7 @@ class Tally(object): Parameters ---------- - filters : Iterable of openmc.filter.FilterMeta + filters : Iterable of openmc.FilterMeta An iterable of filter types (e.g., [MeshFilter, EnergyFilter]; default is []) filter_bins : Iterable of tuple @@ -1273,7 +1272,7 @@ class Tally(object): """ - cv.check_type('filters', filters, Iterable, openmc.filter.FilterMeta) + cv.check_type('filters', filters, Iterable, openmc.FilterMeta) cv.check_type('filter_bins', filter_bins, Iterable, tuple) # Determine the score indices from any of the requested scores @@ -1295,21 +1294,20 @@ class Tally(object): # If not a user-requested Filter, get all bins if not user_filter: # Create list of 2- or 3-tuples tuples for mesh cell bins - if isinstance(self_filter, openmc.filter.MeshFilter): + if isinstance(self_filter, openmc.MeshFilter): dimension = self_filter.mesh.dimension xyz = [range(1, x+1) for x in dimension] bins = list(itertools.product(*xyz)) # Create list of 2-tuples for energy boundary bins - elif isinstance(self_filter, (openmc.filter.EnergyFilter, - openmc.filter.EnergyoutFilter)): + elif isinstance(self_filter, (openmc.EnergyFilter, + openmc.EnergyoutFilter)): bins = [] for k in range(self_filter.num_bins): bins.append((self_filter.bins[k], self_filter.bins[k+1])) # Create list of cell instance IDs for distribcell Filters - elif isinstance(self_filter, - openmc.filter.DistribcellFilter): + elif isinstance(self_filter, openmc.DistribcellFilter): bins = np.arange(self_filter.num_bins) # Create list of IDs for bins for all other filter types @@ -1392,7 +1390,7 @@ class Tally(object): """ for score in scores: - if not isinstance(score, (basestring, CrossScore)): + if not isinstance(score, (basestring, openmc.CrossScore)): msg = 'Unable to get score indices for score "{0}" in Tally ' \ 'ID="{1}" since it is not a string or CrossScore'\ .format(score, self.id) @@ -1424,7 +1422,7 @@ class Tally(object): scores : list of str A list of one or more score strings (e.g., ['absorption', 'nu-fission']; default is []) - filters : Iterable of openmc.filter.FilterMeta + filters : Iterable of openmc.FilterMeta An iterable of filter types (e.g., [MeshFilter, EnergyFilter]; default is []) filter_bins : list of Iterables @@ -1568,9 +1566,9 @@ class Tally(object): column_name = 'nuclide' for nuclide in self.nuclides: - if isinstance(nuclide, Nuclide): + if isinstance(nuclide, openmc.Nuclide): nuclides.append(nuclide.name) - elif isinstance(nuclide, AggregateNuclide): + elif isinstance(nuclide, openmc.AggregateNuclide): nuclides.append(nuclide.name) column_name = '{0}(nuclide)'.format(nuclide.aggregate_op) else: @@ -1587,9 +1585,9 @@ class Tally(object): column_name = 'score' for score in self.scores: - if isinstance(score, (basestring, CrossScore)): + if isinstance(score, (basestring, openmc.CrossScore)): scores.append(str(score)) - elif isinstance(score, AggregateScore): + elif isinstance(score, openmc.AggregateScore): scores.append(score.name) column_name = '{0}(score)'.format(score.aggregate_op) @@ -1979,7 +1977,8 @@ class Tally(object): else: all_filters = [self_copy.filters, other_copy.filters] for self_filter, other_filter in itertools.product(*all_filters): - new_filter = CrossFilter(self_filter, other_filter, binary_op) + new_filter = openmc.CrossFilter(self_filter, other_filter, + binary_op) new_tally.filters.append(new_filter) # Add nuclides to the new tally @@ -1990,7 +1989,7 @@ class Tally(object): all_nuclides = [self_copy.nuclides, other_copy.nuclides] for self_nuclide, other_nuclide in itertools.product(*all_nuclides): new_nuclide = \ - CrossNuclide(self_nuclide, other_nuclide, binary_op) + openmc.CrossNuclide(self_nuclide, other_nuclide, binary_op) new_tally.nuclides.append(new_nuclide) # Add scores to the new tally @@ -2000,7 +1999,8 @@ class Tally(object): else: all_scores = [self_copy.scores, other_copy.scores] for self_score, other_score in itertools.product(*all_scores): - new_score = CrossScore(self_score, other_score, binary_op) + new_score = openmc.CrossScore(self_score, other_score, + binary_op) new_tally.scores.append(new_score) # Update the new tally's filter strides @@ -2229,12 +2229,12 @@ class Tally(object): # Construct lists of tuples for the bins in each of the two filters filters = [type(filter1), type(filter2)] - if isinstance(filter1, openmc.filter.DistribcellFilter): + if isinstance(filter1, openmc.DistribcellFilter): filter1_bins = np.arange(filter1.num_bins) else: filter1_bins = [filter1.get_bin(i) for i in range(filter1.num_bins)] - if isinstance(filter2, openmc.filter.DistribcellFilter): + if isinstance(filter2, openmc.DistribcellFilter): filter2_bins = np.arange(filter2.num_bins) else: filter2_bins = [filter2.get_bin(i) for i in range(filter2.num_bins)] @@ -2354,11 +2354,11 @@ class Tally(object): raise ValueError(msg) # Check that the scores are valid - if not isinstance(score1, (basestring, CrossScore)): + if not isinstance(score1, (basestring, openmc.CrossScore)): msg = 'Unable to swap score1 "{0}" in Tally ID="{1}" since it is ' \ 'not a string or CrossScore'.format(score1, self.id) raise ValueError(msg) - elif not isinstance(score2, (basestring, CrossScore)): + elif not isinstance(score2, (basestring, openmc.CrossScore)): msg = 'Unable to swap score2 "{0}" in Tally ID="{1}" since it is ' \ 'not a string or CrossScore'.format(score2, self.id) raise ValueError(msg) @@ -2876,7 +2876,7 @@ class Tally(object): scores : list of str A list of one or more score strings (e.g., ['absorption', 'nu-fission']; default is []) - filters : Iterable of openmc.filter.FilterMeta + filters : Iterable of openmc.FilterMeta An iterable of filter types (e.g., [MeshFilter, EnergyFilter]; default is []) filter_bins : list of Iterables @@ -2981,13 +2981,13 @@ class Tally(object): for filter_bin in filter_bins[i]: bin_index = find_filter.get_bin_index(filter_bin) - if filter_type in [openmc.filter.EnergyFilter, - openmc.filter.EnergyoutFilter]: + if filter_type in [openmc.EnergyFilter, + openmc.EnergyoutFilter]: bin_indices.extend([bin_index]) bin_indices.extend([bin_index, bin_index+1]) num_bins += 1 - elif filter_type in [openmc.filter.DistribcellFilter, - openmc.filter.MeshFilter]: + elif filter_type in [openmc.DistribcellFilter, + openmc.MeshFilter]: bin_indices = [0] num_bins = find_filter.num_bins else: @@ -3019,7 +3019,7 @@ class Tally(object): scores : list of str A list of one or more score strings to sum across (e.g., ['absorption', 'nu-fission']; default is []) - filter_type : openmc.filter.FilterMeta + filter_type : openmc.FilterMeta Type of the filter, e.g. MeshFilter filter_bins : Iterable of int or tuple A list of the filter bins corresponding to the filter_type parameter @@ -3058,14 +3058,14 @@ class Tally(object): std_dev = self.get_reshaped_data(value='std_dev') # Sum across any filter bins specified by the user - if isinstance(filter_type, openmc.filter.FilterMeta): + if isinstance(filter_type, openmc.FilterMeta): find_filter = self.find_filter(filter_type) # If user did not specify filter bins, sum across all bins if len(filter_bins) == 0: bin_indices = np.arange(find_filter.num_bins) - if isinstance(find_filter, openmc.filter.DistribcellFilter): + if isinstance(find_filter, openmc.DistribcellFilter): filter_bins = np.arange(find_filter.num_bins) else: num_bins = find_filter.num_bins @@ -3088,8 +3088,8 @@ class Tally(object): # Add AggregateFilter to the tally sum if not remove_filter: - filter_sum = \ - AggregateFilter(self_filter, [tuple(filter_bins)], 'sum') + filter_sum = openmc.AggregateFilter(self_filter, + [tuple(filter_bins)], 'sum') tally_sum.filters.append(filter_sum) # Add a copy of each filter not summed across to the tally sum @@ -3111,7 +3111,7 @@ class Tally(object): std_dev = np.sqrt(std_dev) # Add AggregateNuclide to the tally sum - nuclide_sum = AggregateNuclide(nuclides, 'sum') + nuclide_sum = openmc.AggregateNuclide(nuclides, 'sum') tally_sum.nuclides.append(nuclide_sum) # Add a copy of this tally's nuclides to the tally sum @@ -3129,7 +3129,7 @@ class Tally(object): std_dev = np.sqrt(std_dev) # Add AggregateScore to the tally sum - score_sum = AggregateScore(scores, 'sum') + score_sum = openmc.AggregateScore(scores, 'sum') tally_sum.scores.append(score_sum) # Add a copy of this tally's scores to the tally sum @@ -3166,7 +3166,7 @@ class Tally(object): scores : list of str A list of one or more score strings to average across (e.g., ['absorption', 'nu-fission']; default is []) - filter_type : openmc.filter.FilterMeta + filter_type : openmc.FilterMeta Type of the filter, e.g. MeshFilter filter_bins : Iterable of int or tuple A list of the filter bins corresponding to the filter_type parameter @@ -3205,14 +3205,14 @@ class Tally(object): std_dev = self.get_reshaped_data(value='std_dev') # Average across any filter bins specified by the user - if isinstance(filter_type, openmc.filter.FilterMeta): + if isinstance(filter_type, openmc.FilterMeta): find_filter = self.find_filter(filter_type) # If user did not specify filter bins, average across all bins if len(filter_bins) == 0: bin_indices = np.arange(find_filter.num_bins) - if isinstance(find_filter, openmc.filter.DistribcellFilter): + if isinstance(find_filter, openmc.DistribcellFilter): filter_bins = np.arange(find_filter.num_bins) else: num_bins = find_filter.num_bins @@ -3236,8 +3236,8 @@ class Tally(object): # Add AggregateFilter to the tally avg if not remove_filter: - filter_sum = \ - AggregateFilter(self_filter, [tuple(filter_bins)], 'avg') + filter_sum = openmc.AggregateFilter(self_filter, + [tuple(filter_bins)], 'avg') tally_avg.filters.append(filter_sum) # Add a copy of each filter not averaged across to the tally avg @@ -3260,7 +3260,7 @@ class Tally(object): std_dev = np.sqrt(std_dev) # Add AggregateNuclide to the tally avg - nuclide_avg = AggregateNuclide(nuclides, 'avg') + nuclide_avg = openmc.AggregateNuclide(nuclides, 'avg') tally_avg.nuclides.append(nuclide_avg) # Add a copy of this tally's nuclides to the tally avg @@ -3279,7 +3279,7 @@ class Tally(object): std_dev = np.sqrt(std_dev) # Add AggregateScore to the tally avg - score_sum = AggregateScore(scores, 'avg') + score_sum = openmc.AggregateScore(scores, 'avg') tally_avg.scores.append(score_sum) # Add a copy of this tally's scores to the tally avg @@ -3554,7 +3554,7 @@ class Tallies(cv.CheckedList): already_written = set() for tally in self: for f in tally.filters: - if isinstance(f, openmc.filter.MeshFilter): + if isinstance(f, openmc.MeshFilter): if f.mesh not in already_written: if len(f.mesh.name) > 0: self._tallies_file.append(ET.Comment(f.mesh.name))