From 42f438dcabeedc19a07b97bca5c97d7a7a3fe069 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 7 Dec 2015 22:06:56 -0500 Subject: [PATCH 01/61] shortened and fixed _align_tally_data routine --- openmc/tallies.py | 80 ++++++++++------------------------------------- 1 file changed, 17 insertions(+), 63 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 13a219dedd..ba5d19dfde 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1625,6 +1625,10 @@ class Tally(object): other_mean = copy.deepcopy(other.mean) other_std_dev = copy.deepcopy(other.std_dev) + # Initialize list of tile and repeat factors + repeat_factors = [1, 1, 1] + tile_factors = [1, 1, 1] + if self.filters != other.filters: # Determine the number of paired combinations of filter bins @@ -1634,83 +1638,33 @@ class Tally(object): # Determine the factors by which each tally operands' data arrays # must be tiled or repeated for the tally outer product - other_tile_factor = 1 - self_repeat_factor = 1 for filter in diff1: - other_tile_factor *= filter.num_bins + tile_factors[0] *= filter.num_bins for filter in diff2: - self_repeat_factor *= filter.num_bins - - # Tile / repeat the tally data for the tally outer product - self_shape = list(self_mean.shape) - other_shape = list(other_mean.shape) - self_shape[0] *= self_repeat_factor - self_mean = np.repeat(self_mean, self_repeat_factor) - self_std_dev = np.repeat(self_std_dev, self_repeat_factor) - - if self_repeat_factor == 1: - other_shape[0] *= other_tile_factor - other_mean = np.repeat(other_mean, other_tile_factor, axis=0) - other_std_dev = np.repeat(other_std_dev, other_tile_factor, - axis=0) - else: - other_mean = np.tile(other_mean, (other_tile_factor, 1, 1)) - other_std_dev = np.tile(other_std_dev, (other_tile_factor, 1, 1)) - - # NumPy repeat and tile routines return 1D flattened arrays - # Reshape arrays as 3D with filters, nuclides and scores axes - self_mean.shape = tuple(self_shape) - self_std_dev.shape = tuple(self_shape) - other_mean.shape = tuple(other_shape) - other_std_dev.shape = tuple(other_shape) + repeat_factors[0] *= filter.num_bins if self.nuclides != other.nuclides: # Determine the number of paired combinations of nuclides # between the two tallies and repeat arrays along nuclide axes - self_repeat_factor = other.num_nuclides - other_tile_factor = self.num_nuclides - - # Tile / repeat the tally data for the tally outer product - self_shape = list(self_mean.shape) - other_shape = list(other_mean.shape) - self_shape[1] *= self_repeat_factor - other_shape[1] *= other_tile_factor - self_mean = np.repeat(self_mean, self_repeat_factor, axis=1) - other_mean = np.tile(other_mean, (1, other_tile_factor, 1)) - self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=1) - other_std_dev = np.tile(other_std_dev, (1, other_tile_factor, 1)) - - # NumPy repeat and tile routines return 1D flattened arrays - # Reshape arrays as 3D with filters, nuclides and scores axes - self_mean.shape = tuple(self_shape) - self_std_dev.shape = tuple(self_shape) - other_mean.shape = tuple(other_shape) - other_std_dev.shape = tuple(other_shape) + repeat_factors[1] = other.num_nuclides + tile_factors[1] = self.num_nuclides if self.scores != other.scores: # Determine the number of paired combinations of score bins # between the two tallies and repeat arrays along score axes - self_repeat_factor = other.num_score_bins - other_tile_factor = self.num_score_bins + repeat_factors[2] = other.num_score_bins + tile_factors[2] = self.num_score_bins - # Tile / repeat the tally data for the tally outer product - self_shape = list(self_mean.shape) - other_shape = list(other_mean.shape) - self_shape[2] *= self_repeat_factor - other_shape[2] *= other_tile_factor - self_mean = np.repeat(self_mean, self_repeat_factor, axis=2) - other_mean = np.tile(other_mean, (1, 1, other_tile_factor)) - self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=2) - other_std_dev = np.tile(other_std_dev, (1, 1, other_tile_factor)) + # Repeat the self tally + for i in range(3): + self_mean = np.repeat(self_mean, repeat_factors[i], axis=i) + self_std_dev = np.repeat(self_std_dev, repeat_factors[i], axis=i) - # NumPy repeat and tile routines return 1D flattened arrays - # Reshape arrays as 3D with filters, nuclides and scores axes - self_mean.shape = tuple(self_shape) - self_std_dev.shape = tuple(self_shape) - other_mean.shape = tuple(other_shape) - other_std_dev.shape = tuple(other_shape) + # Tile the other tally + other_mean = np.tile(other_mean, tile_factors) + other_std_dev = np.tile(other_std_dev, tile_factors) data = {} data['self'] = {} From b17a8e07e3ae085653b4c57ff2bee6e941dc28e0 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 8 Dec 2015 13:19:02 -0500 Subject: [PATCH 02/61] added test for tally arithmetic --- tests/test_tally_arithmetic/geometry.xml | 8 ++ tests/test_tally_arithmetic/materials.xml | 11 +++ tests/test_tally_arithmetic/results_true.dat | 49 ++++++++++ tests/test_tally_arithmetic/settings.xml | 18 ++++ .../test_tally_arithmetic.py | 91 +++++++++++++++++++ 5 files changed, 177 insertions(+) create mode 100644 tests/test_tally_arithmetic/geometry.xml create mode 100644 tests/test_tally_arithmetic/materials.xml create mode 100644 tests/test_tally_arithmetic/results_true.dat create mode 100644 tests/test_tally_arithmetic/settings.xml create mode 100644 tests/test_tally_arithmetic/test_tally_arithmetic.py diff --git a/tests/test_tally_arithmetic/geometry.xml b/tests/test_tally_arithmetic/geometry.xml new file mode 100644 index 0000000000..bc56030e18 --- /dev/null +++ b/tests/test_tally_arithmetic/geometry.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/tests/test_tally_arithmetic/materials.xml b/tests/test_tally_arithmetic/materials.xml new file mode 100644 index 0000000000..e7947a92da --- /dev/null +++ b/tests/test_tally_arithmetic/materials.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/tests/test_tally_arithmetic/results_true.dat b/tests/test_tally_arithmetic/results_true.dat new file mode 100644 index 0000000000..85183e3e8f --- /dev/null +++ b/tests/test_tally_arithmetic/results_true.dat @@ -0,0 +1,49 @@ +Tally + ID = 10000 + Name = (tally 1 + tally 2) + Filters = + energy [ 0. 20.] + (cell + material) (array([1]), array([1])) + Nuclides = (U-235 + U-235) (U-235 + Pu-239) (U-238 + U-235) (U-238 + Pu-239) + Scores = [(fission + fission), (fission + absorption), (nu-fission + fission), (nu-fission + absorption)] + Estimator = tracklength +[[[ 0.07510122 0.07839105 0.13713377 0.1404236 ] + [ 0.0916553 0.09321683 0.15368785 0.15524938] + [ 0.04596277 0.0492526 0.06126275 0.06455259] + [ 0.06251685 0.06407838 0.07781683 0.07937836]]]Tally + ID = 10001 + Name = (tally 1 - tally 2) + Filters = + energy [ 0. 20.] + (cell - material) (array([1]), array([1])) + Nuclides = (U-235 - U-235) (U-235 - Pu-239) (U-238 - U-235) (U-238 - Pu-239) + Scores = [(fission - fission), (fission - absorption), (nu-fission - fission), (nu-fission - absorption)] + Estimator = tracklength +[[[ 0. -0.00328983 0.06203255 0.05874271] + [-0.01655408 -0.01811561 0.04547847 0.04391694] + [-0.02913845 -0.03242829 -0.01383847 -0.0171283 ] + [-0.04569253 -0.04725406 -0.03039255 -0.03195408]]]Tally + ID = 10002 + Name = (tally 1 * tally 2) + Filters = + energy [ 0. 20.] + (cell * material) (array([1]), array([1])) + Nuclides = (U-235 * U-235) (U-235 * Pu-239) (U-238 * U-235) (U-238 * Pu-239) + Scores = [(fission * fission), (fission * absorption), (nu-fission * fission), (nu-fission * absorption)] + Estimator = tracklength +[[[ 0.00141005 0.00153358 0.00373941 0.00406702] + [ 0.00203166 0.0020903 0.00538792 0.00554342] + [ 0.00031588 0.00034356 0.00089041 0.00096841] + [ 0.00045514 0.00046827 0.00128294 0.00131997]]]Tally + ID = 10003 + Name = (tally 1 / tally 2) + Filters = + energy [ 0. 20.] + (cell / material) (array([1]), array([1])) + Nuclides = (U-235 / U-235) (U-235 / Pu-239) (U-238 / U-235) (U-238 / Pu-239) + Scores = [(fission / fission), (fission / absorption), (nu-fission / fission), (nu-fission / absorption)] + Estimator = tracklength +[[[ 1. 0.91944666 2.65197177 2.4383466 ] + [ 0.69403611 0.67456727 1.84056418 1.78893335] + [ 0.22402189 0.20597618 0.63147153 0.58060439] + [ 0.15547928 0.15111784 0.43826405 0.42597002]]] \ No newline at end of file diff --git a/tests/test_tally_arithmetic/settings.xml b/tests/test_tally_arithmetic/settings.xml new file mode 100644 index 0000000000..a69dde686a --- /dev/null +++ b/tests/test_tally_arithmetic/settings.xml @@ -0,0 +1,18 @@ + + + + + 10 + 5 + 1000 + + + + + -4 -4 -4 4 4 4 + + + + + + diff --git a/tests/test_tally_arithmetic/test_tally_arithmetic.py b/tests/test_tally_arithmetic/test_tally_arithmetic.py new file mode 100644 index 0000000000..ee1a7a6481 --- /dev/null +++ b/tests/test_tally_arithmetic/test_tally_arithmetic.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python + +import os +import sys +import glob +import hashlib +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness +import openmc + + +class TallyArithmeticTestHarness(TestHarness): + def _build_inputs(self): + + u235 = openmc.Nuclide('U-235') + u238 = openmc.Nuclide('U-238') + pu239 = openmc.Nuclide('Pu-239') + + # Instantiate energy filter + energy_filter = openmc.Filter(type='energy', bins=[0., 20.]) + + # Create tallies + tally_1 = openmc.Tally(name='tally 1') + tally_1.add_filter(openmc.Filter(type='cell', bins=[1])) + tally_1.add_filter(energy_filter) + tally_1.add_score('fission') + tally_1.add_score('nu-fission') + tally_1.add_nuclide(u235) + tally_1.add_nuclide(u238) + + tally_2 = openmc.Tally(name='tally 2') + tally_2.add_filter(openmc.Filter(type='material', bins=[1])) + tally_2.add_filter(energy_filter) + tally_2.add_score('fission') + tally_2.add_score('absorption') + tally_2.add_nuclide(u235) + tally_2.add_nuclide(pu239) + + # Export tallies to file + tallies_file = openmc.TalliesFile() + tallies_file.add_tally(tally_1) + tallies_file.add_tally(tally_2) + tallies_file.export_to_xml() + + def _get_results(self, hash_output=False): + """Digest info in the statepoint and return as a string.""" + + # Read the statepoint file. + statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] + sp = openmc.StatePoint(statepoint) + + # Read the summary file. + summary = glob.glob(os.path.join(os.getcwd(), 'summary.h5'))[0] + su = openmc.Summary(summary) + sp.link_with_summary(su) + + # Load the tallies + tally_1 = sp.get_tally(name='tally 1') + tally_2 = sp.get_tally(name='tally 2') + + # Perform all the tally arithmetic operations and output results + outstr = '' + tally_3 = tally_1 + tally_2 + outstr += tally_3.__repr__() + outstr += str(tally_3.mean) + + tally_3 = tally_1 - tally_2 + outstr += tally_3.__repr__() + outstr += str(tally_3.mean) + + tally_3 = tally_1 * tally_2 + outstr += tally_3.__repr__() + outstr += str(tally_3.mean) + + tally_3 = tally_1 / tally_2 + outstr += tally_3.__repr__() + outstr += str(tally_3.mean) + + print(outstr) + + # Hash the results if necessary + if hash_output: + sha512 = hashlib.sha512() + sha512.update(outstr.encode('utf-8')) + outstr = sha512.hexdigest() + + return outstr + +if __name__ == '__main__': + harness = TallyArithmeticTestHarness('statepoint.10.*', True) + harness.main() From b81fa69db3907d129163eff8a6b83dc8d7b38761 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 8 Dec 2015 13:27:45 -0500 Subject: [PATCH 03/61] added tallies.xml file to tally arithmetic test --- tests/test_tally_arithmetic/tallies.xml | 15 +++++++++ .../test_tally_arithmetic.py | 32 ------------------- 2 files changed, 15 insertions(+), 32 deletions(-) create mode 100644 tests/test_tally_arithmetic/tallies.xml diff --git a/tests/test_tally_arithmetic/tallies.xml b/tests/test_tally_arithmetic/tallies.xml new file mode 100644 index 0000000000..2a2eb48361 --- /dev/null +++ b/tests/test_tally_arithmetic/tallies.xml @@ -0,0 +1,15 @@ + + + + + + U-235 U-238 + fission nu-fission + + + + + U-235 Pu-239 + fission absorption + + diff --git a/tests/test_tally_arithmetic/test_tally_arithmetic.py b/tests/test_tally_arithmetic/test_tally_arithmetic.py index ee1a7a6481..f71c960e92 100644 --- a/tests/test_tally_arithmetic/test_tally_arithmetic.py +++ b/tests/test_tally_arithmetic/test_tally_arithmetic.py @@ -10,38 +10,6 @@ import openmc class TallyArithmeticTestHarness(TestHarness): - def _build_inputs(self): - - u235 = openmc.Nuclide('U-235') - u238 = openmc.Nuclide('U-238') - pu239 = openmc.Nuclide('Pu-239') - - # Instantiate energy filter - energy_filter = openmc.Filter(type='energy', bins=[0., 20.]) - - # Create tallies - tally_1 = openmc.Tally(name='tally 1') - tally_1.add_filter(openmc.Filter(type='cell', bins=[1])) - tally_1.add_filter(energy_filter) - tally_1.add_score('fission') - tally_1.add_score('nu-fission') - tally_1.add_nuclide(u235) - tally_1.add_nuclide(u238) - - tally_2 = openmc.Tally(name='tally 2') - tally_2.add_filter(openmc.Filter(type='material', bins=[1])) - tally_2.add_filter(energy_filter) - tally_2.add_score('fission') - tally_2.add_score('absorption') - tally_2.add_nuclide(u235) - tally_2.add_nuclide(pu239) - - # Export tallies to file - tallies_file = openmc.TalliesFile() - tallies_file.add_tally(tally_1) - tallies_file.add_tally(tally_2) - tallies_file.export_to_xml() - def _get_results(self, hash_output=False): """Digest info in the statepoint and return as a string.""" From 4888662b9cf543d31203ddf82961055442b1b9f5 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 9 Dec 2015 10:41:19 -0500 Subject: [PATCH 04/61] fixed tally arithmetic to work with unique filters in both tally operands --- openmc/mgxs/mgxs.py | 12 +- openmc/tallies.py | 152 +++++++++--------- tests/test_tally_arithmetic/results_true.dat | 12 +- .../test_tally_arithmetic.py | 10 +- 4 files changed, 98 insertions(+), 88 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 635c822e31..597e28e292 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -47,7 +47,7 @@ _DOMAINS = [openmc.Cell, class MGXS(object): - """An abstract multi-group cross section for some energy group structure + """An abstract multi-group cross section for some energy group structure within some spatial domain. This class can be used for both OpenMC input generation and tally data @@ -95,7 +95,7 @@ class MGXS(object): num_sumbdomains : Integral The number of subdomains is unity for 'material', 'cell' and 'universe' domain types. When the This is equal to the number of cell instances - for 'distribcell' domain types (it is equal to unity prior to loading + for 'distribcell' domain types (it is equal to unity prior to loading tally data from a statepoint file). num_nuclides : Integral The number of nuclides for which the multi-group cross section is @@ -1420,8 +1420,8 @@ class AbsorptionXS(MGXS): class CaptureXS(MGXS): """A capture multi-group cross section. - - The Neutron capture reaction rate is defined as the difference between + + The Neutron capture reaction rate is defined as the difference between OpenMC's 'absorption' and 'fission' reaction rate score types. This includes not only radiative capture, but all forms of neutron disappearance aside from fission (e.g., MT > 100). @@ -1723,8 +1723,8 @@ class ScatterMatrixXS(MGXS): if self.correction == 'P0': scatter_p1 = self.tallies['scatter-P1'] scatter_p1 = scatter_p1.get_slice(scores=['scatter-P1']) - energy_filter = openmc.Filter(type='energy') - energy_filter.bins = self.energy_groups.group_edges + energy_filter = copy.deepcopy(self.tallies['scatter']. + find_filter('energy')) scatter_p1 = scatter_p1.diagonalize_filter(energy_filter) rxn_tally = self.tallies['scatter'] - scatter_p1 else: diff --git a/openmc/tallies.py b/openmc/tallies.py index ba5d19dfde..3eec325ab9 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1200,12 +1200,12 @@ class Tally(object): # Tile the nuclide bins into a DataFrame column nuclides = np.repeat(nuclides, len(self.scores)) tile_factor = data_size / len(nuclides) - df['nuclide'] = np.tile(nuclides, tile_factor) + df['nuclide'] = np.tile(nuclides, int(tile_factor)) # Include column for scores if user requested it if scores: tile_factor = data_size / len(self.scores) - df['score'] = np.tile(self.scores, tile_factor) + df['score'] = np.tile(self.scores, int(tile_factor)) # Append columns with mean, std. dev. for each tally bin df['mean'] = self.mean.ravel() @@ -1425,25 +1425,30 @@ class Tally(object): # Pickle the Tally results to a file pickle.dump(tally_results, open(filename, 'wb')) - def _outer_product(self, other, binary_op): + def _hybrid_product(self, other, binary_op): """Combines filters, scores and nuclides with another tally. - This is a helper method for the tally arithmetic methods. The filters, - scores and nuclides from both tallies are enumerated into all possible - combinations and expressed as CrossFilter, CrossScore and - CrossNuclide objects in the new derived tally. + This is a helper method for the tally arithmetic methods. It is called a + "hybrid product" because it performs a combination of a tensor + (or Kronecker) product and entrywise (or Hadamard) product. The filters, + nuclides, and scores from both tallies are combined using an entrywise + (or Hadamard) product on matching filters. If all nuclides are identical + in the two tallies, the entrywise product is performed across nuclides; + else the tensor product is performed. If all scores are identical in the + two tallies, the entrywise product is performed across scores; else the + tensor product is performed. Parameters ---------- other : Tally - The tally on the right hand side of the outer product + The tally on the right hand side of the hybrid product binary_op : {'+', '-', '*', '/', '^'} - The binary operation in the outer product + The binary operation in the hybrid product Returns ------- Tally - A new Tally that is the outer product with this one. + A new Tally that is the hybrid product with this one. Raises ------ @@ -1473,25 +1478,6 @@ class Tally(object): self_copy = copy.deepcopy(self) other_copy = copy.deepcopy(other) - # Find any shared filters between the two tallies - filter_intersect = [] - for filter in self_copy.filters: - if filter in other_copy.filters: - filter_intersect.append(filter) - - # Align the shared filters in successive order - for i, filter in enumerate(filter_intersect): - self_index = self_copy.filters.index(filter) - other_index = other_copy.filters.index(filter) - - # If necessary, swap self filter - if self_index != i: - self_copy.swap_filters(filter, self_copy.filters[i], inplace=True) - - # If necessary, swap other filter - if other_index != i: - other_copy.swap_filters(filter, other_copy.filters[i], inplace=True) - data = self_copy._align_tally_data(other_copy) if binary_op == '+': @@ -1535,7 +1521,7 @@ class Tally(object): for self_filter in self_copy.filters: new_tally.add_filter(self_filter) - # Generate filter "outer products" for non-identical filters + # Generate filter entrywise product for non-identical filters else: # Find the common longest sequence of shared filters @@ -1600,7 +1586,7 @@ class Tally(object): This is a helper method to construct a dict of dicts of the "aligned" data arrays from each tally for tally arithmetic. The method analyzes - the filters, scores and nuclides in both tally's and determines how to + the filters, scores and nuclides in both tallies and determines how to appropriately align the data for vectorized arithmetic. For example, if the two tallies have different filters, this method will use NumPy 'tile' and 'repeat' operations to the new data arrays such that all @@ -1620,51 +1606,71 @@ class Tally(object): """ + # Get the set of filters that each tally is missing + other_missing_filters = set(self.filters).difference(set(other.filters)) + self_missing_filters = set(other.filters).difference(set(self.filters)) + + # Add other_missing_filters to other + for filter in other_missing_filters: + filter = copy.deepcopy(filter) + repeat_factor = filter.num_bins + other._mean = np.repeat(other.mean, repeat_factor, axis=0) + other.sum = np.repeat(other.sum, repeat_factor, axis=0) + other._std_dev = np.repeat(other.std_dev, repeat_factor, axis=0) + other.sum_sq = np.repeat(other.sum_sq, repeat_factor, axis=0) + other.add_filter(filter) + + # Correct the stride for other filters + stride = other.num_nuclides * other.num_score_bins + for filter in reversed(other.filters): + filter.stride = stride + stride *= filter.num_bins + + # Add self_missing_filters to self + for filter in self_missing_filters: + filter = copy.deepcopy(filter) + repeat_factor = filter.num_bins + self._mean = np.repeat(self.mean, repeat_factor, axis=0) + self.sum = np.repeat(self.sum, repeat_factor, axis=0) + self._std_dev = np.repeat(self.std_dev, repeat_factor, axis=0) + self.sum_sq = np.repeat(self.sum_sq, repeat_factor, axis=0) + self.add_filter(filter) + + # Correct the stride for self filters + stride = self.num_nuclides * self.num_score_bins + for filter in reversed(self.filters): + filter.stride = stride + stride *= filter.num_bins + + # Align other filters with self filters + for i, filter in enumerate(self.filters): + other_index = other.filters.index(filter) + + # If necessary, swap other filter + if other_index != i: + other.swap_filters(filter, other.filters[i], inplace=True) + + # Deep copy the mean and std dev data self_mean = copy.deepcopy(self.mean) self_std_dev = copy.deepcopy(self.std_dev) other_mean = copy.deepcopy(other.mean) other_std_dev = copy.deepcopy(other.std_dev) - # Initialize list of tile and repeat factors - repeat_factors = [1, 1, 1] - tile_factors = [1, 1, 1] - - if self.filters != other.filters: - - # Determine the number of paired combinations of filter bins - # between the two tallies and repeat arrays along filter axes - diff1 = list(set(self.filters).difference(set(other.filters))) - diff2 = list(set(other.filters).difference(set(self.filters))) - - # Determine the factors by which each tally operands' data arrays - # must be tiled or repeated for the tally outer product - for filter in diff1: - tile_factors[0] *= filter.num_bins - for filter in diff2: - repeat_factors[0] *= filter.num_bins - + # If the tallies do not have identical sets of nuclides, tile and repeat + # to perform cross product of data for each nuclide if self.nuclides != other.nuclides: + self_mean = np.repeat(self_mean, other.num_nuclides, axis=1) + self_std_dev = np.repeat(self_std_dev, other.num_nuclides, axis=1) + other_mean = np.tile(other_mean, (1, self.num_nuclides, 1)) + other_std_dev = np.tile(other_std_dev, (1, self.num_nuclides, 1)) - # Determine the number of paired combinations of nuclides - # between the two tallies and repeat arrays along nuclide axes - repeat_factors[1] = other.num_nuclides - tile_factors[1] = self.num_nuclides - + # If the tallies do not have identical sets of scores, tile and repeat + # to perform cross product of data for each score if self.scores != other.scores: - - # Determine the number of paired combinations of score bins - # between the two tallies and repeat arrays along score axes - repeat_factors[2] = other.num_score_bins - tile_factors[2] = self.num_score_bins - - # Repeat the self tally - for i in range(3): - self_mean = np.repeat(self_mean, repeat_factors[i], axis=i) - self_std_dev = np.repeat(self_std_dev, repeat_factors[i], axis=i) - - # Tile the other tally - other_mean = np.tile(other_mean, tile_factors) - other_std_dev = np.tile(other_std_dev, tile_factors) + self_mean = np.repeat(self_mean, other.num_score_bins, axis=2) + self_std_dev = np.repeat(self_std_dev, other.num_score_bins, axis=2) + other_mean = np.tile(other_mean, (1, 1, self.num_score_bins)) + other_std_dev = np.tile(other_std_dev, (1, 1, self.num_score_bins)) data = {} data['self'] = {} @@ -1845,7 +1851,7 @@ class Tally(object): raise ValueError(msg) if isinstance(other, Tally): - new_tally = self._outer_product(other, binary_op='+') + new_tally = self._hybrid_product(other, binary_op='+') elif isinstance(other, Real): new_tally = Tally(name='derived') @@ -1915,7 +1921,7 @@ class Tally(object): raise ValueError(msg) if isinstance(other, Tally): - new_tally = self._outer_product(other, binary_op='-') + new_tally = self._hybrid_product(other, binary_op='-') elif isinstance(other, Real): new_tally = Tally(name='derived') @@ -1985,7 +1991,7 @@ class Tally(object): raise ValueError(msg) if isinstance(other, Tally): - new_tally = self._outer_product(other, binary_op='*') + new_tally = self._hybrid_product(other, binary_op='*') elif isinstance(other, Real): new_tally = Tally(name='derived') @@ -2055,7 +2061,7 @@ class Tally(object): raise ValueError(msg) if isinstance(other, Tally): - new_tally = self._outer_product(other, binary_op='/') + new_tally = self._hybrid_product(other, binary_op='/') elif isinstance(other, Real): new_tally = Tally(name='derived') @@ -2128,7 +2134,7 @@ class Tally(object): raise ValueError(msg) if isinstance(power, Tally): - new_tally = self._outer_product(power, binary_op='^') + new_tally = self._hybrid_product(power, binary_op='^') elif isinstance(power, Real): new_tally = Tally(name='derived') diff --git a/tests/test_tally_arithmetic/results_true.dat b/tests/test_tally_arithmetic/results_true.dat index 85183e3e8f..23dd38cfb6 100644 --- a/tests/test_tally_arithmetic/results_true.dat +++ b/tests/test_tally_arithmetic/results_true.dat @@ -2,8 +2,9 @@ Tally ID = 10000 Name = (tally 1 + tally 2) Filters = + cell [1] energy [ 0. 20.] - (cell + material) (array([1]), array([1])) + material [1] Nuclides = (U-235 + U-235) (U-235 + Pu-239) (U-238 + U-235) (U-238 + Pu-239) Scores = [(fission + fission), (fission + absorption), (nu-fission + fission), (nu-fission + absorption)] Estimator = tracklength @@ -14,8 +15,9 @@ Tally ID = 10001 Name = (tally 1 - tally 2) Filters = + cell [1] energy [ 0. 20.] - (cell - material) (array([1]), array([1])) + material [1] Nuclides = (U-235 - U-235) (U-235 - Pu-239) (U-238 - U-235) (U-238 - Pu-239) Scores = [(fission - fission), (fission - absorption), (nu-fission - fission), (nu-fission - absorption)] Estimator = tracklength @@ -26,8 +28,9 @@ Tally ID = 10002 Name = (tally 1 * tally 2) Filters = + cell [1] energy [ 0. 20.] - (cell * material) (array([1]), array([1])) + material [1] Nuclides = (U-235 * U-235) (U-235 * Pu-239) (U-238 * U-235) (U-238 * Pu-239) Scores = [(fission * fission), (fission * absorption), (nu-fission * fission), (nu-fission * absorption)] Estimator = tracklength @@ -38,8 +41,9 @@ Tally ID = 10003 Name = (tally 1 / tally 2) Filters = + cell [1] energy [ 0. 20.] - (cell / material) (array([1]), array([1])) + material [1] Nuclides = (U-235 / U-235) (U-235 / Pu-239) (U-238 / U-235) (U-238 / Pu-239) Scores = [(fission / fission), (fission / absorption), (nu-fission / fission), (nu-fission / absorption)] Estimator = tracklength diff --git a/tests/test_tally_arithmetic/test_tally_arithmetic.py b/tests/test_tally_arithmetic/test_tally_arithmetic.py index f71c960e92..2f49061f96 100644 --- a/tests/test_tally_arithmetic/test_tally_arithmetic.py +++ b/tests/test_tally_arithmetic/test_tally_arithmetic.py @@ -29,19 +29,19 @@ class TallyArithmeticTestHarness(TestHarness): # Perform all the tally arithmetic operations and output results outstr = '' tally_3 = tally_1 + tally_2 - outstr += tally_3.__repr__() + outstr += repr(tally_3) outstr += str(tally_3.mean) tally_3 = tally_1 - tally_2 - outstr += tally_3.__repr__() + outstr += repr(tally_3) outstr += str(tally_3.mean) tally_3 = tally_1 * tally_2 - outstr += tally_3.__repr__() + outstr += repr(tally_3) outstr += str(tally_3.mean) tally_3 = tally_1 / tally_2 - outstr += tally_3.__repr__() + outstr += repr(tally_3) outstr += str(tally_3.mean) print(outstr) @@ -55,5 +55,5 @@ class TallyArithmeticTestHarness(TestHarness): return outstr if __name__ == '__main__': - harness = TallyArithmeticTestHarness('statepoint.10.*', True) + harness = TallyArithmeticTestHarness('statepoint.10.h5', True) harness.main() From 4d3046a5976998b7371ebd5de856213e2972333a Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 10 Dec 2015 00:53:01 -0500 Subject: [PATCH 05/61] added capability to perform tensor or entrywise products across nuclides and scores in tally arithmetic --- openmc/tallies.py | 395 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 303 insertions(+), 92 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 3eec325ab9..5656987cbf 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -24,6 +24,7 @@ if sys.version_info[0] >= 3: # "Static" variable for auto-generated Tally IDs AUTO_TALLY_ID = 10000 +_PRODUCT_TYPES = ['tensor', 'entrywise'] def reset_auto_tally_id(): global AUTO_TALLY_ID @@ -1425,18 +1426,20 @@ class Tally(object): # Pickle the Tally results to a file pickle.dump(tally_results, open(filename, 'wb')) - def _hybrid_product(self, other, binary_op): + def hybrid_product(self, other, binary_op, filter_product='None', + nuclide_product='None', score_product='None'): """Combines filters, scores and nuclides with another tally. This is a helper method for the tally arithmetic methods. It is called a - "hybrid product" because it performs a combination of a tensor - (or Kronecker) product and entrywise (or Hadamard) product. The filters, + "hybrid product" because it performs a combination of tensor + (or Kronecker) and entrywise (or Hadamard) products. The filters, nuclides, and scores from both tallies are combined using an entrywise - (or Hadamard) product on matching filters. If all nuclides are identical - in the two tallies, the entrywise product is performed across nuclides; - else the tensor product is performed. If all scores are identical in the - two tallies, the entrywise product is performed across scores; else the - tensor product is performed. + (or Hadamard) product on matching filters. By default, if all nuclides + are identical in the two tallies, the entrywise product is performed + across nuclides; else the tensor product is performed. By default, if all + scores are identical in the two tallies, the entrywise product is + performed across scores; else the tensor product is performed. Users can + also call the method explicitly and specify the desired product. Parameters ---------- @@ -1444,6 +1447,21 @@ class Tally(object): The tally on the right hand side of the hybrid product binary_op : {'+', '-', '*', '/', '^'} The binary operation in the hybrid product + filter_product : str, optional + The type of product (tensor or entrywise) to be performed between + filter data. The default is the entrywise product. Currently only + the entrywise product is supported since a tally cannot contain + two of the same tallies. + nuclide_product : str, optional + The type of product (tensor or entrywise) to be performed between + nuclide data. The default is the entrywise product if all nuclides + between the two tallies are the same; otherwise the default is + the tensor product. + score_product : str, optional + The type of product (tensor or entrywise) to be performed between + score data. The default is the entrywise product if all scores + between the two tallies are the same; otherwise the default is + the tensor product. Returns ------- @@ -1458,6 +1476,33 @@ class Tally(object): """ + # Set default value for filter product if it was not set + if filter_product == 'None': + filter_product = 'entrywise' + elif filter_product == 'tensor': + msg = 'Unable to perform Tally arithmetic with a tensor product' \ + 'for the filter data as this not currently supported.' + raise ValueError(msg) + + # Set default value for nuclide product if it was not set + if nuclide_product == 'None': + if self.nuclides == other.nuclides: + nuclide_product = 'entrywise' + else: + nuclide_product = 'tensor' + + # Set default value for score product if it was not set + if score_product == 'None': + if self.scores == other.scores: + score_product = 'entrywise' + else: + score_product = 'tensor' + + # Check product types + cv.check_value('filter product', filter_product, _PRODUCT_TYPES) + cv.check_value('nuclide product', nuclide_product, _PRODUCT_TYPES) + cv.check_value('score product', score_product, _PRODUCT_TYPES) + # Check that results have been read if not other.derived and other.sum is None: msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ @@ -1473,13 +1518,23 @@ class Tally(object): new_name = '({0} {1} {2})'.format(self.name, binary_op, other.name) new_tally.name = new_name + # Query the mean and std dev so the tally data is read in from file + # if it has not present + self.mean + self.std_dev + other.mean + other.std_dev + # Create copies of self and other tallies to rearrange for tally # arithmetic self_copy = copy.deepcopy(self) other_copy = copy.deepcopy(other) - data = self_copy._align_tally_data(other_copy) + # Align the tally data based on desired hybrid product + data = self_copy._align_tally_data(other_copy, filter_product, + nuclide_product, score_product) + # Perform tally arithmetic operation if binary_op == '+': new_tally._mean = data['self']['mean'] + data['other']['mean'] new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + @@ -1509,6 +1564,13 @@ class Tally(object): new_tally._std_dev = np.abs(new_tally.mean) * \ np.sqrt(first_term**2 + second_term**2) + # Convert any infs and nans to zero + new_tally._mean[np.isinf(new_tally._mean)] = 0 + new_tally._mean = np.nan_to_num(new_tally._mean) + new_tally._std_dev[np.isinf(new_tally._std_dev)] = 0 + new_tally._std_dev = np.nan_to_num(new_tally._std_dev) + + # Set tally attributes if self_copy.estimator == other_copy.estimator: new_tally.estimator = self_copy.estimator if self_copy.with_summary and other_copy.with_summary: @@ -1516,43 +1578,28 @@ class Tally(object): if self_copy.num_realizations == other_copy.num_realizations: new_tally.num_realizations = self_copy.num_realizations - # If filters are identical, simply reuse them in derived tally - if self_copy.filters == other_copy.filters: + # Add filters to the new tally + if filter_product == 'entrywise': for self_filter in self_copy.filters: - new_tally.add_filter(self_filter) - - # Generate filter entrywise product for non-identical filters + new_tally.filters.append(self_filter) 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_tally.add_filter(new_filter) - # Find the common longest sequence of shared filters - match = 0 - for self_filter, other_filter in zip(self_copy.filters, other_copy.filters): - if self_filter == other_filter: - match += 1 - else: - break + # Add nuclides to the new tally + if nuclide_product == 'entrywise': + for self_nuclide in self_copy.nuclides: + new_tally.nuclides.append(self_nuclide) + else: + 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) + new_tally.add_nuclide(new_nuclide) - match_filters = self_copy.filters[:match] - cross_filters = [self_copy.filters[match:], other_copy.filters[match:]] - - # Simply reuse shared filters in derived tally - for filter in match_filters: - new_tally.add_filter(filter) - - # Use cross filters to combine non-shared filters in derived tally - if len(self_copy.filters) != match and len(other_copy.filters) == match: - for filter in cross_filters[0]: - new_tally.add_filter(filter) - elif len(self_copy.filters) == match and len(other_copy.filters) != match: - for filter in cross_filters[1]: - new_tally.add_filter(filter) - else: - for self_filter, other_filter in itertools.product(*cross_filters): - new_filter = CrossFilter(self_filter, other_filter, binary_op) - new_tally.add_filter(new_filter) - - # Generate score "outer products" - if self_copy.scores == other_copy.scores: + # Add scores to the new tally + if score_product == 'entrywise': new_tally.num_score_bins = self_copy.num_score_bins for self_score in self_copy.scores: new_tally.add_score(self_score) @@ -1563,16 +1610,6 @@ class Tally(object): new_score = CrossScore(self_score, other_score, binary_op) new_tally.add_score(new_score) - # Generate nuclide "outer products" - if self_copy.nuclides == other_copy.nuclides: - for self_nuclide in self_copy.nuclides: - new_tally.nuclides.append(self_nuclide) - else: - 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) - new_tally.add_nuclide(new_nuclide) - # Correct each Filter's stride stride = new_tally.num_nuclides * new_tally.num_score_bins for filter in reversed(new_tally.filters): @@ -1581,7 +1618,8 @@ class Tally(object): return new_tally - def _align_tally_data(self, other): + def _align_tally_data(self, other, filter_product, nuclide_product, + score_product): """Aligns data from two tallies for tally arithmetic. This is a helper method to construct a dict of dicts of the "aligned" @@ -1597,6 +1635,15 @@ class Tally(object): ---------- other : Tally The tally to outer product with this tally + filter_product : str + The type of product (tensor or entry) to be performed between filter + data. + nuclide_product : str + The type of product (tensor or entry) to be performed between nuclide + data. + score_product : str + The type of product (tensor or entry) to be performed between score + data. Returns ------- @@ -1610,38 +1657,22 @@ class Tally(object): other_missing_filters = set(self.filters).difference(set(other.filters)) self_missing_filters = set(other.filters).difference(set(self.filters)) - # Add other_missing_filters to other + # Add filters present in self but not in other to other for filter in other_missing_filters: filter = copy.deepcopy(filter) repeat_factor = filter.num_bins other._mean = np.repeat(other.mean, repeat_factor, axis=0) - other.sum = np.repeat(other.sum, repeat_factor, axis=0) other._std_dev = np.repeat(other.std_dev, repeat_factor, axis=0) - other.sum_sq = np.repeat(other.sum_sq, repeat_factor, axis=0) other.add_filter(filter) - # Correct the stride for other filters - stride = other.num_nuclides * other.num_score_bins - for filter in reversed(other.filters): - filter.stride = stride - stride *= filter.num_bins - - # Add self_missing_filters to self + # Add filters present in other but not in self to self for filter in self_missing_filters: filter = copy.deepcopy(filter) repeat_factor = filter.num_bins self._mean = np.repeat(self.mean, repeat_factor, axis=0) - self.sum = np.repeat(self.sum, repeat_factor, axis=0) self._std_dev = np.repeat(self.std_dev, repeat_factor, axis=0) - self.sum_sq = np.repeat(self.sum_sq, repeat_factor, axis=0) self.add_filter(filter) - # Correct the stride for self filters - stride = self.num_nuclides * self.num_score_bins - for filter in reversed(self.filters): - filter.stride = stride - stride *= filter.num_bins - # Align other filters with self filters for i, filter in enumerate(self.filters): other_index = other.filters.index(filter) @@ -1650,28 +1681,98 @@ class Tally(object): if other_index != i: other.swap_filters(filter, other.filters[i], inplace=True) + # Repeat and tile the data by nuclide in preparation for performing + # the tensor product across nuclides. + if nuclide_product == 'tensor': + self._mean = np.repeat(self.mean, other.num_nuclides, axis=1) + self._std_dev = np.repeat(self.std_dev, other.num_nuclides, axis=1) + other._mean = np.tile(other.mean, (1, self.num_nuclides, 1)) + other._std_dev = np.tile(other.std_dev, (1, self.num_nuclides, 1)) + + # Add nuclides to each tally such that each tally contains the complete + # set of nuclides necessary to perform an entrywise product. New nuclides + # added to a tally will have all their scores set to zero. + else: + + # Get the set of nuclides that each tally is missing + other_missing_nuclides = set(self.nuclides).difference(set(other.nuclides)) + self_missing_nuclides = set(other.nuclides).difference(set(self.nuclides)) + + # Add nuclides present in self but not in other to other + for nuclide in other_missing_nuclides: + other._mean = np.insert(other.mean, other.num_nuclides, 0, axis=1) + other._std_dev = np.insert(other.std_dev, other.num_nuclides, 0, axis=1) + other.add_nuclide(nuclide) + + # Add nuclides present in other but not in self to self + for nuclide in self_missing_nuclides: + self._mean = np.insert(self.mean, self.num_nuclides, 0, axis=1) + self._std_dev = np.insert(self.std_dev, self.num_nuclides, 0, axis=1) + self.add_nuclide(nuclide) + + # Align other nuclides with self nuclides + for i, nuclide in enumerate(self.nuclides): + other_index = other.nuclides.index(nuclide) + + # If necessary, swap other nuclide + if other_index != i: + other.swap_nuclides(nuclide, other.nuclides[i]) + + # Repeat and tile the data by score in preparation for performing + # the tensor product across scores. + if score_product == 'tensor': + self._mean = np.repeat(self.mean, other.num_score_bins, axis=2) + self._std_dev = np.repeat(self.std_dev, other.num_score_bins, axis=2) + other._mean = np.tile(other.mean, (1, 1, self.num_score_bins)) + other._std_dev = np.tile(other.std_dev, (1, 1, self.num_score_bins)) + + # Add scores to each tally such that each tally contains the complete set + # of scores necessary to perform an entrywise product. New scores added + # to a tally will be set to zero. + else: + + # Get the set of scores that each tally is missing + other_missing_scores = set(self.scores).difference(set(other.scores)) + self_missing_scores = set(other.scores).difference(set(self.scores)) + + # Add scores present in self but not in other to other + for score in other_missing_scores: + other._mean = np.insert(other.mean, other.num_score_bins, 0, axis=2) + other._std_dev = np.insert(other.std_dev, other.num_score_bins, 0, axis=2) + other.add_score(score) + + # Add scores present in other but not in self to self + for score in self_missing_scores: + self._mean = np.insert(self.mean, self.num_score_bins, 0, axis=2) + self._std_dev = np.insert(self.std_dev, self.num_score_bins, 0, axis=2) + self.add_score(score) + + # Align other scores with self scores + for i, score in enumerate(self.scores): + other_index = other.scores.index(score) + + # If necessary, swap other score + if other_index != i: + other.swap_scores(score, other.scores[i]) + + # Correct the stride for other filters + stride = other.num_nuclides * other.num_score_bins + for filter in reversed(other.filters): + filter.stride = stride + stride *= filter.num_bins + + # Correct the stride for self filters + stride = self.num_nuclides * self.num_score_bins + for filter in reversed(self.filters): + filter.stride = stride + stride *= filter.num_bins + # Deep copy the mean and std dev data self_mean = copy.deepcopy(self.mean) self_std_dev = copy.deepcopy(self.std_dev) other_mean = copy.deepcopy(other.mean) other_std_dev = copy.deepcopy(other.std_dev) - # If the tallies do not have identical sets of nuclides, tile and repeat - # to perform cross product of data for each nuclide - if self.nuclides != other.nuclides: - self_mean = np.repeat(self_mean, other.num_nuclides, axis=1) - self_std_dev = np.repeat(self_std_dev, other.num_nuclides, axis=1) - other_mean = np.tile(other_mean, (1, self.num_nuclides, 1)) - other_std_dev = np.tile(other_std_dev, (1, self.num_nuclides, 1)) - - # If the tallies do not have identical sets of scores, tile and repeat - # to perform cross product of data for each score - if self.scores != other.scores: - self_mean = np.repeat(self_mean, other.num_score_bins, axis=2) - self_std_dev = np.repeat(self_std_dev, other.num_score_bins, axis=2) - other_mean = np.tile(other_mean, (1, 1, self.num_score_bins)) - other_std_dev = np.tile(other_std_dev, (1, 1, self.num_score_bins)) - data = {} data['self'] = {} data['other'] = {} @@ -1808,6 +1909,116 @@ class Tally(object): if not inplace: return swap_tally + def swap_nuclides(self, nuclide1, nuclide2): + """Reverse the ordering of two nuclides in this tally + + This is a helper method for tally arithmetic which helps align the data + in two tallies with shared nuclides. This method reverses the order of + the two nuclides in place. + + Parameters + ---------- + nuclide1 : Nuclide + The nuclide to swap with nuclide2 + + nuclide2 : Nuclide + The nuclide to swap with nuclide1 + + Raises + ------ + ValueError + If this is a derived tally or this method is called before the tally + is populated with data by the StatePoint.read_results() method. + + """ + + # Check that results have been read + if not self.derived and self.sum is None: + msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + + # Swap the nuclides in the Tally + nuclide1_index = self.nuclides.index(nuclide1) + nuclide2_index = self.nuclides.index(nuclide2) + self.nuclides[nuclide1_index] = nuclide2 + self.nuclides[nuclide2_index] = nuclide1 + + # Copy the tally data + self_mean = copy.deepcopy(self.mean) + self_std_dev = copy.deepcopy(self.std_dev) + + # Swap nuclide 1 in place of nuclide 2 + self._mean = np.delete(self.mean, nuclide2_index, axis=1) + self._mean = np.insert(self.mean, nuclide2_index, + self_mean[:,nuclide1_index,:], axis=1) + self._std_dev = np.delete(self.std_dev, nuclide2_index, axis=1) + self._std_dev = np.insert(self.std_dev, nuclide2_index, + self_mean[:,nuclide1_index,:], axis=1) + + # Swap nuclide 2 in place of nuclide 1 + self._mean = np.delete(self.mean, nuclide1_index, axis=1) + self._mean = np.insert(self.mean, nuclide1_index, + self_mean[:,nuclide2_index,:], axis=1) + self._std_dev = np.delete(self.std_dev, nuclide1_index, axis=1) + self._std_dev = np.insert(self.std_dev, nuclide1_index, + self_mean[:,nuclide2_index,:], axis=1) + + def swap_scores(self, score1, score2): + """Reverse the ordering of two scores in this tally + + This is a helper method for tally arithmetic which helps align the data + in two tallies with shared scores. This method copies reverses the order + of the two scores in place. + + Parameters + ---------- + score1 : Score + The score to swap with score2 + + score2 : Score + The score to swap with score1 + + Raises + ------ + ValueError + If this is a derived tally or this method is called before the tally + is populated with data by the StatePoint.read_results() method. + + """ + + # Check that results have been read + if not self.derived and self.sum is None: + msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + + # Swap the scores in the Tally + score1_index = self.scores.index(score1) + score2_index = self.scores.index(score2) + self.scores[score1_index] = score2 + self.scores[score2_index] = score1 + + # Copy the tally data + self_mean = copy.deepcopy(self.mean) + self_std_dev = copy.deepcopy(self.std_dev) + + # Swap score 1 in place of score 2 + self._mean = np.delete(self.mean, score2_index, axis=2) + self._mean = np.insert(self.mean, score2_index, + self_mean[:,:,score1_index], axis=2) + self._std_dev = np.delete(self.std_dev, score2_index, axis=2) + self._std_dev = np.insert(self.std_dev, score2_index, + self_mean[:,:,score1_index], axis=2) + + # Swap score 2 in place of score 1 + self._mean = np.delete(self.mean, score1_index, axis=2) + self._mean = np.insert(self.mean, score1_index, + self_mean[:,:,score2_index], axis=2) + self._std_dev = np.delete(self.std_dev, score1_index, axis=2) + self._std_dev = np.insert(self.std_dev, score1_index, + self_mean[:,:,score2_index], axis=2) + def __add__(self, other): """Adds this tally to another tally or scalar value. @@ -1851,7 +2062,7 @@ class Tally(object): raise ValueError(msg) if isinstance(other, Tally): - new_tally = self._hybrid_product(other, binary_op='+') + new_tally = self.hybrid_product(other, binary_op='+') elif isinstance(other, Real): new_tally = Tally(name='derived') @@ -1921,7 +2132,7 @@ class Tally(object): raise ValueError(msg) if isinstance(other, Tally): - new_tally = self._hybrid_product(other, binary_op='-') + new_tally = self.hybrid_product(other, binary_op='-') elif isinstance(other, Real): new_tally = Tally(name='derived') @@ -1991,7 +2202,7 @@ class Tally(object): raise ValueError(msg) if isinstance(other, Tally): - new_tally = self._hybrid_product(other, binary_op='*') + new_tally = self.hybrid_product(other, binary_op='*') elif isinstance(other, Real): new_tally = Tally(name='derived') @@ -2061,7 +2272,7 @@ class Tally(object): raise ValueError(msg) if isinstance(other, Tally): - new_tally = self._hybrid_product(other, binary_op='/') + new_tally = self.hybrid_product(other, binary_op='/') elif isinstance(other, Real): new_tally = Tally(name='derived') @@ -2134,7 +2345,7 @@ class Tally(object): raise ValueError(msg) if isinstance(power, Tally): - new_tally = self._hybrid_product(power, binary_op='^') + new_tally = self.hybrid_product(power, binary_op='^') elif isinstance(power, Real): new_tally = Tally(name='derived') From cae38c30bded40da7b963b0f4068ecb59eb4ce14 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 10 Dec 2015 01:03:17 -0500 Subject: [PATCH 06/61] fixed typos and removed unnecessary repeat_factor variable --- openmc/tallies.py | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 5656987cbf..8b4aa89ddd 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1519,7 +1519,7 @@ class Tally(object): new_tally.name = new_name # Query the mean and std dev so the tally data is read in from file - # if it has not present + # if it has not already been read in. self.mean self.std_dev other.mean @@ -1636,14 +1636,14 @@ class Tally(object): other : Tally The tally to outer product with this tally filter_product : str - The type of product (tensor or entry) to be performed between filter - data. + The type of product (tensor or entrywise) to be performed between + filter data. nuclide_product : str - The type of product (tensor or entry) to be performed between nuclide - data. + The type of product (tensor or entrywise) to be performed between + nuclide data. score_product : str - The type of product (tensor or entry) to be performed between score - data. + The type of product (tensor or entrywise) to be performed between + score data. Returns ------- @@ -1660,17 +1660,15 @@ class Tally(object): # Add filters present in self but not in other to other for filter in other_missing_filters: filter = copy.deepcopy(filter) - repeat_factor = filter.num_bins - other._mean = np.repeat(other.mean, repeat_factor, axis=0) - other._std_dev = np.repeat(other.std_dev, repeat_factor, axis=0) + other._mean = np.repeat(other.mean, filter.num_bins, axis=0) + other._std_dev = np.repeat(other.std_dev, filter.num_bins, axis=0) other.add_filter(filter) # Add filters present in other but not in self to self for filter in self_missing_filters: filter = copy.deepcopy(filter) - repeat_factor = filter.num_bins - self._mean = np.repeat(self.mean, repeat_factor, axis=0) - self._std_dev = np.repeat(self.std_dev, repeat_factor, axis=0) + self._mean = np.repeat(self.mean, filter.num_bins, axis=0) + self._std_dev = np.repeat(self.std_dev, filter.num_bins, axis=0) self.add_filter(filter) # Align other filters with self filters From 68b131522047c6023260be4043b9367bfdac2f17 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sat, 12 Dec 2015 23:44:15 -0500 Subject: [PATCH 07/61] Initial implementation of tally sparsification in Python API --- openmc/tallies.py | 65 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 13a219dedd..2c45d981d4 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -10,6 +10,7 @@ from xml.etree import ElementTree as ET import sys import numpy as np +import scipy.sparse as sps from openmc import Mesh, Filter, Trigger, Nuclide from openmc.cross import CrossScore, CrossNuclide, CrossFilter @@ -104,6 +105,7 @@ class Tally(object): self._std_dev = None self._with_batch_statistics = False self._derived = False + self._sparse = False self._sp_filename = None self._results_read = False @@ -126,6 +128,7 @@ class Tally(object): clone._with_summary = self.with_summary clone._with_batch_statistics = self.with_batch_statistics clone._derived = self.derived + clone._sparse = self.sparse clone._sp_filename = self._sp_filename clone._results_read = self._results_read @@ -315,13 +318,21 @@ class Tally(object): self._sum = sum self._sum_sq = sum_sq + # Convert NumPy arrays to SciPy sparse matrices + if self.sparse: + self._sum = sps.lil_matrix(self._sum) + self._sum_sq = sps.lil_matrix(self._sum_sq) + # Indicate that Tally results have been read self._results_read = True # Close the HDF5 statepoint file f.close() - return self._sum + if self.sparse: + return self._sum.toarray() + else: + return self._sum @property def sum_sq(self): @@ -332,7 +343,10 @@ class Tally(object): # Force reading of sum and sum_sq self.sum - return self._sum_sq + if self.sparse: + return self._sum_sq.toarray() + else: + return self._sum_sq @property def mean(self): @@ -341,7 +355,15 @@ class Tally(object): return None self._mean = self.sum / self.num_realizations - return self._mean + + # Convert NumPy arrays to SciPy sparse matrices + if self.sparse: + self._mean = sps.lil_matrix(self._mean) + + if self.sparse: + return self._mean.toarray() + else: + return self._mean @property def std_dev(self): @@ -354,8 +376,17 @@ class Tally(object): self._std_dev = np.zeros_like(self.mean) self._std_dev[nonzero] = np.sqrt((self.sum_sq[nonzero]/n - self.mean[nonzero]**2)/(n - 1)) + + # Convert NumPy arrays to SciPy sparse matrices + if self.sparse: + self._std_dev = sps.lil_matrix(self._std_dev) + self.with_batch_statistics = True - return self._std_dev + + if self.sparse: + return self._std_dev.toarray() + else: + return self._std_dev @property def with_batch_statistics(self): @@ -365,6 +396,10 @@ class Tally(object): def derived(self): return self._derived + @property + def sparse(self): + return self._sparse + @estimator.setter def estimator(self, estimator): cv.check_value('estimator', estimator, @@ -619,7 +654,8 @@ class Tally(object): """ if not self.can_merge(tally): - msg = 'Unable to merge tally ID="{0}" with "{1}"'.format(tally.id, self.id) + msg = 'Unable to merge tally ID="{0}" with ' + \ + '"{1}"'.format(tally.id, self.id) raise ValueError(msg) # Create deep copy of tally to return as merged tally @@ -1107,6 +1143,25 @@ class Tally(object): return data + def sparsify(self): + """ + """ + + self._sparse = True + + # FIXME: get_values + # FIXME: each of the properties which load in the data + # FIXME: pandas dataframes + # summation, slicing + if self._sum: + self._sum = sps.lil_matrix(self._sum) + if self._sum_sq: + self._sum_sq = sps.lil_matrix(self._sum_sq) + if self._mean: + self._mean = sps.lil_matrix(self._mean) + if self._std_dev: + self._std_dev = sps.lil_matrix(self._std_dev) + def get_pandas_dataframe(self, filters=True, nuclides=True, scores=True, summary=None): """Build a Pandas DataFrame for the Tally data. From 963238194b7b4a264c357e147709810a0e4dbea8 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 13 Dec 2015 01:30:10 -0500 Subject: [PATCH 08/61] Fixed some bugs in tally sparsification - tally arithmetic ipython notebook now working --- openmc/tallies.py | 197 ++++++++++++++++++++++++++++++---------------- 1 file changed, 127 insertions(+), 70 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 67e9a08388..9cac3a8482 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -83,6 +83,11 @@ class Tally(object): An array containing the sample mean for each bin std_dev : ndarray An array containing the sample standard deviation for each bin + derived : bool + Whether or not the tally is derived from one or more other tallies + sparse : bool + Whether or not the tally uses SciPy's LIL sparse matrix format for + compressed data storage """ @@ -246,6 +251,10 @@ class Tally(object): def scores(self): return self._scores + @property + def shape(self): + return (self.num_filter_bins, self.num_nuclides, self.num_score_bins) + @property def num_scores(self): return len(self._scores) @@ -308,21 +317,18 @@ class Tally(object): return 1 if not val else val # Reshape the results arrays - new_shape = (nonzero(self.num_filter_bins), - nonzero(self.num_nuclides), - nonzero(self.num_score_bins)) - - sum = np.reshape(sum, new_shape) - sum_sq = np.reshape(sum_sq, new_shape) + sum = np.reshape(sum, self.shape) + sum_sq = np.reshape(sum_sq, self.shape) # Set the data for this Tally self._sum = sum self._sum_sq = sum_sq - # Convert NumPy arrays to SciPy sparse matrices + # Convert NumPy arrays to SciPy sparse LIL matrices if self.sparse: - self._sum = sps.lil_matrix(self._sum) - self._sum_sq = sps.lil_matrix(self._sum_sq) + self._sum = sps.lil_matrix(self._sum.flatten(), self._sum.shape) + self._sum_sq = \ + sps.lil_matrix(self._sum_sq.flatten(), self._sum_sq.shape) # Indicate that Tally results have been read self._results_read = True @@ -331,7 +337,7 @@ class Tally(object): f.close() if self.sparse: - return self._sum.toarray() + return np.reshape(self._sum.toarray(), self.shape) else: return self._sum @@ -345,7 +351,7 @@ class Tally(object): self.sum if self.sparse: - return self._sum_sq.toarray() + return np.reshape(self._sum_sq.toarray(), self.shape) else: return self._sum_sq @@ -357,12 +363,13 @@ class Tally(object): self._mean = self.sum / self.num_realizations - # Convert NumPy arrays to SciPy sparse matrices + # Convert NumPy array to SciPy sparse LIL matrix if self.sparse: - self._mean = sps.lil_matrix(self._mean) + self._mean = \ + sps.lil_matrix(self._mean.flatten(), self._mean.shape) if self.sparse: - return self._mean.toarray() + return np.reshape(self._mean.toarray(), self.shape) else: return self._mean @@ -378,14 +385,15 @@ class Tally(object): self._std_dev[nonzero] = np.sqrt((self.sum_sq[nonzero]/n - self.mean[nonzero]**2)/(n - 1)) - # Convert NumPy arrays to SciPy sparse matrices + # Convert NumPy array to SciPy sparse LIL matrix if self.sparse: - self._std_dev = sps.lil_matrix(self._std_dev) + self._std_dev = \ + sps.lil_matrix(self._std_dev.flatten(), self._std_dev.shape) self.with_batch_statistics = True if self.sparse: - return self._std_dev.toarray() + return np.reshape(self._std_dev.toarray(), self.shape) else: return self._std_dev @@ -1099,22 +1107,19 @@ class Tally(object): Raises ------ ValueError - When this method is called before the Tally is populated with data - by the StatePoint.read_results() method. ValueError is also thrown - if the input parameters do not correspond to the Tally's attributes, + When this method is called before the Tally is populated with data, + or the input parameters do not correspond to the Tally's attributes, e.g., if the score(s) do not match those in the Tally. """ - # Ensure that StatePoint.read_results() was called first + # Ensure that the tally has data if (value == 'mean' and self.mean is None) or \ (value == 'std_dev' and self.std_dev is None) or \ (value == 'rel_err' and self.mean is None) or \ (value == 'sum' and self.sum is None) or \ (value == 'sum_sq' and self.sum_sq is None): - msg = 'The Tally ID="{0}" has no data to return. Call the ' \ - 'StatePoint.read_results() method before using ' \ - 'Tally.get_values(...)'.format(self.id) + msg = 'The Tally ID="{0}" has no data to return'.format(self.id) raise ValueError(msg) # Get filter, nuclide and score indices @@ -1148,20 +1153,41 @@ class Tally(object): """ """ + # FIXME: pandas dataframes, summation + if self._sum is not None: + self._sum = \ + sps.lil_matrix(self._sum.flatten(), self._sum.shape) + if self._sum_sq is not None: + self._sum_sq = \ + sps.lil_matrix(self._sum_sq.flatten(), self._sum_sq.shape) + if self._mean is not None: + self._mean = \ + sps.lil_matrix(self._mean.flatten(), self._mean.shape) + if self._std_dev is not None: + self._std_dev = \ + sps.lil_matrix(self._std_dev.flatten(), self._std_dev.shape) + self._sparse = True - # FIXME: get_values - # FIXME: each of the properties which load in the data - # FIXME: pandas dataframes - # summation, slicing - if self._sum: - self._sum = sps.lil_matrix(self._sum) - if self._sum_sq: - self._sum_sq = sps.lil_matrix(self._sum_sq) - if self._mean: - self._mean = sps.lil_matrix(self._mean) - if self._std_dev: - self._std_dev = sps.lil_matrix(self._std_dev) + def densify(self): + """ + """ + + # If the tally is already dense, simply return + if not self._sparse: + return + + # FIXME: pandas dataframes, summation + if self._sum is not None: + self._sum = np.reshape(self._sum.toarray(), self.shape) + if self._sum_sq is not None: + self._sum_sq = np.reshape(self._sum_sq.toarray(), self.shape) + if self._mean is not None: + self._mean = np.reshape(self._mean.toarray(), self.shape) + if self._std_dev is not None: + self._std_dev = np.reshape(self._std_dev.toarray(), self.shape) + + self._sparse = False def get_pandas_dataframe(self, filters=True, nuclides=True, scores=True, summary=None): @@ -1200,17 +1226,14 @@ class Tally(object): ------ KeyError When this method is called before the Tally is populated with data - by the StatePoint.read_results() method. ImportError When Pandas can not be found on the caller's system """ - # Ensure that StatePoint.read_results() was called first + # Ensure that the tally has data if self.mean is None or self.std_dev is None: - msg = 'The Tally ID="{0}" has no data to return. Call the ' \ - 'StatePoint.read_results() method before using ' \ - 'Tally.get_pandas_dataframe(...)'.format(self.id) + msg = 'The Tally ID="{0}" has no data to return'.format(self.id) raise KeyError(msg) # If using Summary, ensure StatePoint.link_with_summary(...) was called @@ -1356,16 +1379,13 @@ class Tally(object): Raises ------ KeyError - When this method is called before the Tally is populated with data - by the StatePoint.read_results() method. + When this method is called before the Tally is populated with data. """ - # Ensure that StatePoint.read_results() was called first + # Ensure that the tally has data if self._sum is None or self._sum_sq is None and not self.derived: - msg = 'The Tally ID="{0}" has no data to export. Call the ' \ - 'StatePoint.read_results() method before using ' \ - 'Tally.export_results(...)'.format(self.id) + msg = 'The Tally ID="{0}" has no data to export'.format(self.id) raise KeyError(msg) if not isinstance(filename, basestring): @@ -1527,7 +1547,7 @@ class Tally(object): ------ ValueError When this method is called before the other tally is populated - with data by the StatePoint.read_results() method. + with data. """ @@ -1708,6 +1728,12 @@ class Tally(object): """ + # Use dense NumPy arrays for data alignment operations + self_sparse = self.sparse + other_sparse = other.sparse + self.densify() + other.densify() + # Get the set of filters that each tally is missing other_missing_filters = set(self.filters).difference(set(other.filters)) self_missing_filters = set(other.filters).difference(set(self.filters)) @@ -1769,7 +1795,7 @@ class Tally(object): # If necessary, swap other nuclide if other_index != i: - other.swap_nuclides(nuclide, other.nuclides[i]) + other.swap_nuclides(nuclide, other.nuclides[i]) # Repeat and tile the data by score in preparation for performing # the tensor product across scores. @@ -1820,6 +1846,12 @@ class Tally(object): filter.stride = stride stride *= filter.num_bins + # Restore tally operands to sparse storage + if self.sparse: + self.sparsify() + if other.sparse: + other.sparsify() + # Deep copy the mean and std dev data self_mean = copy.deepcopy(self.mean) self_std_dev = copy.deepcopy(self.std_dev) @@ -1864,7 +1896,7 @@ class Tally(object): ------ ValueError If this is a derived tally or this method is called before the tally - is populated with data by the StatePoint.read_results() method. + is populated with data. """ @@ -1981,7 +2013,7 @@ class Tally(object): ------ ValueError If this is a derived tally or this method is called before the tally - is populated with data by the StatePoint.read_results() method. + is populated with data. """ @@ -2036,7 +2068,7 @@ class Tally(object): ------ ValueError If this is a derived tally or this method is called before the tally - is populated with data by the StatePoint.read_results() method. + is populated with data. """ @@ -2103,8 +2135,7 @@ class Tally(object): Raises ------ ValueError - When this method is called before the Tally is populated with data - by the StatePoint.read_results() method. + When this method is called before the Tally is populated with data. """ @@ -2136,6 +2167,10 @@ class Tally(object): for score in self.scores: new_tally.add_score(score) + # If original tally operands were sparse, sparsify the sliced tally + if self.sparse and other.sparse: + new_tally.sparsify() + else: msg = 'Unable to add "{0}" to Tally ID="{1}"'.format(other, self.id) raise ValueError(msg) @@ -2173,8 +2208,7 @@ class Tally(object): Raises ------ ValueError - When this method is called before the Tally is populated with data - by the StatePoint.read_results() method. + When this method is called before the Tally is populated with data. """ @@ -2205,6 +2239,10 @@ class Tally(object): for score in self.scores: new_tally.add_score(score) + # If original tally operands were sparse, sparsify the sliced tally + if self.sparse and other.sparse: + new_tally.sparsify() + else: msg = 'Unable to subtract "{0}" from Tally ' \ 'ID="{1}"'.format(other, self.id) @@ -2243,8 +2281,7 @@ class Tally(object): Raises ------ ValueError - When this method is called before the Tally is populated with data - by the StatePoint.read_results() method. + When this method is called before the Tally is populated with data. """ @@ -2275,6 +2312,10 @@ class Tally(object): for score in self.scores: new_tally.add_score(score) + # If original tally operands were sparse, sparsify the sliced tally + if self.sparse and other.sparse: + new_tally.sparsify() + else: msg = 'Unable to multiply Tally ID="{0}" ' \ 'by "{1}"'.format(self.id, other) @@ -2313,8 +2354,7 @@ class Tally(object): Raises ------ ValueError - When this method is called before the Tally is populated with data - by the StatePoint.read_results() method. + When this method is called before the Tally is populated with data. """ @@ -2345,6 +2385,10 @@ class Tally(object): for score in self.scores: new_tally.add_score(score) + # If original tally operands were sparse, sparsify the sliced tally + if self.sparse and other.sparse: + new_tally.sparsify() + else: msg = 'Unable to divide Tally ID="{0}" ' \ 'by "{1}"'.format(self.id, other) @@ -2386,8 +2430,7 @@ class Tally(object): Raises ------ ValueError - When this method is called before the Tally is populated with data - by the StatePoint.read_results() method. + When this method is called before the Tally is populated with data. """ @@ -2419,6 +2462,10 @@ class Tally(object): for score in self.scores: new_tally.add_score(score) + # If original tally was sparse, sparsify the exponentiated tally + if self.sparse: + new_tally.sparsify() + else: msg = 'Unable to raise Tally ID="{0}" to ' \ 'power "{1}"'.format(self.id, power) @@ -2569,12 +2616,11 @@ class Tally(object): Raises ------ ValueError - When this method is called before the Tally is populated with data - by the StatePoint.read_results() method. + When this method is called before the Tally is populated with data. """ - # Ensure that StatePoint.read_results() was called first + # Ensure that the tally has data if not self.derived and self.sum is None: msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ 'since it does not contain any results.'.format(self.id) @@ -2657,6 +2703,10 @@ class Tally(object): filter.stride = stride stride *= filter.num_bins + # If original tally was sparse, sparsify the sliced tally + if self.sparse: + new_tally.sparsify() + return new_tally def summation(self, scores=[], filter_type=None, @@ -2759,6 +2809,10 @@ class Tally(object): filters[i] = CrossFilter(filters[i-1], filters[i], '+') tally_sum.add_filter(filters[-1]) + # If original tally was sparse, sparsify the tally summation + if self.sparse: + tally_sum.sparsify() + return tally_sum def diagonalize_filter(self, new_filter): @@ -2799,7 +2853,6 @@ class Tally(object): num_filter_bins = new_tally.num_filter_bins num_nuclides = new_tally.num_nuclides num_score_bins = new_tally.num_score_bins - new_shape = (num_filter_bins, num_nuclides, num_score_bins) # Determine "base" indices along the new "diagonal", and the factor # by which the "base" indices should be repeated to account for all @@ -2816,16 +2869,16 @@ class Tally(object): # Inject this Tally's data along the diagonal of the diagonalized Tally if self.sum is not None: - new_tally._sum = np.zeros(new_shape, dtype=np.float64) + new_tally._sum = np.zeros(self.shape, dtype=np.float64) new_tally._sum[diag_indices, :, :] = self.sum if self.sum_sq is not None: - new_tally._sum_sq = np.zeros(new_shape, dtype=np.float64) + new_tally._sum_sq = np.zeros(self.shape, dtype=np.float64) new_tally._sum_sq[diag_indices, :, :] = self.sum_sq if self.mean is not None: - new_tally._mean = np.zeros(new_shape, dtype=np.float64) + new_tally._mean = np.zeros(self.shape, dtype=np.float64) new_tally._mean[diag_indices, :, :] = self.mean if self.std_dev is not None: - new_tally._std_dev = np.zeros(new_shape, dtype=np.float64) + new_tally._std_dev = np.zeros(self.shape, dtype=np.float64) new_tally._std_dev[diag_indices, :, :] = self.std_dev # Correct each Filter's stride @@ -2834,6 +2887,10 @@ class Tally(object): filter.stride = stride stride *= filter.num_bins + # If original tally was sparse, sparsify the diagonalized tally + if self.sparse: + new_tally.sparsify + return new_tally From f2deefcf472cd607277208ee8c5f8f447179c70b Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 13 Dec 2015 01:39:21 -0500 Subject: [PATCH 09/61] Fixed bugs in sparse tallies with filter diagonalization --- openmc/tallies.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 9cac3a8482..f9d3599bda 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2869,16 +2869,16 @@ class Tally(object): # Inject this Tally's data along the diagonal of the diagonalized Tally if self.sum is not None: - new_tally._sum = np.zeros(self.shape, dtype=np.float64) + new_tally._sum = np.zeros(new_tally.shape, dtype=np.float64) new_tally._sum[diag_indices, :, :] = self.sum if self.sum_sq is not None: - new_tally._sum_sq = np.zeros(self.shape, dtype=np.float64) + new_tally._sum_sq = np.zeros(new_tally.shape, dtype=np.float64) new_tally._sum_sq[diag_indices, :, :] = self.sum_sq if self.mean is not None: - new_tally._mean = np.zeros(self.shape, dtype=np.float64) + new_tally._mean = np.zeros(new_tally.shape, dtype=np.float64) new_tally._mean[diag_indices, :, :] = self.mean if self.std_dev is not None: - new_tally._std_dev = np.zeros(self.shape, dtype=np.float64) + new_tally._std_dev = np.zeros(new_tally.shape, dtype=np.float64) new_tally._std_dev[diag_indices, :, :] = self.std_dev # Correct each Filter's stride From 61aed1df1095cd750964e7289a3ee23eb8e433ca Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 13 Dec 2015 01:47:38 -0500 Subject: [PATCH 10/61] Added docstrings for Tally sparsify and densify methods --- openmc/tallies.py | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index f9d3599bda..25bf2acb6a 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1150,10 +1150,21 @@ class Tally(object): return data def sparsify(self): - """ + """Convert tally data from NumPy arrays to SciPy list of lists (LIL) + sparse matrices. + + This method may be used to reduce the amount of data in memory during + tally data processing. The tally data will be stored as SciPy LIL + matrices internally within the Tally object. All tally data access + properties and methods will return data as a dense NumPy array. + + See also + -------- + Tally.densify() + """ - # FIXME: pandas dataframes, summation + # Convert NumPy arrays to SciPy sparse LIL matrices if self._sum is not None: self._sum = \ sps.lil_matrix(self._sum.flatten(), self._sum.shape) @@ -1170,14 +1181,24 @@ class Tally(object): self._sparse = True def densify(self): - """ + """Convert tally data from SciPy list of lists (LIL) sparse matrices + to NumPy arrrays. + + This method may be used to restore a sparse tally to its original + state. This method will have no effect on the state of the tally + unless the Tally.sparse() method has been called. + + See also + -------- + Tally.sparsify() + """ # If the tally is already dense, simply return if not self._sparse: return - # FIXME: pandas dataframes, summation + # Convert SciPy sparse LIL matrices to NumPy arrays if self._sum is not None: self._sum = np.reshape(self._sum.toarray(), self.shape) if self._sum_sq is not None: From e85b659977fd85005783ae9a6e9cd64297e5fd83 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 13 Dec 2015 02:04:19 -0500 Subject: [PATCH 11/61] Added tally sparsification to MGXS class --- openmc/mgxs/mgxs.py | 78 +++++++++++++++++++++++++++++++++++++++++++++ openmc/tallies.py | 2 +- 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 597e28e292..3804199cc9 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -103,6 +103,9 @@ class MGXS(object): nuclides : list of str or 'sum' A list of nuclide string names (e.g., 'U-238', 'O-16') when by_nuclide is True and 'sum' when by_nuclide is False. + sparse : bool + Whether or not the MGXS' tallies use SciPy's LIL sparse matrix format + for compressed data storage """ @@ -121,6 +124,7 @@ class MGXS(object): self._tally_trigger = None self._tallies = None self._xs_tally = None + self._sparse = False self.name = name self.by_nuclide = by_nuclide @@ -146,6 +150,7 @@ class MGXS(object): clone._energy_groups = copy.deepcopy(self.energy_groups, memo) clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo) clone._xs_tally = copy.deepcopy(self.xs_tally, memo) + clone._sparse = self.sparse clone._tallies = OrderedDict() for tally_type, tally in self.tallies.items(): @@ -199,6 +204,10 @@ class MGXS(object): def xs_tally(self): return self._xs_tally + @property + def sparse(self): + return self._sparse + @property def num_subdomains(self): tally = list(self.tallies.values())[0] @@ -504,6 +513,10 @@ class MGXS(object): self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) + # Sparsify the MGXS derived tally + if self.sparse: + self.xs_tally.sparsify() + def load_from_statepoint(self, statepoint): """Extracts tallies in an OpenMC StatePoint with the data needed to compute multi-group cross sections. @@ -567,6 +580,9 @@ class MGXS(object): filter_bins, tally.nuclides) self.tallies[tally_type] = sp_tally + if self.sparse: + sp_tally.sparsify() + # Compute the cross section from the tallies self.compute_xs() @@ -765,6 +781,11 @@ class MGXS(object): # Compute the energy condensed multi-group cross section condensed_xs.compute_xs() + + # Sparsify the condensed MGXS + if self.sparse: + condensed_xs.sparsify() + return condensed_xs def get_subdomain_avg_xs(self, subdomains='all'): @@ -848,6 +869,10 @@ class MGXS(object): # Compute the subdomain-averaged multi-group cross section avg_xs.compute_xs() + # Sparsify the subdomain-averaged MGXS + if self.sparse: + avg_xs.sparsify() + return avg_xs def print_xs(self, subdomains='all', nuclides='all', xs_type='macro'): @@ -2078,6 +2103,59 @@ class Chi(MGXS): super(Chi, self).compute_xs() + def sparsify(self): + """Convert tally data from NumPy arrays to SciPy list of lists (LIL) + sparse matrices. + + This method may be used to reduce the amount of data in memory during + tally data processing. The tally data will be stored as SciPy LIL + matrices internally within the Tally object. All tally data access + properties and methods will return data as a dense NumPy array. + + See also + -------- + MGXS.densify(), Tally.sparsify(), Tally.densify() + + """ + + # Sparsify the derived MGXS tally + if self.xs_tally: + self.xs_tally.sparsify() + + # Sparsify the MGXS' base tallies + for tally_name in self.tallies: + self.tallies[tally_name].sparsify() + + self._sparse = True + + def densify(self): + """Convert tally data from SciPy list of lists (LIL) sparse matrices + to NumPy arrrays. + + This method may be used to restore a sparse tally to its original + state. This method will have no effect on the state of the tally + unless the Tally.sparse() method has been called. + + See also + -------- + MGXS.sparsify(), Tally.sparsify(), Tally.densify() + + """ + + # If the MGXS is already dense, simply return + if not self.sparse: + return + + # Densify the derived MGXS tally + if self.xs_tally: + self.xs_tally.densify() + + # Densify the MGXS' base tallies + for tally_name in self.tallies: + self.tallies[tally_name].densify() + + self._sparse = False + def get_xs(self, groups='all', subdomains='all', nuclides='all', xs_type='macro', order_groups='increasing', value='mean'): """Returns an array of the fission spectrum. diff --git a/openmc/tallies.py b/openmc/tallies.py index 25bf2acb6a..1ee1d88907 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1195,7 +1195,7 @@ class Tally(object): """ # If the tally is already dense, simply return - if not self._sparse: + if not self.sparse: return # Convert SciPy sparse LIL matrices to NumPy arrays From beb3189d8d988e66346de247cc667a1aa7c83915 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 13 Dec 2015 11:14:01 -0500 Subject: [PATCH 12/61] Fixed bugs in tally sparsification which broke MGXS library --- openmc/mgxs/library.py | 32 +++++ openmc/mgxs/mgxs.py | 101 +++++----------- openmc/tallies.py | 266 +++++++++++++++++++++-------------------- 3 files changed, 197 insertions(+), 202 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index ef3e90fc41..ca9fa5d669 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -73,6 +73,9 @@ class Library(object): name : str, optional Name of the multi-group cross section library. Used as a label to identify tallies in OpenMC 'tallies.xml' file. + sparse : bool + Whether or not the Library's tallies use SciPy's LIL sparse matrix + format for compressed data storage """ @@ -92,6 +95,7 @@ class Library(object): self._all_mgxs = OrderedDict() self._sp_filename = None self._keff = None + self._sparse = False self.name = name self.openmc_geometry = openmc_geometry @@ -119,6 +123,7 @@ class Library(object): clone._all_mgxs = self.all_mgxs clone._sp_filename = self._sp_filename clone._keff = self._keff + clone._sparse = self.sparse clone._all_mgxs = OrderedDict() for domain in self.domains: @@ -208,6 +213,10 @@ class Library(object): def keff(self): return self._keff + @property + def sparse(self): + return self._sparse + @openmc_geometry.setter def openmc_geometry(self, openmc_geometry): cv.check_type('openmc_geometry', openmc_geometry, openmc.Geometry) @@ -286,6 +295,28 @@ class Library(object): cv.check_type('tally trigger', tally_trigger, openmc.Trigger) self._tally_trigger = tally_trigger + @sparse.setter + def sparse(self, sparse): + """Convert tally data from NumPy arrays to SciPy list of lists (LIL) + sparse matrices, and vice versa. + + This property may be used to reduce the amount of data in memory during + tally data processing. The tally data will be stored as SciPy LIL + matrices internally within the Tally object. All tally data access + properties and methods will return data as a dense NumPy array. + + """ + + cv.check_type('sparse', sparse, bool) + + # Sparsify or densify each MGXS in the Library + for domain in self.domains: + for mgxs_type in self.mgxs_types: + mgxs = self.get_mgxs(domain, mgxs_type) + mgxs.sparse = self.sparse + + self._sparse = sparse + def build_library(self): """Initialize MGXS objects in each domain and for each reaction type in the library. @@ -381,6 +412,7 @@ class Library(object): for mgxs_type in self.mgxs_types: mgxs = self.get_mgxs(domain, mgxs_type) mgxs.load_from_statepoint(statepoint) + mgxs.sparse = self.sparse def get_mgxs(self, domain, mgxs_type): """Return the MGXS object for some domain and reaction rate type. diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 3804199cc9..1b451affc9 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -258,6 +258,29 @@ class MGXS(object): cv.check_type('tally trigger', tally_trigger, openmc.Trigger) self._tally_trigger = tally_trigger + @sparse.setter + def sparse(self, sparse): + """Convert tally data from NumPy arrays to SciPy list of lists (LIL) + sparse matrices, and vice versa. + + This property may be used to reduce the amount of data in memory during + tally data processing. The tally data will be stored as SciPy LIL + matrices internally within the Tally object. All tally data access + properties and methods will return data as a dense NumPy array. + + """ + + cv.check_type('sparse', sparse, bool) + + # Sparsify or densify the derived MGXS tally and its base tallies + if self.xs_tally: + self.xs_tally.sparse = sparse + + for tally_name in self.tallies: + self.tallies[tally_name].sparse = sparse + + self._sparse = sparse + @staticmethod def get_mgxs(mgxs_type, domain=None, domain_type=None, energy_groups=None, by_nuclide=False, name=''): @@ -512,10 +535,7 @@ class MGXS(object): # Remove NaNs which may have resulted from divide-by-zero operations self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) - - # Sparsify the MGXS derived tally - if self.sparse: - self.xs_tally.sparsify() + self.xs_tally.sparse = self.sparse def load_from_statepoint(self, statepoint): """Extracts tallies in an OpenMC StatePoint with the data needed to @@ -578,11 +598,9 @@ class MGXS(object): estimator=tally.estimator) sp_tally = sp_tally.get_slice(tally.scores, filters, filter_bins, tally.nuclides) + sp_tally.sparse = self.sparse self.tallies[tally_type] = sp_tally - if self.sparse: - sp_tally.sparsify() - # Compute the cross section from the tallies self.compute_xs() @@ -732,6 +750,7 @@ class MGXS(object): # Clone this MGXS to initialize the condensed version condensed_xs = copy.deepcopy(self) + condensed_xs.sparse = False condensed_xs.energy_groups = coarse_groups # Build energy indices to sum across @@ -781,11 +800,7 @@ class MGXS(object): # Compute the energy condensed multi-group cross section condensed_xs.compute_xs() - - # Sparsify the condensed MGXS - if self.sparse: - condensed_xs.sparsify() - + condensed_xs.sparse = self.sparse return condensed_xs def get_subdomain_avg_xs(self, subdomains='all'): @@ -828,8 +843,9 @@ class MGXS(object): # Clone this MGXS to initialize the subdomain-averaged version avg_xs = copy.deepcopy(self) + avg_xs.sparse = False - # If domain is distribcell, make the new domain 'cell' + # If domain is distribcell, make the new domain 'cell' if self.domain_type == 'distribcell': avg_xs.domain_type = 'cell' @@ -868,11 +884,7 @@ class MGXS(object): # Compute the subdomain-averaged multi-group cross section avg_xs.compute_xs() - - # Sparsify the subdomain-averaged MGXS - if self.sparse: - avg_xs.sparsify() - + avg_xs.sparse = self.sparse return avg_xs def print_xs(self, subdomains='all', nuclides='all', xs_type='macro'): @@ -2103,59 +2115,6 @@ class Chi(MGXS): super(Chi, self).compute_xs() - def sparsify(self): - """Convert tally data from NumPy arrays to SciPy list of lists (LIL) - sparse matrices. - - This method may be used to reduce the amount of data in memory during - tally data processing. The tally data will be stored as SciPy LIL - matrices internally within the Tally object. All tally data access - properties and methods will return data as a dense NumPy array. - - See also - -------- - MGXS.densify(), Tally.sparsify(), Tally.densify() - - """ - - # Sparsify the derived MGXS tally - if self.xs_tally: - self.xs_tally.sparsify() - - # Sparsify the MGXS' base tallies - for tally_name in self.tallies: - self.tallies[tally_name].sparsify() - - self._sparse = True - - def densify(self): - """Convert tally data from SciPy list of lists (LIL) sparse matrices - to NumPy arrrays. - - This method may be used to restore a sparse tally to its original - state. This method will have no effect on the state of the tally - unless the Tally.sparse() method has been called. - - See also - -------- - MGXS.sparsify(), Tally.sparsify(), Tally.densify() - - """ - - # If the MGXS is already dense, simply return - if not self.sparse: - return - - # Densify the derived MGXS tally - if self.xs_tally: - self.xs_tally.densify() - - # Densify the MGXS' base tallies - for tally_name in self.tallies: - self.tallies[tally_name].densify() - - self._sparse = False - def get_xs(self, groups='all', subdomains='all', nuclides='all', xs_type='macro', order_groups='increasing', value='mean'): """Returns an array of the fission spectrum. diff --git a/openmc/tallies.py b/openmc/tallies.py index 1ee1d88907..b57a0d228f 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -326,7 +326,8 @@ class Tally(object): # Convert NumPy arrays to SciPy sparse LIL matrices if self.sparse: - self._sum = sps.lil_matrix(self._sum.flatten(), self._sum.shape) + self._sum = \ + sps.lil_matrix(self._sum.flatten(), self._sum.shape) self._sum_sq = \ sps.lil_matrix(self._sum_sq.flatten(), self._sum_sq.shape) @@ -536,6 +537,48 @@ class Tally(object): cv.check_type('sum_sq', sum_sq, Iterable) self._sum_sq = sum_sq + @sparse.setter + def sparse(self, sparse): + """Convert tally data from NumPy arrays to SciPy list of lists (LIL) + sparse matrices, and vice versa. + + This property may be used to reduce the amount of data in memory during + tally data processing. The tally data will be stored as SciPy LIL + matrices internally within the Tally object. All tally data access + properties and methods will return data as a dense NumPy array. + + """ + + cv.check_type('sparse', sparse, bool) + + # Convert NumPy arrays to SciPy sparse LIL matrices + if sparse and not self.sparse: + if self._sum is not None: + self._sum = \ + sps.lil_matrix(self._sum.flatten(), self._sum.shape) + if self._sum_sq is not None: + self._sum_sq = \ + sps.lil_matrix(self._sum_sq.flatten(), self._sum_sq.shape) + if self._mean is not None: + self._mean = \ + sps.lil_matrix(self._mean.flatten(), self._mean.shape) + if self._std_dev is not None: + self._std_dev = \ + sps.lil_matrix(self._std_dev.flatten(), self._std_dev.shape) + self._sparse = True + + # Convert SciPy sparse LIL matrices to NumPy arrays + elif not sparse and self.sparse: + if self._sum is not None: + self._sum = np.reshape(self._sum.toarray(), self.shape) + if self._sum_sq is not None: + self._sum_sq = np.reshape(self._sum_sq.toarray(), self.shape) + if self._mean is not None: + self._mean = np.reshape(self._mean.toarray(), self.shape) + if self._std_dev is not None: + self._std_dev = np.reshape(self._std_dev.toarray(), self.shape) + self._sparse = False + def remove_score(self, score): """Remove a score from the tally @@ -1149,67 +1192,6 @@ class Tally(object): return data - def sparsify(self): - """Convert tally data from NumPy arrays to SciPy list of lists (LIL) - sparse matrices. - - This method may be used to reduce the amount of data in memory during - tally data processing. The tally data will be stored as SciPy LIL - matrices internally within the Tally object. All tally data access - properties and methods will return data as a dense NumPy array. - - See also - -------- - Tally.densify() - - """ - - # Convert NumPy arrays to SciPy sparse LIL matrices - if self._sum is not None: - self._sum = \ - sps.lil_matrix(self._sum.flatten(), self._sum.shape) - if self._sum_sq is not None: - self._sum_sq = \ - sps.lil_matrix(self._sum_sq.flatten(), self._sum_sq.shape) - if self._mean is not None: - self._mean = \ - sps.lil_matrix(self._mean.flatten(), self._mean.shape) - if self._std_dev is not None: - self._std_dev = \ - sps.lil_matrix(self._std_dev.flatten(), self._std_dev.shape) - - self._sparse = True - - def densify(self): - """Convert tally data from SciPy list of lists (LIL) sparse matrices - to NumPy arrrays. - - This method may be used to restore a sparse tally to its original - state. This method will have no effect on the state of the tally - unless the Tally.sparse() method has been called. - - See also - -------- - Tally.sparsify() - - """ - - # If the tally is already dense, simply return - if not self.sparse: - return - - # Convert SciPy sparse LIL matrices to NumPy arrays - if self._sum is not None: - self._sum = np.reshape(self._sum.toarray(), self.shape) - if self._sum_sq is not None: - self._sum_sq = np.reshape(self._sum_sq.toarray(), self.shape) - if self._mean is not None: - self._mean = np.reshape(self._mean.toarray(), self.shape) - if self._std_dev is not None: - self._std_dev = np.reshape(self._std_dev.toarray(), self.shape) - - self._sparse = False - def get_pandas_dataframe(self, filters=True, nuclides=True, scores=True, summary=None): """Build a Pandas DataFrame for the Tally data. @@ -1626,6 +1608,9 @@ class Tally(object): self_copy = copy.deepcopy(self) other_copy = copy.deepcopy(other) + self_copy.sparse = False + other_copy.sparse = False + # Align the tally data based on desired hybrid product data = self_copy._align_tally_data(other_copy, filter_product, nuclide_product, score_product) @@ -1691,7 +1676,8 @@ class Tally(object): else: 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) + new_nuclide = \ + CrossNuclide(self_nuclide, other_nuclide, binary_op) new_tally.add_nuclide(new_nuclide) # Add scores to the new tally @@ -1700,7 +1686,8 @@ class Tally(object): for self_score in self_copy.scores: new_tally.add_score(self_score) else: - new_tally.num_score_bins = self_copy.num_score_bins * other_copy.num_score_bins + new_tally.num_score_bins = \ + self_copy.num_score_bins * other_copy.num_score_bins 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) @@ -1717,7 +1704,6 @@ class Tally(object): def _align_tally_data(self, other, filter_product, nuclide_product, score_product): """Aligns data from two tallies for tally arithmetic. - This is a helper method to construct a dict of dicts of the "aligned" data arrays from each tally for tally arithmetic. The method analyzes the filters, scores and nuclides in both tallies and determines how to @@ -1726,7 +1712,6 @@ class Tally(object): 'tile' and 'repeat' operations to the new data arrays such that all possible combinations of the data in each tally's bins will be made when the arithmetic operation is applied to the arrays. - Parameters ---------- other : Tally @@ -1740,24 +1725,18 @@ class Tally(object): score_product : str The type of product (tensor or entrywise) to be performed between score data. - Returns ------- dict A dictionary of dictionaries to "aligned" 'mean' and 'std. dev' NumPy arrays for each tally's data. - """ - # Use dense NumPy arrays for data alignment operations - self_sparse = self.sparse - other_sparse = other.sparse - self.densify() - other.densify() - # Get the set of filters that each tally is missing - other_missing_filters = set(self.filters).difference(set(other.filters)) - self_missing_filters = set(other.filters).difference(set(self.filters)) + other_missing_filters = \ + set(self.filters).difference(set(other.filters)) + self_missing_filters = \ + set(other.filters).difference(set(self.filters)) # Add filters present in self but not in other to other for filter in other_missing_filters: @@ -1784,30 +1763,40 @@ class Tally(object): # Repeat and tile the data by nuclide in preparation for performing # the tensor product across nuclides. if nuclide_product == 'tensor': - self._mean = np.repeat(self.mean, other.num_nuclides, axis=1) - self._std_dev = np.repeat(self.std_dev, other.num_nuclides, axis=1) - other._mean = np.tile(other.mean, (1, self.num_nuclides, 1)) - other._std_dev = np.tile(other.std_dev, (1, self.num_nuclides, 1)) + self._mean = \ + np.repeat(self.mean, other.num_nuclides, axis=1) + self._std_dev = \ + np.repeat(self.std_dev, other.num_nuclides, axis=1) + other._mean = \ + np.tile(other.mean, (1, self.num_nuclides, 1)) + other._std_dev = \ + np.tile(other.std_dev, (1, self.num_nuclides, 1)) # Add nuclides to each tally such that each tally contains the complete - # set of nuclides necessary to perform an entrywise product. New nuclides - # added to a tally will have all their scores set to zero. + # set of nuclides necessary to perform an entrywise product. New + # nuclides added to a tally will have all their scores set to zero. else: # Get the set of nuclides that each tally is missing - other_missing_nuclides = set(self.nuclides).difference(set(other.nuclides)) - self_missing_nuclides = set(other.nuclides).difference(set(self.nuclides)) + other_missing_nuclides = \ + set(self.nuclides).difference(set(other.nuclides)) + self_missing_nuclides = \ + set(other.nuclides).difference(set(self.nuclides)) # Add nuclides present in self but not in other to other for nuclide in other_missing_nuclides: - other._mean = np.insert(other.mean, other.num_nuclides, 0, axis=1) - other._std_dev = np.insert(other.std_dev, other.num_nuclides, 0, axis=1) + other._mean = \ + np.insert(other.mean, other.num_nuclides, 0, axis=1) + other._std_dev = \ + np.insert(other.std_dev, other.num_nuclides, 0, axis=1) other.add_nuclide(nuclide) # Add nuclides present in other but not in self to self for nuclide in self_missing_nuclides: - self._mean = np.insert(self.mean, self.num_nuclides, 0, axis=1) - self._std_dev = np.insert(self.std_dev, self.num_nuclides, 0, axis=1) + self._mean = \ + np.insert(self.mean, self.num_nuclides, 0, axis=1) + self._std_dev = \ + np.insert(self.std_dev, self.num_nuclides, 0, axis=1) self.add_nuclide(nuclide) # Align other nuclides with self nuclides @@ -1821,30 +1810,40 @@ class Tally(object): # Repeat and tile the data by score in preparation for performing # the tensor product across scores. if score_product == 'tensor': - self._mean = np.repeat(self.mean, other.num_score_bins, axis=2) - self._std_dev = np.repeat(self.std_dev, other.num_score_bins, axis=2) - other._mean = np.tile(other.mean, (1, 1, self.num_score_bins)) - other._std_dev = np.tile(other.std_dev, (1, 1, self.num_score_bins)) + self._mean = \ + np.repeat(self.mean, other.num_score_bins, axis=2) + self._std_dev = \ + np.repeat(self.std_dev, other.num_score_bins, axis=2) + other._mean = \ + np.tile(other.mean, (1, 1, self.num_score_bins)) + other._std_dev = \ + np.tile(other.std_dev, (1, 1, self.num_score_bins)) - # Add scores to each tally such that each tally contains the complete set - # of scores necessary to perform an entrywise product. New scores added - # to a tally will be set to zero. + # Add scores to each tally such that each tally contains the complete + # set of scores necessary to perform an entrywise product. New scores + # added to a tally will be set to zero. else: # Get the set of scores that each tally is missing - other_missing_scores = set(self.scores).difference(set(other.scores)) - self_missing_scores = set(other.scores).difference(set(self.scores)) + other_missing_scores = \ + set(self.scores).difference(set(other.scores)) + self_missing_scores = \ + set(other.scores).difference(set(self.scores)) # Add scores present in self but not in other to other for score in other_missing_scores: - other._mean = np.insert(other.mean, other.num_score_bins, 0, axis=2) - other._std_dev = np.insert(other.std_dev, other.num_score_bins, 0, axis=2) + other._mean = \ + np.insert(other.mean, other.num_score_bins, 0, axis=2) + other._std_dev = \ + np.insert(other.std_dev, other.num_score_bins, 0, axis=2) other.add_score(score) # Add scores present in other but not in self to self for score in self_missing_scores: - self._mean = np.insert(self.mean, self.num_score_bins, 0, axis=2) - self._std_dev = np.insert(self.std_dev, self.num_score_bins, 0, axis=2) + self._mean = \ + np.insert(self.mean, self.num_score_bins, 0, axis=2) + self._std_dev = \ + np.insert(self.std_dev, self.num_score_bins, 0, axis=2) self.add_score(score) # Align other scores with self scores @@ -1867,12 +1866,6 @@ class Tally(object): filter.stride = stride stride *= filter.num_bins - # Restore tally operands to sparse storage - if self.sparse: - self.sparsify() - if other.sparse: - other.sparsify() - # Deep copy the mean and std dev data self_mean = copy.deepcopy(self.mean) self_std_dev = copy.deepcopy(self.std_dev) @@ -1886,6 +1879,7 @@ class Tally(object): data['other']['mean'] = other_mean data['self']['std. dev.'] = self_std_dev data['other']['std. dev.'] = other_std_dev + return data def swap_filters(self, filter1, filter2, inplace=False): @@ -2169,6 +2163,10 @@ class Tally(object): if isinstance(other, Tally): new_tally = self.hybrid_product(other, binary_op='+') + # If both tally operands were sparse, sparsify the new tally + if self.sparse and other.sparse: + new_tally.sparse = True + elif isinstance(other, Real): new_tally = Tally(name='derived') new_tally._derived = True @@ -2188,9 +2186,8 @@ class Tally(object): for score in self.scores: new_tally.add_score(score) - # If original tally operands were sparse, sparsify the sliced tally - if self.sparse and other.sparse: - new_tally.sparsify() + # If this tally operand is sparse, sparsify the new tally + new_tally.sparse = self.sparse else: msg = 'Unable to add "{0}" to Tally ID="{1}"'.format(other, self.id) @@ -2242,6 +2239,10 @@ class Tally(object): if isinstance(other, Tally): new_tally = self.hybrid_product(other, binary_op='-') + # If both tally operands were sparse, sparsify the new tally + if self.sparse and other.sparse: + new_tally.sparse = True + elif isinstance(other, Real): new_tally = Tally(name='derived') new_tally._derived = True @@ -2260,9 +2261,8 @@ class Tally(object): for score in self.scores: new_tally.add_score(score) - # If original tally operands were sparse, sparsify the sliced tally - if self.sparse and other.sparse: - new_tally.sparsify() + # If this tally operand is sparse, sparsify the new tally + new_tally.sparse = self.sparse else: msg = 'Unable to subtract "{0}" from Tally ' \ @@ -2315,6 +2315,10 @@ class Tally(object): if isinstance(other, Tally): new_tally = self.hybrid_product(other, binary_op='*') + # If original tally operands were sparse, sparsify the new tally + if self.sparse and other.sparse: + new_tally.sparse = True + elif isinstance(other, Real): new_tally = Tally(name='derived') new_tally._derived = True @@ -2333,9 +2337,8 @@ class Tally(object): for score in self.scores: new_tally.add_score(score) - # If original tally operands were sparse, sparsify the sliced tally - if self.sparse and other.sparse: - new_tally.sparsify() + # If this tally operand is sparse, sparsify the new tally + new_tally.sparse = self.sparse else: msg = 'Unable to multiply Tally ID="{0}" ' \ @@ -2388,6 +2391,10 @@ class Tally(object): if isinstance(other, Tally): new_tally = self.hybrid_product(other, binary_op='/') + # If original tally operands were sparse, sparsify the new tally + if self.sparse and other.sparse: + new_tally.sparse = True + elif isinstance(other, Real): new_tally = Tally(name='derived') new_tally._derived = True @@ -2406,9 +2413,8 @@ class Tally(object): for score in self.scores: new_tally.add_score(score) - # If original tally operands were sparse, sparsify the sliced tally - if self.sparse and other.sparse: - new_tally.sparsify() + # If this tally operand is sparse, sparsify the new tally + new_tally.sparse = self.sparse else: msg = 'Unable to divide Tally ID="{0}" ' \ @@ -2464,6 +2470,10 @@ class Tally(object): if isinstance(power, Tally): new_tally = self.hybrid_product(power, binary_op='^') + # If original tally operands were sparse, sparsify the new tally + if self.sparse and other.sparse: + new_tally.sparse = True + elif isinstance(power, Real): new_tally = Tally(name='derived') new_tally._derived = True @@ -2484,8 +2494,7 @@ class Tally(object): new_tally.add_score(score) # If original tally was sparse, sparsify the exponentiated tally - if self.sparse: - new_tally.sparsify() + new_tally.sparse = self.sparse else: msg = 'Unable to raise Tally ID="{0}" to ' \ @@ -2648,6 +2657,7 @@ class Tally(object): raise ValueError(msg) new_tally = copy.deepcopy(self) + new_tally.sparse = False if self.sum is not None: new_sum = self.get_values(scores, filters, filter_bins, @@ -2663,7 +2673,7 @@ class Tally(object): new_tally._mean = new_mean if self.std_dev is not None: new_std_dev = self.get_values(scores, filters, filter_bins, - nuclides, 'std_dev') + nuclides, 'std_dev') new_tally._std_dev = new_std_dev # SCORES @@ -2725,9 +2735,7 @@ class Tally(object): stride *= filter.num_bins # If original tally was sparse, sparsify the sliced tally - if self.sparse: - new_tally.sparsify() - + new_tally.sparse = self.sparse return new_tally def summation(self, scores=[], filter_type=None, @@ -2831,9 +2839,7 @@ class Tally(object): tally_sum.add_filter(filters[-1]) # If original tally was sparse, sparsify the tally summation - if self.sparse: - tally_sum.sparsify() - + tally_sum.sparse = self.sparse return tally_sum def diagonalize_filter(self, new_filter): @@ -2909,9 +2915,7 @@ class Tally(object): stride *= filter.num_bins # If original tally was sparse, sparsify the diagonalized tally - if self.sparse: - new_tally.sparsify - + new_tally.sparse = self.sparse return new_tally From 2893f10d3576d2b43391ff60d4fe6544c2ad038b Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sun, 13 Dec 2015 13:47:27 -0500 Subject: [PATCH 13/61] addressed PR comments and changed tally.get_values() routine to return copy of data --- openmc/mgxs/mgxs.py | 8 +- openmc/tallies.py | 275 +++++++++++++++++++++----------------------- 2 files changed, 133 insertions(+), 150 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 597e28e292..7913747f98 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -92,7 +92,7 @@ class MGXS(object): xs_tally : Tally Derived tally for the multi-group cross section. This attribute is None unless the multi-group cross section has been computed. - num_sumbdomains : Integral + num_subdomains : Integral The number of subdomains is unity for 'material', 'cell' and 'universe' domain types. When the This is equal to the number of cell instances for 'distribcell' domain types (it is equal to unity prior to loading @@ -1421,7 +1421,7 @@ class AbsorptionXS(MGXS): class CaptureXS(MGXS): """A capture multi-group cross section. - The Neutron capture reaction rate is defined as the difference between + The neutron capture reaction rate is defined as the difference between OpenMC's 'absorption' and 'fission' reaction rate score types. This includes not only radiative capture, but all forms of neutron disappearance aside from fission (e.g., MT > 100). @@ -1723,8 +1723,8 @@ class ScatterMatrixXS(MGXS): if self.correction == 'P0': scatter_p1 = self.tallies['scatter-P1'] scatter_p1 = scatter_p1.get_slice(scores=['scatter-P1']) - energy_filter = copy.deepcopy(self.tallies['scatter']. - find_filter('energy')) + energy_filter = self.tallies['scatter'].find_filter('energy') + energy_filter = copy.deepcopy(energy_filter) scatter_p1 = scatter_p1.diagonalize_filter(energy_filter) rxn_tally = self.tallies['scatter'] - scatter_p1 else: diff --git a/openmc/tallies.py b/openmc/tallies.py index 8b4aa89ddd..62e304d941 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -24,6 +24,11 @@ if sys.version_info[0] >= 3: # "Static" variable for auto-generated Tally IDs AUTO_TALLY_ID = 10000 +# The tally arithmetic product types. The tensor product performs the full +# cross product of the data in two tallies with respect to a specified axis +# (filters, nuclides, or scores). The entrywise product performs the arithmetic +# operation entrywise across the entries in two tallies with respect to a +# specified axis. _PRODUCT_TYPES = ['tensor', 'entrywise'] def reset_auto_tally_id(): @@ -1005,7 +1010,12 @@ class Tally(object): """ - cv.check_iterable_type('scores', scores, basestring) + for score in scores: + if not isinstance(score, (basestring, 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) + raise ValueError(msg) # Determine the score indices from any of the requested scores if scores: @@ -1106,7 +1116,7 @@ class Tally(object): '\'rel_err\', \'sum\', or \'sum_sq\''.format(self.id, value) raise LookupError(msg) - return data + return data.copy() def get_pandas_dataframe(self, filters=True, nuclides=True, scores=True, summary=None): @@ -1426,20 +1436,20 @@ class Tally(object): # Pickle the Tally results to a file pickle.dump(tally_results, open(filename, 'wb')) - def hybrid_product(self, other, binary_op, filter_product='None', - nuclide_product='None', score_product='None'): + def hybrid_product(self, other, binary_op, filter_product=None, + nuclide_product=None, score_product=None): """Combines filters, scores and nuclides with another tally. This is a helper method for the tally arithmetic methods. It is called a "hybrid product" because it performs a combination of tensor - (or Kronecker) and entrywise (or Hadamard) products. The filters, - nuclides, and scores from both tallies are combined using an entrywise - (or Hadamard) product on matching filters. By default, if all nuclides - are identical in the two tallies, the entrywise product is performed - across nuclides; else the tensor product is performed. By default, if all - scores are identical in the two tallies, the entrywise product is - performed across scores; else the tensor product is performed. Users can - also call the method explicitly and specify the desired product. + (or Kronecker) and entrywise (or Hadamard) products. The filters from + both tallies are combined using an entrywise (or Hadamard) product on + matching filters. By default, if all nuclides are identical in the two + tallies, the entrywise product is performed across nuclides; else the + tensor product is performed. By default, if all scores are identical in + the two tallies, the entrywise product is performed across scores; else + the tensor product is performed. Users can also call the method + explicitly and specify the desired product. Parameters ---------- @@ -1477,7 +1487,7 @@ class Tally(object): """ # Set default value for filter product if it was not set - if filter_product == 'None': + if filter_product is None: filter_product = 'entrywise' elif filter_product == 'tensor': msg = 'Unable to perform Tally arithmetic with a tensor product' \ @@ -1485,14 +1495,14 @@ class Tally(object): raise ValueError(msg) # Set default value for nuclide product if it was not set - if nuclide_product == 'None': + if nuclide_product is None: if self.nuclides == other.nuclides: nuclide_product = 'entrywise' else: nuclide_product = 'tensor' # Set default value for score product if it was not set - if score_product == 'None': + if score_product is None: if self.scores == other.scores: score_product = 'entrywise' else: @@ -1520,10 +1530,7 @@ class Tally(object): # Query the mean and std dev so the tally data is read in from file # if it has not already been read in. - self.mean - self.std_dev - other.mean - other.std_dev + self.mean, self.std_dev, other.mean, other.std_dev # Create copies of self and other tallies to rearrange for tally # arithmetic @@ -1581,7 +1588,7 @@ class Tally(object): # Add filters to the new tally if filter_product == 'entrywise': for self_filter in self_copy.filters: - new_tally.filters.append(self_filter) + new_tally.add_filter(self_filter) else: all_filters = [self_copy.filters, other_copy.filters] for self_filter, other_filter in itertools.product(*all_filters): @@ -1591,7 +1598,7 @@ class Tally(object): # Add nuclides to the new tally if nuclide_product == 'entrywise': for self_nuclide in self_copy.nuclides: - new_tally.nuclides.append(self_nuclide) + new_tally.add_nuclide(self_nuclide) else: all_nuclides = [self_copy.nuclides, other_copy.nuclides] for self_nuclide, other_nuclide in itertools.product(*all_nuclides): @@ -1677,7 +1684,7 @@ class Tally(object): # If necessary, swap other filter if other_index != i: - other.swap_filters(filter, other.filters[i], inplace=True) + other._swap_filters(filter, other.filters[i]) # Repeat and tile the data by nuclide in preparation for performing # the tensor product across nuclides. @@ -1710,11 +1717,11 @@ class Tally(object): # Align other nuclides with self nuclides for i, nuclide in enumerate(self.nuclides): - other_index = other.nuclides.index(nuclide) + other_index = other.get_nuclide_index(nuclide) # If necessary, swap other nuclide if other_index != i: - other.swap_nuclides(nuclide, other.nuclides[i]) + other._swap_nuclides(nuclide, other.nuclides[i]) # Repeat and tile the data by score in preparation for performing # the tensor product across scores. @@ -1744,6 +1751,7 @@ class Tally(object): self._mean = np.insert(self.mean, self.num_score_bins, 0, axis=2) self._std_dev = np.insert(self.std_dev, self.num_score_bins, 0, axis=2) self.add_score(score) + self.num_score_bins = self.num_score_bins + 1 # Align other scores with self scores for i, score in enumerate(self.scores): @@ -1751,7 +1759,7 @@ class Tally(object): # If necessary, swap other score if other_index != i: - other.swap_scores(score, other.scores[i]) + other._swap_scores(score, other.scores[i]) # Correct the stride for other filters stride = other.num_nuclides * other.num_score_bins @@ -1765,22 +1773,16 @@ class Tally(object): filter.stride = stride stride *= filter.num_bins - # Deep copy the mean and std dev data - self_mean = copy.deepcopy(self.mean) - self_std_dev = copy.deepcopy(self.std_dev) - other_mean = copy.deepcopy(other.mean) - other_std_dev = copy.deepcopy(other.std_dev) - data = {} data['self'] = {} data['other'] = {} - data['self']['mean'] = self_mean - data['other']['mean'] = other_mean - data['self']['std. dev.'] = self_std_dev - data['other']['std. dev.'] = other_std_dev + data['self']['mean'] = self.mean + data['other']['mean'] = other.mean + data['self']['std. dev.'] = self.std_dev + data['other']['std. dev.'] = other.std_dev return data - def swap_filters(self, filter1, filter2, inplace=False): + def _swap_filters(self, filter1, filter2): """Reverse the ordering of two filters in this tally This is a helper method for tally arithmetic which helps align the data @@ -1795,26 +1797,16 @@ class Tally(object): filter2 : Filter The filter to swap with filter1 - inplace : bool, optional - Whether to perform operation inplace or return new tally with the - filters swapped. - - Returns - ------- - swap_tally - If inplace is false, a copy of this tally with the filters swapped. - Otherwise, nothing is returned. - Raises ------ ValueError - If this is a derived tally or this method is called before the tally - is populated with data by the StatePoint.read_results() method. + If this method is called before the mean and std dev is computed + for this tally. """ # Check that results have been read - if not self.derived and self.sum is None: + if self.sum is None or self.std_dev is None: msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) @@ -1822,6 +1814,7 @@ class Tally(object): cv.check_type('filter1', filter1, Filter) cv.check_type('filter2', filter2, Filter) + # Check that the filters exist in the tally and are not the same if filter1 == filter2: msg = 'Unable to swap a filter with itself' raise ValueError(msg) @@ -1834,25 +1827,15 @@ class Tally(object): 'does not contain such a filter'.format(filter2.type, self.id) raise ValueError(msg) - # Create a copy of the tally that preserves the original data formatting - # throughout swapping process - tally_copy = copy.deepcopy(self) - - # Set the swap tally - if inplace: - swap_tally = self - else: - swap_tally = copy.deepcopy(self) - # Swap the filters in the copied version of this Tally - filter1_index = swap_tally.filters.index(filter1) - filter2_index = swap_tally.filters.index(filter2) - swap_tally.filters[filter1_index] = filter2 - swap_tally.filters[filter2_index] = filter1 + filter1_index = self.filters.index(filter1) + filter2_index = self.filters.index(filter2) + self.filters[filter1_index] = filter2 + self.filters[filter2_index] = filter1 # Update the strides for each of the filters - stride = swap_tally.num_nuclides * swap_tally.num_score_bins - for filter in reversed(swap_tally.filters): + stride = self.num_nuclides * self.num_score_bins + for filter in reversed(self.filters): filter.stride = stride stride *= filter.num_bins @@ -1868,46 +1851,25 @@ class Tally(object): else: filter2_bins = [filter2.get_bin(i) for i in range(filter2.num_bins)] - # Adjust the sum data array to relect the new filter order - if swap_tally.sum is not None: - for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): - filter_bins = [(bin1,), (bin2,)] - data = tally_copy.get_values( - filters=filters, filter_bins=filter_bins, value='sum') - indices = swap_tally.get_filter_indices(filters, filter_bins) - swap_tally.sum[indices, :, :] = data - - # Adjust the sum_sq data array to relect the new filter order - if swap_tally.sum_sq is not None: - for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): - filter_bins = [(bin1,), (bin2,)] - data = tally_copy.get_values( - filters=filters, filter_bins=filter_bins, value='sum_sq') - indices = swap_tally.get_filter_indices(filters, filter_bins) - swap_tally.sum_sq[indices, :, :] = data - # Adjust the mean data array to relect the new filter order - if swap_tally.mean is not None: + if self.mean is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] - data = tally_copy.get_values( + data = self.get_values( filters=filters, filter_bins=filter_bins, value='mean') - indices = swap_tally.get_filter_indices(filters, filter_bins) - swap_tally._mean[indices, :, :] = data + indices = self.get_filter_indices(filters, filter_bins) + self._mean[indices, :, :] = data # Adjust the std_dev data array to relect the new filter order - if swap_tally.std_dev is not None: + if self.std_dev is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] - data = tally_copy.get_values( + data = self.get_values( filters=filters, filter_bins=filter_bins, value='std_dev') - indices = swap_tally.get_filter_indices(filters, filter_bins) - swap_tally._std_dev[indices, :, :] = data + indices = self.get_filter_indices(filters, filter_bins) + self._std_dev[indices, :, :] = data - if not inplace: - return swap_tally - - def swap_nuclides(self, nuclide1, nuclide2): + def _swap_nuclides(self, nuclide1, nuclide2): """Reverse the ordering of two nuclides in this tally This is a helper method for tally arithmetic which helps align the data @@ -1925,44 +1887,52 @@ class Tally(object): Raises ------ ValueError - If this is a derived tally or this method is called before the tally - is populated with data by the StatePoint.read_results() method. + If this method is called before the mean and std dev is computed + for this tally. """ # Check that results have been read - if not self.derived and self.sum is None: + if self.sum is None or self.std_dev is None: msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) + cv.check_type('nuclide1', nuclide1, Nuclide) + cv.check_type('nuclide2', nuclide2, Nuclide) + + # Check that the nuclides exist in the tally and are not the same + if nuclide1 == nuclide2: + msg = 'Unable to swap a nuclide with itself' + raise ValueError(msg) + elif nuclide1 not in self.nuclides: + msg = 'Unable to swap nuclide1 "{0}" in Tally ID="{1}" since it ' \ + 'does not contain such a nuclide'\ + .format(nuclide1.name, self.id) + raise ValueError(msg) + elif nuclide2 not in self.nuclides: + msg = 'Unable to swap "{0}" nuclide2 in Tally ID="{1}" since it ' \ + 'does not contain such a nuclide'\ + .format(nuclide2.name, self.id) + raise ValueError(msg) + # Swap the nuclides in the Tally - nuclide1_index = self.nuclides.index(nuclide1) - nuclide2_index = self.nuclides.index(nuclide2) + nuclide1_index = self.get_nuclide_index(nuclide1) + nuclide2_index = self.get_nuclide_index(nuclide2) self.nuclides[nuclide1_index] = nuclide2 self.nuclides[nuclide2_index] = nuclide1 - # Copy the tally data - self_mean = copy.deepcopy(self.mean) - self_std_dev = copy.deepcopy(self.std_dev) + # Swap the mean and std dev data + nuclide1_mean = self._mean[:,nuclide1_index,:].copy() + nuclide2_mean = self._mean[:,nuclide2_index,:].copy() + nuclide1_std_dev = self._std_dev[:,nuclide1_index,:].copy() + nuclide2_std_dev = self._std_dev[:,nuclide2_index,:].copy() + self._mean[:,nuclide2_index,:] = nuclide1_mean + self._mean[:,nuclide1_index,:] = nuclide2_mean + self._std_dev[:,nuclide2_index,:] = nuclide1_std_dev + self._std_dev[:,nuclide1_index,:] = nuclide2_std_dev - # Swap nuclide 1 in place of nuclide 2 - self._mean = np.delete(self.mean, nuclide2_index, axis=1) - self._mean = np.insert(self.mean, nuclide2_index, - self_mean[:,nuclide1_index,:], axis=1) - self._std_dev = np.delete(self.std_dev, nuclide2_index, axis=1) - self._std_dev = np.insert(self.std_dev, nuclide2_index, - self_mean[:,nuclide1_index,:], axis=1) - - # Swap nuclide 2 in place of nuclide 1 - self._mean = np.delete(self.mean, nuclide1_index, axis=1) - self._mean = np.insert(self.mean, nuclide1_index, - self_mean[:,nuclide2_index,:], axis=1) - self._std_dev = np.delete(self.std_dev, nuclide1_index, axis=1) - self._std_dev = np.insert(self.std_dev, nuclide1_index, - self_mean[:,nuclide2_index,:], axis=1) - - def swap_scores(self, score1, score2): + def _swap_scores(self, score1, score2): """Reverse the ordering of two scores in this tally This is a helper method for tally arithmetic which helps align the data @@ -1971,51 +1941,64 @@ class Tally(object): Parameters ---------- - score1 : Score + score1 : str or CrossScore The score to swap with score2 - score2 : Score + score2 : str or CrossScore The score to swap with score1 Raises ------ ValueError - If this is a derived tally or this method is called before the tally - is populated with data by the StatePoint.read_results() method. + If this method is called before the mean and std dev is computed + for this tally. """ # Check that results have been read - if not self.derived and self.sum is None: + if self.sum is None or self.std_dev is None: msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) + # Check that the scores are valid + if not isinstance(score1, (basestring, CrossScore)): + msg = 'Unable to swap score "{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)): + msg = 'Unable to swap score "{0}" in Tally ID="{1}" since it is ' \ + 'not a string or CrossScore'.format(score2, self.id) + raise ValueError(msg) + + # Check that the scores exist in the tally and are not the same + if score1 == score2: + msg = 'Unable to swap a score with itself' + raise ValueError(msg) + elif score1 not in self.scores: + msg = 'Unable to swap score1 "{0}" in Tally ID="{1}" since it ' \ + 'does not contain such a score'.format(score1, self.id) + raise ValueError(msg) + elif score2 not in self.scores: + msg = 'Unable to swap score2 "{0}" in Tally ID="{1}" since it ' \ + 'does not contain such a score'.format(score2, self.id) + raise ValueError(msg) + # Swap the scores in the Tally - score1_index = self.scores.index(score1) - score2_index = self.scores.index(score2) + score1_index = self.get_score_index(score1) + score2_index = self.get_score_index(score2) self.scores[score1_index] = score2 self.scores[score2_index] = score1 - # Copy the tally data - self_mean = copy.deepcopy(self.mean) - self_std_dev = copy.deepcopy(self.std_dev) - - # Swap score 1 in place of score 2 - self._mean = np.delete(self.mean, score2_index, axis=2) - self._mean = np.insert(self.mean, score2_index, - self_mean[:,:,score1_index], axis=2) - self._std_dev = np.delete(self.std_dev, score2_index, axis=2) - self._std_dev = np.insert(self.std_dev, score2_index, - self_mean[:,:,score1_index], axis=2) - - # Swap score 2 in place of score 1 - self._mean = np.delete(self.mean, score1_index, axis=2) - self._mean = np.insert(self.mean, score1_index, - self_mean[:,:,score2_index], axis=2) - self._std_dev = np.delete(self.std_dev, score1_index, axis=2) - self._std_dev = np.insert(self.std_dev, score1_index, - self_mean[:,:,score2_index], axis=2) + # Swap the mean and std dev data + score1_mean = self._mean[:,:,score1_index].copy() + score2_mean = self._mean[:,:,score2_index].copy() + score1_std_dev = self._std_dev[:,:,score1_index].copy() + score2_std_dev = self._std_dev[:,:,score2_index].copy() + self._mean[:,:,score2_index] = score1_mean + self._mean[:,:,score1_index] = score2_mean + self._std_dev[:,:,score2_index] = score1_std_dev + self._std_dev[:,:,score1_index] = score2_std_dev def __add__(self, other): """Adds this tally to another tally or scalar value. From 52d879ebd39ff36c93e658e55505dac089b224d1 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sun, 13 Dec 2015 15:07:46 -0500 Subject: [PATCH 14/61] modified swap functions to swap sum and sum_sq, if present --- openmc/tallies.py | 108 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 81 insertions(+), 27 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 62e304d941..d624cfed4e 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1800,13 +1800,13 @@ class Tally(object): Raises ------ ValueError - If this method is called before the mean and std dev is computed - for this tally. + If this is a derived tally or this method is called before the tally + is populated with data by the StatePoint.read_results() method. """ # Check that results have been read - if self.sum is None or self.std_dev is None: + if not self.derived and self.sum is None: msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) @@ -1851,6 +1851,24 @@ class Tally(object): else: filter2_bins = [filter2.get_bin(i) for i in range(filter2.num_bins)] + # Adjust the sum data array to relect the new filter order + if self.sum is not None: + for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): + filter_bins = [(bin1,), (bin2,)] + data = self.get_values( + filters=filters, filter_bins=filter_bins, value='sum') + indices = self.get_filter_indices(filters, filter_bins) + self.sum[indices, :, :] = data + + # Adjust the sum_sq data array to relect the new filter order + if self.sum_sq is not None: + for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): + filter_bins = [(bin1,), (bin2,)] + data = self.get_values( + filters=filters, filter_bins=filter_bins, value='sum_sq') + indices = self.get_filter_indices(filters, filter_bins) + self.sum_sq[indices, :, :] = data + # Adjust the mean data array to relect the new filter order if self.mean is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): @@ -1887,13 +1905,13 @@ class Tally(object): Raises ------ ValueError - If this method is called before the mean and std dev is computed - for this tally. + If this is a derived tally or this method is called before the tally + is populated with data by the StatePoint.read_results() method. """ # Check that results have been read - if self.sum is None or self.std_dev is None: + if not self.derived and self.sum is None: msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) @@ -1922,15 +1940,33 @@ class Tally(object): self.nuclides[nuclide1_index] = nuclide2 self.nuclides[nuclide2_index] = nuclide1 - # Swap the mean and std dev data - nuclide1_mean = self._mean[:,nuclide1_index,:].copy() - nuclide2_mean = self._mean[:,nuclide2_index,:].copy() - nuclide1_std_dev = self._std_dev[:,nuclide1_index,:].copy() - nuclide2_std_dev = self._std_dev[:,nuclide2_index,:].copy() - self._mean[:,nuclide2_index,:] = nuclide1_mean - self._mean[:,nuclide1_index,:] = nuclide2_mean - self._std_dev[:,nuclide2_index,:] = nuclide1_std_dev - self._std_dev[:,nuclide1_index,:] = nuclide2_std_dev + # Adjust the sum data array to relect the new nuclide order + if self.sum is not None: + nuclide1_sum = self._sum[:,nuclide1_index,:].copy() + nuclide2_sum = self._sum[:,nuclide2_index,:].copy() + self._sum[:,nuclide2_index,:] = nuclide1_sum + self._sum[:,nuclide1_index,:] = nuclide2_sum + + # Adjust the sum_sq data array to relect the new nuclide order + if self.sum_sq is not None: + nuclide1_sum_sq = self._sum_sq[:,nuclide1_index,:].copy() + nuclide2_sum_sq = self._sum_sq[:,nuclide2_index,:].copy() + self._sum_sq[:,nuclide2_index,:] = nuclide1_sum_sq + self._sum_sq[:,nuclide1_index,:] = nuclide2_sum_sq + + # Adjust the mean data array to relect the new nuclide order + if self.mean is not None: + nuclide1_mean = self._mean[:,nuclide1_index,:].copy() + nuclide2_mean = self._mean[:,nuclide2_index,:].copy() + self._mean[:,nuclide2_index,:] = nuclide1_mean + self._mean[:,nuclide1_index,:] = nuclide2_mean + + # Adjust the std_dev data array to relect the new nuclide order + if self.std_dev is not None: + nuclide1_std_dev = self._std_dev[:,nuclide1_index,:].copy() + nuclide2_std_dev = self._std_dev[:,nuclide2_index,:].copy() + self._std_dev[:,nuclide2_index,:] = nuclide1_std_dev + self._std_dev[:,nuclide1_index,:] = nuclide2_std_dev def _swap_scores(self, score1, score2): """Reverse the ordering of two scores in this tally @@ -1950,13 +1986,13 @@ class Tally(object): Raises ------ ValueError - If this method is called before the mean and std dev is computed - for this tally. + If this is a derived tally or this method is called before the tally + is populated with data by the StatePoint.read_results() method. """ # Check that results have been read - if self.sum is None or self.std_dev is None: + if not self.derived and self.sum is None: msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) @@ -1990,15 +2026,33 @@ class Tally(object): self.scores[score1_index] = score2 self.scores[score2_index] = score1 - # Swap the mean and std dev data - score1_mean = self._mean[:,:,score1_index].copy() - score2_mean = self._mean[:,:,score2_index].copy() - score1_std_dev = self._std_dev[:,:,score1_index].copy() - score2_std_dev = self._std_dev[:,:,score2_index].copy() - self._mean[:,:,score2_index] = score1_mean - self._mean[:,:,score1_index] = score2_mean - self._std_dev[:,:,score2_index] = score1_std_dev - self._std_dev[:,:,score1_index] = score2_std_dev + # Adjust the sum data array to relect the new nuclide order + if self.sum is not None: + score1_sum = self._sum[:,:,score1_index].copy() + score2_sum = self._sum[:,:,score2_index].copy() + self._sum[:,:,score2_index] = score1_sum + self._sum[:,:,score1_index] = score2_sum + + # Adjust the sum_sq data array to relect the new nuclide order + if self.sum_sq is not None: + score1_sum_sq = self._sum_sq[:,:,score1_index].copy() + score2_sum_sq = self._sum_sq[:,:,score2_index].copy() + self._sum_sq[:,:,score2_index] = score1_sum_sq + self._sum_sq[:,:,score1_index] = score2_sum_sq + + # Adjust the mean data array to relect the new nuclide order + if self.mean is not None: + score1_mean = self._mean[:,:,score1_index].copy() + score2_mean = self._mean[:,:,score2_index].copy() + self._mean[:,:,score2_index] = score1_mean + self._mean[:,:,score1_index] = score2_mean + + # Adjust the std_dev data array to relect the new nuclide order + if self.std_dev is not None: + score1_std_dev = self._std_dev[:,:,score1_index].copy() + score2_std_dev = self._std_dev[:,:,score2_index].copy() + self._std_dev[:,:,score2_index] = score1_std_dev + self._std_dev[:,:,score1_index] = score2_std_dev def __add__(self, other): """Adds this tally to another tally or scalar value. From 16fcc9300caf8e5bb0a52ca648ecacf61a8b3aee Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Mon, 14 Dec 2015 09:32:10 -0500 Subject: [PATCH 15/61] Remove unused nonzero method and added docstring for shape property to Tally Python API class --- openmc/tallies.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index b57a0d228f..0954122d80 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -70,6 +70,9 @@ class Tally(object): Total number of filter bins accounting for all filters num_bins : Integral Total number of bins for the tally + shape : 3-tuple of Integral + The shape of the tally data array ordered as the number of filter bins, + nuclide bins and score bins num_realizations : Integral Total number of realizations with_summary : bool @@ -251,10 +254,6 @@ class Tally(object): def scores(self): return self._scores - @property - def shape(self): - return (self.num_filter_bins, self.num_nuclides, self.num_score_bins) - @property def num_scores(self): return len(self._scores) @@ -279,6 +278,10 @@ class Tally(object): num_bins *= self.num_score_bins return num_bins + @property + def shape(self): + return (self.num_filter_bins, self.num_nuclides, self.num_score_bins) + @property def estimator(self): return self._estimator @@ -312,10 +315,6 @@ class Tally(object): sum = data['sum'] sum_sq = data['sum_sq'] - # Define a routine to convert 0 to 1 - def nonzero(val): - return 1 if not val else val - # Reshape the results arrays sum = np.reshape(sum, self.shape) sum_sq = np.reshape(sum_sq, self.shape) From 50519fe62d57036dd80a9249d698db4974d76d22 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 14 Dec 2015 11:34:52 -0500 Subject: [PATCH 16/61] removed num_score_bins from Tally object and removed sum and sum_sq from tally arithmetic --- openmc/mgxs/mgxs.py | 4 +- openmc/statepoint.py | 2 - openmc/summary.py | 2 - openmc/tallies.py | 107 ++++++++----------------------------------- 4 files changed, 21 insertions(+), 94 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 7913747f98..7f521a975c 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -755,7 +755,7 @@ class MGXS(object): # Reshape condensed data arrays with one dimension for all filters new_shape = \ - (tally.num_filter_bins, tally.num_nuclides, tally.num_score_bins,) + (tally.num_filter_bins, tally.num_nuclides, tally.num_scores,) mean = np.reshape(mean, new_shape) std_dev = np.reshape(std_dev, new_shape) @@ -837,7 +837,7 @@ class MGXS(object): # Reshape averaged data arrays with one dimension for all filters new_shape = \ - (tally.num_filter_bins, tally.num_nuclides, tally.num_score_bins,) + (tally.num_filter_bins, tally.num_nuclides, tally.num_scores,) mean = np.reshape(mean, new_shape) std_dev = np.reshape(std_dev, new_shape) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 2edf9badd4..4ab7ddd5d1 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -394,8 +394,6 @@ class StatePoint(object): # Read score bins n_score_bins = self._f['{0}{1}/n_score_bins'.format(base, tally_key)].value - tally.num_score_bins = n_score_bins - scores = self._f['{0}{1}/score_bins'.format( base, tally_key)].value n_user_scores = self._f['{0}{1}/n_user_score_bins' diff --git a/openmc/summary.py b/openmc/summary.py index 4b1088e827..c14f9073d8 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -524,8 +524,6 @@ class Summary(object): scores = self._f['{0}/score_bins'.format(subbase)].value for score in scores: tally.add_score(score.decode()) - num_score_bins = self._f['{0}/n_score_bins'.format(subbase)][...] - tally.num_score_bins = num_score_bins # Read filter metadata num_filters = self._f['{0}/n_filters'.format(subbase)].value diff --git a/openmc/tallies.py b/openmc/tallies.py index d624cfed4e..d097ba0a6c 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -64,10 +64,6 @@ class Tally(object): Type of estimator for the tally triggers : list of openmc.trigger.Trigger List of tally triggers - num_score_bins : Integral - Total number of scores, accounting for the fact that a single - user-specified score, e.g. scatter-P3 or flux-Y2,2, might have multiple - bins num_scores : Integral Total number of user-specified scores num_filter_bins : Integral @@ -100,7 +96,6 @@ class Tally(object): self._estimator = None self._triggers = [] - self._num_score_bins = 0 self._num_realizations = 0 self._with_summary = False @@ -123,7 +118,6 @@ class Tally(object): clone.id = self.id clone.name = self.name clone.estimator = self.estimator - clone.num_score_bins = self.num_score_bins clone.num_realizations = self.num_realizations clone._sum = copy.deepcopy(self._sum, memo) clone._sum_sq = copy.deepcopy(self._sum_sq, memo) @@ -252,10 +246,6 @@ class Tally(object): def num_scores(self): return len(self._scores) - @property - def num_score_bins(self): - return self._num_score_bins - @property def num_filter_bins(self): num_bins = 1 @@ -269,7 +259,7 @@ class Tally(object): def num_bins(self): num_bins = self.num_filter_bins num_bins *= self.num_nuclides - num_bins *= self.num_score_bins + num_bins *= self.num_scores return num_bins @property @@ -312,7 +302,7 @@ class Tally(object): # Reshape the results arrays new_shape = (nonzero(self.num_filter_bins), nonzero(self.num_nuclides), - nonzero(self.num_score_bins)) + nonzero(self.num_scores)) sum = np.reshape(sum, new_shape) sum_sq = np.reshape(sum_sq, new_shape) @@ -468,10 +458,6 @@ class Tally(object): else: self._scores.append(score) - @num_score_bins.setter - def num_score_bins(self, num_score_bins): - self._num_score_bins = num_score_bins - @num_realizations.setter def num_realizations(self, num_realizations): cv.check_type('number of realizations', num_realizations, Integral) @@ -1286,7 +1272,7 @@ class Tally(object): for filter in self.filters: new_shape += (filter.num_bins, ) new_shape += (self.num_nuclides,) - new_shape += (self.num_score_bins,) + new_shape += (self.num_scores,) # Reshape the data with one dimension for each filter data = np.reshape(data, new_shape) @@ -1607,18 +1593,16 @@ class Tally(object): # Add scores to the new tally if score_product == 'entrywise': - new_tally.num_score_bins = self_copy.num_score_bins for self_score in self_copy.scores: new_tally.add_score(self_score) else: - new_tally.num_score_bins = self_copy.num_score_bins * other_copy.num_score_bins 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_tally.add_score(new_score) # Correct each Filter's stride - stride = new_tally.num_nuclides * new_tally.num_score_bins + stride = new_tally.num_nuclides * new_tally.num_scores for filter in reversed(new_tally.filters): filter.stride = stride stride *= filter.num_bins @@ -1726,10 +1710,10 @@ class Tally(object): # Repeat and tile the data by score in preparation for performing # the tensor product across scores. if score_product == 'tensor': - self._mean = np.repeat(self.mean, other.num_score_bins, axis=2) - self._std_dev = np.repeat(self.std_dev, other.num_score_bins, axis=2) - other._mean = np.tile(other.mean, (1, 1, self.num_score_bins)) - other._std_dev = np.tile(other.std_dev, (1, 1, self.num_score_bins)) + self._mean = np.repeat(self.mean, other.num_scores, axis=2) + self._std_dev = np.repeat(self.std_dev, other.num_scores, axis=2) + other._mean = np.tile(other.mean, (1, 1, self.num_scores)) + other._std_dev = np.tile(other.std_dev, (1, 1, self.num_scores)) # Add scores to each tally such that each tally contains the complete set # of scores necessary to perform an entrywise product. New scores added @@ -1742,16 +1726,15 @@ class Tally(object): # Add scores present in self but not in other to other for score in other_missing_scores: - other._mean = np.insert(other.mean, other.num_score_bins, 0, axis=2) - other._std_dev = np.insert(other.std_dev, other.num_score_bins, 0, axis=2) + other._mean = np.insert(other.mean, other.num_scores, 0, axis=2) + other._std_dev = np.insert(other.std_dev, other.num_scores, 0, axis=2) other.add_score(score) # Add scores present in other but not in self to self for score in self_missing_scores: - self._mean = np.insert(self.mean, self.num_score_bins, 0, axis=2) - self._std_dev = np.insert(self.std_dev, self.num_score_bins, 0, axis=2) + self._mean = np.insert(self.mean, self.num_scores, 0, axis=2) + self._std_dev = np.insert(self.std_dev, self.num_scores, 0, axis=2) self.add_score(score) - self.num_score_bins = self.num_score_bins + 1 # Align other scores with self scores for i, score in enumerate(self.scores): @@ -1762,13 +1745,13 @@ class Tally(object): other._swap_scores(score, other.scores[i]) # Correct the stride for other filters - stride = other.num_nuclides * other.num_score_bins + stride = other.num_nuclides * other.num_scores for filter in reversed(other.filters): filter.stride = stride stride *= filter.num_bins # Correct the stride for self filters - stride = self.num_nuclides * self.num_score_bins + stride = self.num_nuclides * self.num_scores for filter in reversed(self.filters): filter.stride = stride stride *= filter.num_bins @@ -1834,7 +1817,7 @@ class Tally(object): self.filters[filter2_index] = filter1 # Update the strides for each of the filters - stride = self.num_nuclides * self.num_score_bins + stride = self.num_nuclides * self.num_scores for filter in reversed(self.filters): filter.stride = stride stride *= filter.num_bins @@ -1851,24 +1834,6 @@ class Tally(object): else: filter2_bins = [filter2.get_bin(i) for i in range(filter2.num_bins)] - # Adjust the sum data array to relect the new filter order - if self.sum is not None: - for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): - filter_bins = [(bin1,), (bin2,)] - data = self.get_values( - filters=filters, filter_bins=filter_bins, value='sum') - indices = self.get_filter_indices(filters, filter_bins) - self.sum[indices, :, :] = data - - # Adjust the sum_sq data array to relect the new filter order - if self.sum_sq is not None: - for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): - filter_bins = [(bin1,), (bin2,)] - data = self.get_values( - filters=filters, filter_bins=filter_bins, value='sum_sq') - indices = self.get_filter_indices(filters, filter_bins) - self.sum_sq[indices, :, :] = data - # Adjust the mean data array to relect the new filter order if self.mean is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): @@ -1940,20 +1905,6 @@ class Tally(object): self.nuclides[nuclide1_index] = nuclide2 self.nuclides[nuclide2_index] = nuclide1 - # Adjust the sum data array to relect the new nuclide order - if self.sum is not None: - nuclide1_sum = self._sum[:,nuclide1_index,:].copy() - nuclide2_sum = self._sum[:,nuclide2_index,:].copy() - self._sum[:,nuclide2_index,:] = nuclide1_sum - self._sum[:,nuclide1_index,:] = nuclide2_sum - - # Adjust the sum_sq data array to relect the new nuclide order - if self.sum_sq is not None: - nuclide1_sum_sq = self._sum_sq[:,nuclide1_index,:].copy() - nuclide2_sum_sq = self._sum_sq[:,nuclide2_index,:].copy() - self._sum_sq[:,nuclide2_index,:] = nuclide1_sum_sq - self._sum_sq[:,nuclide1_index,:] = nuclide2_sum_sq - # Adjust the mean data array to relect the new nuclide order if self.mean is not None: nuclide1_mean = self._mean[:,nuclide1_index,:].copy() @@ -2026,20 +1977,6 @@ class Tally(object): self.scores[score1_index] = score2 self.scores[score2_index] = score1 - # Adjust the sum data array to relect the new nuclide order - if self.sum is not None: - score1_sum = self._sum[:,:,score1_index].copy() - score2_sum = self._sum[:,:,score2_index].copy() - self._sum[:,:,score2_index] = score1_sum - self._sum[:,:,score1_index] = score2_sum - - # Adjust the sum_sq data array to relect the new nuclide order - if self.sum_sq is not None: - score1_sum_sq = self._sum_sq[:,:,score1_index].copy() - score2_sum_sq = self._sum_sq[:,:,score2_index].copy() - self._sum_sq[:,:,score2_index] = score1_sum_sq - self._sum_sq[:,:,score1_index] = score2_sum_sq - # Adjust the mean data array to relect the new nuclide order if self.mean is not None: score1_mean = self._mean[:,:,score1_index].copy() @@ -2109,7 +2046,6 @@ class Tally(object): new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations - new_tally.num_score_bins = self.num_score_bins for filter in self.filters: new_tally.add_filter(filter) @@ -2178,7 +2114,6 @@ class Tally(object): new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations - new_tally.num_score_bins = self.num_score_bins for filter in self.filters: new_tally.add_filter(filter) @@ -2248,7 +2183,6 @@ class Tally(object): new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations - new_tally.num_score_bins = self.num_score_bins for filter in self.filters: new_tally.add_filter(filter) @@ -2318,7 +2252,6 @@ class Tally(object): new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations - new_tally.num_score_bins = self.num_score_bins for filter in self.filters: new_tally.add_filter(filter) @@ -2392,7 +2325,6 @@ class Tally(object): new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations - new_tally.num_score_bins = self.num_score_bins for filter in self.filters: new_tally.add_filter(filter) @@ -2594,7 +2526,6 @@ class Tally(object): # Loop over indices in reverse to remove excluded scores for score_index in reversed(score_indices): new_tally.remove_score(self.scores[score_index]) - new_tally.num_score_bins -= 1 # NUCLIDES if nuclides: @@ -2634,7 +2565,7 @@ class Tally(object): filter.num_bins = len(filter_bins[i]) # Correct each Filter's stride - stride = new_tally.num_nuclides * new_tally.num_score_bins + stride = new_tally.num_nuclides * new_tally.num_scores for filter in reversed(new_tally.filters): filter.stride = stride stride *= filter.num_bins @@ -2780,8 +2711,8 @@ class Tally(object): # Determine the shape of data in the new diagonalized Tally num_filter_bins = new_tally.num_filter_bins num_nuclides = new_tally.num_nuclides - num_score_bins = new_tally.num_score_bins - new_shape = (num_filter_bins, num_nuclides, num_score_bins) + num_scores = new_tally.num_scores + new_shape = (num_filter_bins, num_nuclides, num_scores) # Determine "base" indices along the new "diagonal", and the factor # by which the "base" indices should be repeated to account for all @@ -2811,7 +2742,7 @@ class Tally(object): new_tally._std_dev[diag_indices, :, :] = self.std_dev # Correct each Filter's stride - stride = new_tally.num_nuclides * new_tally.num_score_bins + stride = new_tally.num_nuclides * new_tally.num_scores for filter in reversed(new_tally.filters): filter.stride = stride stride *= filter.num_bins From a0160ad48ab32b954034c0ae5ce8da733bbde73f Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 17 Dec 2015 15:07:32 -0500 Subject: [PATCH 17/61] reverted to using num_score_bins in tallies.py --- openmc/statepoint.py | 8 ++++--- openmc/summary.py | 2 ++ openmc/tallies.py | 52 ++++++++++++++++++++++++++++---------------- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 4ab7ddd5d1..1ff0584a72 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -9,9 +9,9 @@ if sys.version > '3': class StatePoint(object): - """State information on a simulation at a certain point in time (at the end of a - given batch). Statepoints can be used to analyze tally results as well as - restart a simulation. + """State information on a simulation at a certain point in time (at the end + of a given batch). Statepoints can be used to analyze tally results as well + as restart a simulation. Attributes ---------- @@ -394,6 +394,8 @@ class StatePoint(object): # Read score bins n_score_bins = self._f['{0}{1}/n_score_bins'.format(base, tally_key)].value + tally.num_score_bins = n_score_bins + scores = self._f['{0}{1}/score_bins'.format( base, tally_key)].value n_user_scores = self._f['{0}{1}/n_user_score_bins' diff --git a/openmc/summary.py b/openmc/summary.py index c14f9073d8..4b1088e827 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -524,6 +524,8 @@ class Summary(object): scores = self._f['{0}/score_bins'.format(subbase)].value for score in scores: tally.add_score(score.decode()) + num_score_bins = self._f['{0}/n_score_bins'.format(subbase)][...] + tally.num_score_bins = num_score_bins # Read filter metadata num_filters = self._f['{0}/n_filters'.format(subbase)].value diff --git a/openmc/tallies.py b/openmc/tallies.py index d097ba0a6c..e3b9fb439f 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -64,6 +64,10 @@ class Tally(object): Type of estimator for the tally triggers : list of openmc.trigger.Trigger List of tally triggers + num_score_bins : Integral + Total number of scores, accounting for the fact that a single + user-specified score, e.g. scatter-P3 or flux-Y2,2, might have multiple + bins num_scores : Integral Total number of user-specified scores num_filter_bins : Integral @@ -96,6 +100,7 @@ class Tally(object): self._estimator = None self._triggers = [] + self._num_score_bins = 0 self._num_realizations = 0 self._with_summary = False @@ -118,6 +123,7 @@ class Tally(object): clone.id = self.id clone.name = self.name clone.estimator = self.estimator + clone.num_score_bins = self.num_score_bins clone.num_realizations = self.num_realizations clone._sum = copy.deepcopy(self._sum, memo) clone._sum_sq = copy.deepcopy(self._sum_sq, memo) @@ -246,6 +252,10 @@ class Tally(object): def num_scores(self): return len(self._scores) + @property + def num_score_bins(self): + return self._num_score_bins + @property def num_filter_bins(self): num_bins = 1 @@ -259,7 +269,7 @@ class Tally(object): def num_bins(self): num_bins = self.num_filter_bins num_bins *= self.num_nuclides - num_bins *= self.num_scores + num_bins *= self.num_score_bins return num_bins @property @@ -302,7 +312,7 @@ class Tally(object): # Reshape the results arrays new_shape = (nonzero(self.num_filter_bins), nonzero(self.num_nuclides), - nonzero(self.num_scores)) + nonzero(self.num_score_bins)) sum = np.reshape(sum, new_shape) sum_sq = np.reshape(sum_sq, new_shape) @@ -458,6 +468,10 @@ class Tally(object): else: self._scores.append(score) + @num_score_bins.setter + def num_score_bins(self, num_score_bins): + self._num_score_bins = num_score_bins + @num_realizations.setter def num_realizations(self, num_realizations): cv.check_type('number of realizations', num_realizations, Integral) @@ -1272,7 +1286,7 @@ class Tally(object): for filter in self.filters: new_shape += (filter.num_bins, ) new_shape += (self.num_nuclides,) - new_shape += (self.num_scores,) + new_shape += (self.num_score_bins,) # Reshape the data with one dimension for each filter data = np.reshape(data, new_shape) @@ -1602,7 +1616,7 @@ class Tally(object): new_tally.add_score(new_score) # Correct each Filter's stride - stride = new_tally.num_nuclides * new_tally.num_scores + stride = new_tally.num_nuclides * new_tally.num_score_bins for filter in reversed(new_tally.filters): filter.stride = stride stride *= filter.num_bins @@ -1710,10 +1724,10 @@ class Tally(object): # Repeat and tile the data by score in preparation for performing # the tensor product across scores. if score_product == 'tensor': - self._mean = np.repeat(self.mean, other.num_scores, axis=2) - self._std_dev = np.repeat(self.std_dev, other.num_scores, axis=2) - other._mean = np.tile(other.mean, (1, 1, self.num_scores)) - other._std_dev = np.tile(other.std_dev, (1, 1, self.num_scores)) + self._mean = np.repeat(self.mean, other.num_score_bins, axis=2) + self._std_dev = np.repeat(self.std_dev, other.num_score_bins, axis=2) + other._mean = np.tile(other.mean, (1, 1, self.num_score_bins)) + other._std_dev = np.tile(other.std_dev, (1, 1, self.num_score_bins)) # Add scores to each tally such that each tally contains the complete set # of scores necessary to perform an entrywise product. New scores added @@ -1726,14 +1740,14 @@ class Tally(object): # Add scores present in self but not in other to other for score in other_missing_scores: - other._mean = np.insert(other.mean, other.num_scores, 0, axis=2) - other._std_dev = np.insert(other.std_dev, other.num_scores, 0, axis=2) + other._mean = np.insert(other.mean, other.num_score_bins, 0, axis=2) + other._std_dev = np.insert(other.std_dev, other.num_score_bins, 0, axis=2) other.add_score(score) # Add scores present in other but not in self to self for score in self_missing_scores: - self._mean = np.insert(self.mean, self.num_scores, 0, axis=2) - self._std_dev = np.insert(self.std_dev, self.num_scores, 0, axis=2) + self._mean = np.insert(self.mean, self.num_score_bins, 0, axis=2) + self._std_dev = np.insert(self.std_dev, self.num_score_bins, 0, axis=2) self.add_score(score) # Align other scores with self scores @@ -1745,13 +1759,13 @@ class Tally(object): other._swap_scores(score, other.scores[i]) # Correct the stride for other filters - stride = other.num_nuclides * other.num_scores + stride = other.num_nuclides * other.num_score_bins for filter in reversed(other.filters): filter.stride = stride stride *= filter.num_bins # Correct the stride for self filters - stride = self.num_nuclides * self.num_scores + stride = self.num_nuclides * self.num_score_bins for filter in reversed(self.filters): filter.stride = stride stride *= filter.num_bins @@ -1817,7 +1831,7 @@ class Tally(object): self.filters[filter2_index] = filter1 # Update the strides for each of the filters - stride = self.num_nuclides * self.num_scores + stride = self.num_nuclides * self.num_score_bins for filter in reversed(self.filters): filter.stride = stride stride *= filter.num_bins @@ -2565,7 +2579,7 @@ class Tally(object): filter.num_bins = len(filter_bins[i]) # Correct each Filter's stride - stride = new_tally.num_nuclides * new_tally.num_scores + stride = new_tally.num_nuclides * new_tally.num_score_bins for filter in reversed(new_tally.filters): filter.stride = stride stride *= filter.num_bins @@ -2711,8 +2725,8 @@ class Tally(object): # Determine the shape of data in the new diagonalized Tally num_filter_bins = new_tally.num_filter_bins num_nuclides = new_tally.num_nuclides - num_scores = new_tally.num_scores - new_shape = (num_filter_bins, num_nuclides, num_scores) + num_score_bins = new_tally.num_score_bins + new_shape = (num_filter_bins, num_nuclides, num_score_bins) # Determine "base" indices along the new "diagonal", and the factor # by which the "base" indices should be repeated to account for all @@ -2742,7 +2756,7 @@ class Tally(object): new_tally._std_dev[diag_indices, :, :] = self.std_dev # Correct each Filter's stride - stride = new_tally.num_nuclides * new_tally.num_scores + stride = new_tally.num_nuclides * new_tally.num_score_bins for filter in reversed(new_tally.filters): filter.stride = stride stride *= filter.num_bins From 4a21ac8bf6adfa28897489093171eac79b7051cb Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 17 Dec 2015 18:20:57 -0500 Subject: [PATCH 18/61] fixed errors in reverting to num_score_bins --- openmc/mgxs/mgxs.py | 4 ++-- openmc/tallies.py | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 7f521a975c..7913747f98 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -755,7 +755,7 @@ class MGXS(object): # Reshape condensed data arrays with one dimension for all filters new_shape = \ - (tally.num_filter_bins, tally.num_nuclides, tally.num_scores,) + (tally.num_filter_bins, tally.num_nuclides, tally.num_score_bins,) mean = np.reshape(mean, new_shape) std_dev = np.reshape(std_dev, new_shape) @@ -837,7 +837,7 @@ class MGXS(object): # Reshape averaged data arrays with one dimension for all filters new_shape = \ - (tally.num_filter_bins, tally.num_nuclides, tally.num_scores,) + (tally.num_filter_bins, tally.num_nuclides, tally.num_score_bins,) mean = np.reshape(mean, new_shape) std_dev = np.reshape(std_dev, new_shape) diff --git a/openmc/tallies.py b/openmc/tallies.py index e3b9fb439f..4fa4f187dd 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1607,9 +1607,11 @@ class Tally(object): # Add scores to the new tally if score_product == 'entrywise': + new_tally.num_score_bins = self_copy.num_score_bins for self_score in self_copy.scores: new_tally.add_score(self_score) else: + new_tally.num_score_bins = self_copy.num_score_bins * other_copy.num_score_bins 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) @@ -1749,6 +1751,7 @@ class Tally(object): self._mean = np.insert(self.mean, self.num_score_bins, 0, axis=2) self._std_dev = np.insert(self.std_dev, self.num_score_bins, 0, axis=2) self.add_score(score) + self.num_score_bins += 1 # Align other scores with self scores for i, score in enumerate(self.scores): @@ -2060,6 +2063,7 @@ class Tally(object): new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations + new_tally.num_score_bins = self.num_score_bins for filter in self.filters: new_tally.add_filter(filter) @@ -2128,6 +2132,7 @@ class Tally(object): new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations + new_tally.num_score_bins = self.num_score_bins for filter in self.filters: new_tally.add_filter(filter) @@ -2197,6 +2202,7 @@ class Tally(object): new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations + new_tally.num_score_bins = self.num_score_bins for filter in self.filters: new_tally.add_filter(filter) @@ -2266,6 +2272,7 @@ class Tally(object): new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations + new_tally.num_score_bins = self.num_score_bins for filter in self.filters: new_tally.add_filter(filter) @@ -2339,6 +2346,7 @@ class Tally(object): new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations + new_tally.num_score_bins = self.num_score_bins for filter in self.filters: new_tally.add_filter(filter) @@ -2540,6 +2548,7 @@ class Tally(object): # Loop over indices in reverse to remove excluded scores for score_index in reversed(score_indices): new_tally.remove_score(self.scores[score_index]) + new_tally.num_score_bins -= 1 # NUCLIDES if nuclides: From 587f0e8f0e842089bfc727d06be2d9f1cc539dea Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Fri, 18 Dec 2015 13:59:16 -0800 Subject: [PATCH 19/61] extended tally arithmetic test to cover different hybrid tallies and fixed bug in tallies.py --- openmc/tallies.py | 2 +- tests/test_tally_arithmetic/geometry.xml | 8 - tests/test_tally_arithmetic/materials.xml | 11 - tests/test_tally_arithmetic/results_true.dat | 1582 ++++++++++++++++- tests/test_tally_arithmetic/settings.xml | 18 - tests/test_tally_arithmetic/tallies.xml | 15 - .../test_tally_arithmetic.py | 169 +- 7 files changed, 1691 insertions(+), 114 deletions(-) delete mode 100644 tests/test_tally_arithmetic/geometry.xml delete mode 100644 tests/test_tally_arithmetic/materials.xml delete mode 100644 tests/test_tally_arithmetic/settings.xml delete mode 100644 tests/test_tally_arithmetic/tallies.xml diff --git a/openmc/tallies.py b/openmc/tallies.py index 4fa4f187dd..73bf4c0dff 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1846,7 +1846,7 @@ class Tally(object): else: filter1_bins = [(filter1.get_bin(i)) for i in range(filter1.num_bins)] - if filter1.type == 'distribcell': + if filter2.type == 'distribcell': filter2_bins = np.arange(filter2.num_bins) else: filter2_bins = [filter2.get_bin(i) for i in range(filter2.num_bins)] diff --git a/tests/test_tally_arithmetic/geometry.xml b/tests/test_tally_arithmetic/geometry.xml deleted file mode 100644 index bc56030e18..0000000000 --- a/tests/test_tally_arithmetic/geometry.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/tests/test_tally_arithmetic/materials.xml b/tests/test_tally_arithmetic/materials.xml deleted file mode 100644 index e7947a92da..0000000000 --- a/tests/test_tally_arithmetic/materials.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/tests/test_tally_arithmetic/results_true.dat b/tests/test_tally_arithmetic/results_true.dat index 23dd38cfb6..cf1189261b 100644 --- a/tests/test_tally_arithmetic/results_true.dat +++ b/tests/test_tally_arithmetic/results_true.dat @@ -1,53 +1,1541 @@ Tally - ID = 10000 - Name = (tally 1 + tally 2) - Filters = - cell [1] - energy [ 0. 20.] - material [1] - Nuclides = (U-235 + U-235) (U-235 + Pu-239) (U-238 + U-235) (U-238 + Pu-239) - Scores = [(fission + fission), (fission + absorption), (nu-fission + fission), (nu-fission + absorption)] - Estimator = tracklength -[[[ 0.07510122 0.07839105 0.13713377 0.1404236 ] - [ 0.0916553 0.09321683 0.15368785 0.15524938] - [ 0.04596277 0.0492526 0.06126275 0.06455259] - [ 0.06251685 0.06407838 0.07781683 0.07937836]]]Tally - ID = 10001 - Name = (tally 1 - tally 2) - Filters = - cell [1] - energy [ 0. 20.] - material [1] - Nuclides = (U-235 - U-235) (U-235 - Pu-239) (U-238 - U-235) (U-238 - Pu-239) - Scores = [(fission - fission), (fission - absorption), (nu-fission - fission), (nu-fission - absorption)] - Estimator = tracklength -[[[ 0. -0.00328983 0.06203255 0.05874271] - [-0.01655408 -0.01811561 0.04547847 0.04391694] - [-0.02913845 -0.03242829 -0.01383847 -0.0171283 ] - [-0.04569253 -0.04725406 -0.03039255 -0.03195408]]]Tally - ID = 10002 + ID = 10004 Name = (tally 1 * tally 2) Filters = - cell [1] - energy [ 0. 20.] - material [1] - Nuclides = (U-235 * U-235) (U-235 * Pu-239) (U-238 * U-235) (U-238 * Pu-239) - Scores = [(fission * fission), (fission * absorption), (nu-fission * fission), (nu-fission * absorption)] + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + universe [1 3] + Nuclides = (U-235 * U-238) (U-235 * U-235) (Pu-239 * U-238) (Pu-239 * U-235) + Scores = [(nu-fission * total), (nu-fission * fission), (total * total), (total * fission)] Estimator = tracklength -[[[ 0.00141005 0.00153358 0.00373941 0.00406702] - [ 0.00203166 0.0020903 0.00538792 0.00554342] - [ 0.00031588 0.00034356 0.00089041 0.00096841] - [ 0.00045514 0.00046827 0.00128294 0.00131997]]]Tally - ID = 10003 - Name = (tally 1 / tally 2) +[[[ 4.38740856e-02 4.44445557e-08 2.18498184e-02 2.21339193e-08] + [ 3.91423913e-02 3.22796615e-02 1.94933781e-02 1.60756567e-02] + [ 2.68307165e-02 2.71795812e-08 1.39204488e-02 1.41014486e-08] + [ 2.39371006e-02 1.97402734e-02 1.24191684e-02 1.02417491e-02]] + + [[ 4.38740856e-02 4.44445557e-08 2.18498184e-02 2.21339193e-08] + [ 3.91423913e-02 3.22796615e-02 1.94933781e-02 1.60756567e-02] + [ 2.68307165e-02 2.71795812e-08 1.39204488e-02 1.41014486e-08] + [ 2.39371006e-02 1.97402734e-02 1.24191684e-02 1.02417491e-02]] + + [[ 6.34252895e-02 9.32564450e-07 4.92445903e-02 7.24060618e-07] + [ 6.77320364e-03 3.57584505e-03 5.25884298e-03 2.77635350e-03] + [ 6.58867184e-02 9.68755709e-07 4.08248924e-02 6.00262822e-07] + [ 7.03606029e-03 3.71461759e-03 4.35970118e-03 2.30166059e-03]] + + [[ 6.34252895e-02 9.32564450e-07 4.92445903e-02 7.24060618e-07] + [ 6.77320364e-03 3.57584505e-03 5.25884298e-03 2.77635350e-03] + [ 6.58867184e-02 9.68755709e-07 4.08248924e-02 6.00262822e-07] + [ 7.03606029e-03 3.71461759e-03 4.35970118e-03 2.30166059e-03]] + + [[ 1.41588780e-02 1.27076668e-06 3.12556757e-02 2.80521318e-06] + [ 3.40319989e-04 6.28212863e-05 7.51255235e-04 1.38677779e-04] + [ 4.32998473e-03 3.88618386e-07 9.24461087e-03 8.29708643e-07] + [ 1.04074656e-04 1.92116360e-05 2.22201637e-04 4.10172576e-05]] + + [[ 1.41588780e-02 1.27076668e-06 3.12556757e-02 2.80521318e-06] + [ 3.40319989e-04 6.28212863e-05 7.51255235e-04 1.38677779e-04] + [ 4.32998473e-03 3.88618386e-07 9.24461087e-03 8.29708643e-07] + [ 1.04074656e-04 1.92116360e-05 2.22201637e-04 4.10172576e-05]] + + [[ 1.30500388e-03 7.58050822e-05 2.86079380e-03 1.66177827e-04] + [ 2.87565919e-05 4.85258186e-06 6.30394140e-05 1.06376972e-05] + [ 6.91597829e-04 4.01735436e-05 8.36826356e-04 4.86095802e-05] + [ 1.52397988e-05 2.57166674e-06 1.84400019e-05 3.11169067e-06]] + + [[ 1.30500388e-03 7.58050822e-05 2.86079380e-03 1.66177827e-04] + [ 2.87565919e-05 4.85258186e-06 6.30394140e-05 1.06376972e-05] + [ 6.91597829e-04 4.01735436e-05 8.36826356e-04 4.86095802e-05] + [ 1.52397988e-05 2.57166674e-06 1.84400019e-05 3.11169067e-06]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally + ID = 10005 + Name = (tally 1 * tally 2) Filters = - cell [1] - energy [ 0. 20.] - material [1] - Nuclides = (U-235 / U-235) (U-235 / Pu-239) (U-238 / U-235) (U-238 / Pu-239) - Scores = [(fission / fission), (fission / absorption), (nu-fission / fission), (nu-fission / absorption)] + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + universe [1 3] + Nuclides = (U-235 * U-238) (U-235 * U-235) (Pu-239 * U-238) (Pu-239 * U-235) + Scores = [(nu-fission * total), (nu-fission * fission), (total * total), (total * fission)] Estimator = tracklength -[[[ 1. 0.91944666 2.65197177 2.4383466 ] - [ 0.69403611 0.67456727 1.84056418 1.78893335] - [ 0.22402189 0.20597618 0.63147153 0.58060439] - [ 0.15547928 0.15111784 0.43826405 0.42597002]]] \ No newline at end of file +[[[ 4.38740856e-02 4.44445557e-08 2.18498184e-02 2.21339193e-08] + [ 3.91423913e-02 3.22796615e-02 1.94933781e-02 1.60756567e-02] + [ 2.68307165e-02 2.71795812e-08 1.39204488e-02 1.41014486e-08] + [ 2.39371006e-02 1.97402734e-02 1.24191684e-02 1.02417491e-02]] + + [[ 4.38740856e-02 4.44445557e-08 2.18498184e-02 2.21339193e-08] + [ 3.91423913e-02 3.22796615e-02 1.94933781e-02 1.60756567e-02] + [ 2.68307165e-02 2.71795812e-08 1.39204488e-02 1.41014486e-08] + [ 2.39371006e-02 1.97402734e-02 1.24191684e-02 1.02417491e-02]] + + [[ 6.34252895e-02 9.32564450e-07 4.92445903e-02 7.24060618e-07] + [ 6.77320364e-03 3.57584505e-03 5.25884298e-03 2.77635350e-03] + [ 6.58867184e-02 9.68755709e-07 4.08248924e-02 6.00262822e-07] + [ 7.03606029e-03 3.71461759e-03 4.35970118e-03 2.30166059e-03]] + + [[ 6.34252895e-02 9.32564450e-07 4.92445903e-02 7.24060618e-07] + [ 6.77320364e-03 3.57584505e-03 5.25884298e-03 2.77635350e-03] + [ 6.58867184e-02 9.68755709e-07 4.08248924e-02 6.00262822e-07] + [ 7.03606029e-03 3.71461759e-03 4.35970118e-03 2.30166059e-03]] + + [[ 1.41588780e-02 1.27076668e-06 3.12556757e-02 2.80521318e-06] + [ 3.40319989e-04 6.28212863e-05 7.51255235e-04 1.38677779e-04] + [ 4.32998473e-03 3.88618386e-07 9.24461087e-03 8.29708643e-07] + [ 1.04074656e-04 1.92116360e-05 2.22201637e-04 4.10172576e-05]] + + [[ 1.41588780e-02 1.27076668e-06 3.12556757e-02 2.80521318e-06] + [ 3.40319989e-04 6.28212863e-05 7.51255235e-04 1.38677779e-04] + [ 4.32998473e-03 3.88618386e-07 9.24461087e-03 8.29708643e-07] + [ 1.04074656e-04 1.92116360e-05 2.22201637e-04 4.10172576e-05]] + + [[ 1.30500388e-03 7.58050822e-05 2.86079380e-03 1.66177827e-04] + [ 2.87565919e-05 4.85258186e-06 6.30394140e-05 1.06376972e-05] + [ 6.91597829e-04 4.01735436e-05 8.36826356e-04 4.86095802e-05] + [ 1.52397988e-05 2.57166674e-06 1.84400019e-05 3.11169067e-06]] + + [[ 1.30500388e-03 7.58050822e-05 2.86079380e-03 1.66177827e-04] + [ 2.87565919e-05 4.85258186e-06 6.30394140e-05 1.06376972e-05] + [ 6.91597829e-04 4.01735436e-05 8.36826356e-04 4.86095802e-05] + [ 1.52397988e-05 2.57166674e-06 1.84400019e-05 3.11169067e-06]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally + ID = 10006 + Name = (tally 1 * tally 2) + Filters = + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + universe [1 3] + Nuclides = U-235 Pu-239 U-238 + Scores = [(nu-fission * total), (nu-fission * fission), (total * total), (total * fission)] + Estimator = tracklength +[[[ 3.91423913e-02 3.22796615e-02 1.94933781e-02 1.60756567e-02] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 3.91423913e-02 3.22796615e-02 1.94933781e-02 1.60756567e-02] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 6.77320364e-03 3.57584505e-03 5.25884298e-03 2.77635350e-03] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 6.77320364e-03 3.57584505e-03 5.25884298e-03 2.77635350e-03] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 3.40319989e-04 6.28212863e-05 7.51255235e-04 1.38677779e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 3.40319989e-04 6.28212863e-05 7.51255235e-04 1.38677779e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 2.87565919e-05 4.85258186e-06 6.30394140e-05 1.06376972e-05] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 2.87565919e-05 4.85258186e-06 6.30394140e-05 1.06376972e-05] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally + ID = 10007 + Name = (tally 1 * tally 2) + Filters = + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + universe [1 3] + Nuclides = (U-235 * U-238) (U-235 * U-235) (Pu-239 * U-238) (Pu-239 * U-235) + Scores = [u'nu-fission', u'total', u'fission'] + Estimator = tracklength +[[[ 0.00000000e+00 2.18498184e-02 0.00000000e+00] + [ 0.00000000e+00 1.94933781e-02 0.00000000e+00] + [ 0.00000000e+00 1.39204488e-02 0.00000000e+00] + [ 0.00000000e+00 1.24191684e-02 0.00000000e+00]] + + [[ 0.00000000e+00 2.18498184e-02 0.00000000e+00] + [ 0.00000000e+00 1.94933781e-02 0.00000000e+00] + [ 0.00000000e+00 1.39204488e-02 0.00000000e+00] + [ 0.00000000e+00 1.24191684e-02 0.00000000e+00]] + + [[ 0.00000000e+00 4.92445903e-02 0.00000000e+00] + [ 0.00000000e+00 5.25884298e-03 0.00000000e+00] + [ 0.00000000e+00 4.08248924e-02 0.00000000e+00] + [ 0.00000000e+00 4.35970118e-03 0.00000000e+00]] + + [[ 0.00000000e+00 4.92445903e-02 0.00000000e+00] + [ 0.00000000e+00 5.25884298e-03 0.00000000e+00] + [ 0.00000000e+00 4.08248924e-02 0.00000000e+00] + [ 0.00000000e+00 4.35970118e-03 0.00000000e+00]] + + [[ 0.00000000e+00 3.12556757e-02 0.00000000e+00] + [ 0.00000000e+00 7.51255235e-04 0.00000000e+00] + [ 0.00000000e+00 9.24461087e-03 0.00000000e+00] + [ 0.00000000e+00 2.22201637e-04 0.00000000e+00]] + + [[ 0.00000000e+00 3.12556757e-02 0.00000000e+00] + [ 0.00000000e+00 7.51255235e-04 0.00000000e+00] + [ 0.00000000e+00 9.24461087e-03 0.00000000e+00] + [ 0.00000000e+00 2.22201637e-04 0.00000000e+00]] + + [[ 0.00000000e+00 2.86079380e-03 0.00000000e+00] + [ 0.00000000e+00 6.30394140e-05 0.00000000e+00] + [ 0.00000000e+00 8.36826356e-04 0.00000000e+00] + [ 0.00000000e+00 1.84400019e-05 0.00000000e+00]] + + [[ 0.00000000e+00 2.86079380e-03 0.00000000e+00] + [ 0.00000000e+00 6.30394140e-05 0.00000000e+00] + [ 0.00000000e+00 8.36826356e-04 0.00000000e+00] + [ 0.00000000e+00 1.84400019e-05 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally + ID = 10008 + Name = (tally 1 * tally 2) + Filters = + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + universe [1 3] + Nuclides = U-235 Pu-239 U-238 + Scores = [u'nu-fission', u'total', u'fission'] + Estimator = tracklength +[[[ 0.00000000e+00 1.94933781e-02 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 1.94933781e-02 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 5.25884298e-03 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 5.25884298e-03 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 7.51255235e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 7.51255235e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 6.30394140e-05 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 6.30394140e-05 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally + ID = 10009 + Name = (tally 1 * tally 3) + Filters = + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + distribcell [60] + Nuclides = (U-235 * U-235) (U-235 * O-16) (Pu-239 * U-235) (Pu-239 * O-16) + Scores = [(nu-fission * absorption), (nu-fission * total), (total * absorption), (total * total)] + Estimator = tracklength +[[[ 1.28735734e-03 1.32667348e-03 6.41119323e-04 6.60699229e-04] + [ 7.64287878e-08 1.96051024e-03 3.80624487e-08 9.76357502e-04] + [ 7.87269280e-04 8.11312633e-04 4.08455054e-04 4.20929349e-04] + [ 4.67391880e-08 1.19892856e-03 2.42494633e-08 6.22034217e-04]] + + [[ 1.28735734e-03 1.32667348e-03 6.41119323e-04 6.60699229e-04] + [ 7.64287878e-08 1.96051024e-03 3.80624487e-08 9.76357502e-04] + [ 7.87269280e-04 8.11312633e-04 4.08455054e-04 4.20929349e-04] + [ 4.67391880e-08 1.19892856e-03 2.42494633e-08 6.22034217e-04]] + + [[ 3.23659105e-04 4.09115129e-04 1.61186098e-04 2.03744218e-04] + [ 2.11850877e-08 5.44379963e-03 1.05504266e-08 2.71107720e-03] + [ 1.97930180e-04 2.50189876e-04 1.02691143e-04 1.29804785e-04] + [ 1.29555083e-08 3.32909603e-03 6.72164275e-09 1.72721855e-03]] + + ..., + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally + ID = 10010 + Name = (tally 1 * tally 3) + Filters = + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + distribcell [60] + Nuclides = (U-235 * U-235) (U-235 * O-16) (Pu-239 * U-235) (Pu-239 * O-16) + Scores = [(nu-fission * absorption), (nu-fission * total), (total * absorption), (total * total)] + Estimator = tracklength +[[[ 1.28735734e-03 1.32667348e-03 6.41119323e-04 6.60699229e-04] + [ 7.64287878e-08 1.96051024e-03 3.80624487e-08 9.76357502e-04] + [ 7.87269280e-04 8.11312633e-04 4.08455054e-04 4.20929349e-04] + [ 4.67391880e-08 1.19892856e-03 2.42494633e-08 6.22034217e-04]] + + [[ 1.28735734e-03 1.32667348e-03 6.41119323e-04 6.60699229e-04] + [ 7.64287878e-08 1.96051024e-03 3.80624487e-08 9.76357502e-04] + [ 7.87269280e-04 8.11312633e-04 4.08455054e-04 4.20929349e-04] + [ 4.67391880e-08 1.19892856e-03 2.42494633e-08 6.22034217e-04]] + + [[ 3.23659105e-04 4.09115129e-04 1.61186098e-04 2.03744218e-04] + [ 2.11850877e-08 5.44379963e-03 1.05504266e-08 2.71107720e-03] + [ 1.97930180e-04 2.50189876e-04 1.02691143e-04 1.29804785e-04] + [ 1.29555083e-08 3.32909603e-03 6.72164275e-09 1.72721855e-03]] + + ..., + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally + ID = 10011 + Name = (tally 1 * tally 3) + Filters = + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + distribcell [60] + Nuclides = U-235 Pu-239 O-16 + Scores = [(nu-fission * absorption), (nu-fission * total), (total * absorption), (total * total)] + Estimator = tracklength +[[[ 0.00128736 0.00132667 0.00064112 0.0006607 ] + [ 0. 0. 0. 0. ] + [ 0. 0. 0. 0. ]] + + [[ 0.00128736 0.00132667 0.00064112 0.0006607 ] + [ 0. 0. 0. 0. ] + [ 0. 0. 0. 0. ]] + + [[ 0.00032366 0.00040912 0.00016119 0.00020374] + [ 0. 0. 0. 0. ] + [ 0. 0. 0. 0. ]] + + ..., + [[ 0. 0. 0. 0. ] + [ 0. 0. 0. 0. ] + [ 0. 0. 0. 0. ]] + + [[ 0. 0. 0. 0. ] + [ 0. 0. 0. 0. ] + [ 0. 0. 0. 0. ]] + + [[ 0. 0. 0. 0. ] + [ 0. 0. 0. 0. ] + [ 0. 0. 0. 0. ]]]Tally + ID = 10012 + Name = (tally 1 * tally 3) + Filters = + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + distribcell [60] + Nuclides = (U-235 * U-235) (U-235 * O-16) (Pu-239 * U-235) (Pu-239 * O-16) + Scores = [u'nu-fission', u'total', u'absorption'] + Estimator = tracklength +[[[ 0. 0.0006607 0. ] + [ 0. 0.00097636 0. ] + [ 0. 0.00042093 0. ] + [ 0. 0.00062203 0. ]] + + [[ 0. 0.0006607 0. ] + [ 0. 0.00097636 0. ] + [ 0. 0.00042093 0. ] + [ 0. 0.00062203 0. ]] + + [[ 0. 0.00020374 0. ] + [ 0. 0.00271108 0. ] + [ 0. 0.0001298 0. ] + [ 0. 0.00172722 0. ]] + + ..., + [[ 0. 0. 0. ] + [ 0. 0. 0. ] + [ 0. 0. 0. ] + [ 0. 0. 0. ]] + + [[ 0. 0. 0. ] + [ 0. 0. 0. ] + [ 0. 0. 0. ] + [ 0. 0. 0. ]] + + [[ 0. 0. 0. ] + [ 0. 0. 0. ] + [ 0. 0. 0. ] + [ 0. 0. 0. ]]]Tally + ID = 10013 + Name = (tally 1 * tally 3) + Filters = + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + distribcell [60] + Nuclides = U-235 Pu-239 O-16 + Scores = [u'nu-fission', u'total', u'absorption'] + Estimator = tracklength +[[[ 0. 0.0006607 0. ] + [ 0. 0. 0. ] + [ 0. 0. 0. ]] + + [[ 0. 0.0006607 0. ] + [ 0. 0. 0. ] + [ 0. 0. 0. ]] + + [[ 0. 0.00020374 0. ] + [ 0. 0. 0. ] + [ 0. 0. 0. ]] + + ..., + [[ 0. 0. 0. ] + [ 0. 0. 0. ] + [ 0. 0. 0. ]] + + [[ 0. 0. 0. ] + [ 0. 0. 0. ] + [ 0. 0. 0. ]] + + [[ 0. 0. 0. ] + [ 0. 0. 0. ] + [ 0. 0. 0. ]]]Tally + ID = 10014 + Name = (tally 1 * tally 4) + Filters = + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + mesh [1] + Nuclides = (U-235 * U-235) (U-235 * Zr-90) (Pu-239 * U-235) (Pu-239 * Zr-90) + Scores = [(nu-fission * scatter), (nu-fission * total), (total * scatter), (total * total)] + Estimator = tracklength +[[[ 1.25406870e-04 3.38446993e-03 6.24541184e-05 1.68550643e-03] + [ 8.54338123e-04 8.55444603e-04 4.25470584e-04 4.26021624e-04] + [ 7.66911978e-05 2.06973551e-03 3.97893175e-05 1.07383071e-03] + [ 5.22461121e-04 5.23137776e-04 2.71065937e-04 2.71417003e-04]] + + [[ 1.25406870e-04 3.38446993e-03 6.24541184e-05 1.68550643e-03] + [ 8.54338123e-04 8.55444603e-04 4.25470584e-04 4.26021624e-04] + [ 7.66911978e-05 2.06973551e-03 3.97893175e-05 1.07383071e-03] + [ 5.22461121e-04 5.23137776e-04 2.71065937e-04 2.71417003e-04]] + + [[ 3.99632703e-04 2.08614103e-03 1.99021857e-04 1.03892314e-03] + [ 2.65001925e-03 2.65034264e-03 1.31974122e-03 1.31990227e-03] + [ 2.44391002e-04 1.27575670e-03 1.26796183e-04 6.61894580e-04] + [ 1.62059025e-03 1.62078801e-03 8.40802879e-04 8.40905483e-04]] + + ..., + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally + ID = 10015 + Name = (tally 1 * tally 4) + Filters = + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + mesh [1] + Nuclides = (U-235 * U-235) (U-235 * Zr-90) (Pu-239 * U-235) (Pu-239 * Zr-90) + Scores = [(nu-fission * scatter), (nu-fission * total), (total * scatter), (total * total)] + Estimator = tracklength +[[[ 1.25406870e-04 3.38446993e-03 6.24541184e-05 1.68550643e-03] + [ 8.54338123e-04 8.55444603e-04 4.25470584e-04 4.26021624e-04] + [ 7.66911978e-05 2.06973551e-03 3.97893175e-05 1.07383071e-03] + [ 5.22461121e-04 5.23137776e-04 2.71065937e-04 2.71417003e-04]] + + [[ 1.25406870e-04 3.38446993e-03 6.24541184e-05 1.68550643e-03] + [ 8.54338123e-04 8.55444603e-04 4.25470584e-04 4.26021624e-04] + [ 7.66911978e-05 2.06973551e-03 3.97893175e-05 1.07383071e-03] + [ 5.22461121e-04 5.23137776e-04 2.71065937e-04 2.71417003e-04]] + + [[ 3.99632703e-04 2.08614103e-03 1.99021857e-04 1.03892314e-03] + [ 2.65001925e-03 2.65034264e-03 1.31974122e-03 1.31990227e-03] + [ 2.44391002e-04 1.27575670e-03 1.26796183e-04 6.61894580e-04] + [ 1.62059025e-03 1.62078801e-03 8.40802879e-04 8.40905483e-04]] + + ..., + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally + ID = 10016 + Name = (tally 1 * tally 4) + Filters = + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + mesh [1] + Nuclides = U-235 Pu-239 Zr-90 + Scores = [(nu-fission * scatter), (nu-fission * total), (total * scatter), (total * total)] + Estimator = tracklength +[[[ 1.25406870e-04 3.38446993e-03 6.24541184e-05 1.68550643e-03] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 1.25406870e-04 3.38446993e-03 6.24541184e-05 1.68550643e-03] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 3.99632703e-04 2.08614103e-03 1.99021857e-04 1.03892314e-03] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 3.99632703e-04 2.08614103e-03 1.99021857e-04 1.03892314e-03] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 7.26649160e-04 9.61556092e-04 3.61879956e-04 4.78866412e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 7.26649160e-04 9.61556092e-04 3.61879956e-04 4.78866412e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 2.03428184e-04 2.48054431e-04 1.01309664e-04 1.23534068e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 2.03428184e-04 2.48054431e-04 1.01309664e-04 1.23534068e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 2.07797571e-04 5.88917101e-03 1.61337951e-04 4.57246338e-03] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 2.07797571e-04 5.88917101e-03 1.61337951e-04 4.57246338e-03] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 5.43202987e-04 2.90564462e-03 4.21753038e-04 2.25599726e-03] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 5.43202987e-04 2.90564462e-03 4.21753038e-04 2.25599726e-03] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 7.56220267e-04 1.00221809e-03 5.87143670e-04 7.78141017e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 7.56220267e-04 1.00221809e-03 5.87143670e-04 7.78141017e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 2.48919397e-04 3.01542606e-04 1.93265712e-04 2.34123363e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 2.48919397e-04 3.01542606e-04 1.93265712e-04 2.34123363e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 1.15352081e-05 3.61534913e-04 2.54639331e-05 7.98087108e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 1.15352081e-05 3.61534913e-04 2.54639331e-05 7.98087108e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 3.43932622e-05 1.89185338e-04 7.59230111e-05 4.17626001e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 3.43932622e-05 1.89185338e-04 7.59230111e-05 4.17626001e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 5.23298543e-05 6.89978472e-05 1.15517978e-04 1.52312516e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 5.23298543e-05 6.89978472e-05 1.15517978e-04 1.52312516e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 1.66777184e-05 2.04329526e-05 3.68160075e-05 4.51056743e-05] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 1.66777184e-05 2.04329526e-05 3.68160075e-05 4.51056743e-05] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 2.13734333e-06 5.36870274e-05 4.68542556e-06 1.17691233e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 2.13734333e-06 5.36870274e-05 4.68542556e-06 1.17691233e-04] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 7.20926557e-06 4.05199536e-05 1.58039547e-05 8.88267335e-05] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 7.20926557e-06 4.05199536e-05 1.58039547e-05 8.88267335e-05] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 1.11679867e-05 1.50075971e-05 2.44821549e-05 3.28992436e-05] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 1.11679867e-05 1.50075971e-05 2.44821549e-05 3.28992436e-05] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 4.13069536e-06 5.01085896e-06 9.05519734e-06 1.09846679e-05] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 4.13069536e-06 5.01085896e-06 9.05519734e-06 1.09846679e-05] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally + ID = 10017 + Name = (tally 1 * tally 4) + Filters = + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + mesh [1] + Nuclides = (U-235 * U-235) (U-235 * Zr-90) (Pu-239 * U-235) (Pu-239 * Zr-90) + Scores = [u'nu-fission', u'total', u'scatter'] + Estimator = tracklength +[[[ 0.00000000e+00 1.68550643e-03 0.00000000e+00] + [ 0.00000000e+00 4.26021624e-04 0.00000000e+00] + [ 0.00000000e+00 1.07383071e-03 0.00000000e+00] + [ 0.00000000e+00 2.71417003e-04 0.00000000e+00]] + + [[ 0.00000000e+00 1.68550643e-03 0.00000000e+00] + [ 0.00000000e+00 4.26021624e-04 0.00000000e+00] + [ 0.00000000e+00 1.07383071e-03 0.00000000e+00] + [ 0.00000000e+00 2.71417003e-04 0.00000000e+00]] + + [[ 0.00000000e+00 1.03892314e-03 0.00000000e+00] + [ 0.00000000e+00 1.31990227e-03 0.00000000e+00] + [ 0.00000000e+00 6.61894580e-04 0.00000000e+00] + [ 0.00000000e+00 8.40905483e-04 0.00000000e+00]] + + [[ 0.00000000e+00 1.03892314e-03 0.00000000e+00] + [ 0.00000000e+00 1.31990227e-03 0.00000000e+00] + [ 0.00000000e+00 6.61894580e-04 0.00000000e+00] + [ 0.00000000e+00 8.40905483e-04 0.00000000e+00]] + + [[ 0.00000000e+00 4.78866412e-04 0.00000000e+00] + [ 0.00000000e+00 4.73832352e-03 0.00000000e+00] + [ 0.00000000e+00 3.05084248e-04 0.00000000e+00] + [ 0.00000000e+00 3.01877064e-03 0.00000000e+00]] + + [[ 0.00000000e+00 4.78866412e-04 0.00000000e+00] + [ 0.00000000e+00 4.73832352e-03 0.00000000e+00] + [ 0.00000000e+00 3.05084248e-04 0.00000000e+00] + [ 0.00000000e+00 3.01877064e-03 0.00000000e+00]] + + [[ 0.00000000e+00 1.23534068e-04 0.00000000e+00] + [ 0.00000000e+00 1.24325262e-03 0.00000000e+00] + [ 0.00000000e+00 7.87031563e-05 0.00000000e+00] + [ 0.00000000e+00 7.92072238e-04 0.00000000e+00]] + + [[ 0.00000000e+00 1.23534068e-04 0.00000000e+00] + [ 0.00000000e+00 1.24325262e-03 0.00000000e+00] + [ 0.00000000e+00 7.87031563e-05 0.00000000e+00] + [ 0.00000000e+00 7.92072238e-04 0.00000000e+00]] + + [[ 0.00000000e+00 4.57246338e-03 0.00000000e+00] + [ 0.00000000e+00 9.78864960e-04 0.00000000e+00] + [ 0.00000000e+00 3.79067678e-03 0.00000000e+00] + [ 0.00000000e+00 8.11501454e-04 0.00000000e+00]] + + [[ 0.00000000e+00 4.57246338e-03 0.00000000e+00] + [ 0.00000000e+00 9.78864960e-04 0.00000000e+00] + [ 0.00000000e+00 3.79067678e-03 0.00000000e+00] + [ 0.00000000e+00 8.11501454e-04 0.00000000e+00]] + + [[ 0.00000000e+00 2.25599726e-03 0.00000000e+00] + [ 0.00000000e+00 3.25856852e-03 0.00000000e+00] + [ 0.00000000e+00 1.87027335e-03 0.00000000e+00] + [ 0.00000000e+00 2.70142788e-03 0.00000000e+00]] + + [[ 0.00000000e+00 2.25599726e-03 0.00000000e+00] + [ 0.00000000e+00 3.25856852e-03 0.00000000e+00] + [ 0.00000000e+00 1.87027335e-03 0.00000000e+00] + [ 0.00000000e+00 2.70142788e-03 0.00000000e+00]] + + [[ 0.00000000e+00 7.78141017e-04 0.00000000e+00] + [ 0.00000000e+00 8.05177588e-03 0.00000000e+00] + [ 0.00000000e+00 6.45096711e-04 0.00000000e+00] + [ 0.00000000e+00 6.67510647e-03 0.00000000e+00]] + + [[ 0.00000000e+00 7.78141017e-04 0.00000000e+00] + [ 0.00000000e+00 8.05177588e-03 0.00000000e+00] + [ 0.00000000e+00 6.45096711e-04 0.00000000e+00] + [ 0.00000000e+00 6.67510647e-03 0.00000000e+00]] + + [[ 0.00000000e+00 2.34123363e-04 0.00000000e+00] + [ 0.00000000e+00 2.14338698e-03 0.00000000e+00] + [ 0.00000000e+00 1.94093626e-04 0.00000000e+00] + [ 0.00000000e+00 1.77691685e-03 0.00000000e+00]] + + [[ 0.00000000e+00 2.34123363e-04 0.00000000e+00] + [ 0.00000000e+00 2.14338698e-03 0.00000000e+00] + [ 0.00000000e+00 1.94093626e-04 0.00000000e+00] + [ 0.00000000e+00 1.77691685e-03 0.00000000e+00]] + + [[ 0.00000000e+00 7.98087108e-04 0.00000000e+00] + [ 0.00000000e+00 2.17118729e-04 0.00000000e+00] + [ 0.00000000e+00 2.36053279e-04 0.00000000e+00] + [ 0.00000000e+00 6.42180376e-05 0.00000000e+00]] + + [[ 0.00000000e+00 7.98087108e-04 0.00000000e+00] + [ 0.00000000e+00 2.17118729e-04 0.00000000e+00] + [ 0.00000000e+00 2.36053279e-04 0.00000000e+00] + [ 0.00000000e+00 6.42180376e-05 0.00000000e+00]] + + [[ 0.00000000e+00 4.17626001e-04 0.00000000e+00] + [ 0.00000000e+00 5.10491350e-04 0.00000000e+00] + [ 0.00000000e+00 1.23522841e-04 0.00000000e+00] + [ 0.00000000e+00 1.50989981e-04 0.00000000e+00]] + + [[ 0.00000000e+00 4.17626001e-04 0.00000000e+00] + [ 0.00000000e+00 5.10491350e-04 0.00000000e+00] + [ 0.00000000e+00 1.23522841e-04 0.00000000e+00] + [ 0.00000000e+00 1.50989981e-04 0.00000000e+00]] + + [[ 0.00000000e+00 1.52312516e-04 0.00000000e+00] + [ 0.00000000e+00 1.54884686e-03 0.00000000e+00] + [ 0.00000000e+00 4.50500561e-05 0.00000000e+00] + [ 0.00000000e+00 4.58108367e-04 0.00000000e+00]] + + [[ 0.00000000e+00 1.52312516e-04 0.00000000e+00] + [ 0.00000000e+00 1.54884686e-03 0.00000000e+00] + [ 0.00000000e+00 4.50500561e-05 0.00000000e+00] + [ 0.00000000e+00 4.58108367e-04 0.00000000e+00]] + + [[ 0.00000000e+00 4.51056743e-05 0.00000000e+00] + [ 0.00000000e+00 4.58602101e-04 0.00000000e+00] + [ 0.00000000e+00 1.33410780e-05 0.00000000e+00] + [ 0.00000000e+00 1.35642499e-04 0.00000000e+00]] + + [[ 0.00000000e+00 4.51056743e-05 0.00000000e+00] + [ 0.00000000e+00 4.58602101e-04 0.00000000e+00] + [ 0.00000000e+00 1.33410780e-05 0.00000000e+00] + [ 0.00000000e+00 1.35642499e-04 0.00000000e+00]] + + [[ 0.00000000e+00 1.17691233e-04 0.00000000e+00] + [ 0.00000000e+00 2.57333424e-05 0.00000000e+00] + [ 0.00000000e+00 3.44265026e-05 0.00000000e+00] + [ 0.00000000e+00 7.52739998e-06 0.00000000e+00]] + + [[ 0.00000000e+00 1.17691233e-04 0.00000000e+00] + [ 0.00000000e+00 2.57333424e-05 0.00000000e+00] + [ 0.00000000e+00 3.44265026e-05 0.00000000e+00] + [ 0.00000000e+00 7.52739998e-06 0.00000000e+00]] + + [[ 0.00000000e+00 8.88267335e-05 0.00000000e+00] + [ 0.00000000e+00 9.82261843e-05 0.00000000e+00] + [ 0.00000000e+00 2.59831910e-05 0.00000000e+00] + [ 0.00000000e+00 2.87326755e-05 0.00000000e+00]] + + [[ 0.00000000e+00 8.88267335e-05 0.00000000e+00] + [ 0.00000000e+00 9.82261843e-05 0.00000000e+00] + [ 0.00000000e+00 2.59831910e-05 0.00000000e+00] + [ 0.00000000e+00 2.87326755e-05 0.00000000e+00]] + + [[ 0.00000000e+00 3.28992436e-05 0.00000000e+00] + [ 0.00000000e+00 3.04106557e-04 0.00000000e+00] + [ 0.00000000e+00 9.62353672e-06 0.00000000e+00] + [ 0.00000000e+00 8.89558632e-05 0.00000000e+00]] + + [[ 0.00000000e+00 3.28992436e-05 0.00000000e+00] + [ 0.00000000e+00 3.04106557e-04 0.00000000e+00] + [ 0.00000000e+00 9.62353672e-06 0.00000000e+00] + [ 0.00000000e+00 8.89558632e-05 0.00000000e+00]] + + [[ 0.00000000e+00 1.09846679e-05 0.00000000e+00] + [ 0.00000000e+00 9.94842161e-05 0.00000000e+00] + [ 0.00000000e+00 3.21318497e-06 0.00000000e+00] + [ 0.00000000e+00 2.91006692e-05 0.00000000e+00]] + + [[ 0.00000000e+00 1.09846679e-05 0.00000000e+00] + [ 0.00000000e+00 9.94842161e-05 0.00000000e+00] + [ 0.00000000e+00 3.21318497e-06 0.00000000e+00] + [ 0.00000000e+00 2.91006692e-05 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally + ID = 10018 + Name = (tally 1 * tally 4) + Filters = + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + mesh [1] + Nuclides = U-235 Pu-239 Zr-90 + Scores = [u'nu-fission', u'total', u'scatter'] + Estimator = tracklength +[[[ 0.00000000e+00 1.68550643e-03 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 1.68550643e-03 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 1.03892314e-03 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 1.03892314e-03 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 4.78866412e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 4.78866412e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 1.23534068e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 1.23534068e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 4.57246338e-03 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 4.57246338e-03 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 2.25599726e-03 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 2.25599726e-03 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 7.78141017e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 7.78141017e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 2.34123363e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 2.34123363e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 7.98087108e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 7.98087108e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 4.17626001e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 4.17626001e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 1.52312516e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 1.52312516e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 4.51056743e-05 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 4.51056743e-05 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 1.17691233e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 1.17691233e-04 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 8.88267335e-05 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 8.88267335e-05 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 3.28992436e-05 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 3.28992436e-05 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 1.09846679e-05 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 1.09846679e-05 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]]] \ No newline at end of file diff --git a/tests/test_tally_arithmetic/settings.xml b/tests/test_tally_arithmetic/settings.xml deleted file mode 100644 index a69dde686a..0000000000 --- a/tests/test_tally_arithmetic/settings.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - 10 - 5 - 1000 - - - - - -4 -4 -4 4 4 4 - - - - - - diff --git a/tests/test_tally_arithmetic/tallies.xml b/tests/test_tally_arithmetic/tallies.xml deleted file mode 100644 index 2a2eb48361..0000000000 --- a/tests/test_tally_arithmetic/tallies.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - U-235 U-238 - fission nu-fission - - - - - U-235 Pu-239 - fission absorption - - diff --git a/tests/test_tally_arithmetic/test_tally_arithmetic.py b/tests/test_tally_arithmetic/test_tally_arithmetic.py index 2f49061f96..70439b54f9 100644 --- a/tests/test_tally_arithmetic/test_tally_arithmetic.py +++ b/tests/test_tally_arithmetic/test_tally_arithmetic.py @@ -5,11 +5,87 @@ import sys import glob import hashlib sys.path.insert(0, os.pardir) -from testing_harness import TestHarness +from testing_harness import PyAPITestHarness import openmc -class TallyArithmeticTestHarness(TestHarness): +class TallyArithmeticTestHarness(PyAPITestHarness): + def _build_inputs(self): + + # The summary.h5 file needs to be created to read in the tallies + self._input_set.settings.output = {'summary': True} + + # Initialize the tallies file + tallies_file = openmc.TalliesFile() + + # Initialize the nuclides + u235 = openmc.Nuclide('U-235') + u238 = openmc.Nuclide('U-238') + pu239 = openmc.Nuclide('Pu-239') + zr90 = openmc.Nuclide('Zr-90') + o16 = openmc.Nuclide('O-16') + + # Initialize Mesh + mesh = openmc.Mesh(mesh_id=1) + mesh.type = 'regular' + mesh.dimension = [2, 2, 2] + mesh.lower_left = [-160.0, -160.0, -183.0] + mesh.upper_right = [160.0, 160.0, 183.0] + + # Initialize the filters + energy_filter = openmc.Filter(type='energy', bins=(0.0, 0.253e-6, + 1.0e-3, 1.0, 20.0)) + material_filter = openmc.Filter(type='material', bins=(1, 3)) + universe_filter = openmc.Filter(type='universe', bins=(1, 3)) + distrib_filter = openmc.Filter(type='distribcell', bins=(60)) + mesh_filter = openmc.Filter(type='mesh') + mesh_filter.mesh = mesh + + # Initialized the tallies + tally = openmc.Tally(name='tally 1') + tally.add_filter(material_filter) + tally.add_filter(energy_filter) + tally.add_score('nu-fission') + tally.add_score('total') + tally.add_nuclide(u235) + tally.add_nuclide(pu239) + tallies_file.add_tally(tally) + + # Instantiate reaction rate Tally in fuel + tally = openmc.Tally(name='tally 2') + tally.add_filter(universe_filter) + tally.add_filter(energy_filter) + tally.add_score('total') + tally.add_score('fission') + tally.add_nuclide(u238) + tally.add_nuclide(u235) + tallies_file.add_tally(tally) + + # Instantiate reaction rate Tally in moderator + tally = openmc.Tally(name='tally 3') + tally.add_filter(distrib_filter) + tally.add_filter(energy_filter) + tally.add_score('absorption') + tally.add_score('total') + tally.add_nuclide(u235) + tally.add_nuclide(o16) + tallies_file.add_tally(tally) + + # Instantiate reaction rate Tally in moderator + tally = openmc.Tally(name='tally 4') + tally.add_filter(mesh_filter) + tally.add_filter(energy_filter) + tally.add_score('scatter') + tally.add_score('total') + tally.add_nuclide(u235) + tally.add_nuclide(zr90) + tallies_file.add_tally(tally) + tallies_file.add_mesh(mesh) + + # Export tallies to file + self._input_set.tallies = tallies_file + super(TallyArithmeticTestHarness, self)._build_inputs() + def _get_results(self, hash_output=False): """Digest info in the statepoint and return as a string.""" @@ -22,27 +98,87 @@ class TallyArithmeticTestHarness(TestHarness): su = openmc.Summary(summary) sp.link_with_summary(su) + print 'reading in tallies' + # Load the tallies tally_1 = sp.get_tally(name='tally 1') tally_2 = sp.get_tally(name='tally 2') + tally_3 = sp.get_tally(name='tally 3') + tally_4 = sp.get_tally(name='tally 4') # Perform all the tally arithmetic operations and output results outstr = '' - tally_3 = tally_1 + tally_2 - outstr += repr(tally_3) - outstr += str(tally_3.mean) + tally_5 = tally_1 * tally_2 + outstr += repr(tally_5) + outstr += str(tally_5.mean) - tally_3 = tally_1 - tally_2 - outstr += repr(tally_3) - outstr += str(tally_3.mean) + tally_5 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'tensor', + 'tensor') + outstr += repr(tally_5) + outstr += str(tally_5.mean) - tally_3 = tally_1 * tally_2 - outstr += repr(tally_3) - outstr += str(tally_3.mean) + tally_5 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'entrywise', + 'tensor') + outstr += repr(tally_5) + outstr += str(tally_5.mean) - tally_3 = tally_1 / tally_2 - outstr += repr(tally_3) - outstr += str(tally_3.mean) + tally_5 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'tensor', + 'entrywise') + outstr += repr(tally_5) + outstr += str(tally_5.mean) + + tally_5 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'entrywise', + 'entrywise') + outstr += repr(tally_5) + outstr += str(tally_5.mean) + + tally_5 = tally_1 * tally_3 + outstr += repr(tally_5) + outstr += str(tally_5.mean) + + tally_5 = tally_1.hybrid_product(tally_3, '*', 'entrywise', 'tensor', + 'tensor') + outstr += repr(tally_5) + outstr += str(tally_5.mean) + + tally_5 = tally_1.hybrid_product(tally_3, '*', 'entrywise', 'entrywise', + 'tensor') + outstr += repr(tally_5) + outstr += str(tally_5.mean) + + tally_5 = tally_1.hybrid_product(tally_3, '*', 'entrywise', 'tensor', + 'entrywise') + outstr += repr(tally_5) + outstr += str(tally_5.mean) + + tally_5 = tally_1.hybrid_product(tally_3, '*', 'entrywise', 'entrywise', + 'entrywise') + outstr += repr(tally_5) + outstr += str(tally_5.mean) + + tally_5 = tally_1 * tally_4 + outstr += repr(tally_5) + outstr += str(tally_5.mean) + + tally_5 = tally_1.hybrid_product(tally_4, '*', 'entrywise', 'tensor', + 'tensor') + outstr += repr(tally_5) + outstr += str(tally_5.mean) + + tally_5 = tally_1.hybrid_product(tally_4, '*', 'entrywise', 'entrywise', + 'tensor') + outstr += repr(tally_5) + outstr += str(tally_5.mean) + + tally_5 = tally_1.hybrid_product(tally_4, '*', 'entrywise', 'tensor', + 'entrywise') + outstr += repr(tally_5) + outstr += str(tally_5.mean) + + tally_5 = tally_1.hybrid_product(tally_4, '*', 'entrywise', 'entrywise', + 'entrywise') + outstr += repr(tally_5) + outstr += str(tally_5.mean) print(outstr) @@ -54,6 +190,11 @@ class TallyArithmeticTestHarness(TestHarness): return outstr + def _cleanup(self): + super(TallyArithmeticTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) + if __name__ == '__main__': harness = TallyArithmeticTestHarness('statepoint.10.h5', True) harness.main() From 36ca4c9ee8a9073fa311cd0428ab61698ec6e405 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Fri, 18 Dec 2015 14:04:15 -0800 Subject: [PATCH 20/61] added tally arithmetic test inputs_true.dat --- tests/test_tally_arithmetic/inputs_true.dat | 1 + 1 file changed, 1 insertion(+) create mode 100644 tests/test_tally_arithmetic/inputs_true.dat diff --git a/tests/test_tally_arithmetic/inputs_true.dat b/tests/test_tally_arithmetic/inputs_true.dat new file mode 100644 index 0000000000..64d6dcaa94 --- /dev/null +++ b/tests/test_tally_arithmetic/inputs_true.dat @@ -0,0 +1 @@ +95bc6a1a1cca9965ff55251a8de7b2e31ae6a1dc68308554b3cac6ab83673408b10acdb7131bce73516ec0aee6f00efda49afe3038e79df8cf4c854234a6d383 \ No newline at end of file From 911c88ff97d17a056dde134e0a66c51c63c63e18 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sat, 19 Dec 2015 09:11:40 -0800 Subject: [PATCH 21/61] condensed the tally arithmetic test to reduce run time --- tests/test_tally_arithmetic/inputs_true.dat | 2 +- tests/test_tally_arithmetic/results_true.dat | 1609 ++--------------- .../test_tally_arithmetic.py | 108 +- 3 files changed, 149 insertions(+), 1570 deletions(-) diff --git a/tests/test_tally_arithmetic/inputs_true.dat b/tests/test_tally_arithmetic/inputs_true.dat index 64d6dcaa94..8e8838131a 100644 --- a/tests/test_tally_arithmetic/inputs_true.dat +++ b/tests/test_tally_arithmetic/inputs_true.dat @@ -1 +1 @@ -95bc6a1a1cca9965ff55251a8de7b2e31ae6a1dc68308554b3cac6ab83673408b10acdb7131bce73516ec0aee6f00efda49afe3038e79df8cf4c854234a6d383 \ No newline at end of file +df6318b76cd37a29ef9dd09da48a70c191ed07c1a2ceb75eb502ab35086c31250872406f22c2587edfcee16f67dd95c81db012ccd728710ed2509084438aea56 \ No newline at end of file diff --git a/tests/test_tally_arithmetic/results_true.dat b/tests/test_tally_arithmetic/results_true.dat index cf1189261b..2878cbf4b7 100644 --- a/tests/test_tally_arithmetic/results_true.dat +++ b/tests/test_tally_arithmetic/results_true.dat @@ -1,91 +1,119 @@ Tally + ID = 10002 + Name = (tally 1 * tally 2) + Filters = + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + distribcell [60] + mesh [1] + Nuclides = (U-235 * U-238) (U-235 * U-235) (Pu-239 * U-238) (Pu-239 * U-235) + Scores = [(nu-fission * total), (nu-fission * fission), (total * total), (total * fission)] + Estimator = tracklength +[[[ 8.90240785e-05 8.31464209e-11 4.41507090e-05 4.12357364e-11] + [ 7.29618709e-05 5.98879928e-05 3.61847984e-05 2.97009235e-05] + [ 4.69276830e-05 4.38293656e-11 2.35903380e-05 2.20328275e-11] + [ 3.84607356e-05 3.15690405e-05 1.93340411e-05 1.58696166e-05]] + + [[ 8.90240785e-05 8.31464209e-11 4.41507090e-05 4.12357364e-11] + [ 7.29618709e-05 5.98879928e-05 3.61847984e-05 2.97009235e-05] + [ 4.69276830e-05 4.38293656e-11 2.35903380e-05 2.20328275e-11] + [ 3.84607356e-05 3.15690405e-05 1.93340411e-05 1.58696166e-05]] + + [[ 8.90240785e-05 8.31464209e-11 4.41507090e-05 4.12357364e-11] + [ 7.29618709e-05 5.98879928e-05 3.61847984e-05 2.97009235e-05] + [ 4.69276830e-05 4.38293656e-11 2.35903380e-05 2.20328275e-11] + [ 3.84607356e-05 3.15690405e-05 1.93340411e-05 1.58696166e-05]] + + ..., + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally + ID = 10003 + Name = (tally 1 * tally 2) + Filters = + material [1 3] + energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 + 2.00000000e+01] + distribcell [60] + mesh [1] + Nuclides = (U-235 * U-238) (U-235 * U-235) (Pu-239 * U-238) (Pu-239 * U-235) + Scores = [(nu-fission * total), (nu-fission * fission), (total * total), (total * fission)] + Estimator = tracklength +[[[ 8.90240785e-05 8.31464209e-11 4.41507090e-05 4.12357364e-11] + [ 7.29618709e-05 5.98879928e-05 3.61847984e-05 2.97009235e-05] + [ 4.69276830e-05 4.38293656e-11 2.35903380e-05 2.20328275e-11] + [ 3.84607356e-05 3.15690405e-05 1.93340411e-05 1.58696166e-05]] + + [[ 8.90240785e-05 8.31464209e-11 4.41507090e-05 4.12357364e-11] + [ 7.29618709e-05 5.98879928e-05 3.61847984e-05 2.97009235e-05] + [ 4.69276830e-05 4.38293656e-11 2.35903380e-05 2.20328275e-11] + [ 3.84607356e-05 3.15690405e-05 1.93340411e-05 1.58696166e-05]] + + [[ 8.90240785e-05 8.31464209e-11 4.41507090e-05 4.12357364e-11] + [ 7.29618709e-05 5.98879928e-05 3.61847984e-05 2.97009235e-05] + [ 4.69276830e-05 4.38293656e-11 2.35903380e-05 2.20328275e-11] + [ 3.84607356e-05 3.15690405e-05 1.93340411e-05 1.58696166e-05]] + + ..., + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally ID = 10004 Name = (tally 1 * tally 2) Filters = material [1 3] energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 2.00000000e+01] - universe [1 3] - Nuclides = (U-235 * U-238) (U-235 * U-235) (Pu-239 * U-238) (Pu-239 * U-235) + distribcell [60] + mesh [1] + Nuclides = U-235 Pu-239 U-238 Scores = [(nu-fission * total), (nu-fission * fission), (total * total), (total * fission)] Estimator = tracklength -[[[ 4.38740856e-02 4.44445557e-08 2.18498184e-02 2.21339193e-08] - [ 3.91423913e-02 3.22796615e-02 1.94933781e-02 1.60756567e-02] - [ 2.68307165e-02 2.71795812e-08 1.39204488e-02 1.41014486e-08] - [ 2.39371006e-02 1.97402734e-02 1.24191684e-02 1.02417491e-02]] - - [[ 4.38740856e-02 4.44445557e-08 2.18498184e-02 2.21339193e-08] - [ 3.91423913e-02 3.22796615e-02 1.94933781e-02 1.60756567e-02] - [ 2.68307165e-02 2.71795812e-08 1.39204488e-02 1.41014486e-08] - [ 2.39371006e-02 1.97402734e-02 1.24191684e-02 1.02417491e-02]] - - [[ 6.34252895e-02 9.32564450e-07 4.92445903e-02 7.24060618e-07] - [ 6.77320364e-03 3.57584505e-03 5.25884298e-03 2.77635350e-03] - [ 6.58867184e-02 9.68755709e-07 4.08248924e-02 6.00262822e-07] - [ 7.03606029e-03 3.71461759e-03 4.35970118e-03 2.30166059e-03]] - - [[ 6.34252895e-02 9.32564450e-07 4.92445903e-02 7.24060618e-07] - [ 6.77320364e-03 3.57584505e-03 5.25884298e-03 2.77635350e-03] - [ 6.58867184e-02 9.68755709e-07 4.08248924e-02 6.00262822e-07] - [ 7.03606029e-03 3.71461759e-03 4.35970118e-03 2.30166059e-03]] - - [[ 1.41588780e-02 1.27076668e-06 3.12556757e-02 2.80521318e-06] - [ 3.40319989e-04 6.28212863e-05 7.51255235e-04 1.38677779e-04] - [ 4.32998473e-03 3.88618386e-07 9.24461087e-03 8.29708643e-07] - [ 1.04074656e-04 1.92116360e-05 2.22201637e-04 4.10172576e-05]] - - [[ 1.41588780e-02 1.27076668e-06 3.12556757e-02 2.80521318e-06] - [ 3.40319989e-04 6.28212863e-05 7.51255235e-04 1.38677779e-04] - [ 4.32998473e-03 3.88618386e-07 9.24461087e-03 8.29708643e-07] - [ 1.04074656e-04 1.92116360e-05 2.22201637e-04 4.10172576e-05]] - - [[ 1.30500388e-03 7.58050822e-05 2.86079380e-03 1.66177827e-04] - [ 2.87565919e-05 4.85258186e-06 6.30394140e-05 1.06376972e-05] - [ 6.91597829e-04 4.01735436e-05 8.36826356e-04 4.86095802e-05] - [ 1.52397988e-05 2.57166674e-06 1.84400019e-05 3.11169067e-06]] - - [[ 1.30500388e-03 7.58050822e-05 2.86079380e-03 1.66177827e-04] - [ 2.87565919e-05 4.85258186e-06 6.30394140e-05 1.06376972e-05] - [ 6.91597829e-04 4.01735436e-05 8.36826356e-04 4.86095802e-05] - [ 1.52397988e-05 2.57166674e-06 1.84400019e-05 3.11169067e-06]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] +[[[ 7.29618709e-05 5.98879928e-05 3.61847984e-05 2.97009235e-05] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 7.29618709e-05 5.98879928e-05 3.61847984e-05 2.97009235e-05] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + [[ 7.29618709e-05 5.98879928e-05 3.61847984e-05 2.97009235e-05] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] + + ..., + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally ID = 10005 @@ -94,1440 +122,65 @@ Tally material [1 3] energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 2.00000000e+01] - universe [1 3] + distribcell [60] + mesh [1] Nuclides = (U-235 * U-238) (U-235 * U-235) (Pu-239 * U-238) (Pu-239 * U-235) - Scores = [(nu-fission * total), (nu-fission * fission), (total * total), (total * fission)] + Scores = [u'nu-fission', u'total', u'fission'] Estimator = tracklength -[[[ 4.38740856e-02 4.44445557e-08 2.18498184e-02 2.21339193e-08] - [ 3.91423913e-02 3.22796615e-02 1.94933781e-02 1.60756567e-02] - [ 2.68307165e-02 2.71795812e-08 1.39204488e-02 1.41014486e-08] - [ 2.39371006e-02 1.97402734e-02 1.24191684e-02 1.02417491e-02]] +[[[ 0.00000000e+00 4.41507090e-05 0.00000000e+00] + [ 0.00000000e+00 3.61847984e-05 0.00000000e+00] + [ 0.00000000e+00 2.35903380e-05 0.00000000e+00] + [ 0.00000000e+00 1.93340411e-05 0.00000000e+00]] - [[ 4.38740856e-02 4.44445557e-08 2.18498184e-02 2.21339193e-08] - [ 3.91423913e-02 3.22796615e-02 1.94933781e-02 1.60756567e-02] - [ 2.68307165e-02 2.71795812e-08 1.39204488e-02 1.41014486e-08] - [ 2.39371006e-02 1.97402734e-02 1.24191684e-02 1.02417491e-02]] + [[ 0.00000000e+00 4.41507090e-05 0.00000000e+00] + [ 0.00000000e+00 3.61847984e-05 0.00000000e+00] + [ 0.00000000e+00 2.35903380e-05 0.00000000e+00] + [ 0.00000000e+00 1.93340411e-05 0.00000000e+00]] - [[ 6.34252895e-02 9.32564450e-07 4.92445903e-02 7.24060618e-07] - [ 6.77320364e-03 3.57584505e-03 5.25884298e-03 2.77635350e-03] - [ 6.58867184e-02 9.68755709e-07 4.08248924e-02 6.00262822e-07] - [ 7.03606029e-03 3.71461759e-03 4.35970118e-03 2.30166059e-03]] + [[ 0.00000000e+00 4.41507090e-05 0.00000000e+00] + [ 0.00000000e+00 3.61847984e-05 0.00000000e+00] + [ 0.00000000e+00 2.35903380e-05 0.00000000e+00] + [ 0.00000000e+00 1.93340411e-05 0.00000000e+00]] - [[ 6.34252895e-02 9.32564450e-07 4.92445903e-02 7.24060618e-07] - [ 6.77320364e-03 3.57584505e-03 5.25884298e-03 2.77635350e-03] - [ 6.58867184e-02 9.68755709e-07 4.08248924e-02 6.00262822e-07] - [ 7.03606029e-03 3.71461759e-03 4.35970118e-03 2.30166059e-03]] + ..., + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - [[ 1.41588780e-02 1.27076668e-06 3.12556757e-02 2.80521318e-06] - [ 3.40319989e-04 6.28212863e-05 7.51255235e-04 1.38677779e-04] - [ 4.32998473e-03 3.88618386e-07 9.24461087e-03 8.29708643e-07] - [ 1.04074656e-04 1.92116360e-05 2.22201637e-04 4.10172576e-05]] + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - [[ 1.41588780e-02 1.27076668e-06 3.12556757e-02 2.80521318e-06] - [ 3.40319989e-04 6.28212863e-05 7.51255235e-04 1.38677779e-04] - [ 4.32998473e-03 3.88618386e-07 9.24461087e-03 8.29708643e-07] - [ 1.04074656e-04 1.92116360e-05 2.22201637e-04 4.10172576e-05]] - - [[ 1.30500388e-03 7.58050822e-05 2.86079380e-03 1.66177827e-04] - [ 2.87565919e-05 4.85258186e-06 6.30394140e-05 1.06376972e-05] - [ 6.91597829e-04 4.01735436e-05 8.36826356e-04 4.86095802e-05] - [ 1.52397988e-05 2.57166674e-06 1.84400019e-05 3.11169067e-06]] - - [[ 1.30500388e-03 7.58050822e-05 2.86079380e-03 1.66177827e-04] - [ 2.87565919e-05 4.85258186e-06 6.30394140e-05 1.06376972e-05] - [ 6.91597829e-04 4.01735436e-05 8.36826356e-04 4.86095802e-05] - [ 1.52397988e-05 2.57166674e-06 1.84400019e-05 3.11169067e-06]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally + [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally ID = 10006 Name = (tally 1 * tally 2) Filters = material [1 3] energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 2.00000000e+01] - universe [1 3] - Nuclides = U-235 Pu-239 U-238 - Scores = [(nu-fission * total), (nu-fission * fission), (total * total), (total * fission)] - Estimator = tracklength -[[[ 3.91423913e-02 3.22796615e-02 1.94933781e-02 1.60756567e-02] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 3.91423913e-02 3.22796615e-02 1.94933781e-02 1.60756567e-02] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 6.77320364e-03 3.57584505e-03 5.25884298e-03 2.77635350e-03] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 6.77320364e-03 3.57584505e-03 5.25884298e-03 2.77635350e-03] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 3.40319989e-04 6.28212863e-05 7.51255235e-04 1.38677779e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 3.40319989e-04 6.28212863e-05 7.51255235e-04 1.38677779e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 2.87565919e-05 4.85258186e-06 6.30394140e-05 1.06376972e-05] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 2.87565919e-05 4.85258186e-06 6.30394140e-05 1.06376972e-05] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally - ID = 10007 - Name = (tally 1 * tally 2) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - universe [1 3] - Nuclides = (U-235 * U-238) (U-235 * U-235) (Pu-239 * U-238) (Pu-239 * U-235) - Scores = [u'nu-fission', u'total', u'fission'] - Estimator = tracklength -[[[ 0.00000000e+00 2.18498184e-02 0.00000000e+00] - [ 0.00000000e+00 1.94933781e-02 0.00000000e+00] - [ 0.00000000e+00 1.39204488e-02 0.00000000e+00] - [ 0.00000000e+00 1.24191684e-02 0.00000000e+00]] - - [[ 0.00000000e+00 2.18498184e-02 0.00000000e+00] - [ 0.00000000e+00 1.94933781e-02 0.00000000e+00] - [ 0.00000000e+00 1.39204488e-02 0.00000000e+00] - [ 0.00000000e+00 1.24191684e-02 0.00000000e+00]] - - [[ 0.00000000e+00 4.92445903e-02 0.00000000e+00] - [ 0.00000000e+00 5.25884298e-03 0.00000000e+00] - [ 0.00000000e+00 4.08248924e-02 0.00000000e+00] - [ 0.00000000e+00 4.35970118e-03 0.00000000e+00]] - - [[ 0.00000000e+00 4.92445903e-02 0.00000000e+00] - [ 0.00000000e+00 5.25884298e-03 0.00000000e+00] - [ 0.00000000e+00 4.08248924e-02 0.00000000e+00] - [ 0.00000000e+00 4.35970118e-03 0.00000000e+00]] - - [[ 0.00000000e+00 3.12556757e-02 0.00000000e+00] - [ 0.00000000e+00 7.51255235e-04 0.00000000e+00] - [ 0.00000000e+00 9.24461087e-03 0.00000000e+00] - [ 0.00000000e+00 2.22201637e-04 0.00000000e+00]] - - [[ 0.00000000e+00 3.12556757e-02 0.00000000e+00] - [ 0.00000000e+00 7.51255235e-04 0.00000000e+00] - [ 0.00000000e+00 9.24461087e-03 0.00000000e+00] - [ 0.00000000e+00 2.22201637e-04 0.00000000e+00]] - - [[ 0.00000000e+00 2.86079380e-03 0.00000000e+00] - [ 0.00000000e+00 6.30394140e-05 0.00000000e+00] - [ 0.00000000e+00 8.36826356e-04 0.00000000e+00] - [ 0.00000000e+00 1.84400019e-05 0.00000000e+00]] - - [[ 0.00000000e+00 2.86079380e-03 0.00000000e+00] - [ 0.00000000e+00 6.30394140e-05 0.00000000e+00] - [ 0.00000000e+00 8.36826356e-04 0.00000000e+00] - [ 0.00000000e+00 1.84400019e-05 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally - ID = 10008 - Name = (tally 1 * tally 2) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - universe [1 3] + distribcell [60] + mesh [1] Nuclides = U-235 Pu-239 U-238 Scores = [u'nu-fission', u'total', u'fission'] Estimator = tracklength -[[[ 0.00000000e+00 1.94933781e-02 0.00000000e+00] +[[[ 0.00000000e+00 3.61847984e-05 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - [[ 0.00000000e+00 1.94933781e-02 0.00000000e+00] + [[ 0.00000000e+00 3.61847984e-05 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - [[ 0.00000000e+00 5.25884298e-03 0.00000000e+00] + [[ 0.00000000e+00 3.61847984e-05 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - [[ 0.00000000e+00 5.25884298e-03 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 7.51255235e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 7.51255235e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 6.30394140e-05 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 6.30394140e-05 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally - ID = 10009 - Name = (tally 1 * tally 3) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - distribcell [60] - Nuclides = (U-235 * U-235) (U-235 * O-16) (Pu-239 * U-235) (Pu-239 * O-16) - Scores = [(nu-fission * absorption), (nu-fission * total), (total * absorption), (total * total)] - Estimator = tracklength -[[[ 1.28735734e-03 1.32667348e-03 6.41119323e-04 6.60699229e-04] - [ 7.64287878e-08 1.96051024e-03 3.80624487e-08 9.76357502e-04] - [ 7.87269280e-04 8.11312633e-04 4.08455054e-04 4.20929349e-04] - [ 4.67391880e-08 1.19892856e-03 2.42494633e-08 6.22034217e-04]] - - [[ 1.28735734e-03 1.32667348e-03 6.41119323e-04 6.60699229e-04] - [ 7.64287878e-08 1.96051024e-03 3.80624487e-08 9.76357502e-04] - [ 7.87269280e-04 8.11312633e-04 4.08455054e-04 4.20929349e-04] - [ 4.67391880e-08 1.19892856e-03 2.42494633e-08 6.22034217e-04]] - - [[ 3.23659105e-04 4.09115129e-04 1.61186098e-04 2.03744218e-04] - [ 2.11850877e-08 5.44379963e-03 1.05504266e-08 2.71107720e-03] - [ 1.97930180e-04 2.50189876e-04 1.02691143e-04 1.29804785e-04] - [ 1.29555083e-08 3.32909603e-03 6.72164275e-09 1.72721855e-03]] - ..., - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally - ID = 10010 - Name = (tally 1 * tally 3) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - distribcell [60] - Nuclides = (U-235 * U-235) (U-235 * O-16) (Pu-239 * U-235) (Pu-239 * O-16) - Scores = [(nu-fission * absorption), (nu-fission * total), (total * absorption), (total * total)] - Estimator = tracklength -[[[ 1.28735734e-03 1.32667348e-03 6.41119323e-04 6.60699229e-04] - [ 7.64287878e-08 1.96051024e-03 3.80624487e-08 9.76357502e-04] - [ 7.87269280e-04 8.11312633e-04 4.08455054e-04 4.20929349e-04] - [ 4.67391880e-08 1.19892856e-03 2.42494633e-08 6.22034217e-04]] - - [[ 1.28735734e-03 1.32667348e-03 6.41119323e-04 6.60699229e-04] - [ 7.64287878e-08 1.96051024e-03 3.80624487e-08 9.76357502e-04] - [ 7.87269280e-04 8.11312633e-04 4.08455054e-04 4.20929349e-04] - [ 4.67391880e-08 1.19892856e-03 2.42494633e-08 6.22034217e-04]] - - [[ 3.23659105e-04 4.09115129e-04 1.61186098e-04 2.03744218e-04] - [ 2.11850877e-08 5.44379963e-03 1.05504266e-08 2.71107720e-03] - [ 1.97930180e-04 2.50189876e-04 1.02691143e-04 1.29804785e-04] - [ 1.29555083e-08 3.32909603e-03 6.72164275e-09 1.72721855e-03]] - - ..., - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally - ID = 10011 - Name = (tally 1 * tally 3) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - distribcell [60] - Nuclides = U-235 Pu-239 O-16 - Scores = [(nu-fission * absorption), (nu-fission * total), (total * absorption), (total * total)] - Estimator = tracklength -[[[ 0.00128736 0.00132667 0.00064112 0.0006607 ] - [ 0. 0. 0. 0. ] - [ 0. 0. 0. 0. ]] - - [[ 0.00128736 0.00132667 0.00064112 0.0006607 ] - [ 0. 0. 0. 0. ] - [ 0. 0. 0. 0. ]] - - [[ 0.00032366 0.00040912 0.00016119 0.00020374] - [ 0. 0. 0. 0. ] - [ 0. 0. 0. 0. ]] - - ..., - [[ 0. 0. 0. 0. ] - [ 0. 0. 0. 0. ] - [ 0. 0. 0. 0. ]] - - [[ 0. 0. 0. 0. ] - [ 0. 0. 0. 0. ] - [ 0. 0. 0. 0. ]] - - [[ 0. 0. 0. 0. ] - [ 0. 0. 0. 0. ] - [ 0. 0. 0. 0. ]]]Tally - ID = 10012 - Name = (tally 1 * tally 3) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - distribcell [60] - Nuclides = (U-235 * U-235) (U-235 * O-16) (Pu-239 * U-235) (Pu-239 * O-16) - Scores = [u'nu-fission', u'total', u'absorption'] - Estimator = tracklength -[[[ 0. 0.0006607 0. ] - [ 0. 0.00097636 0. ] - [ 0. 0.00042093 0. ] - [ 0. 0.00062203 0. ]] - - [[ 0. 0.0006607 0. ] - [ 0. 0.00097636 0. ] - [ 0. 0.00042093 0. ] - [ 0. 0.00062203 0. ]] - - [[ 0. 0.00020374 0. ] - [ 0. 0.00271108 0. ] - [ 0. 0.0001298 0. ] - [ 0. 0.00172722 0. ]] - - ..., - [[ 0. 0. 0. ] - [ 0. 0. 0. ] - [ 0. 0. 0. ] - [ 0. 0. 0. ]] - - [[ 0. 0. 0. ] - [ 0. 0. 0. ] - [ 0. 0. 0. ] - [ 0. 0. 0. ]] - - [[ 0. 0. 0. ] - [ 0. 0. 0. ] - [ 0. 0. 0. ] - [ 0. 0. 0. ]]]Tally - ID = 10013 - Name = (tally 1 * tally 3) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - distribcell [60] - Nuclides = U-235 Pu-239 O-16 - Scores = [u'nu-fission', u'total', u'absorption'] - Estimator = tracklength -[[[ 0. 0.0006607 0. ] - [ 0. 0. 0. ] - [ 0. 0. 0. ]] - - [[ 0. 0.0006607 0. ] - [ 0. 0. 0. ] - [ 0. 0. 0. ]] - - [[ 0. 0.00020374 0. ] - [ 0. 0. 0. ] - [ 0. 0. 0. ]] - - ..., - [[ 0. 0. 0. ] - [ 0. 0. 0. ] - [ 0. 0. 0. ]] - - [[ 0. 0. 0. ] - [ 0. 0. 0. ] - [ 0. 0. 0. ]] - - [[ 0. 0. 0. ] - [ 0. 0. 0. ] - [ 0. 0. 0. ]]]Tally - ID = 10014 - Name = (tally 1 * tally 4) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - mesh [1] - Nuclides = (U-235 * U-235) (U-235 * Zr-90) (Pu-239 * U-235) (Pu-239 * Zr-90) - Scores = [(nu-fission * scatter), (nu-fission * total), (total * scatter), (total * total)] - Estimator = tracklength -[[[ 1.25406870e-04 3.38446993e-03 6.24541184e-05 1.68550643e-03] - [ 8.54338123e-04 8.55444603e-04 4.25470584e-04 4.26021624e-04] - [ 7.66911978e-05 2.06973551e-03 3.97893175e-05 1.07383071e-03] - [ 5.22461121e-04 5.23137776e-04 2.71065937e-04 2.71417003e-04]] - - [[ 1.25406870e-04 3.38446993e-03 6.24541184e-05 1.68550643e-03] - [ 8.54338123e-04 8.55444603e-04 4.25470584e-04 4.26021624e-04] - [ 7.66911978e-05 2.06973551e-03 3.97893175e-05 1.07383071e-03] - [ 5.22461121e-04 5.23137776e-04 2.71065937e-04 2.71417003e-04]] - - [[ 3.99632703e-04 2.08614103e-03 1.99021857e-04 1.03892314e-03] - [ 2.65001925e-03 2.65034264e-03 1.31974122e-03 1.31990227e-03] - [ 2.44391002e-04 1.27575670e-03 1.26796183e-04 6.61894580e-04] - [ 1.62059025e-03 1.62078801e-03 8.40802879e-04 8.40905483e-04]] - - ..., - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally - ID = 10015 - Name = (tally 1 * tally 4) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - mesh [1] - Nuclides = (U-235 * U-235) (U-235 * Zr-90) (Pu-239 * U-235) (Pu-239 * Zr-90) - Scores = [(nu-fission * scatter), (nu-fission * total), (total * scatter), (total * total)] - Estimator = tracklength -[[[ 1.25406870e-04 3.38446993e-03 6.24541184e-05 1.68550643e-03] - [ 8.54338123e-04 8.55444603e-04 4.25470584e-04 4.26021624e-04] - [ 7.66911978e-05 2.06973551e-03 3.97893175e-05 1.07383071e-03] - [ 5.22461121e-04 5.23137776e-04 2.71065937e-04 2.71417003e-04]] - - [[ 1.25406870e-04 3.38446993e-03 6.24541184e-05 1.68550643e-03] - [ 8.54338123e-04 8.55444603e-04 4.25470584e-04 4.26021624e-04] - [ 7.66911978e-05 2.06973551e-03 3.97893175e-05 1.07383071e-03] - [ 5.22461121e-04 5.23137776e-04 2.71065937e-04 2.71417003e-04]] - - [[ 3.99632703e-04 2.08614103e-03 1.99021857e-04 1.03892314e-03] - [ 2.65001925e-03 2.65034264e-03 1.31974122e-03 1.31990227e-03] - [ 2.44391002e-04 1.27575670e-03 1.26796183e-04 6.61894580e-04] - [ 1.62059025e-03 1.62078801e-03 8.40802879e-04 8.40905483e-04]] - - ..., - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally - ID = 10016 - Name = (tally 1 * tally 4) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - mesh [1] - Nuclides = U-235 Pu-239 Zr-90 - Scores = [(nu-fission * scatter), (nu-fission * total), (total * scatter), (total * total)] - Estimator = tracklength -[[[ 1.25406870e-04 3.38446993e-03 6.24541184e-05 1.68550643e-03] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 1.25406870e-04 3.38446993e-03 6.24541184e-05 1.68550643e-03] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 3.99632703e-04 2.08614103e-03 1.99021857e-04 1.03892314e-03] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 3.99632703e-04 2.08614103e-03 1.99021857e-04 1.03892314e-03] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 7.26649160e-04 9.61556092e-04 3.61879956e-04 4.78866412e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 7.26649160e-04 9.61556092e-04 3.61879956e-04 4.78866412e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 2.03428184e-04 2.48054431e-04 1.01309664e-04 1.23534068e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 2.03428184e-04 2.48054431e-04 1.01309664e-04 1.23534068e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 2.07797571e-04 5.88917101e-03 1.61337951e-04 4.57246338e-03] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 2.07797571e-04 5.88917101e-03 1.61337951e-04 4.57246338e-03] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 5.43202987e-04 2.90564462e-03 4.21753038e-04 2.25599726e-03] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 5.43202987e-04 2.90564462e-03 4.21753038e-04 2.25599726e-03] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 7.56220267e-04 1.00221809e-03 5.87143670e-04 7.78141017e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 7.56220267e-04 1.00221809e-03 5.87143670e-04 7.78141017e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 2.48919397e-04 3.01542606e-04 1.93265712e-04 2.34123363e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 2.48919397e-04 3.01542606e-04 1.93265712e-04 2.34123363e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 1.15352081e-05 3.61534913e-04 2.54639331e-05 7.98087108e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 1.15352081e-05 3.61534913e-04 2.54639331e-05 7.98087108e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 3.43932622e-05 1.89185338e-04 7.59230111e-05 4.17626001e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 3.43932622e-05 1.89185338e-04 7.59230111e-05 4.17626001e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 5.23298543e-05 6.89978472e-05 1.15517978e-04 1.52312516e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 5.23298543e-05 6.89978472e-05 1.15517978e-04 1.52312516e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 1.66777184e-05 2.04329526e-05 3.68160075e-05 4.51056743e-05] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 1.66777184e-05 2.04329526e-05 3.68160075e-05 4.51056743e-05] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 2.13734333e-06 5.36870274e-05 4.68542556e-06 1.17691233e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 2.13734333e-06 5.36870274e-05 4.68542556e-06 1.17691233e-04] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 7.20926557e-06 4.05199536e-05 1.58039547e-05 8.88267335e-05] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 7.20926557e-06 4.05199536e-05 1.58039547e-05 8.88267335e-05] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 1.11679867e-05 1.50075971e-05 2.44821549e-05 3.28992436e-05] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 1.11679867e-05 1.50075971e-05 2.44821549e-05 3.28992436e-05] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 4.13069536e-06 5.01085896e-06 9.05519734e-06 1.09846679e-05] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 4.13069536e-06 5.01085896e-06 9.05519734e-06 1.09846679e-05] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally - ID = 10017 - Name = (tally 1 * tally 4) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - mesh [1] - Nuclides = (U-235 * U-235) (U-235 * Zr-90) (Pu-239 * U-235) (Pu-239 * Zr-90) - Scores = [u'nu-fission', u'total', u'scatter'] - Estimator = tracklength -[[[ 0.00000000e+00 1.68550643e-03 0.00000000e+00] - [ 0.00000000e+00 4.26021624e-04 0.00000000e+00] - [ 0.00000000e+00 1.07383071e-03 0.00000000e+00] - [ 0.00000000e+00 2.71417003e-04 0.00000000e+00]] - - [[ 0.00000000e+00 1.68550643e-03 0.00000000e+00] - [ 0.00000000e+00 4.26021624e-04 0.00000000e+00] - [ 0.00000000e+00 1.07383071e-03 0.00000000e+00] - [ 0.00000000e+00 2.71417003e-04 0.00000000e+00]] - - [[ 0.00000000e+00 1.03892314e-03 0.00000000e+00] - [ 0.00000000e+00 1.31990227e-03 0.00000000e+00] - [ 0.00000000e+00 6.61894580e-04 0.00000000e+00] - [ 0.00000000e+00 8.40905483e-04 0.00000000e+00]] - - [[ 0.00000000e+00 1.03892314e-03 0.00000000e+00] - [ 0.00000000e+00 1.31990227e-03 0.00000000e+00] - [ 0.00000000e+00 6.61894580e-04 0.00000000e+00] - [ 0.00000000e+00 8.40905483e-04 0.00000000e+00]] - - [[ 0.00000000e+00 4.78866412e-04 0.00000000e+00] - [ 0.00000000e+00 4.73832352e-03 0.00000000e+00] - [ 0.00000000e+00 3.05084248e-04 0.00000000e+00] - [ 0.00000000e+00 3.01877064e-03 0.00000000e+00]] - - [[ 0.00000000e+00 4.78866412e-04 0.00000000e+00] - [ 0.00000000e+00 4.73832352e-03 0.00000000e+00] - [ 0.00000000e+00 3.05084248e-04 0.00000000e+00] - [ 0.00000000e+00 3.01877064e-03 0.00000000e+00]] - - [[ 0.00000000e+00 1.23534068e-04 0.00000000e+00] - [ 0.00000000e+00 1.24325262e-03 0.00000000e+00] - [ 0.00000000e+00 7.87031563e-05 0.00000000e+00] - [ 0.00000000e+00 7.92072238e-04 0.00000000e+00]] - - [[ 0.00000000e+00 1.23534068e-04 0.00000000e+00] - [ 0.00000000e+00 1.24325262e-03 0.00000000e+00] - [ 0.00000000e+00 7.87031563e-05 0.00000000e+00] - [ 0.00000000e+00 7.92072238e-04 0.00000000e+00]] - - [[ 0.00000000e+00 4.57246338e-03 0.00000000e+00] - [ 0.00000000e+00 9.78864960e-04 0.00000000e+00] - [ 0.00000000e+00 3.79067678e-03 0.00000000e+00] - [ 0.00000000e+00 8.11501454e-04 0.00000000e+00]] - - [[ 0.00000000e+00 4.57246338e-03 0.00000000e+00] - [ 0.00000000e+00 9.78864960e-04 0.00000000e+00] - [ 0.00000000e+00 3.79067678e-03 0.00000000e+00] - [ 0.00000000e+00 8.11501454e-04 0.00000000e+00]] - - [[ 0.00000000e+00 2.25599726e-03 0.00000000e+00] - [ 0.00000000e+00 3.25856852e-03 0.00000000e+00] - [ 0.00000000e+00 1.87027335e-03 0.00000000e+00] - [ 0.00000000e+00 2.70142788e-03 0.00000000e+00]] - - [[ 0.00000000e+00 2.25599726e-03 0.00000000e+00] - [ 0.00000000e+00 3.25856852e-03 0.00000000e+00] - [ 0.00000000e+00 1.87027335e-03 0.00000000e+00] - [ 0.00000000e+00 2.70142788e-03 0.00000000e+00]] - - [[ 0.00000000e+00 7.78141017e-04 0.00000000e+00] - [ 0.00000000e+00 8.05177588e-03 0.00000000e+00] - [ 0.00000000e+00 6.45096711e-04 0.00000000e+00] - [ 0.00000000e+00 6.67510647e-03 0.00000000e+00]] - - [[ 0.00000000e+00 7.78141017e-04 0.00000000e+00] - [ 0.00000000e+00 8.05177588e-03 0.00000000e+00] - [ 0.00000000e+00 6.45096711e-04 0.00000000e+00] - [ 0.00000000e+00 6.67510647e-03 0.00000000e+00]] - - [[ 0.00000000e+00 2.34123363e-04 0.00000000e+00] - [ 0.00000000e+00 2.14338698e-03 0.00000000e+00] - [ 0.00000000e+00 1.94093626e-04 0.00000000e+00] - [ 0.00000000e+00 1.77691685e-03 0.00000000e+00]] - - [[ 0.00000000e+00 2.34123363e-04 0.00000000e+00] - [ 0.00000000e+00 2.14338698e-03 0.00000000e+00] - [ 0.00000000e+00 1.94093626e-04 0.00000000e+00] - [ 0.00000000e+00 1.77691685e-03 0.00000000e+00]] - - [[ 0.00000000e+00 7.98087108e-04 0.00000000e+00] - [ 0.00000000e+00 2.17118729e-04 0.00000000e+00] - [ 0.00000000e+00 2.36053279e-04 0.00000000e+00] - [ 0.00000000e+00 6.42180376e-05 0.00000000e+00]] - - [[ 0.00000000e+00 7.98087108e-04 0.00000000e+00] - [ 0.00000000e+00 2.17118729e-04 0.00000000e+00] - [ 0.00000000e+00 2.36053279e-04 0.00000000e+00] - [ 0.00000000e+00 6.42180376e-05 0.00000000e+00]] - - [[ 0.00000000e+00 4.17626001e-04 0.00000000e+00] - [ 0.00000000e+00 5.10491350e-04 0.00000000e+00] - [ 0.00000000e+00 1.23522841e-04 0.00000000e+00] - [ 0.00000000e+00 1.50989981e-04 0.00000000e+00]] - - [[ 0.00000000e+00 4.17626001e-04 0.00000000e+00] - [ 0.00000000e+00 5.10491350e-04 0.00000000e+00] - [ 0.00000000e+00 1.23522841e-04 0.00000000e+00] - [ 0.00000000e+00 1.50989981e-04 0.00000000e+00]] - - [[ 0.00000000e+00 1.52312516e-04 0.00000000e+00] - [ 0.00000000e+00 1.54884686e-03 0.00000000e+00] - [ 0.00000000e+00 4.50500561e-05 0.00000000e+00] - [ 0.00000000e+00 4.58108367e-04 0.00000000e+00]] - - [[ 0.00000000e+00 1.52312516e-04 0.00000000e+00] - [ 0.00000000e+00 1.54884686e-03 0.00000000e+00] - [ 0.00000000e+00 4.50500561e-05 0.00000000e+00] - [ 0.00000000e+00 4.58108367e-04 0.00000000e+00]] - - [[ 0.00000000e+00 4.51056743e-05 0.00000000e+00] - [ 0.00000000e+00 4.58602101e-04 0.00000000e+00] - [ 0.00000000e+00 1.33410780e-05 0.00000000e+00] - [ 0.00000000e+00 1.35642499e-04 0.00000000e+00]] - - [[ 0.00000000e+00 4.51056743e-05 0.00000000e+00] - [ 0.00000000e+00 4.58602101e-04 0.00000000e+00] - [ 0.00000000e+00 1.33410780e-05 0.00000000e+00] - [ 0.00000000e+00 1.35642499e-04 0.00000000e+00]] - - [[ 0.00000000e+00 1.17691233e-04 0.00000000e+00] - [ 0.00000000e+00 2.57333424e-05 0.00000000e+00] - [ 0.00000000e+00 3.44265026e-05 0.00000000e+00] - [ 0.00000000e+00 7.52739998e-06 0.00000000e+00]] - - [[ 0.00000000e+00 1.17691233e-04 0.00000000e+00] - [ 0.00000000e+00 2.57333424e-05 0.00000000e+00] - [ 0.00000000e+00 3.44265026e-05 0.00000000e+00] - [ 0.00000000e+00 7.52739998e-06 0.00000000e+00]] - - [[ 0.00000000e+00 8.88267335e-05 0.00000000e+00] - [ 0.00000000e+00 9.82261843e-05 0.00000000e+00] - [ 0.00000000e+00 2.59831910e-05 0.00000000e+00] - [ 0.00000000e+00 2.87326755e-05 0.00000000e+00]] - - [[ 0.00000000e+00 8.88267335e-05 0.00000000e+00] - [ 0.00000000e+00 9.82261843e-05 0.00000000e+00] - [ 0.00000000e+00 2.59831910e-05 0.00000000e+00] - [ 0.00000000e+00 2.87326755e-05 0.00000000e+00]] - - [[ 0.00000000e+00 3.28992436e-05 0.00000000e+00] - [ 0.00000000e+00 3.04106557e-04 0.00000000e+00] - [ 0.00000000e+00 9.62353672e-06 0.00000000e+00] - [ 0.00000000e+00 8.89558632e-05 0.00000000e+00]] - - [[ 0.00000000e+00 3.28992436e-05 0.00000000e+00] - [ 0.00000000e+00 3.04106557e-04 0.00000000e+00] - [ 0.00000000e+00 9.62353672e-06 0.00000000e+00] - [ 0.00000000e+00 8.89558632e-05 0.00000000e+00]] - - [[ 0.00000000e+00 1.09846679e-05 0.00000000e+00] - [ 0.00000000e+00 9.94842161e-05 0.00000000e+00] - [ 0.00000000e+00 3.21318497e-06 0.00000000e+00] - [ 0.00000000e+00 2.91006692e-05 0.00000000e+00]] - - [[ 0.00000000e+00 1.09846679e-05 0.00000000e+00] - [ 0.00000000e+00 9.94842161e-05 0.00000000e+00] - [ 0.00000000e+00 3.21318497e-06 0.00000000e+00] - [ 0.00000000e+00 2.91006692e-05 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally - ID = 10018 - Name = (tally 1 * tally 4) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - mesh [1] - Nuclides = U-235 Pu-239 Zr-90 - Scores = [u'nu-fission', u'total', u'scatter'] - Estimator = tracklength -[[[ 0.00000000e+00 1.68550643e-03 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 1.68550643e-03 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 1.03892314e-03 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 1.03892314e-03 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 4.78866412e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 4.78866412e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 1.23534068e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 1.23534068e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 4.57246338e-03 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 4.57246338e-03 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 2.25599726e-03 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 2.25599726e-03 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 7.78141017e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 7.78141017e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 2.34123363e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 2.34123363e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 7.98087108e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 7.98087108e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 4.17626001e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 4.17626001e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 1.52312516e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 1.52312516e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 4.51056743e-05 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 4.51056743e-05 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 1.17691233e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 1.17691233e-04 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 8.88267335e-05 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 8.88267335e-05 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 3.28992436e-05 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 3.28992436e-05 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 1.09846679e-05 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 1.09846679e-05 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] - [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] diff --git a/tests/test_tally_arithmetic/test_tally_arithmetic.py b/tests/test_tally_arithmetic/test_tally_arithmetic.py index 70439b54f9..5517cbcf75 100644 --- a/tests/test_tally_arithmetic/test_tally_arithmetic.py +++ b/tests/test_tally_arithmetic/test_tally_arithmetic.py @@ -22,8 +22,6 @@ class TallyArithmeticTestHarness(PyAPITestHarness): u235 = openmc.Nuclide('U-235') u238 = openmc.Nuclide('U-238') pu239 = openmc.Nuclide('Pu-239') - zr90 = openmc.Nuclide('Zr-90') - o16 = openmc.Nuclide('O-16') # Initialize Mesh mesh = openmc.Mesh(mesh_id=1) @@ -36,7 +34,6 @@ class TallyArithmeticTestHarness(PyAPITestHarness): energy_filter = openmc.Filter(type='energy', bins=(0.0, 0.253e-6, 1.0e-3, 1.0, 20.0)) material_filter = openmc.Filter(type='material', bins=(1, 3)) - universe_filter = openmc.Filter(type='universe', bins=(1, 3)) distrib_filter = openmc.Filter(type='distribcell', bins=(60)) mesh_filter = openmc.Filter(type='mesh') mesh_filter.mesh = mesh @@ -45,6 +42,7 @@ class TallyArithmeticTestHarness(PyAPITestHarness): tally = openmc.Tally(name='tally 1') tally.add_filter(material_filter) tally.add_filter(energy_filter) + tally.add_filter(distrib_filter) tally.add_score('nu-fission') tally.add_score('total') tally.add_nuclide(u235) @@ -53,33 +51,13 @@ class TallyArithmeticTestHarness(PyAPITestHarness): # Instantiate reaction rate Tally in fuel tally = openmc.Tally(name='tally 2') - tally.add_filter(universe_filter) tally.add_filter(energy_filter) + tally.add_filter(mesh_filter) tally.add_score('total') tally.add_score('fission') tally.add_nuclide(u238) tally.add_nuclide(u235) tallies_file.add_tally(tally) - - # Instantiate reaction rate Tally in moderator - tally = openmc.Tally(name='tally 3') - tally.add_filter(distrib_filter) - tally.add_filter(energy_filter) - tally.add_score('absorption') - tally.add_score('total') - tally.add_nuclide(u235) - tally.add_nuclide(o16) - tallies_file.add_tally(tally) - - # Instantiate reaction rate Tally in moderator - tally = openmc.Tally(name='tally 4') - tally.add_filter(mesh_filter) - tally.add_filter(energy_filter) - tally.add_score('scatter') - tally.add_score('total') - tally.add_nuclide(u235) - tally.add_nuclide(zr90) - tallies_file.add_tally(tally) tallies_file.add_mesh(mesh) # Export tallies to file @@ -98,87 +76,35 @@ class TallyArithmeticTestHarness(PyAPITestHarness): su = openmc.Summary(summary) sp.link_with_summary(su) - print 'reading in tallies' - # Load the tallies tally_1 = sp.get_tally(name='tally 1') tally_2 = sp.get_tally(name='tally 2') - tally_3 = sp.get_tally(name='tally 3') - tally_4 = sp.get_tally(name='tally 4') # Perform all the tally arithmetic operations and output results outstr = '' - tally_5 = tally_1 * tally_2 - outstr += repr(tally_5) - outstr += str(tally_5.mean) + tally_3 = tally_1 * tally_2 + outstr += repr(tally_3) + outstr += str(tally_3.mean) - tally_5 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'tensor', + tally_3 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'tensor', 'tensor') - outstr += repr(tally_5) - outstr += str(tally_5.mean) + outstr += repr(tally_3) + outstr += str(tally_3.mean) - tally_5 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'entrywise', + tally_3 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'entrywise', 'tensor') - outstr += repr(tally_5) - outstr += str(tally_5.mean) + outstr += repr(tally_3) + outstr += str(tally_3.mean) - tally_5 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'tensor', + tally_3 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'tensor', 'entrywise') - outstr += repr(tally_5) - outstr += str(tally_5.mean) + outstr += repr(tally_3) + outstr += str(tally_3.mean) - tally_5 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'entrywise', + tally_3 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'entrywise', 'entrywise') - outstr += repr(tally_5) - outstr += str(tally_5.mean) - - tally_5 = tally_1 * tally_3 - outstr += repr(tally_5) - outstr += str(tally_5.mean) - - tally_5 = tally_1.hybrid_product(tally_3, '*', 'entrywise', 'tensor', - 'tensor') - outstr += repr(tally_5) - outstr += str(tally_5.mean) - - tally_5 = tally_1.hybrid_product(tally_3, '*', 'entrywise', 'entrywise', - 'tensor') - outstr += repr(tally_5) - outstr += str(tally_5.mean) - - tally_5 = tally_1.hybrid_product(tally_3, '*', 'entrywise', 'tensor', - 'entrywise') - outstr += repr(tally_5) - outstr += str(tally_5.mean) - - tally_5 = tally_1.hybrid_product(tally_3, '*', 'entrywise', 'entrywise', - 'entrywise') - outstr += repr(tally_5) - outstr += str(tally_5.mean) - - tally_5 = tally_1 * tally_4 - outstr += repr(tally_5) - outstr += str(tally_5.mean) - - tally_5 = tally_1.hybrid_product(tally_4, '*', 'entrywise', 'tensor', - 'tensor') - outstr += repr(tally_5) - outstr += str(tally_5.mean) - - tally_5 = tally_1.hybrid_product(tally_4, '*', 'entrywise', 'entrywise', - 'tensor') - outstr += repr(tally_5) - outstr += str(tally_5.mean) - - tally_5 = tally_1.hybrid_product(tally_4, '*', 'entrywise', 'tensor', - 'entrywise') - outstr += repr(tally_5) - outstr += str(tally_5.mean) - - tally_5 = tally_1.hybrid_product(tally_4, '*', 'entrywise', 'entrywise', - 'entrywise') - outstr += repr(tally_5) - outstr += str(tally_5.mean) + outstr += repr(tally_3) + outstr += str(tally_3.mean) print(outstr) From e4fc8e44edb8871ee589b7979c1a8c716150e76f Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sat, 19 Dec 2015 10:50:07 -0800 Subject: [PATCH 22/61] updated tally arithmetic test for work for Python 3 --- tests/test_tally_arithmetic/results_true.dat | 68 ++----------------- .../test_tally_arithmetic.py | 5 -- 2 files changed, 4 insertions(+), 69 deletions(-) diff --git a/tests/test_tally_arithmetic/results_true.dat b/tests/test_tally_arithmetic/results_true.dat index 2878cbf4b7..ded2efa665 100644 --- a/tests/test_tally_arithmetic/results_true.dat +++ b/tests/test_tally_arithmetic/results_true.dat @@ -1,15 +1,3 @@ -Tally - ID = 10002 - Name = (tally 1 * tally 2) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - distribcell [60] - mesh [1] - Nuclides = (U-235 * U-238) (U-235 * U-235) (Pu-239 * U-238) (Pu-239 * U-235) - Scores = [(nu-fission * total), (nu-fission * fission), (total * total), (total * fission)] - Estimator = tracklength [[[ 8.90240785e-05 8.31464209e-11 4.41507090e-05 4.12357364e-11] [ 7.29618709e-05 5.98879928e-05 3.61847984e-05 2.97009235e-05] [ 4.69276830e-05 4.38293656e-11 2.35903380e-05 2.20328275e-11] @@ -39,19 +27,7 @@ Tally [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally - ID = 10003 - Name = (tally 1 * tally 2) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - distribcell [60] - mesh [1] - Nuclides = (U-235 * U-238) (U-235 * U-235) (Pu-239 * U-238) (Pu-239 * U-235) - Scores = [(nu-fission * total), (nu-fission * fission), (total * total), (total * fission)] - Estimator = tracklength -[[[ 8.90240785e-05 8.31464209e-11 4.41507090e-05 4.12357364e-11] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]][[[ 8.90240785e-05 8.31464209e-11 4.41507090e-05 4.12357364e-11] [ 7.29618709e-05 5.98879928e-05 3.61847984e-05 2.97009235e-05] [ 4.69276830e-05 4.38293656e-11 2.35903380e-05 2.20328275e-11] [ 3.84607356e-05 3.15690405e-05 1.93340411e-05 1.58696166e-05]] @@ -80,19 +56,7 @@ Tally [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally - ID = 10004 - Name = (tally 1 * tally 2) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - distribcell [60] - mesh [1] - Nuclides = U-235 Pu-239 U-238 - Scores = [(nu-fission * total), (nu-fission * fission), (total * total), (total * fission)] - Estimator = tracklength -[[[ 7.29618709e-05 5.98879928e-05 3.61847984e-05 2.97009235e-05] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]][[[ 7.29618709e-05 5.98879928e-05 3.61847984e-05 2.97009235e-05] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] @@ -115,19 +79,7 @@ Tally [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally - ID = 10005 - Name = (tally 1 * tally 2) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - distribcell [60] - mesh [1] - Nuclides = (U-235 * U-238) (U-235 * U-235) (Pu-239 * U-238) (Pu-239 * U-235) - Scores = [u'nu-fission', u'total', u'fission'] - Estimator = tracklength -[[[ 0.00000000e+00 4.41507090e-05 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]][[[ 0.00000000e+00 4.41507090e-05 0.00000000e+00] [ 0.00000000e+00 3.61847984e-05 0.00000000e+00] [ 0.00000000e+00 2.35903380e-05 0.00000000e+00] [ 0.00000000e+00 1.93340411e-05 0.00000000e+00]] @@ -156,19 +108,7 @@ Tally [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]Tally - ID = 10006 - Name = (tally 1 * tally 2) - Filters = - material [1 3] - energy [ 0.00000000e+00 2.53000000e-07 1.00000000e-03 1.00000000e+00 - 2.00000000e+01] - distribcell [60] - mesh [1] - Nuclides = U-235 Pu-239 U-238 - Scores = [u'nu-fission', u'total', u'fission'] - Estimator = tracklength -[[[ 0.00000000e+00 3.61847984e-05 0.00000000e+00] + [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]]][[[ 0.00000000e+00 3.61847984e-05 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00]] diff --git a/tests/test_tally_arithmetic/test_tally_arithmetic.py b/tests/test_tally_arithmetic/test_tally_arithmetic.py index 5517cbcf75..e794458c8c 100644 --- a/tests/test_tally_arithmetic/test_tally_arithmetic.py +++ b/tests/test_tally_arithmetic/test_tally_arithmetic.py @@ -83,27 +83,22 @@ class TallyArithmeticTestHarness(PyAPITestHarness): # Perform all the tally arithmetic operations and output results outstr = '' tally_3 = tally_1 * tally_2 - outstr += repr(tally_3) outstr += str(tally_3.mean) tally_3 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'tensor', 'tensor') - outstr += repr(tally_3) outstr += str(tally_3.mean) tally_3 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'entrywise', 'tensor') - outstr += repr(tally_3) outstr += str(tally_3.mean) tally_3 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'tensor', 'entrywise') - outstr += repr(tally_3) outstr += str(tally_3.mean) tally_3 = tally_1.hybrid_product(tally_2, '*', 'entrywise', 'entrywise', 'entrywise') - outstr += repr(tally_3) outstr += str(tally_3.mean) print(outstr) From 6ca9e70a7073921f3c86c1313a442a973abbd12a Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sat, 19 Dec 2015 12:08:03 -0800 Subject: [PATCH 23/61] fixed comments in tallies.py and tally arithmetic test --- openmc/tallies.py | 2 +- tests/test_tally_arithmetic/test_tally_arithmetic.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 73bf4c0dff..4d5435b92b 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1461,7 +1461,7 @@ class Tally(object): The type of product (tensor or entrywise) to be performed between filter data. The default is the entrywise product. Currently only the entrywise product is supported since a tally cannot contain - two of the same tallies. + two of the same filter. nuclide_product : str, optional The type of product (tensor or entrywise) to be performed between nuclide data. The default is the entrywise product if all nuclides diff --git a/tests/test_tally_arithmetic/test_tally_arithmetic.py b/tests/test_tally_arithmetic/test_tally_arithmetic.py index e794458c8c..6643fd5a22 100644 --- a/tests/test_tally_arithmetic/test_tally_arithmetic.py +++ b/tests/test_tally_arithmetic/test_tally_arithmetic.py @@ -49,7 +49,6 @@ class TallyArithmeticTestHarness(PyAPITestHarness): tally.add_nuclide(pu239) tallies_file.add_tally(tally) - # Instantiate reaction rate Tally in fuel tally = openmc.Tally(name='tally 2') tally.add_filter(energy_filter) tally.add_filter(mesh_filter) From d713cc05755650428f95c1ab0a5cfbeef1a84452 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 22 Dec 2015 13:02:45 -0800 Subject: [PATCH 24/61] addressed comments from PR review mainly dealing with PEP8 compliance and typos --- openmc/tallies.py | 83 ++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 4d5435b92b..cd7bc338ec 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -31,6 +31,7 @@ AUTO_TALLY_ID = 10000 # specified axis. _PRODUCT_TYPES = ['tensor', 'entrywise'] + def reset_auto_tally_id(): global AUTO_TALLY_ID AUTO_TALLY_ID = 10000 @@ -1116,7 +1117,7 @@ class Tally(object): '\'rel_err\', \'sum\', or \'sum_sq\''.format(self.id, value) raise LookupError(msg) - return data.copy() + return data def get_pandas_dataframe(self, filters=True, nuclides=True, scores=True, summary=None): @@ -1440,16 +1441,16 @@ class Tally(object): nuclide_product=None, score_product=None): """Combines filters, scores and nuclides with another tally. - This is a helper method for the tally arithmetic methods. It is called a - "hybrid product" because it performs a combination of tensor - (or Kronecker) and entrywise (or Hadamard) products. The filters from - both tallies are combined using an entrywise (or Hadamard) product on - matching filters. By default, if all nuclides are identical in the two - tallies, the entrywise product is performed across nuclides; else the - tensor product is performed. By default, if all scores are identical in - the two tallies, the entrywise product is performed across scores; else - the tensor product is performed. Users can also call the method - explicitly and specify the desired product. + This is a helper method for the tally arithmetic operator overloaded + methods. It is called a "hybrid product" because it performs a + combination of tensor (or Kronecker) and entrywise (or Hadamard) + products. The filters from both tallies are combined using an entrywise + (or Hadamard) product on matching filters. By default, if all nuclides + are identical in the two tallies, the entrywise product is performed + across nuclides; else the tensor product is performed. By default, if + all scores are identical in the two tallies, the entrywise product is + performed across scores; else the tensor product is performed. Users + can also call the method explicitly and specify the desired product. Parameters ---------- @@ -1457,17 +1458,17 @@ class Tally(object): The tally on the right hand side of the hybrid product binary_op : {'+', '-', '*', '/', '^'} The binary operation in the hybrid product - filter_product : str, optional + filter_product : {'tensor', 'entrywise' or None} The type of product (tensor or entrywise) to be performed between filter data. The default is the entrywise product. Currently only the entrywise product is supported since a tally cannot contain two of the same filter. - nuclide_product : str, optional + nuclide_product : {'tensor', 'entrywise' or None} The type of product (tensor or entrywise) to be performed between nuclide data. The default is the entrywise product if all nuclides between the two tallies are the same; otherwise the default is the tensor product. - score_product : str, optional + score_product : {'tensor', 'entrywise' or None} The type of product (tensor or entrywise) to be performed between score data. The default is the entrywise product if all scores between the two tallies are the same; otherwise the default is @@ -1491,7 +1492,7 @@ class Tally(object): filter_product = 'entrywise' elif filter_product == 'tensor': msg = 'Unable to perform Tally arithmetic with a tensor product' \ - 'for the filter data as this not currently supported.' + 'for the filter data as this is not currently supported.' raise ValueError(msg) # Set default value for nuclide product if it was not set @@ -1642,13 +1643,13 @@ class Tally(object): ---------- other : Tally The tally to outer product with this tally - filter_product : str - The type of product (tensor or entrywise) to be performed between - filter data. - nuclide_product : str + filter_product : {'entrywise'} + The type of product to be performed between filter data. Currently, + only the entrywise product is supported for the filter product. + nuclide_product : {'tensor', 'entrywise'} The type of product (tensor or entrywise) to be performed between nuclide data. - score_product : str + score_product : {'tensor', 'entrywise'} The type of product (tensor or entrywise) to be performed between score data. @@ -1786,8 +1787,8 @@ class Tally(object): """Reverse the ordering of two filters in this tally This is a helper method for tally arithmetic which helps align the data - in two tallies with shared filters. This method copies this tally and - reverses the order of the two filters. + in two tallies with shared filters. This method reverses the order of + the two filters in place. Parameters ---------- @@ -1924,23 +1925,23 @@ class Tally(object): # Adjust the mean data array to relect the new nuclide order if self.mean is not None: - nuclide1_mean = self._mean[:,nuclide1_index,:].copy() - nuclide2_mean = self._mean[:,nuclide2_index,:].copy() - self._mean[:,nuclide2_index,:] = nuclide1_mean - self._mean[:,nuclide1_index,:] = nuclide2_mean + nuclide1_mean = self._mean[:, nuclide1_index, :].copy() + nuclide2_mean = self._mean[:, nuclide2_index, :].copy() + self._mean[:, nuclide2_index, :] = nuclide1_mean + self._mean[:, nuclide1_index, :] = nuclide2_mean # Adjust the std_dev data array to relect the new nuclide order if self.std_dev is not None: - nuclide1_std_dev = self._std_dev[:,nuclide1_index,:].copy() - nuclide2_std_dev = self._std_dev[:,nuclide2_index,:].copy() - self._std_dev[:,nuclide2_index,:] = nuclide1_std_dev - self._std_dev[:,nuclide1_index,:] = nuclide2_std_dev + nuclide1_std_dev = self._std_dev[:, nuclide1_index, :].copy() + nuclide2_std_dev = self._std_dev[:, nuclide2_index, :].copy() + self._std_dev[:, nuclide2_index, :] = nuclide1_std_dev + self._std_dev[:, nuclide1_index, :] = nuclide2_std_dev def _swap_scores(self, score1, score2): """Reverse the ordering of two scores in this tally This is a helper method for tally arithmetic which helps align the data - in two tallies with shared scores. This method copies reverses the order + in two tallies with shared scores. This method reverses the order of the two scores in place. Parameters @@ -1967,11 +1968,11 @@ class Tally(object): # Check that the scores are valid if not isinstance(score1, (basestring, CrossScore)): - msg = 'Unable to swap score "{0}" in Tally ID="{1}" since it is ' \ + 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)): - msg = 'Unable to swap score "{0}" in Tally ID="{1}" since it is ' \ + 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) @@ -1996,17 +1997,17 @@ class Tally(object): # Adjust the mean data array to relect the new nuclide order if self.mean is not None: - score1_mean = self._mean[:,:,score1_index].copy() - score2_mean = self._mean[:,:,score2_index].copy() - self._mean[:,:,score2_index] = score1_mean - self._mean[:,:,score1_index] = score2_mean + score1_mean = self._mean[:, :, score1_index].copy() + score2_mean = self._mean[:, :, score2_index].copy() + self._mean[:, :, score2_index] = score1_mean + self._mean[:, :, score1_index] = score2_mean # Adjust the std_dev data array to relect the new nuclide order if self.std_dev is not None: - score1_std_dev = self._std_dev[:,:,score1_index].copy() - score2_std_dev = self._std_dev[:,:,score2_index].copy() - self._std_dev[:,:,score2_index] = score1_std_dev - self._std_dev[:,:,score1_index] = score2_std_dev + score1_std_dev = self._std_dev[:, :, score1_index].copy() + score2_std_dev = self._std_dev[:, :, score2_index].copy() + self._std_dev[:, :, score2_index] = score1_std_dev + self._std_dev[:, :, score1_index] = score2_std_dev def __add__(self, other): """Adds this tally to another tally or scalar value. From 714f4ff2cc0706e706cbe4e29f293bcfb195a60b Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 22 Dec 2015 14:10:13 -0800 Subject: [PATCH 25/61] removed num_score_bins from tallies.py and removed duplicate scores from tests --- openmc/statepoint.py | 7 +-- openmc/summary.py | 2 - openmc/tallies.py | 68 +++++++++---------------- tests/test_many_scores/results_true.dat | 12 ----- tests/test_many_scores/tallies.xml | 6 +-- tests/test_score_MT/inputs_true.dat | 2 +- tests/test_score_MT/results_true.dat | 24 --------- tests/test_score_MT/test_score_MT.py | 1 - 8 files changed, 29 insertions(+), 93 deletions(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 1ff0584a72..4c17379630 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -391,11 +391,6 @@ class StatePoint(object): nuclide = openmc.Nuclide(name.decode().strip()) tally.add_nuclide(nuclide) - # Read score bins - n_score_bins = self._f['{0}{1}/n_score_bins'.format(base, tally_key)].value - - tally.num_score_bins = n_score_bins - scores = self._f['{0}{1}/score_bins'.format( base, tally_key)].value n_user_scores = self._f['{0}{1}/n_user_score_bins' @@ -404,7 +399,7 @@ class StatePoint(object): # Compute and set the filter strides for i in range(n_filters): filter = tally.filters[i] - filter.stride = n_score_bins * len(nuclide_names) + filter.stride = n_user_scores * len(nuclide_names) for j in range(i+1, n_filters): filter.stride *= tally.filters[j].num_bins diff --git a/openmc/summary.py b/openmc/summary.py index 4b1088e827..c14f9073d8 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -524,8 +524,6 @@ class Summary(object): scores = self._f['{0}/score_bins'.format(subbase)].value for score in scores: tally.add_score(score.decode()) - num_score_bins = self._f['{0}/n_score_bins'.format(subbase)][...] - tally.num_score_bins = num_score_bins # Read filter metadata num_filters = self._f['{0}/n_filters'.format(subbase)].value diff --git a/openmc/tallies.py b/openmc/tallies.py index cd7bc338ec..dfc03d50a4 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -65,10 +65,6 @@ class Tally(object): Type of estimator for the tally triggers : list of openmc.trigger.Trigger List of tally triggers - num_score_bins : Integral - Total number of scores, accounting for the fact that a single - user-specified score, e.g. scatter-P3 or flux-Y2,2, might have multiple - bins num_scores : Integral Total number of user-specified scores num_filter_bins : Integral @@ -101,7 +97,6 @@ class Tally(object): self._estimator = None self._triggers = [] - self._num_score_bins = 0 self._num_realizations = 0 self._with_summary = False @@ -124,7 +119,6 @@ class Tally(object): clone.id = self.id clone.name = self.name clone.estimator = self.estimator - clone.num_score_bins = self.num_score_bins clone.num_realizations = self.num_realizations clone._sum = copy.deepcopy(self._sum, memo) clone._sum_sq = copy.deepcopy(self._sum_sq, memo) @@ -253,10 +247,6 @@ class Tally(object): def num_scores(self): return len(self._scores) - @property - def num_score_bins(self): - return self._num_score_bins - @property def num_filter_bins(self): num_bins = 1 @@ -270,7 +260,7 @@ class Tally(object): def num_bins(self): num_bins = self.num_filter_bins num_bins *= self.num_nuclides - num_bins *= self.num_score_bins + num_bins *= self.num_scores return num_bins @property @@ -313,7 +303,7 @@ class Tally(object): # Reshape the results arrays new_shape = (nonzero(self.num_filter_bins), nonzero(self.num_nuclides), - nonzero(self.num_score_bins)) + nonzero(self.num_scores)) sum = np.reshape(sum, new_shape) sum_sq = np.reshape(sum_sq, new_shape) @@ -459,9 +449,13 @@ class Tally(object): 'not a string'.format(score, self.id) raise ValueError(msg) - # If the score is already in the Tally, don't add it again + # If the score is already in the Tally, raise an error if score in self.scores: - return + msg = 'Unable to add a duplicate score {0} to Tally ID="{1}" ' \ + 'since duplicate scores are not supported in the OpenMC ' \ + 'Python API'.format(score, self.id) + raise ValueError(msg) + # Normal score strings if isinstance(score, basestring): self._scores.append(score.strip()) @@ -469,10 +463,6 @@ class Tally(object): else: self._scores.append(score) - @num_score_bins.setter - def num_score_bins(self, num_score_bins): - self._num_score_bins = num_score_bins - @num_realizations.setter def num_realizations(self, num_realizations): cv.check_type('number of realizations', num_realizations, Integral) @@ -1287,7 +1277,7 @@ class Tally(object): for filter in self.filters: new_shape += (filter.num_bins, ) new_shape += (self.num_nuclides,) - new_shape += (self.num_score_bins,) + new_shape += (self.num_scores,) # Reshape the data with one dimension for each filter data = np.reshape(data, new_shape) @@ -1608,18 +1598,16 @@ class Tally(object): # Add scores to the new tally if score_product == 'entrywise': - new_tally.num_score_bins = self_copy.num_score_bins for self_score in self_copy.scores: new_tally.add_score(self_score) else: - new_tally.num_score_bins = self_copy.num_score_bins * other_copy.num_score_bins 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_tally.add_score(new_score) # Correct each Filter's stride - stride = new_tally.num_nuclides * new_tally.num_score_bins + stride = new_tally.num_nuclides * new_tally.num_scores for filter in reversed(new_tally.filters): filter.stride = stride stride *= filter.num_bins @@ -1727,10 +1715,10 @@ class Tally(object): # Repeat and tile the data by score in preparation for performing # the tensor product across scores. if score_product == 'tensor': - self._mean = np.repeat(self.mean, other.num_score_bins, axis=2) - self._std_dev = np.repeat(self.std_dev, other.num_score_bins, axis=2) - other._mean = np.tile(other.mean, (1, 1, self.num_score_bins)) - other._std_dev = np.tile(other.std_dev, (1, 1, self.num_score_bins)) + self._mean = np.repeat(self.mean, other.num_scores, axis=2) + self._std_dev = np.repeat(self.std_dev, other.num_scores, axis=2) + other._mean = np.tile(other.mean, (1, 1, self.num_scores)) + other._std_dev = np.tile(other.std_dev, (1, 1, self.num_scores)) # Add scores to each tally such that each tally contains the complete set # of scores necessary to perform an entrywise product. New scores added @@ -1743,16 +1731,15 @@ class Tally(object): # Add scores present in self but not in other to other for score in other_missing_scores: - other._mean = np.insert(other.mean, other.num_score_bins, 0, axis=2) - other._std_dev = np.insert(other.std_dev, other.num_score_bins, 0, axis=2) + other._mean = np.insert(other.mean, other.num_scores, 0, axis=2) + other._std_dev = np.insert(other.std_dev, other.num_scores, 0, axis=2) other.add_score(score) # Add scores present in other but not in self to self for score in self_missing_scores: - self._mean = np.insert(self.mean, self.num_score_bins, 0, axis=2) - self._std_dev = np.insert(self.std_dev, self.num_score_bins, 0, axis=2) + self._mean = np.insert(self.mean, self.num_scores, 0, axis=2) + self._std_dev = np.insert(self.std_dev, self.num_scores, 0, axis=2) self.add_score(score) - self.num_score_bins += 1 # Align other scores with self scores for i, score in enumerate(self.scores): @@ -1763,13 +1750,13 @@ class Tally(object): other._swap_scores(score, other.scores[i]) # Correct the stride for other filters - stride = other.num_nuclides * other.num_score_bins + stride = other.num_nuclides * other.num_scores for filter in reversed(other.filters): filter.stride = stride stride *= filter.num_bins # Correct the stride for self filters - stride = self.num_nuclides * self.num_score_bins + stride = self.num_nuclides * self.num_scores for filter in reversed(self.filters): filter.stride = stride stride *= filter.num_bins @@ -1835,7 +1822,7 @@ class Tally(object): self.filters[filter2_index] = filter1 # Update the strides for each of the filters - stride = self.num_nuclides * self.num_score_bins + stride = self.num_nuclides * self.num_scores for filter in reversed(self.filters): filter.stride = stride stride *= filter.num_bins @@ -2064,7 +2051,6 @@ class Tally(object): new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations - new_tally.num_score_bins = self.num_score_bins for filter in self.filters: new_tally.add_filter(filter) @@ -2133,7 +2119,6 @@ class Tally(object): new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations - new_tally.num_score_bins = self.num_score_bins for filter in self.filters: new_tally.add_filter(filter) @@ -2203,7 +2188,6 @@ class Tally(object): new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations - new_tally.num_score_bins = self.num_score_bins for filter in self.filters: new_tally.add_filter(filter) @@ -2273,7 +2257,6 @@ class Tally(object): new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations - new_tally.num_score_bins = self.num_score_bins for filter in self.filters: new_tally.add_filter(filter) @@ -2347,7 +2330,6 @@ class Tally(object): new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations - new_tally.num_score_bins = self.num_score_bins for filter in self.filters: new_tally.add_filter(filter) @@ -2549,7 +2531,6 @@ class Tally(object): # Loop over indices in reverse to remove excluded scores for score_index in reversed(score_indices): new_tally.remove_score(self.scores[score_index]) - new_tally.num_score_bins -= 1 # NUCLIDES if nuclides: @@ -2589,7 +2570,7 @@ class Tally(object): filter.num_bins = len(filter_bins[i]) # Correct each Filter's stride - stride = new_tally.num_nuclides * new_tally.num_score_bins + stride = new_tally.num_nuclides * new_tally.num_scores for filter in reversed(new_tally.filters): filter.stride = stride stride *= filter.num_bins @@ -2735,8 +2716,7 @@ class Tally(object): # Determine the shape of data in the new diagonalized Tally num_filter_bins = new_tally.num_filter_bins num_nuclides = new_tally.num_nuclides - num_score_bins = new_tally.num_score_bins - new_shape = (num_filter_bins, num_nuclides, num_score_bins) + new_shape = (num_filter_bins, num_nuclides, num_scores) # Determine "base" indices along the new "diagonal", and the factor # by which the "base" indices should be repeated to account for all @@ -2766,7 +2746,7 @@ class Tally(object): new_tally._std_dev[diag_indices, :, :] = self.std_dev # Correct each Filter's stride - stride = new_tally.num_nuclides * new_tally.num_score_bins + stride = new_tally.num_nuclides * new_tally.num_scores for filter in reversed(new_tally.filters): filter.stride = stride stride *= filter.num_bins diff --git a/tests/test_many_scores/results_true.dat b/tests/test_many_scores/results_true.dat index 0d5dd6e32e..ae5430e30a 100644 --- a/tests/test_many_scores/results_true.dat +++ b/tests/test_many_scores/results_true.dat @@ -11,18 +11,6 @@ tally 1: 2.483728E+01 5.102293E-01 8.710841E-02 -8.628000E+00 -2.481430E+01 -9.329009E-01 -2.902534E-01 -5.102293E-01 -8.710841E-02 -5.087118E-01 -8.657086E-02 -8.632000E+00 -2.483728E+01 -9.328366E-01 -2.902108E-01 5.087118E-01 8.657086E-02 9.212024E+00 diff --git a/tests/test_many_scores/tallies.xml b/tests/test_many_scores/tallies.xml index 2df5597d04..b8a154f1ac 100644 --- a/tests/test_many_scores/tallies.xml +++ b/tests/test_many_scores/tallies.xml @@ -4,9 +4,9 @@ - flux total scatter nu-scatter scatter-2 scatter-p2 nu-scatter-2 - nu-scatter-p2 transport n1n absorption nu-fission kappa-fission - flux-y2 total-y2 scatter-y2 nu-scatter-y2 events delayed-nu-fission + flux total scatter nu-scatter scatter-2 nu-scatter-2 transport n1n + absorption nu-fission kappa-fission flux-y2 total-y2 scatter-y2 + nu-scatter-y2 events delayed-nu-fission diff --git a/tests/test_score_MT/inputs_true.dat b/tests/test_score_MT/inputs_true.dat index 3789a69cba..b361c28cf2 100644 --- a/tests/test_score_MT/inputs_true.dat +++ b/tests/test_score_MT/inputs_true.dat @@ -1 +1 @@ -63295b9d510370e65e63a3db627d47d286f5479e53c8eabeda9a5cb25ffe35becb636835aadad11691e34c23292fe11b5f688daee76d76ceac4b5dfd2f9ede4c \ No newline at end of file +7270299e4a4dde19d250825b0124fa36b60df847f046e058ccdfc74d4690beaaaaf387e050f596cb3445caf793d6a390ddb2d19650a3dccd4eb60056ae3b1477 \ No newline at end of file diff --git a/tests/test_score_MT/results_true.dat b/tests/test_score_MT/results_true.dat index 44656963f0..04b9c5ca50 100644 --- a/tests/test_score_MT/results_true.dat +++ b/tests/test_score_MT/results_true.dat @@ -7,10 +7,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -1.538090E-03 -1.381456E-06 1.538090E-03 1.381456E-06 3.974412E-01 @@ -19,16 +15,12 @@ tally 1: 3.796357E-01 5.252455E-06 2.290531E-11 -5.252455E-06 -2.290531E-11 3.359792E-02 2.267331E-04 2.459115E-02 1.233078E-04 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 7.004005E-05 1.748739E-09 8.104946E-02 @@ -42,18 +34,12 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 2.000000E-01 9.000000E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 2.000000E-02 2.000000E-04 0.000000E+00 @@ -64,8 +50,6 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 tally 3: 0.000000E+00 0.000000E+00 @@ -73,10 +57,6 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -1.408027E-03 -1.849607E-06 1.408027E-03 1.849607E-06 3.946436E-01 @@ -85,16 +65,12 @@ tally 3: 3.382059E-01 2.179241E-05 4.749090E-10 -2.179241E-05 -4.749090E-10 3.146594E-02 2.159308E-04 4.278352E-02 4.094478E-04 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 1.736514E-04 1.245171E-08 7.989710E-02 diff --git a/tests/test_score_MT/test_score_MT.py b/tests/test_score_MT/test_score_MT.py index dae86d418c..fb8aa7cfb4 100644 --- a/tests/test_score_MT/test_score_MT.py +++ b/tests/test_score_MT/test_score_MT.py @@ -12,7 +12,6 @@ class ScoreMTTestHarness(PyAPITestHarness): filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] [t.add_filter(filt) for t in tallies] - [t.add_score('n2n') for t in tallies] [t.add_score('16') for t in tallies] [t.add_score('51') for t in tallies] [t.add_score('102') for t in tallies] From 04783529c802e33b6f76e9cde4ab58b12d540094 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 22 Dec 2015 14:40:56 -0800 Subject: [PATCH 26/61] removed num_score_bins from mgxs.py --- openmc/mgxs/mgxs.py | 4 ++-- openmc/summary.py | 1 + openmc/tallies.py | 9 +++------ 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 7913747f98..7f521a975c 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -755,7 +755,7 @@ class MGXS(object): # Reshape condensed data arrays with one dimension for all filters new_shape = \ - (tally.num_filter_bins, tally.num_nuclides, tally.num_score_bins,) + (tally.num_filter_bins, tally.num_nuclides, tally.num_scores,) mean = np.reshape(mean, new_shape) std_dev = np.reshape(std_dev, new_shape) @@ -837,7 +837,7 @@ class MGXS(object): # Reshape averaged data arrays with one dimension for all filters new_shape = \ - (tally.num_filter_bins, tally.num_nuclides, tally.num_score_bins,) + (tally.num_filter_bins, tally.num_nuclides, tally.num_scores,) mean = np.reshape(mean, new_shape) std_dev = np.reshape(std_dev, new_shape) diff --git a/openmc/summary.py b/openmc/summary.py index c14f9073d8..b97b77b308 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -1,4 +1,5 @@ import numpy as np +import re import openmc from openmc.region import Region diff --git a/openmc/tallies.py b/openmc/tallies.py index dfc03d50a4..75e69a4c10 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -449,13 +449,9 @@ class Tally(object): 'not a string'.format(score, self.id) raise ValueError(msg) - # If the score is already in the Tally, raise an error + # If the score is already in the Tally, don't add it again if score in self.scores: - msg = 'Unable to add a duplicate score {0} to Tally ID="{1}" ' \ - 'since duplicate scores are not supported in the OpenMC ' \ - 'Python API'.format(score, self.id) - raise ValueError(msg) - + return # Normal score strings if isinstance(score, basestring): self._scores.append(score.strip()) @@ -2716,6 +2712,7 @@ class Tally(object): # Determine the shape of data in the new diagonalized Tally num_filter_bins = new_tally.num_filter_bins num_nuclides = new_tally.num_nuclides + num_scores = new_tally.num_scores new_shape = (num_filter_bins, num_nuclides, num_scores) # Determine "base" indices along the new "diagonal", and the factor From 0174bbe093a47e6756f302dc3a4f6926f7c5658d Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 22 Dec 2015 15:35:46 -0800 Subject: [PATCH 27/61] changed n_user_scores to n_score_bins in statepoint.py --- openmc/statepoint.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 4c17379630..845937f594 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -393,13 +393,13 @@ class StatePoint(object): scores = self._f['{0}{1}/score_bins'.format( base, tally_key)].value - n_user_scores = self._f['{0}{1}/n_user_score_bins' - .format(base, tally_key)].value + n_score_bins = self._f['{0}{1}/n_score_bins' + .format(base, tally_key)].value # Compute and set the filter strides for i in range(n_filters): filter = tally.filters[i] - filter.stride = n_user_scores * len(nuclide_names) + filter.stride = n_score_bins * len(nuclide_names) for j in range(i+1, n_filters): filter.stride *= tally.filters[j].num_bins From 48a47cacda418beeec9c1b42c32ea0a99a168c5b Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 22 Dec 2015 16:02:09 -0800 Subject: [PATCH 28/61] added moment orders to summary file --- .../pythonapi/examples/tally-arithmetic.ipynb | 64 ++++++++----------- openmc/summary.py | 13 +++- openmc/tallies.py | 8 ++- src/summary.F90 | 35 +++++++++- 4 files changed, 78 insertions(+), 42 deletions(-) diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 3ec974e057..18a19c991c 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -363,26 +363,7 @@ "outputs": [ { "data": { - "image/png": [ - "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\n", - "AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\n", - "QYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98LGQ4UM+6dthcAAALKSURBVGje7dpLcqQwDAbgHHE2\n", - "YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n", - "+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\n", - "nl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n", - "/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n", - "6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\n", - "vjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\n", - "dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\n", - "ACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\n", - "vY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n", - "+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\n", - "QBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n", - "9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n", - "8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTEtMjVUMTQ6MjA6\n", - "NTEtMDg6MDDVsKLDAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTExLTI1VDE0OjIwOjUxLTA4OjAw\n", - "pO0afwAAAABJRU5ErkJggg==\n" - ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98MFg87MxcAKAsAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTItMjJUMTU6NTk6\nNTEtMDg6MDCDpzvTAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEyLTIyVDE1OjU5OjUxLTA4OjAw\n8vqDbwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -591,9 +572,9 @@ "\n", " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", - " Version: 0.7.0\n", - " Git SHA1: 74ffcb447521c968fb64fdaa63e40598783f2fba\n", - " Date/Time: 2015-11-25 14:20:51\n", + " Version: 0.7.1\n", + " Git SHA1: 6ca9e70a7073921f3c86c1313a442a973abbd12a\n", + " Date/Time: 2015-12-22 15:59:51\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -650,20 +631,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 7.9600E-01 seconds\n", - " Reading cross sections = 2.1200E-01 seconds\n", - " Total time in simulation = 1.8740E+01 seconds\n", - " Time in transport only = 1.8727E+01 seconds\n", - " Time in inactive batches = 2.5970E+00 seconds\n", - " Time in active batches = 1.6143E+01 seconds\n", - " Time synchronizing fission bank = 2.0000E-03 seconds\n", + " Total time for initialization = 6.9900E-01 seconds\n", + " Reading cross sections = 1.9100E-01 seconds\n", + " Total time in simulation = 1.7186E+01 seconds\n", + " Time in transport only = 1.7171E+01 seconds\n", + " Time in inactive batches = 2.4100E+00 seconds\n", + " Time in active batches = 1.4776E+01 seconds\n", + " Time synchronizing fission bank = 1.0000E-03 seconds\n", " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.9553E+01 seconds\n", - " Calculation Rate (inactive) = 4813.25 neutrons/second\n", - " Calculation Rate (active) = 2322.99 neutrons/second\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", + " Total time for finalization = 3.0000E-03 seconds\n", + " Total time elapsed = 1.7901E+01 seconds\n", + " Calculation Rate (inactive) = 5186.72 neutrons/second\n", + " Calculation Rate (active) = 2537.90 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1579,6 +1560,15 @@ " filters=['cell'], filter_bins=[(moderator_cell.id,)])\n", "slice_test.get_pandas_dataframe()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } ], "metadata": { @@ -1597,7 +1587,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.10" + "version": "2.7.11" } }, "nbformat": 4, diff --git a/openmc/summary.py b/openmc/summary.py index b97b77b308..8e8d4bc7ee 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -521,10 +521,19 @@ class Summary(object): # Create Tally object and assign basic properties tally = openmc.Tally(tally_id, tally_name) + # Read scattering moment order strings (e.g., P3, Y-1,2, etc.) + moments = self._f['{0}/moment_orders'.format(subbase)].value + # Read score metadata scores = self._f['{0}/score_bins'.format(subbase)].value - for score in scores: - tally.add_score(score.decode()) + for j, score in enumerate(scores): + score = score.decode() + + # If this is a moment, use generic moment order + pattern = r'-n$|-pn$|-yn$' + score = re.sub(pattern, '-' + moments[j].decode(), score) + + tally.add_score(score) # Read filter metadata num_filters = self._f['{0}/n_filters'.format(subbase)].value diff --git a/openmc/tallies.py b/openmc/tallies.py index 75e69a4c10..c6331f594e 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -449,9 +449,13 @@ class Tally(object): 'not a string'.format(score, self.id) raise ValueError(msg) - # If the score is already in the Tally, don't add it again + # If the score is already in the Tally, raise an error if score in self.scores: - return + msg = 'Unable to add a duplicate score {0} to Tally ID="{1}" ' \ + 'since duplicate scores are not supported in the OpenMC ' \ + 'Python API'.format(score, self.id) + raise ValueError(msg) + # Normal score strings if isinstance(score, basestring): self._scores.append(score.strip()) diff --git a/src/summary.F90 b/src/summary.F90 index f2c261ec75..187abc26c9 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -484,8 +484,10 @@ contains subroutine write_tallies(file_id) integer(HID_T), intent(in) :: file_id - integer :: i, j + integer :: i, j, k integer :: i_list, i_xs + integer :: n_order ! loop index for moment orders + integer :: nm_order ! loop index for Ynm moment orders integer(HID_T) :: tallies_group integer(HID_T) :: mesh_group integer(HID_T) :: tally_group @@ -664,6 +666,37 @@ contains deallocate(str_array) + ! Write explicit moment order strings for each score bin + k = 1 + allocate(str_array(t%n_score_bins)) + MOMENT_LOOP: do j = 1, t%n_user_score_bins + select case(t%score_bins(k)) + case (SCORE_SCATTER_N, SCORE_NU_SCATTER_N) + str_array(k) = 'P' // trim(to_str(t%moment_order(k))) + k = k + 1 + case (SCORE_SCATTER_PN, SCORE_NU_SCATTER_PN) + do n_order = 0, t%moment_order(k) + str_array(k) = 'P' // trim(to_str(n_order)) + k = k + 1 + end do + case (SCORE_SCATTER_YN, SCORE_NU_SCATTER_YN, SCORE_FLUX_YN, & + SCORE_TOTAL_YN) + do n_order = 0, t%moment_order(k) + do nm_order = -n_order, n_order + str_array(k) = 'Y' // trim(to_str(n_order)) // ',' // & + trim(to_str(nm_order)) + k = k + 1 + end do + end do + case default + str_array(k) = '' + k = k + 1 + end select + end do MOMENT_LOOP + + call write_dataset(tally_group, "moment_orders", str_array) + deallocate(str_array) + call close_group(tally_group) end do TALLY_METADATA From c364114ddded7cecaa72560fa0aa43fa25b3cbd7 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 23 Dec 2015 07:02:53 -0800 Subject: [PATCH 29/61] reverted tally-arithmetic.ipynb to version in release-0.7.1 branch --- .../pythonapi/examples/tally-arithmetic.ipynb | 64 +++++++++++-------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 18a19c991c..3ec974e057 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -363,7 +363,26 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98MFg87MxcAKAsAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTItMjJUMTU6NTk6\nNTEtMDg6MDCDpzvTAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEyLTIyVDE1OjU5OjUxLTA4OjAw\n8vqDbwAAAABJRU5ErkJggg==\n", + "image/png": [ + "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\n", + "AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\n", + "QYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98LGQ4UM+6dthcAAALKSURBVGje7dpLcqQwDAbgHHE2\n", + "YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n", + "+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\n", + "nl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n", + "/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n", + "6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\n", + "vjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\n", + "dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\n", + "ACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\n", + "vY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n", + "+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\n", + "QBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n", + "9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n", + "8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTEtMjVUMTQ6MjA6\n", + "NTEtMDg6MDDVsKLDAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTExLTI1VDE0OjIwOjUxLTA4OjAw\n", + "pO0afwAAAABJRU5ErkJggg==\n" + ], "text/plain": [ "" ] @@ -572,9 +591,9 @@ "\n", " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", - " Version: 0.7.1\n", - " Git SHA1: 6ca9e70a7073921f3c86c1313a442a973abbd12a\n", - " Date/Time: 2015-12-22 15:59:51\n", + " Version: 0.7.0\n", + " Git SHA1: 74ffcb447521c968fb64fdaa63e40598783f2fba\n", + " Date/Time: 2015-11-25 14:20:51\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -631,20 +650,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 6.9900E-01 seconds\n", - " Reading cross sections = 1.9100E-01 seconds\n", - " Total time in simulation = 1.7186E+01 seconds\n", - " Time in transport only = 1.7171E+01 seconds\n", - " Time in inactive batches = 2.4100E+00 seconds\n", - " Time in active batches = 1.4776E+01 seconds\n", - " Time synchronizing fission bank = 1.0000E-03 seconds\n", + " Total time for initialization = 7.9600E-01 seconds\n", + " Reading cross sections = 2.1200E-01 seconds\n", + " Total time in simulation = 1.8740E+01 seconds\n", + " Time in transport only = 1.8727E+01 seconds\n", + " Time in inactive batches = 2.5970E+00 seconds\n", + " Time in active batches = 1.6143E+01 seconds\n", + " Time synchronizing fission bank = 2.0000E-03 seconds\n", " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", - " Total time for finalization = 3.0000E-03 seconds\n", - " Total time elapsed = 1.7901E+01 seconds\n", - " Calculation Rate (inactive) = 5186.72 neutrons/second\n", - " Calculation Rate (active) = 2537.90 neutrons/second\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 2.0000E-03 seconds\n", + " Total time elapsed = 1.9553E+01 seconds\n", + " Calculation Rate (inactive) = 4813.25 neutrons/second\n", + " Calculation Rate (active) = 2322.99 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1560,15 +1579,6 @@ " filters=['cell'], filter_bins=[(moderator_cell.id,)])\n", "slice_test.get_pandas_dataframe()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { @@ -1587,7 +1597,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.11" + "version": "2.7.10" } }, "nbformat": 4, From 4ac325d0695ce3614b55864e6486fa561ee99f10 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 23 Dec 2015 08:10:43 -0800 Subject: [PATCH 30/61] modified tally merge method to only add unique scores --- openmc/tallies.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index c6331f594e..a8569b7272 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -633,9 +633,10 @@ class Tally(object): merged_tally.filters[i] = merged_filter break - # Add scores from second tally to merged tally + # Add unique scores from second tally to merged tally for score in tally.scores: - merged_tally.add_score(score) + if score not in merged_tally.scores: + merged_tally.add_score(score) # Add triggers from second tally to merged tally for trigger in tally.triggers: From cdf5a56e89f93caf8aff237a43349ed3f18e173c Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Thu, 24 Dec 2015 19:34:51 -0500 Subject: [PATCH 31/61] Use same region spec. length for input and summary --- src/constants.F90 | 9 +++++---- src/input_xml.F90 | 2 +- src/summary.F90 | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/constants.F90 b/src/constants.F90 index ba77f35aba..aef2d61776 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -45,10 +45,11 @@ module constants ! Maximum number of words in a single line, length of line, and length of ! single word - integer, parameter :: MAX_WORDS = 500 - integer, parameter :: MAX_LINE_LEN = 250 - integer, parameter :: MAX_WORD_LEN = 150 - integer, parameter :: MAX_FILE_LEN = 255 + integer, parameter :: MAX_WORDS = 500 + integer, parameter :: MAX_LINE_LEN = 250 + integer, parameter :: MAX_WORD_LEN = 150 + integer, parameter :: MAX_FILE_LEN = 255 + integer, parameter :: REGION_SPEC_LEN = 1000 ! Maximum number of external source spatial resamples to encounter before an ! error is thrown. diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 5449b169dd..abd6e29092 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -994,7 +994,7 @@ contains logical :: boundary_exists character(MAX_LINE_LEN) :: filename character(MAX_WORD_LEN) :: word - character(1000) :: region_spec + character(REGION_SPEC_LEN) :: region_spec type(Cell), pointer :: c class(Surface), pointer :: s class(Lattice), pointer :: lat diff --git a/src/summary.F90 b/src/summary.F90 index f2c261ec75..cb005d3be5 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -113,7 +113,7 @@ contains integer(HID_T) :: universes_group, univ_group integer(HID_T) :: lattices_group, lattice_group real(8), allocatable :: coeffs(:) - character(MAX_LINE_LEN) :: region_spec + character(REGION_SPEC_LEN) :: region_spec type(Cell), pointer :: c class(Surface), pointer :: s type(Universe), pointer :: u From 8762642dda47965b2ea29cdda5c5c6c585937d02 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Fri, 25 Dec 2015 12:23:53 -0800 Subject: [PATCH 32/61] changed mean and std_dev direct access to property getters in tallies.py --- openmc/summary.py | 1 - openmc/tallies.py | 36 ++++++++++++++++++------------------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/openmc/summary.py b/openmc/summary.py index 45742b0c8a..ff6b59d3c7 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -532,7 +532,6 @@ class Summary(object): # If this is a moment, use generic moment order pattern = r'-n$|-pn$|-yn$' score = re.sub(pattern, '-' + moments[j].decode(), score) - tally.add_score(score) # Read filter metadata diff --git a/openmc/tallies.py b/openmc/tallies.py index a8569b7272..cdf6c1f87e 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1847,7 +1847,7 @@ class Tally(object): data = self.get_values( filters=filters, filter_bins=filter_bins, value='mean') indices = self.get_filter_indices(filters, filter_bins) - self._mean[indices, :, :] = data + self.mean[indices, :, :] = data # Adjust the std_dev data array to relect the new filter order if self.std_dev is not None: @@ -1856,7 +1856,7 @@ class Tally(object): data = self.get_values( filters=filters, filter_bins=filter_bins, value='std_dev') indices = self.get_filter_indices(filters, filter_bins) - self._std_dev[indices, :, :] = data + self.std_dev[indices, :, :] = data def _swap_nuclides(self, nuclide1, nuclide2): """Reverse the ordering of two nuclides in this tally @@ -1913,17 +1913,17 @@ class Tally(object): # Adjust the mean data array to relect the new nuclide order if self.mean is not None: - nuclide1_mean = self._mean[:, nuclide1_index, :].copy() - nuclide2_mean = self._mean[:, nuclide2_index, :].copy() - self._mean[:, nuclide2_index, :] = nuclide1_mean - self._mean[:, nuclide1_index, :] = nuclide2_mean + nuclide1_mean = self.mean[:, nuclide1_index, :].copy() + nuclide2_mean = self.mean[:, nuclide2_index, :].copy() + self.mean[:, nuclide2_index, :] = nuclide1_mean + self.mean[:, nuclide1_index, :] = nuclide2_mean # Adjust the std_dev data array to relect the new nuclide order if self.std_dev is not None: - nuclide1_std_dev = self._std_dev[:, nuclide1_index, :].copy() - nuclide2_std_dev = self._std_dev[:, nuclide2_index, :].copy() - self._std_dev[:, nuclide2_index, :] = nuclide1_std_dev - self._std_dev[:, nuclide1_index, :] = nuclide2_std_dev + nuclide1_std_dev = self.std_dev[:, nuclide1_index, :].copy() + nuclide2_std_dev = self.std_dev[:, nuclide2_index, :].copy() + self.std_dev[:, nuclide2_index, :] = nuclide1_std_dev + self.std_dev[:, nuclide1_index, :] = nuclide2_std_dev def _swap_scores(self, score1, score2): """Reverse the ordering of two scores in this tally @@ -1985,17 +1985,17 @@ class Tally(object): # Adjust the mean data array to relect the new nuclide order if self.mean is not None: - score1_mean = self._mean[:, :, score1_index].copy() - score2_mean = self._mean[:, :, score2_index].copy() - self._mean[:, :, score2_index] = score1_mean - self._mean[:, :, score1_index] = score2_mean + score1_mean = self.mean[:, :, score1_index].copy() + score2_mean = self.mean[:, :, score2_index].copy() + self.mean[:, :, score2_index] = score1_mean + self.mean[:, :, score1_index] = score2_mean # Adjust the std_dev data array to relect the new nuclide order if self.std_dev is not None: - score1_std_dev = self._std_dev[:, :, score1_index].copy() - score2_std_dev = self._std_dev[:, :, score2_index].copy() - self._std_dev[:, :, score2_index] = score1_std_dev - self._std_dev[:, :, score1_index] = score2_std_dev + score1_std_dev = self.std_dev[:, :, score1_index].copy() + score2_std_dev = self.std_dev[:, :, score2_index].copy() + self.std_dev[:, :, score2_index] = score1_std_dev + self.std_dev[:, :, score1_index] = score2_std_dev def __add__(self, other): """Adds this tally to another tally or scalar value. From 4e939d382024660c8213b8d3ae9a5576daaa5339 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 28 Dec 2015 10:59:27 -0800 Subject: [PATCH 33/61] changed RectLattice universes ordering from [x][y][z] to [z][y][x] --- openmc/universe.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/universe.py b/openmc/universe.py index 98367c381b..14a3007afb 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -1119,7 +1119,7 @@ class RectLattice(Lattice): for z in range(self._dimension[2]): for y in range(self._dimension[1]): for x in range(self._dimension[0]): - universe = self._universes[x][y][z] + universe = self._universes[z][y][x] # Append Universe ID to the Lattice XML subelement universe_ids += '{0} '.format(universe._id) @@ -1137,7 +1137,7 @@ class RectLattice(Lattice): else: for y in range(self._dimension[1]): for x in range(self._dimension[0]): - universe = self._universes[x][y] + universe = self._universes[y][x] # Append Universe ID to Lattice XML subelement universe_ids += '{0} '.format(universe._id) From 022d8d3a44c0151dfad75c2baf72aa6f199dd08f Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 28 Dec 2015 23:14:05 -0500 Subject: [PATCH 34/61] Replace filter % offset w/ cell % distribcell_ind --- openmc/filter.py | 14 ---------- openmc/statepoint.py | 4 --- src/geometry_header.F90 | 9 ++++--- src/initialize.F90 | 58 ++++++++++++++--------------------------- src/output.F90 | 23 ++++++++-------- src/state_point.F90 | 1 - src/summary.F90 | 3 ++- src/tally.F90 | 6 +++-- src/tally_header.F90 | 1 - 9 files changed, 44 insertions(+), 75 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index 04935b8edc..dce3d4924c 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -42,8 +42,6 @@ class Filter(object): The number of filter bins mesh : Mesh or None A Mesh object for 'mesh' type filters. - offset : Integral - A value used to index tally bins for 'distribcell' tallies. stride : Integral The number of filter, nuclide and score bins within each of this filter's bins. @@ -57,7 +55,6 @@ class Filter(object): self._num_bins = 0 self._bins = None self._mesh = None - self._offset = -1 self._stride = None if type is not None: @@ -93,7 +90,6 @@ class Filter(object): clone._bins = copy.deepcopy(self.bins, memo) clone._num_bins = self.num_bins clone._mesh = copy.deepcopy(self.mesh, memo) - clone._offset = self.offset clone._stride = self.stride memo[id(self)] = clone @@ -108,7 +104,6 @@ class Filter(object): string = 'Filter\n' string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self.type) string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', self.bins) - string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self.offset) return string @property @@ -134,10 +129,6 @@ class Filter(object): def mesh(self): return self._mesh - @property - def offset(self): - return self._offset - @property def stride(self): return self._stride @@ -226,11 +217,6 @@ class Filter(object): self.type = 'mesh' self.bins = self.mesh.id - @offset.setter - def offset(self, offset): - cv.check_type('filter offset', offset, Integral) - self._offset = offset - @stride.setter def stride(self, stride): cv.check_type('filter stride', stride, Integral) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 2edf9badd4..bc020cfbce 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -360,9 +360,6 @@ class StatePoint(object): # Read the Filter type filter_type = self._f['{0}{1}/type'.format(subbase, j)].value.decode() - # Read the Filter offset - offset = self._f['{0}{1}/offset'.format(subbase, j)].value - n_bins = self._f['{0}{1}/n_bins'.format(subbase, j)].value # Read the bin values @@ -370,7 +367,6 @@ class StatePoint(object): # Create Filter object filter = openmc.Filter(filter_type, bins) - filter.offset = offset filter.num_bins = n_bins if filter_type == 'mesh': diff --git a/src/geometry_header.F90 b/src/geometry_header.F90 index 6ca13740ba..684de883c2 100644 --- a/src/geometry_header.F90 +++ b/src/geometry_header.F90 @@ -131,10 +131,13 @@ module geometry_header integer, allocatable :: offset (:) ! Distribcell offset for tally ! counter integer, allocatable :: region(:) ! Definition of spatial region as - ! Boolean expression of half-spaces + ! Boolean expression of half-spaces integer, allocatable :: rpn(:) ! Reverse Polish notation for region - ! expression - logical :: simple ! Is the region simple (intersections only) + ! expression + logical :: simple ! Is the region simple (intersections + ! only) + integer :: distribcell_ind ! Index corresponding to this cell in + ! distribcell arrays ! Rotation matrix and translation vector real(8), allocatable :: translation(:) diff --git a/src/initialize.F90 b/src/initialize.F90 index 9d63eb4e93..acfe92b921 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -1050,12 +1050,12 @@ contains do i = 1, n_tallies t => tallies(i) - do j = 1, t%n_filters - filter => t%filters(j) + do j = 1, t % n_filters + filter => t % filters(j) - if (filter%type == FILTER_DISTRIBCELL) then - if (.not. cell_list%contains(filter%int_bins(1))) then - call cell_list%add(filter%int_bins(1)) + if (filter % type == FILTER_DISTRIBCELL) then + if (.not. cell_list % contains(filter % int_bins(1))) then + call cell_list % add(filter % int_bins(1)) end if end if @@ -1066,8 +1066,8 @@ contains ! to determine the number of offset tables to allocate do i = 1, n_universes univ => universes(i) - do j = 1, univ%n_cells - if (cell_list%contains(univ%cells(j))) then + do j = 1, univ % n_cells + if (cell_list % contains(univ % cells(j))) then n_maps = n_maps + 1 end if end do @@ -1089,56 +1089,38 @@ contains do i = 1, n_universes univ => universes(i) - do j = 1, univ%n_cells + do j = 1, univ % n_cells + if (.not. cell_list % contains(univ % cells(j))) cycle - if (cell_list%contains(univ%cells(j))) then + cells(univ % cells(j)) % distribcell_ind = k - ! Loop over all tallies - do l = 1, n_tallies - t => tallies(l) - - do m = 1, t%n_filters - filter => t%filters(m) - - ! Loop over only distribcell filters - ! If filter points to cell we just found, set offset index - if (filter%type == FILTER_DISTRIBCELL) then - if (filter%int_bins(1) == univ%cells(j)) then - filter%offset = k - end if - end if - - end do - end do - - univ_list(k) = univ%id - k = k + 1 - end if + univ_list(k) = univ % id + k = k + 1 end do end do ! Allocate the offset tables for lattices do i = 1, n_lattices - lat => lattices(i)%obj + lat => lattices(i) % obj select type(lat) type is (RectLattice) - allocate(lat%offset(n_maps, lat%n_cells(1), lat%n_cells(2), & - lat%n_cells(3))) + allocate(lat % offset(n_maps, lat % n_cells(1), lat % n_cells(2), & + lat % n_cells(3))) type is (HexLattice) - allocate(lat%offset(n_maps, 2 * lat%n_rings - 1, & - 2 * lat%n_rings - 1, lat%n_axial)) + allocate(lat % offset(n_maps, 2 * lat % n_rings - 1, & + 2 * lat % n_rings - 1, lat % n_axial)) end select - lat%offset(:, :, :, :) = 0 + lat % offset(:, :, :, :) = 0 end do ! Allocate offset table for fill cells do i = 1, n_cells - if (cells(i)%material == NONE) then - allocate(cells(i)%offset(n_maps)) + if (cells(i) % material == NONE) then + allocate(cells(i) % offset(n_maps)) end if end do diff --git a/src/output.F90 b/src/output.F90 index c31b20b70b..8be6c09dab 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1378,8 +1378,7 @@ contains label = '' univ => universes(BASE_UNIVERSE) offset = 0 - call find_offset(t % filters(i_filter) % offset, & - t % filters(i_filter) % int_bins(1), & + call find_offset(t % filters(i_filter) % int_bins(1), & univ, bin-1, offset, label) case (FILTER_SURFACE) i = t % filters(i_filter) % int_bins(bin) @@ -1413,15 +1412,15 @@ contains ! with the given offset !=============================================================================== - recursive subroutine find_offset(map, goal, univ, final, offset, path) + recursive subroutine find_offset(goal, univ, final, offset, path) - integer, intent(in) :: map ! Index in maps vector - integer, intent(in) :: goal ! The target cell ID + integer, intent(in) :: goal ! The target cell index type(Universe), intent(in) :: univ ! Universe to begin search integer, intent(in) :: final ! Target offset integer, intent(inout) :: offset ! Current offset character(*), intent(inout) :: path ! Path to offset + integer :: map ! Index in maps vector integer :: i, j ! Index over cells integer :: k, l, m ! Indices in lattice integer :: old_k, old_l, old_m ! Previous indices in lattice @@ -1436,6 +1435,9 @@ contains type(Universe), pointer :: next_univ ! Next universe to loop through class(Lattice), pointer :: lat ! Pointer to current lattice + ! Get the distribcell index for this cell + map = cells(goal) % distribcell_ind + n = univ % n_cells ! Write to the geometry stack @@ -1537,7 +1539,7 @@ contains offset = c % offset(map) + offset next_univ => universes(c % fill) - call find_offset(map, goal, next_univ, final, offset, path) + call find_offset(goal, next_univ, final, offset, path) return ! ==================================================================== @@ -1577,7 +1579,7 @@ contains path = trim(path) // "(" // trim(to_str(k)) // & "," // trim(to_str(l)) // "," // & trim(to_str(m)) // ")" - call find_offset(map, goal, next_univ, final, offset, path) + call find_offset(goal, next_univ, final, offset, path) return else old_m = m @@ -1593,7 +1595,7 @@ contains path = trim(path) // "(" // trim(to_str(old_k)) // & "," // trim(to_str(old_l)) // "," // & trim(to_str(old_m)) // ")" - call find_offset(map, goal, next_univ, final, offset, path) + call find_offset(goal, next_univ, final, offset, path) return end if @@ -1638,8 +1640,7 @@ contains trim(to_str(k - lat % n_rings)) // "," // & trim(to_str(l - lat % n_rings)) // "," // & trim(to_str(m)) // ")" - call find_offset(map, goal, next_univ, final, offset, & - path) + call find_offset(goal, next_univ, final, offset, path) return else old_m = m @@ -1656,7 +1657,7 @@ contains trim(to_str(old_k - lat % n_rings)) // "," // & trim(to_str(old_l - lat % n_rings)) // "," // & trim(to_str(old_m)) // ")" - call find_offset(map, goal, next_univ, final, offset, path) + call find_offset(goal, next_univ, final, offset, path) return end if diff --git a/src/state_point.F90 b/src/state_point.F90 index f9f4b5b757..046c857fd2 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -268,7 +268,6 @@ contains call write_dataset(filter_group, "type", "delayedgroup") end select - call write_dataset(filter_group, "offset", tally%filters(j)%offset) call write_dataset(filter_group, "n_bins", tally%filters(j)%n_bins) if (tally % filters(j) % type == FILTER_ENERGYIN .or. & tally % filters(j) % type == FILTER_ENERGYOUT .or. & diff --git a/src/summary.F90 b/src/summary.F90 index cb005d3be5..11c4cd434b 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -196,6 +196,8 @@ contains end do call write_dataset(cell_group, "region", adjustl(region_spec)) + call write_dataset(cell_group, "distribcell_ind", c % distribcell_ind) + call close_group(cell_group) end do CELL_LOOP @@ -540,7 +542,6 @@ contains filter_group = create_group(tally_group, "filter " // trim(to_str(j))) ! Write number of bins for this filter - call write_dataset(filter_group, "offset", t%filters(j)%offset) call write_dataset(filter_group, "n_bins", t%filters(j)%n_bins) ! Write filter bins diff --git a/src/tally.F90 b/src/tally.F90 index 09e30a2426..2ccd59a58e 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -1712,6 +1712,7 @@ contains integer :: j integer :: n ! number of bins for single filter integer :: offset ! offset for distribcell + integer :: distribcell_ind ! index in distribcell arrays real(8) :: E ! particle energy real(8) :: theta, phi ! Polar and Azimuthal Angles, respectively type(TallyObject), pointer :: t @@ -1756,12 +1757,13 @@ contains case (FILTER_DISTRIBCELL) ! determine next distribcell bin + distribcell_ind = cells(t % filters(i) % int_bins(1)) % distribcell_ind matching_bins(i) = NO_BIN_FOUND offset = 0 do j = 1, p % n_coord if (cells(p % coord(j) % cell) % type == CELL_FILL) then offset = offset + cells(p % coord(j) % cell) % & - offset(t % filters(i) % offset) + offset(distribcell_ind) elseif(cells(p % coord(j) % cell) % type == CELL_LATTICE) then if (lattices(p % coord(j + 1) % lattice) % obj & % are_valid_indices([& @@ -1769,7 +1771,7 @@ contains p % coord(j + 1) % lattice_y, & p % coord(j + 1) % lattice_z])) then offset = offset + lattices(p % coord(j + 1) % lattice) % obj % & - offset(t % filters(i) % offset, & + offset(distribcell_ind, & p % coord(j + 1) % lattice_x, & p % coord(j + 1) % lattice_y, & p % coord(j + 1) % lattice_z) diff --git a/src/tally_header.F90 b/src/tally_header.F90 index 18b9219522..dcbba3d89e 100644 --- a/src/tally_header.F90 +++ b/src/tally_header.F90 @@ -55,7 +55,6 @@ module tally_header type TallyFilter integer :: type = NONE integer :: n_bins = 0 - integer :: offset = 0 ! Only used for distribcell filters integer, allocatable :: int_bins(:) real(8), allocatable :: real_bins(:) ! Only used for energy filters end type TallyFilter From 56e8e7d6818937cdcb57fc208532025e52768a68 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Tue, 29 Dec 2015 16:25:29 -0500 Subject: [PATCH 35/61] Update PyAPI with distribcell changes --- openmc/filter.py | 2 +- openmc/geometry.py | 20 +++++++++++++------- openmc/summary.py | 5 +++++ openmc/universe.py | 37 ++++++++++++++++++++++++++----------- src/input_xml.F90 | 3 ++- src/output.F90 | 14 +++++--------- 6 files changed, 52 insertions(+), 29 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index dce3d4924c..ea92f5257c 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -609,7 +609,7 @@ class Filter(object): # If this region is in Cell corresponding to the # distribcell filter bin, store it in dictionary if cell_id == self.bins[0]: - offset = openmc_geometry.get_offset(path, self.offset) + offset = openmc_geometry.get_offset(path) offsets_to_coords[offset] = coords # Each distribcell offset is a DataFrame bin diff --git a/openmc/geometry.py b/openmc/geometry.py index e848e0cddf..16f6a45e5a 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -42,7 +42,7 @@ class Geometry(object): self._root_universe = root_universe - def get_offset(self, path, filter_offset): + def get_offset(self, path): """Returns the corresponding location in the results array for a given path and filter number. This is primarily intended to post-processing result when a distribcell filter is used. @@ -55,8 +55,6 @@ class Geometry(object): lattice passed through. For the case of the lattice, a tuple should be provided to indicate which coordinates in the lattice should be entered. This should be in the form: (lat_id, i_x, i_y, i_z) - filter_offset : int - An integer that specifies which offset map the filter is using Returns ------- @@ -65,14 +63,22 @@ class Geometry(object): """ + # Find the distribcell index of the cell. + cells = self.get_all_cells() + if path[-1] in cells: + distribcell_ind = cells[path[-1]].distribcell_ind + else: + raise RuntimeError('Could not find cell {} specified in a \ + distribcell filter'.format(path[-1])) + # Return memoize'd offset if possible - if (path, filter_offset) in self._offsets: - offset = self._offsets[(path, filter_offset)] + if (path, distribcell_ind) in self._offsets: + offset = self._offsets[(path, distribcell_ind)] # Begin recursive call to compute offset starting with the base Universe else: - offset = self._root_universe.get_offset(path, filter_offset) - self._offsets[(path, filter_offset)] = offset + offset = self._root_universe.get_offset(path, distribcell_ind) + self._offsets[(path, distribcell_ind)] = offset # Return the final offset return offset diff --git a/openmc/summary.py b/openmc/summary.py index bc6551e7cb..9e2145b343 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -271,6 +271,11 @@ class Summary(object): cell.region = Region.from_expression( region, {s.id: s for s in self.surfaces.values()}) + # Get the distribcell index + ind = self._f['geometry/cells'][key]['distribcell_ind'].value + if ind != 0: + cell.distribcell_ind = ind + # Add the Cell to the global dictionary of all Cells self.cells[index] = cell diff --git a/openmc/universe.py b/openmc/universe.py index 98367c381b..b346ffd00d 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -63,6 +63,8 @@ class Cell(object): that is used to translate (shift) the universe. offsets : ndarray Array of offsets used for distributed cell searches + distribcell_ind : int + Index of this cell in distribcell arrays """ @@ -76,6 +78,7 @@ class Cell(object): self._rotation = None self._translation = None self._offsets = None + self._distribcell_ind = None def __eq__(self, other): if not isinstance(other, Cell): @@ -122,6 +125,8 @@ class Cell(object): string += '{0: <16}{1}{2}\n'.format('\tTranslation', '=\t', self._translation) string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self._offsets) + string += '{0: <16}{1}{2}\n'.format('\tDistribcell index', '=\t', + self._distribcell_ind) return string @@ -164,6 +169,10 @@ class Cell(object): def offsets(self): return self._offsets + @property + def distribcell_ind(self): + return self._distribcell_ind + @id.setter def id(self, cell_id): if cell_id is None: @@ -231,6 +240,11 @@ class Cell(object): cv.check_type('cell region', region, Region) self._region = region + @distribcell_ind.setter + def distribcell_ind(self, ind): + cv.check_type('distribcell index', ind, Integral) + self._distribcell_ind = ind + def add_surface(self, surface, halfspace): """Add a half-space to the list of half-spaces whose intersection defines the cell. @@ -271,7 +285,7 @@ class Cell(object): else: self.region = Intersection(self.region, region) - def get_offset(self, path, filter_offset): + def get_offset(self, path, distribcell_ind): # Get the current element and remove it from the list cell_id = path[0] path = path[1:] @@ -282,12 +296,12 @@ class Cell(object): # If the Cell is filled by a Universe elif self._type == 'fill': - offset = self._offsets[filter_offset-1] - offset += self._fill.get_offset(path, filter_offset) + offset = self._offsets[distribcell_ind-1] + offset += self._fill.get_offset(path, distribcell_ind) # If the Cell is filled by a Lattice else: - offset = self._fill.get_offset(path, filter_offset) + offset = self._fill.get_offset(path, distribcell_ind) return offset @@ -591,7 +605,7 @@ class Universe(object): self._cells.clear() - def get_offset(self, path, filter_offset): + def get_offset(self, path, distribcell_ind): # Get the current element and remove it from the list path = path[1:] @@ -599,7 +613,7 @@ class Universe(object): cell_id = path[0] # Make a recursive call to the Cell within this Universe - offset = self._cells[cell_id].get_offset(path, filter_offset) + offset = self._cells[cell_id].get_offset(path, distribcell_ind) # Return the offset computed at all nested Universe levels return offset @@ -1059,21 +1073,22 @@ class RectLattice(Lattice): cv.check_greater_than('lattice pitch', dim, 0.0) self._pitch = pitch - def get_offset(self, path, filter_offset): + def get_offset(self, path, distribcell_ind): # Get the current element and remove it from the list i = path[0] path = path[1:] # For 2D Lattices if len(self._dimension) == 2: - offset = self._offsets[i[1]-1, i[2]-1, 0, filter_offset-1] - offset += self._universes[i[1]][i[2]].get_offset(path, filter_offset) + offset = self._offsets[i[1]-1, i[2]-1, 0, distribcell_ind-1] + offset += self._universes[i[1]][i[2]].get_offset(path, + distribcell_ind) # For 3D Lattices else: - offset = self._offsets[i[1]-1, i[2]-1, i[3]-1, filter_offset-1] + offset = self._offsets[i[1]-1, i[2]-1, i[3]-1, distribcell_ind-1] offset += self._universes[i[1]-1][i[2]-1][i[3]-1].get_offset(path, - filter_offset) + distribcell_ind) return offset diff --git a/src/input_xml.F90 b/src/input_xml.F90 index abd6e29092..a4317ed8e3 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1049,8 +1049,9 @@ contains do i = 1, n_cells c => cells(i) - ! Initialize the number of cell instances - this is a base case for distribcells + ! Initialize distribcell instances and distribcell index c % instances = 0 + c % distribcell_ind = NONE ! Get pointer to i-th cell node call get_list_item(node_cell_list, i, node_cell) diff --git a/src/output.F90 b/src/output.F90 index 8be6c09dab..5b938e98d3 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1449,17 +1449,13 @@ contains ! Look through all cells in this universe do i = 1, n - - cell_index = univ % cells(i) - c => cells(cell_index) - - ! If the cell ID matches the goal and the offset matches final, - ! write to the geometry stack - if (cell_dict % get_key(c % id) == goal .AND. offset == final) then - path = trim(path) // "->" // to_str(c%id) + ! If the cell matches the goal and the offset matches final, write to the + ! geometry stack + if (univ % cells(i) == goal .AND. offset == final) then + c => cells(univ % cells(i)) + path = trim(path) // "->" // to_str(c % id) return end if - end do ! Find the fill cell or lattice cell that we need to enter From c4b83ced54a66dd52d229507edf2214beddea1f3 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Wed, 30 Dec 2015 14:43:33 -0500 Subject: [PATCH 36/61] Fixed bugs in OpenCG compatiblity and Summary Python modules for new z-y-z Universe ordering --- openmc/opencg_compatible.py | 6 +++--- openmc/summary.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index afa57c78d9..62192355de 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -905,7 +905,7 @@ def get_opencg_lattice(openmc_lattice): for z in range(dimension[2]): for y in range(dimension[1]): for x in range(dimension[0]): - universe_id = universes[x][dimension[1]-y-1][z].id + universe_id = universes[z][dimension[1]-y-1][x].id universe_array[z][y][x] = unique_universes[universe_id] opencg_lattice = opencg.Lattice(lattice_id, name) @@ -963,7 +963,7 @@ def get_openmc_lattice(opencg_lattice): outer = opencg_lattice.outside # Initialize an empty array for the OpenMC nested Universes in this Lattice - universe_array = np.ndarray(tuple(np.array(dimension)), + universe_array = np.ndarray(tuple(np.array(dimension)[::-1]), dtype=openmc.Universe) # Create OpenMC Universes for each unique nested Universe in this Lattice @@ -977,7 +977,7 @@ def get_openmc_lattice(opencg_lattice): for y in range(dimension[1]): for x in range(dimension[0]): universe_id = universes[z][y][x].id - universe_array[x][y][z] = unique_universes[universe_id] + universe_array[z][y][x] = unique_universes[universe_id] # Reverse y-dimension in array to match ordering in OpenCG universe_array = universe_array[:, ::-1, :] diff --git a/openmc/summary.py b/openmc/summary.py index bc6551e7cb..3d0e37ddad 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -356,8 +356,8 @@ class Summary(object): self.get_universe_by_id(universe_ids[x, y, z]) # Transpose, reverse y-dimension for appropriate ordering - shape = universes.shape - universes = np.transpose(universes, (1, 0, 2)) + shape = universes.shape[::-1] + universes = np.transpose(universes, (2, 1, 0)) universes.shape = shape universes = universes[:, ::-1, :] lattice.universes = universes From a28c9281e796fbc719a62bc73fdaf8187c23d260 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 30 Dec 2015 13:29:14 -0800 Subject: [PATCH 37/61] added documentation for updated summary file format and incremented the REVISION_SUMMARY constant --- docs/source/usersguide/output/summary.rst | 5 +++++ src/constants.F90 | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/source/usersguide/output/summary.rst b/docs/source/usersguide/output/summary.rst index f87f60c4a0..ce1c1221a8 100644 --- a/docs/source/usersguide/output/summary.rst +++ b/docs/source/usersguide/output/summary.rst @@ -306,6 +306,11 @@ The current revision of the summary file format is 1. than the number of user-specified scores since each score might have multiple scoring bins, e.g., scatter-PN. +**/tallies/tally /moment_orders** (*char[][]*) + + Tallying moment orders for Legendre and spherical harmonic tally expansions + (*e.g.*, 'P2', 'Y1,2', etc.). + **/tallies/tally /score_bins** (*char[][]*) Scoring bins for the tally. diff --git a/src/constants.F90 b/src/constants.F90 index ba77f35aba..2db3ec3c6c 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -14,7 +14,7 @@ module constants integer, parameter :: REVISION_STATEPOINT = 14 integer, parameter :: REVISION_PARTICLE_RESTART = 1 integer, parameter :: REVISION_TRACK = 1 - integer, parameter :: REVISION_SUMMARY = 1 + integer, parameter :: REVISION_SUMMARY = 2 ! ============================================================================ ! ADJUSTABLE PARAMETERS From 33375dfa30f80de5fe69dcfb47425d21642e479a Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 30 Dec 2015 15:57:44 -0500 Subject: [PATCH 38/61] Small fixes for #538 --- openmc/filter.py | 2 +- openmc/geometry.py | 5 +++-- openmc/universe.py | 22 +++++++++++----------- src/initialize.F90 | 14 +++++++------- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index ea92f5257c..d61fb648f6 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -609,7 +609,7 @@ class Filter(object): # If this region is in Cell corresponding to the # distribcell filter bin, store it in dictionary if cell_id == self.bins[0]: - offset = openmc_geometry.get_offset(path) + offset = openmc_geometry.get_cell_instance(path) offsets_to_coords[offset] = coords # Each distribcell offset is a DataFrame bin diff --git a/openmc/geometry.py b/openmc/geometry.py index 16f6a45e5a..baadfce3c2 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -42,7 +42,7 @@ class Geometry(object): self._root_universe = root_universe - def get_offset(self, path): + def get_cell_instance(self, path): """Returns the corresponding location in the results array for a given path and filter number. This is primarily intended to post-processing result when a distribcell filter is used. @@ -77,7 +77,8 @@ class Geometry(object): # Begin recursive call to compute offset starting with the base Universe else: - offset = self._root_universe.get_offset(path, distribcell_ind) + offset = self._root_universe.get_cell_instance(path, + distribcell_ind) self._offsets[(path, distribcell_ind)] = offset # Return the final offset diff --git a/openmc/universe.py b/openmc/universe.py index b346ffd00d..e7b2151a32 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -285,7 +285,7 @@ class Cell(object): else: self.region = Intersection(self.region, region) - def get_offset(self, path, distribcell_ind): + def get_cell_instance(self, path, distribcell_ind): # Get the current element and remove it from the list cell_id = path[0] path = path[1:] @@ -296,12 +296,12 @@ class Cell(object): # If the Cell is filled by a Universe elif self._type == 'fill': - offset = self._offsets[distribcell_ind-1] - offset += self._fill.get_offset(path, distribcell_ind) + offset = self.offsets[distribcell_ind-1] + offset += self.fill.get_cell_instance(path, distribcell_ind) # If the Cell is filled by a Lattice else: - offset = self._fill.get_offset(path, distribcell_ind) + offset = self.fill.get_cell_instance(path, distribcell_ind) return offset @@ -605,7 +605,7 @@ class Universe(object): self._cells.clear() - def get_offset(self, path, distribcell_ind): + def get_cell_instance(self, path, distribcell_ind): # Get the current element and remove it from the list path = path[1:] @@ -613,7 +613,7 @@ class Universe(object): cell_id = path[0] # Make a recursive call to the Cell within this Universe - offset = self._cells[cell_id].get_offset(path, distribcell_ind) + offset = self.cells[cell_id].get_cell_instance(path, distribcell_ind) # Return the offset computed at all nested Universe levels return offset @@ -1073,7 +1073,7 @@ class RectLattice(Lattice): cv.check_greater_than('lattice pitch', dim, 0.0) self._pitch = pitch - def get_offset(self, path, distribcell_ind): + def get_cell_instance(self, path, distribcell_ind): # Get the current element and remove it from the list i = path[0] path = path[1:] @@ -1081,14 +1081,14 @@ class RectLattice(Lattice): # For 2D Lattices if len(self._dimension) == 2: offset = self._offsets[i[1]-1, i[2]-1, 0, distribcell_ind-1] - offset += self._universes[i[1]][i[2]].get_offset(path, - distribcell_ind) + offset += self._universes[i[1]][i[2]].get_cell_instance(path, + distribcell_ind) # For 3D Lattices else: offset = self._offsets[i[1]-1, i[2]-1, i[3]-1, distribcell_ind-1] - offset += self._universes[i[1]-1][i[2]-1][i[3]-1].get_offset(path, - distribcell_ind) + offset += self._universes[i[1]-1][i[2]-1][i[3]-1].get_cell_instance( + path, distribcell_ind) return offset diff --git a/src/initialize.F90 b/src/initialize.F90 index acfe92b921..1134040e9a 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -1086,16 +1086,16 @@ contains found(:,:) = .false. k = 1 + ! Search through universes for distributed cells and assign each one a + ! unique distribcell array index. do i = 1, n_universes univ => universes(i) - do j = 1, univ % n_cells - if (.not. cell_list % contains(univ % cells(j))) cycle - - cells(univ % cells(j)) % distribcell_ind = k - - univ_list(k) = univ % id - k = k + 1 + if (cell_list % contains(univ % cells(j))) then + cells(univ % cells(j)) % distribcell_ind = k + univ_list(k) = univ % id + k = k + 1 + end if end do end do From 562739c24554576997dad5d4172dd14764460213 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Wed, 30 Dec 2015 17:09:46 -0500 Subject: [PATCH 39/61] HDF5 summary file now report the lattice universes in original input ordering --- openmc/opencg_compatible.py | 7 +++++-- openmc/summary.py | 22 +++++++--------------- src/summary.F90 | 5 +++-- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 62192355de..ad2cd06f83 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -725,11 +725,11 @@ def get_openmc_cell(opencg_cell): else: openmc_cell.fill = get_openmc_material(fill) - if opencg_cell.rotation: + if opencg_cell.rotation is not None: rotation = np.asarray(opencg_cell.rotation, dtype=np.float64) openmc_cell.rotation = rotation - if opencg_cell.translation: + if opencg_cell.translation is not None: translation = np.asarray(opencg_cell.translation, dtype=np.float64) openmc_cell.translation = translation @@ -908,6 +908,9 @@ def get_opencg_lattice(openmc_lattice): universe_id = universes[z][dimension[1]-y-1][x].id universe_array[z][y][x] = unique_universes[universe_id] + # Reverse y-dimension in array to match ordering in OpenCG + universe_array = universe_array[:, ::-1, :] + opencg_lattice = opencg.Lattice(lattice_id, name) opencg_lattice.dimension = dimension opencg_lattice.width = pitch diff --git a/openmc/summary.py b/openmc/summary.py index 3d0e37ddad..1c4d39b39b 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -329,11 +329,8 @@ class Summary(object): self._f['geometry/lattices'][key]['lower_left'][...] pitch = self._f['geometry/lattices'][key]['pitch'][...] outer = self._f['geometry/lattices'][key]['outer'].value - universe_ids = \ - self._f['geometry/lattices'][key]['universes'][...] - universe_ids = np.swapaxes(universe_ids, 0, 1) - universe_ids = np.swapaxes(universe_ids, 1, 2) + self._f['geometry/lattices'][key]['universes'][...] # Create the Lattice lattice = openmc.RectLattice(lattice_id=lattice_id, name=name) @@ -349,22 +346,17 @@ class Summary(object): universes = \ np.ndarray(tuple(universe_ids.shape), dtype=openmc.Universe) - for x in range(universe_ids.shape[0]): + for z in range(universe_ids.shape[0]): for y in range(universe_ids.shape[1]): - for z in range(universe_ids.shape[2]): - universes[x, y, z] = \ - self.get_universe_by_id(universe_ids[x, y, z]) + for x in range(universe_ids.shape[2]): + universes[z, y, x] = \ + self.get_universe_by_id(universe_ids[z, y, x]) - # Transpose, reverse y-dimension for appropriate ordering - shape = universes.shape[::-1] - universes = np.transpose(universes, (2, 1, 0)) - universes.shape = shape - universes = universes[:, ::-1, :] + # Set the universes for the lattice lattice.universes = universes if offsets is not None: - offsets = np.swapaxes(offsets, 0, 1) - offsets = np.swapaxes(offsets, 1, 2) + offsets = np.swapaxes(offsets, 0, 2) lattice.offsets = offsets # Add the Lattice to the global dictionary of all Lattices diff --git a/src/summary.F90 b/src/summary.F90 index cb005d3be5..f525797e24 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -362,9 +362,10 @@ contains allocate(lattice_universes(lat%n_cells(1), lat%n_cells(2), & &lat%n_cells(3))) do j = 1, lat%n_cells(1) - do k = 1, lat%n_cells(2) + do k = 0, lat%n_cells(2) - 1 do m = 1, lat%n_cells(3) - lattice_universes(j,k,m) = universes(lat%universes(j,k,m))%id + lattice_universes(j, k+1, m) = & + universes(lat%universes(j, lat%n_cells(2) - k, m))%id end do end do end do From 665f824d630a0160341b3fb79c8caf889ba723ab Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Fri, 1 Jan 2016 16:08:07 -0500 Subject: [PATCH 40/61] Removed unnecessary double flip of y lattice ordering in OpenCG compatibility module --- openmc/opencg_compatible.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index ad2cd06f83..9b86042ddc 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -905,12 +905,9 @@ def get_opencg_lattice(openmc_lattice): for z in range(dimension[2]): for y in range(dimension[1]): for x in range(dimension[0]): - universe_id = universes[z][dimension[1]-y-1][x].id + universe_id = universes[z][y][x].id universe_array[z][y][x] = unique_universes[universe_id] - # Reverse y-dimension in array to match ordering in OpenCG - universe_array = universe_array[:, ::-1, :] - opencg_lattice = opencg.Lattice(lattice_id, name) opencg_lattice.dimension = dimension opencg_lattice.width = pitch From 8daac97bc3d51d074b29b925b749390c2f1e497c Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Fri, 1 Jan 2016 16:43:12 -0500 Subject: [PATCH 41/61] OpenCG compatiblity module now properly deals with 3D lattices --- openmc/opencg_compatible.py | 17 ++++++++++++++--- openmc/summary.py | 7 +++++++ src/summary.F90 | 9 +++++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 9b86042ddc..d778f44d85 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -881,16 +881,27 @@ def get_opencg_lattice(openmc_lattice): universes = openmc_lattice.universes outer = openmc_lattice.outer + # Convert 2D dimension to 3D for OpenCG + if len(dimension) == 2: + new_dimension = np.ones(3, dtype=np.int) + new_dimension[:2] = dimension + dimension = new_dimension + + # Convert 2D pitch to 3D for OpenCG if len(pitch) == 2: - new_pitch = np.ones(3, dtype=np.float64) * np.inf + new_pitch = np.ones(3, dtype=np.float64) * np.finfo(np.float64).max new_pitch[:2] = pitch pitch = new_pitch + # Convert 2D lower left to 3D for OpenCG if len(lower_left) == 2: - new_lower_left = np.ones(3, dtype=np.float64) + new_lower_left = np.ones(3, dtype=np.float64) * np.finfo(np.float64).min new_lower_left[:2] = lower_left lower_left = new_lower_left + # Convert 2D universes array to 3D for OpenCG + universes = np.atleast_3d(universes) + # Initialize an empty array for the OpenCG nested Universes in this Lattice universe_array = np.ndarray(tuple(np.array(dimension)[::-1]), dtype=opencg.Universe) @@ -905,7 +916,7 @@ def get_opencg_lattice(openmc_lattice): for z in range(dimension[2]): for y in range(dimension[1]): for x in range(dimension[0]): - universe_id = universes[z][y][x].id + universe_id = universes[x][y][z].id universe_array[z][y][x] = unique_universes[universe_id] opencg_lattice = opencg.Lattice(lattice_id, name) diff --git a/openmc/summary.py b/openmc/summary.py index 1c4d39b39b..5405ac0e1e 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -352,6 +352,13 @@ class Summary(object): universes[z, y, x] = \ self.get_universe_by_id(universe_ids[z, y, x]) + # Use 2D NumPy array to store lattice universes for 2D lattices + if len(dimension) == 2: + print('squeezing!') + universes = np.squeeze(universes) + universes = np.atleast_2d(universes) + print(universes.shape) + # Set the universes for the lattice lattice.universes = universes diff --git a/src/summary.F90 b/src/summary.F90 index f525797e24..0f64f80ec2 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -355,8 +355,13 @@ contains call write_dataset(lattice_group, "type", "rectangular") ! Write lattice dimensions, lower left corner, and pitch - call write_dataset(lattice_group, "dimension", lat%n_cells) - call write_dataset(lattice_group, "lower_left", lat%lower_left) + if (lat % is_3d) then + call write_dataset(lattice_group, "dimension", lat % n_cells) + call write_dataset(lattice_group, "lower_left", lat % lower_left) + else + call write_dataset(lattice_group, "dimension", lat % n_cells(1:2)) + call write_dataset(lattice_group, "lower_left", lat % lower_left) + end if ! Write lattice universes. allocate(lattice_universes(lat%n_cells(1), lat%n_cells(2), & From 6efaf427619e5ecad51cff885aca50a45b0a3d8e Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sat, 2 Jan 2016 08:49:57 -0500 Subject: [PATCH 42/61] Fixed OpenCG compatibility from 2D to 3D lattice reshaping --- openmc/opencg_compatible.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index d778f44d85..61485b5099 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -900,7 +900,8 @@ def get_opencg_lattice(openmc_lattice): lower_left = new_lower_left # Convert 2D universes array to 3D for OpenCG - universes = np.atleast_3d(universes) + if len(universes.shape) == 2: + universes.shape = (1,) + universes.shape # Initialize an empty array for the OpenCG nested Universes in this Lattice universe_array = np.ndarray(tuple(np.array(dimension)[::-1]), @@ -916,7 +917,7 @@ def get_opencg_lattice(openmc_lattice): for z in range(dimension[2]): for y in range(dimension[1]): for x in range(dimension[0]): - universe_id = universes[x][y][z].id + universe_id = universes[z][y][x].id universe_array[z][y][x] = unique_universes[universe_id] opencg_lattice = opencg.Lattice(lattice_id, name) From 0dddf0db56477346bde7210a2749084474c0812a Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sat, 2 Jan 2016 13:29:26 -0500 Subject: [PATCH 43/61] Now enforce lattice universes storage as a NumPy array --- openmc/universe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/universe.py b/openmc/universe.py index 14a3007afb..60cbf4fa79 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -807,7 +807,7 @@ class Lattice(object): def universes(self, universes): cv.check_iterable_type('lattice universes', universes, Universe, min_depth=2, max_depth=3) - self._universes = universes + self._universes = np.asarray(universes) def get_unique_universes(self): """Determine all unique universes in the lattice From c48af6f71aad7829a426f8e06eb2757ad626ff88 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sat, 2 Jan 2016 17:36:07 -0500 Subject: [PATCH 44/61] Removed debug print statements from summary.py --- openmc/summary.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/openmc/summary.py b/openmc/summary.py index 5405ac0e1e..71074c8867 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -354,10 +354,8 @@ class Summary(object): # Use 2D NumPy array to store lattice universes for 2D lattices if len(dimension) == 2: - print('squeezing!') universes = np.squeeze(universes) universes = np.atleast_2d(universes) - print(universes.shape) # Set the universes for the lattice lattice.universes = universes From 7fea70650f576674f7663fbbbdee2f543956293b Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Sun, 3 Jan 2016 13:44:42 -0500 Subject: [PATCH 45/61] Improve geometry.get_cell_instance docstring --- openmc/geometry.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/openmc/geometry.py b/openmc/geometry.py index baadfce3c2..eb2b9db558 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -43,9 +43,9 @@ class Geometry(object): self._root_universe = root_universe def get_cell_instance(self, path): - """Returns the corresponding location in the results array for a given path and - filter number. This is primarily intended to post-processing result when - a distribcell filter is used. + """Return the instance number for the final cell in a geometry path. + + The instance is an index into tally distribcell filter arrays. Parameters ---------- @@ -58,8 +58,8 @@ class Geometry(object): Returns ------- - offset : int - Location in the results array for the path and filter + instance : int + Index in tally results array for distribcell filters """ From 493c6fd9ccb9d1e23516ba83b24249fb1d4ccba7 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 4 Jan 2016 06:54:35 -0600 Subject: [PATCH 46/61] Fix type of return argument for h5pget_driver_f. --- src/hdf5_interface.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index fc7a462e6a..01e50d983a 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -1898,7 +1898,7 @@ contains logical :: mpio integer :: hdf5_err - integer :: driver + integer(HID_T) :: driver integer(HID_T) :: file_id integer(HID_T) :: fapl_id From 9f34183d49d8fd8a1e2f30caf49029f0ba115cba Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 4 Jan 2016 10:40:14 -0600 Subject: [PATCH 47/61] Revert to having Reaction%multiplicity_E as a pointer. Apparently having multiplicity_E as an allocatable scalar causes gfortran 5.2 to segfault when compiling ace.F90. Not sure why exactly... --- src/ace_header.F90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ace_header.F90 b/src/ace_header.F90 index 985371ff18..d7c298979c 100644 --- a/src/ace_header.F90 +++ b/src/ace_header.F90 @@ -48,7 +48,7 @@ module ace_header integer :: MT ! ENDF MT value real(8) :: Q_value ! Reaction Q value integer :: multiplicity ! Number of secondary particles released - type(Tab1), allocatable :: multiplicity_E ! Energy-dependent neutron yield + type(Tab1), pointer :: multiplicity_E => null() ! Energy-dependent neutron yield integer :: threshold ! Energy grid index of threshold logical :: scatter_in_cm ! scattering system in center-of-mass? logical :: multiplicity_with_E = .false. ! Flag to indicate E-dependent multiplicity @@ -308,6 +308,8 @@ module ace_header class(Reaction), intent(inout) :: this ! The Reaction object to clear + if (associated(this % multiplicity_E)) deallocate(this % multiplicity_E) + if (associated(this % edist)) then call this % edist % clear() deallocate(this % edist) From 796ac84fe7643f5f229e539456ea81e488f8f85a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Dec 2015 20:31:37 -0600 Subject: [PATCH 48/61] Documentation changes to build on Read The Docs --- .gitignore | 1 + docs/Makefile | 9 +++- docs/requirements-rtd.txt | 2 + docs/source/_images/cmfd_flow.png | Bin 0 -> 25211 bytes .../cmfd_flow.tikz => _images/cmfd_flow.tex} | 12 ++++- docs/source/_images/meshfig.png | Bin 0 -> 46942 bytes .../meshfig.tikz => _images/meshfig.tex} | 41 +++++++++++------- docs/source/conf.py | 40 ++++++++++++----- docs/source/devguide/docbuild.rst | 11 +---- docs/source/methods/cmfd.rst | 18 +++++--- docs/sphinxext/notebook_sphinxext.py | 5 +-- 11 files changed, 90 insertions(+), 49 deletions(-) create mode 100644 docs/requirements-rtd.txt create mode 100644 docs/source/_images/cmfd_flow.png rename docs/source/{methods/cmfd_tikz/cmfd_flow.tikz => _images/cmfd_flow.tex} (76%) create mode 100644 docs/source/_images/meshfig.png rename docs/source/{methods/cmfd_tikz/meshfig.tikz => _images/meshfig.tex} (99%) diff --git a/.gitignore b/.gitignore index 136491a4b8..3260cb4946 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ examples/python/**/*.xml # Documentation builds docs/build docs/source/_images/*.pdf +docs/source/_images/*.aux # Source build build diff --git a/docs/Makefile b/docs/Makefile index 89c71dc074..e84aadd33c 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -17,6 +17,8 @@ ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) sou SVG2PDF = inkscape PDFS = $(patsubst %.svg,%.pdf,$(wildcard $(IMAGEDIR)/*.svg)) +# Tikz to PNG conversion +PNGS = $(patsubst %.tex,%.png,$(wildcard $(IMAGEDIR)/*.tex)) .PHONY: help images clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest @@ -43,8 +45,13 @@ help: %.pdf: %.svg $(SVG2PDF) -f $< -A $@ +%.png: %.tex + pdflatex --interaction=nonstopmode --output-directory=$(IMAGEDIR) $< + pdftoppm -r 120 -singlefile $(patsubst %.tex,%.pdf, $<) $(basename $<) + convert -trim -fuzz 2% -transparent white $(patsubst %.tex,%.ppm,$<) $@ + # Rule to build PDFs -images: $(PDFS) +images: $(PDFS) $(PNGS) clean: -rm -rf $(BUILDDIR)/* diff --git a/docs/requirements-rtd.txt b/docs/requirements-rtd.txt new file mode 100644 index 0000000000..652f880ff8 --- /dev/null +++ b/docs/requirements-rtd.txt @@ -0,0 +1,2 @@ +sphinx-numfig +jupyter diff --git a/docs/source/_images/cmfd_flow.png b/docs/source/_images/cmfd_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..078f1a4bf844daa633bbf7ab044eb94c8615d84b GIT binary patch literal 25211 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 Date: Mon, 4 Jan 2016 12:47:43 -0800 Subject: [PATCH 49/61] fixed typos in comments and descrptions in Python API --- openmc/statepoint.py | 2 +- openmc/summary.py | 2 +- openmc/tallies.py | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 845937f594..b3cb4b6bdf 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -404,7 +404,7 @@ class StatePoint(object): for j in range(i+1, n_filters): filter.stride *= tally.filters[j].num_bins - # Read scattering moment order strings (e.g., P3, Y-1,2, etc.) + # Read scattering moment order strings (e.g., P3, Y1,2, etc.) moments = self._f['{0}{1}/moment_orders'.format( base, tally_key)].value diff --git a/openmc/summary.py b/openmc/summary.py index 00cf2d47ea..a347b5baa5 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -518,7 +518,7 @@ class Summary(object): # Create Tally object and assign basic properties tally = openmc.Tally(tally_id, tally_name) - # Read scattering moment order strings (e.g., P3, Y-1,2, etc.) + # Read scattering moment order strings (e.g., P3, Y1,2, etc.) moments = self._f['{0}/moment_orders'.format(subbase)].value # Read score metadata diff --git a/openmc/tallies.py b/openmc/tallies.py index cdf6c1f87e..190f147279 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -66,7 +66,9 @@ class Tally(object): triggers : list of openmc.trigger.Trigger List of tally triggers num_scores : Integral - Total number of user-specified scores + Total number of scores, accounting for the fact that a single + user-specified score, e.g. scatter-P3 or flux-Y2,2, might have multiple + bins num_filter_bins : Integral Total number of filter bins accounting for all filters num_bins : Integral From bae0ad713683bff2e6bc2bc234c0ec91f66709eb Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 4 Jan 2016 18:25:59 -0500 Subject: [PATCH 50/61] Small fixes for #538 --- docs/source/usersguide/output/statepoint.rst | 4 --- docs/source/usersguide/output/summary.rst | 4 +++ openmc/geometry.py | 10 +++--- openmc/summary.py | 4 +-- openmc/universe.py | 38 ++++++++++---------- src/geometry_header.F90 | 2 +- src/initialize.F90 | 2 +- src/input_xml.F90 | 2 +- src/output.F90 | 2 +- src/summary.F90 | 2 +- src/tally.F90 | 9 ++--- 11 files changed, 40 insertions(+), 39 deletions(-) diff --git a/docs/source/usersguide/output/statepoint.rst b/docs/source/usersguide/output/statepoint.rst index d3c1729af6..15bc79f739 100644 --- a/docs/source/usersguide/output/statepoint.rst +++ b/docs/source/usersguide/output/statepoint.rst @@ -185,10 +185,6 @@ if run_mode == 'k-eigenvalue': Type of the j-th filter. Can be 'universe', 'material', 'cell', 'cellborn', 'surface', 'mesh', 'energy', 'energyout', or 'distribcell'. -**/tallies/tally /filter /offset** (*int*) - - Filter offset (used for distribcell filter). - **/tallies/tally /filter /n_bins** (*int*) Number of bins for the j-th filter. diff --git a/docs/source/usersguide/output/summary.rst b/docs/source/usersguide/output/summary.rst index f87f60c4a0..302f340799 100644 --- a/docs/source/usersguide/output/summary.rst +++ b/docs/source/usersguide/output/summary.rst @@ -121,6 +121,10 @@ The current revision of the summary file format is 1. Region specification for the cell. +**/geometry/cells/cell /distribcell_index** (*int*) + + Index of this cell in distribcell filter arrays. + **/geometry/surfaces/surface /index** (*int*) Index in surfaces array used internally in OpenMC. diff --git a/openmc/geometry.py b/openmc/geometry.py index eb2b9db558..fc8e19f071 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -66,20 +66,20 @@ class Geometry(object): # Find the distribcell index of the cell. cells = self.get_all_cells() if path[-1] in cells: - distribcell_ind = cells[path[-1]].distribcell_ind + distribcell_index = cells[path[-1]].distribcell_index else: raise RuntimeError('Could not find cell {} specified in a \ distribcell filter'.format(path[-1])) # Return memoize'd offset if possible - if (path, distribcell_ind) in self._offsets: - offset = self._offsets[(path, distribcell_ind)] + if (path, distribcell_index) in self._offsets: + offset = self._offsets[(path, distribcell_index)] # Begin recursive call to compute offset starting with the base Universe else: offset = self._root_universe.get_cell_instance(path, - distribcell_ind) - self._offsets[(path, distribcell_ind)] = offset + distribcell_index) + self._offsets[(path, distribcell_index)] = offset # Return the final offset return offset diff --git a/openmc/summary.py b/openmc/summary.py index 9e2145b343..1c4c69aab7 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -272,9 +272,9 @@ class Summary(object): region, {s.id: s for s in self.surfaces.values()}) # Get the distribcell index - ind = self._f['geometry/cells'][key]['distribcell_ind'].value + ind = self._f['geometry/cells'][key]['distribcell_index'].value if ind != 0: - cell.distribcell_ind = ind + cell.distribcell_index = ind # Add the Cell to the global dictionary of all Cells self.cells[index] = cell diff --git a/openmc/universe.py b/openmc/universe.py index e7b2151a32..8c50ddbc75 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -63,7 +63,7 @@ class Cell(object): that is used to translate (shift) the universe. offsets : ndarray Array of offsets used for distributed cell searches - distribcell_ind : int + distribcell_index : int Index of this cell in distribcell arrays """ @@ -78,7 +78,7 @@ class Cell(object): self._rotation = None self._translation = None self._offsets = None - self._distribcell_ind = None + self._distribcell_index = None def __eq__(self, other): if not isinstance(other, Cell): @@ -126,7 +126,7 @@ class Cell(object): self._translation) string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self._offsets) string += '{0: <16}{1}{2}\n'.format('\tDistribcell index', '=\t', - self._distribcell_ind) + self._distribcell_index) return string @@ -170,8 +170,8 @@ class Cell(object): return self._offsets @property - def distribcell_ind(self): - return self._distribcell_ind + def distribcell_index(self): + return self._distribcell_index @id.setter def id(self, cell_id): @@ -240,10 +240,10 @@ class Cell(object): cv.check_type('cell region', region, Region) self._region = region - @distribcell_ind.setter - def distribcell_ind(self, ind): + @distribcell_index.setter + def distribcell_index(self, ind): cv.check_type('distribcell index', ind, Integral) - self._distribcell_ind = ind + self._distribcell_index = ind def add_surface(self, surface, halfspace): """Add a half-space to the list of half-spaces whose intersection defines the @@ -285,7 +285,7 @@ class Cell(object): else: self.region = Intersection(self.region, region) - def get_cell_instance(self, path, distribcell_ind): + def get_cell_instance(self, path, distribcell_index): # Get the current element and remove it from the list cell_id = path[0] path = path[1:] @@ -296,12 +296,12 @@ class Cell(object): # If the Cell is filled by a Universe elif self._type == 'fill': - offset = self.offsets[distribcell_ind-1] - offset += self.fill.get_cell_instance(path, distribcell_ind) + offset = self.offsets[distribcell_index-1] + offset += self.fill.get_cell_instance(path, distribcell_index) # If the Cell is filled by a Lattice else: - offset = self.fill.get_cell_instance(path, distribcell_ind) + offset = self.fill.get_cell_instance(path, distribcell_index) return offset @@ -605,7 +605,7 @@ class Universe(object): self._cells.clear() - def get_cell_instance(self, path, distribcell_ind): + def get_cell_instance(self, path, distribcell_index): # Get the current element and remove it from the list path = path[1:] @@ -613,7 +613,7 @@ class Universe(object): cell_id = path[0] # Make a recursive call to the Cell within this Universe - offset = self.cells[cell_id].get_cell_instance(path, distribcell_ind) + offset = self.cells[cell_id].get_cell_instance(path, distribcell_index) # Return the offset computed at all nested Universe levels return offset @@ -1073,22 +1073,22 @@ class RectLattice(Lattice): cv.check_greater_than('lattice pitch', dim, 0.0) self._pitch = pitch - def get_cell_instance(self, path, distribcell_ind): + def get_cell_instance(self, path, distribcell_index): # Get the current element and remove it from the list i = path[0] path = path[1:] # For 2D Lattices if len(self._dimension) == 2: - offset = self._offsets[i[1]-1, i[2]-1, 0, distribcell_ind-1] + offset = self._offsets[i[1]-1, i[2]-1, 0, distribcell_index-1] offset += self._universes[i[1]][i[2]].get_cell_instance(path, - distribcell_ind) + distribcell_index) # For 3D Lattices else: - offset = self._offsets[i[1]-1, i[2]-1, i[3]-1, distribcell_ind-1] + offset = self._offsets[i[1]-1, i[2]-1, i[3]-1, distribcell_index-1] offset += self._universes[i[1]-1][i[2]-1][i[3]-1].get_cell_instance( - path, distribcell_ind) + path, distribcell_index) return offset diff --git a/src/geometry_header.F90 b/src/geometry_header.F90 index 684de883c2..3dad3ba395 100644 --- a/src/geometry_header.F90 +++ b/src/geometry_header.F90 @@ -136,7 +136,7 @@ module geometry_header ! expression logical :: simple ! Is the region simple (intersections ! only) - integer :: distribcell_ind ! Index corresponding to this cell in + integer :: distribcell_index ! Index corresponding to this cell in ! distribcell arrays ! Rotation matrix and translation vector diff --git a/src/initialize.F90 b/src/initialize.F90 index 1134040e9a..30654be9d2 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -1092,7 +1092,7 @@ contains univ => universes(i) do j = 1, univ % n_cells if (cell_list % contains(univ % cells(j))) then - cells(univ % cells(j)) % distribcell_ind = k + cells(univ % cells(j)) % distribcell_index = k univ_list(k) = univ % id k = k + 1 end if diff --git a/src/input_xml.F90 b/src/input_xml.F90 index a4317ed8e3..07d739b889 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1051,7 +1051,7 @@ contains ! Initialize distribcell instances and distribcell index c % instances = 0 - c % distribcell_ind = NONE + c % distribcell_index = NONE ! Get pointer to i-th cell node call get_list_item(node_cell_list, i, node_cell) diff --git a/src/output.F90 b/src/output.F90 index 5b938e98d3..66e6831371 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1436,7 +1436,7 @@ contains class(Lattice), pointer :: lat ! Pointer to current lattice ! Get the distribcell index for this cell - map = cells(goal) % distribcell_ind + map = cells(goal) % distribcell_index n = univ % n_cells diff --git a/src/summary.F90 b/src/summary.F90 index 11c4cd434b..7a430cf741 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -196,7 +196,7 @@ contains end do call write_dataset(cell_group, "region", adjustl(region_spec)) - call write_dataset(cell_group, "distribcell_ind", c % distribcell_ind) + call write_dataset(cell_group, "distribcell_index", c % distribcell_index) call close_group(cell_group) end do CELL_LOOP diff --git a/src/tally.F90 b/src/tally.F90 index 2ccd59a58e..7210efc5c8 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -1712,7 +1712,7 @@ contains integer :: j integer :: n ! number of bins for single filter integer :: offset ! offset for distribcell - integer :: distribcell_ind ! index in distribcell arrays + integer :: distribcell_index ! index in distribcell arrays real(8) :: E ! particle energy real(8) :: theta, phi ! Polar and Azimuthal Angles, respectively type(TallyObject), pointer :: t @@ -1757,13 +1757,14 @@ contains case (FILTER_DISTRIBCELL) ! determine next distribcell bin - distribcell_ind = cells(t % filters(i) % int_bins(1)) % distribcell_ind + distribcell_index = cells(t % filters(i) % int_bins(1)) & + % distribcell_index matching_bins(i) = NO_BIN_FOUND offset = 0 do j = 1, p % n_coord if (cells(p % coord(j) % cell) % type == CELL_FILL) then offset = offset + cells(p % coord(j) % cell) % & - offset(distribcell_ind) + offset(distribcell_index) elseif(cells(p % coord(j) % cell) % type == CELL_LATTICE) then if (lattices(p % coord(j + 1) % lattice) % obj & % are_valid_indices([& @@ -1771,7 +1772,7 @@ contains p % coord(j + 1) % lattice_y, & p % coord(j + 1) % lattice_z])) then offset = offset + lattices(p % coord(j + 1) % lattice) % obj % & - offset(distribcell_ind, & + offset(distribcell_index, & p % coord(j + 1) % lattice_x, & p % coord(j + 1) % lattice_y, & p % coord(j + 1) % lattice_z) From 38676476c39d806b513f167df554337792b69049 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Mon, 4 Jan 2016 19:40:49 -0500 Subject: [PATCH 51/61] Removed manual tuple construction for tally shape in place of new shape property --- openmc/mgxs/mgxs.py | 12 ++++-------- openmc/tallies.py | 6 ------ 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index e9ce00254d..968504a06d 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -789,10 +789,8 @@ class MGXS(object): std_dev = np.sqrt(std_dev) # Reshape condensed data arrays with one dimension for all filters - new_shape = \ - (tally.num_filter_bins, tally.num_nuclides, tally.num_scores,) - mean = np.reshape(mean, new_shape) - std_dev = np.reshape(std_dev, new_shape) + mean = np.reshape(mean, tally.shape) + std_dev = np.reshape(std_dev, tally.shape) # Override tally's data with the new condensed data tally._mean = mean @@ -873,10 +871,8 @@ class MGXS(object): domain_filter.num_bins = 1 # Reshape averaged data arrays with one dimension for all filters - new_shape = \ - (tally.num_filter_bins, tally.num_nuclides, tally.num_scores,) - mean = np.reshape(mean, new_shape) - std_dev = np.reshape(std_dev, new_shape) + mean = np.reshape(mean, tally.shape) + std_dev = np.reshape(std_dev, tally.shape) # Override tally's data with the new condensed data tally._mean = mean diff --git a/openmc/tallies.py b/openmc/tallies.py index 8764e2e17c..3a8f102ce3 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2841,12 +2841,6 @@ class Tally(object): new_tally = copy.deepcopy(self) new_tally.add_filter(new_filter) - # Determine the shape of data in the new diagonalized Tally - num_filter_bins = new_tally.num_filter_bins - num_nuclides = new_tally.num_nuclides - num_scores = new_tally.num_scores - new_shape = (num_filter_bins, num_nuclides, num_scores) - # Determine "base" indices along the new "diagonal", and the factor # by which the "base" indices should be repeated to account for all # other filter bins in the diagonalized tally From 1af9c8b6a290764abc86b256dbcdd5fd1e1f80af Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Mon, 4 Jan 2016 20:46:26 -0500 Subject: [PATCH 52/61] Fixed bug when getting Pandas DataFrame from distribcell tally with 2D Lattice --- openmc/opencg_compatible.py | 4 +++- openmc/statepoint.py | 41 +++++++++++++++++++++++++++++++++---- openmc/universe.py | 2 +- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 61485b5099..0bda48c160 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -901,7 +901,9 @@ def get_opencg_lattice(openmc_lattice): # Convert 2D universes array to 3D for OpenCG if len(universes.shape) == 2: - universes.shape = (1,) + universes.shape + new_universes = universes.copy() + new_universes.shape = (1,) + universes.shape + universes = new_universes # Initialize an empty array for the OpenCG nested Universes in this Lattice universe_array = np.ndarray(tuple(np.array(dimension)[::-1]), diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 2b1e57dfa4..3c0759f124 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -75,6 +75,9 @@ class StatePoint(object): energy of the source site. source_present : bool Indicate whether source sites are present + sparse : bool + Whether or not the tallies uses SciPy's LIL sparse matrix format for + compressed data storage tallies : dict Dictionary whose keys are tally IDs and whose values are Tally objects tallies_present : bool @@ -110,6 +113,7 @@ class StatePoint(object): self._tallies_read = False self._summary = False self._global_tallies = None + self._sparse = False def close(self): self._f.close() @@ -318,6 +322,10 @@ class StatePoint(object): def source_present(self): return self._f['source_present'].value > 0 + @property + def sparse(self): + return self._sparse + @property def tallies(self): if not self._tallies_read: @@ -340,7 +348,8 @@ class StatePoint(object): for tally_key in tally_keys: # Read the Tally size specifications - n_realizations = self._f['{0}{1}/n_realizations'.format(base, tally_key)].value + n_realizations = \ + self._f['{0}{1}/n_realizations'.format(base, tally_key)].value # Create Tally object and assign basic properties tally = openmc.Tally(tally_id=tally_key) @@ -350,7 +359,8 @@ class StatePoint(object): tally.num_realizations = n_realizations # Read the number of Filters - n_filters = self._f['{0}{1}/n_filters'.format(base, tally_key)].value + n_filters = \ + self._f['{0}{1}/n_filters'.format(base, tally_key)].value subbase = '{0}{1}/filter '.format(base, tally_key) @@ -358,7 +368,8 @@ class StatePoint(object): for j in range(1, n_filters+1): # Read the Filter type - filter_type = self._f['{0}{1}/type'.format(subbase, j)].value.decode() + filter_type = \ + self._f['{0}{1}/type'.format(subbase, j)].value.decode() n_bins = self._f['{0}{1}/n_bins'.format(subbase, j)].value @@ -380,7 +391,8 @@ class StatePoint(object): tally.add_filter(filter) # Read Nuclide bins - nuclide_names = self._f['{0}{1}/nuclides'.format(base, tally_key)].value + nuclide_names = \ + self._f['{0}{1}/nuclides'.format(base, tally_key)].value # Add all Nuclides to the Tally for name in nuclide_names: @@ -415,6 +427,7 @@ class StatePoint(object): tally.add_score(score) # Add Tally to the global dictionary of all Tallies + tally.sparse = self.sparse self._tallies[tally_key] = tally self._tallies_read = True @@ -439,6 +452,26 @@ class StatePoint(object): def with_summary(self): return False if self.summary is None else True + @sparse.setter + def sparse(self, sparse): + """Convert tally data from NumPy arrays to SciPy list of lists (LIL) + sparse matrices, and vice versa. + + This property may be used to reduce the amount of data in memory during + tally data processing. The tally data will be stored as SciPy LIL + matrices internally within each Tally object. All tally data access + properties and methods will return data as a dense NumPy array. + + """ + + cv.check_type('sparse', sparse, bool) + self._sparse = sparse + + # Update tally sparsities + if self._tallies_read: + for tally_id in self.tallies: + self.tallies[tally_id].sparse = self.sparse + def get_tally(self, scores=[], filters=[], nuclides=[], name=None, id=None, estimator=None): """Finds and returns a Tally object with certain properties. diff --git a/openmc/universe.py b/openmc/universe.py index b997e8845c..8417f27c71 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -1081,7 +1081,7 @@ class RectLattice(Lattice): # For 2D Lattices if len(self._dimension) == 2: offset = self._offsets[i[1]-1, i[2]-1, 0, distribcell_index-1] - offset += self._universes[i[1]][i[2]].get_cell_instance(path, + offset += self._universes[i[1]-1][i[2]-1].get_cell_instance(path, distribcell_index) # For 3D Lattices From bb1156b6dddcbfa929e5bdb375f529f205fa4fd3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 4 Jan 2016 21:36:04 -0600 Subject: [PATCH 53/61] Add 200 px width logo for RTD documentation. --- docs/source/_images/openmc200px.png | Bin 0 -> 6919 bytes docs/source/conf.py | 6 ++---- 2 files changed, 2 insertions(+), 4 deletions(-) create mode 100644 docs/source/_images/openmc200px.png diff --git a/docs/source/_images/openmc200px.png b/docs/source/_images/openmc200px.png new file mode 100644 index 0000000000000000000000000000000000000000..3997c6baa078996a5f33b02649688b24b5f7ca75 GIT binary patch literal 6919 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 N002ovPDHLkV1o1n77PFY literal 0 HcmV?d00001 diff --git a/docs/source/conf.py b/docs/source/conf.py index 7b227ec520..32154fa60f 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -126,11 +126,13 @@ pygments_style = 'tango' # Sphinx are currently 'default' and 'sphinxdoc'. if on_rtd: html_theme = 'default' + html_logo = '_images/openmc200px.png' else: html_theme = 'haiku' html_theme_options = {'full_logo': True, 'linkcolor': '#0c3762', 'visitedlinkcolor': '#0c3762'} + html_logo = '_images/openmc.png' # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = ["_theme"] @@ -142,10 +144,6 @@ html_title = "OpenMC Documentation" # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -html_logo = '_images/openmc.png' - # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. From b516520e6c79d63204bee107ee89e70dad2f9616 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Tue, 5 Jan 2016 09:24:35 -0500 Subject: [PATCH 54/61] Reinserted blank lines into docstrings in tallies.py --- openmc/tallies.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openmc/tallies.py b/openmc/tallies.py index 3a8f102ce3..8bfdeb3fc9 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1701,6 +1701,7 @@ class Tally(object): def _align_tally_data(self, other, filter_product, nuclide_product, score_product): """Aligns data from two tallies for tally arithmetic. + This is a helper method to construct a dict of dicts of the "aligned" data arrays from each tally for tally arithmetic. The method analyzes the filters, scores and nuclides in both tallies and determines how to @@ -1709,6 +1710,7 @@ class Tally(object): 'tile' and 'repeat' operations to the new data arrays such that all possible combinations of the data in each tally's bins will be made when the arithmetic operation is applied to the arrays. + Parameters ---------- other : Tally @@ -1722,11 +1724,13 @@ class Tally(object): score_product : {'tensor', 'entrywise'} The type of product (tensor or entrywise) to be performed between score data. + Returns ------- dict A dictionary of dictionaries to "aligned" 'mean' and 'std. dev' NumPy arrays for each tally's data. + """ # Get the set of filters that each tally is missing From d2c9e1808270f72827a403c562ef5df12925dbe7 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Tue, 5 Jan 2016 09:37:38 -0500 Subject: [PATCH 55/61] Added scipy to install_requires in setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 907d80e31b..935e8a3658 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,7 @@ kwargs = {'name': 'openmc', if have_setuptools: kwargs.update({ # Required dependencies - 'install_requires': ['numpy', 'h5py', 'matplotlib'], + 'install_requires': ['numpy', 'h5py', 'matplotlib', 'scipy'], # Optional dependencies 'extras_require': { From 3eb10519ac566dc92f0c6775f5a465f7e1b7f5a4 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Wed, 6 Jan 2016 08:45:25 -0500 Subject: [PATCH 56/61] Made SciPy imports for sparse tallies optional --- openmc/tallies.py | 10 +++++++++- setup.py | 3 ++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 8bfdeb3fc9..7ec1ca50cb 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -10,7 +10,6 @@ from xml.etree import ElementTree as ET import sys import numpy as np -import scipy.sparse as sps from openmc import Mesh, Filter, Trigger, Nuclide from openmc.cross import CrossScore, CrossNuclide, CrossFilter @@ -323,6 +322,8 @@ class Tally(object): # Convert NumPy arrays to SciPy sparse LIL matrices if self.sparse: + import scipy.sparse as sps + self._sum = \ sps.lil_matrix(self._sum.flatten(), self._sum.shape) self._sum_sq = \ @@ -363,6 +364,8 @@ class Tally(object): # Convert NumPy array to SciPy sparse LIL matrix if self.sparse: + import scipy.sparse as sps + self._mean = \ sps.lil_matrix(self._mean.flatten(), self._mean.shape) @@ -385,6 +388,8 @@ class Tally(object): # Convert NumPy array to SciPy sparse LIL matrix if self.sparse: + import scipy.sparse as sps + self._std_dev = \ sps.lil_matrix(self._std_dev.flatten(), self._std_dev.shape) @@ -550,6 +555,8 @@ class Tally(object): # Convert NumPy arrays to SciPy sparse LIL matrices if sparse and not self.sparse: + import scipy.sparse as sps + if self._sum is not None: self._sum = \ sps.lil_matrix(self._sum.flatten(), self._sum.shape) @@ -562,6 +569,7 @@ class Tally(object): if self._std_dev is not None: self._std_dev = \ sps.lil_matrix(self._std_dev.flatten(), self._std_dev.shape) + self._sparse = True # Convert SciPy sparse LIL matrices to NumPy arrays diff --git a/setup.py b/setup.py index 935e8a3658..d401f5fbaf 100644 --- a/setup.py +++ b/setup.py @@ -32,11 +32,12 @@ kwargs = {'name': 'openmc', if have_setuptools: kwargs.update({ # Required dependencies - 'install_requires': ['numpy', 'h5py', 'matplotlib', 'scipy'], + 'install_requires': ['numpy', 'h5py', 'matplotlib'], # Optional dependencies 'extras_require': { 'pandas': ['pandas'], + 'sparse' : ['scipy'], 'vtk': ['vtk', 'silomesh'], 'validate': ['lxml'] }}) From 1c8a12f85a5433ed7a26a7f5a3698b3d18fafa97 Mon Sep 17 00:00:00 2001 From: Kelly Rowland Date: Wed, 6 Jan 2016 09:07:54 -0800 Subject: [PATCH 57/61] fix link to MCNP manual --- docs/source/methods/physics.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/methods/physics.rst b/docs/source/methods/physics.rst index e25057488c..c3ee161a75 100644 --- a/docs/source/methods/physics.rst +++ b/docs/source/methods/physics.rst @@ -1636,4 +1636,4 @@ another. .. _lectures: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-ur-05-4983.pdf -.. _MCNP Manual: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/MCNP5_Manual_Volume_I_LA-UR-03-1987.pdf +.. _MCNP Manual: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-ur-03-1987.pdf From 4d4e31fbd60bea6b3d9f040eabd8d11345bb87cd Mon Sep 17 00:00:00 2001 From: Kelly Rowland Date: Wed, 6 Jan 2016 13:24:50 -0800 Subject: [PATCH 58/61] remove extraneous whitespace on MCNP manual link --- docs/source/methods/physics.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/methods/physics.rst b/docs/source/methods/physics.rst index c3ee161a75..33f6c74d13 100644 --- a/docs/source/methods/physics.rst +++ b/docs/source/methods/physics.rst @@ -1636,4 +1636,4 @@ another. .. _lectures: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-ur-05-4983.pdf -.. _MCNP Manual: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-ur-03-1987.pdf +.. _MCNP Manual: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-ur-03-1987.pdf From b394aeb40c4fb84adb2448edb0d5bb53a52c2769 Mon Sep 17 00:00:00 2001 From: Kelly Rowland Date: Wed, 6 Jan 2016 13:25:34 -0800 Subject: [PATCH 59/61] fix link to LANL Monte Carlo sampler --- docs/source/methods/physics.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/methods/physics.rst b/docs/source/methods/physics.rst index 33f6c74d13..cc486ab67b 100644 --- a/docs/source/methods/physics.rst +++ b/docs/source/methods/physics.rst @@ -1626,7 +1626,7 @@ another. .. _ENDF-6 Format: http://www-nds.iaea.org/ndspub/documents/endf/endf102/endf102.pdf -.. _Monte Carlo Sampler: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-9721_3rdmcsampler.pdf +.. _Monte Carlo Sampler: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-9721.pdf .. _LA-UR-14-27694: http://permalink.lanl.gov/object/tr?what=info:lanl-repo/lareport/LA-UR-14-27694 From 44d1ba3b9467b9a3a024996149d40d52277f7fb6 Mon Sep 17 00:00:00 2001 From: Kelly Rowland Date: Wed, 6 Jan 2016 13:29:34 -0800 Subject: [PATCH 60/61] fix link to rand generation with arbitrary strides --- docs/source/methods/random_numbers.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/methods/random_numbers.rst b/docs/source/methods/random_numbers.rst index 3ea61719c5..e0a974f43b 100644 --- a/docs/source/methods/random_numbers.rst +++ b/docs/source/methods/random_numbers.rst @@ -70,5 +70,5 @@ the idea is to determine the new multiplicative and additive constants in Different Sizes and Good Lattice Structures," *Math. Comput.*, **68**, 249 (1999). -.. _Brown: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/anl_rn_arb-strides_1994.pdf +.. _Brown: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/anl-rn-arb-stride.pdf .. _linear congruential generator: http://en.wikipedia.org/wiki/Linear_congruential_generator From 6021623e2c2e5ae01146da8d2e2c25d9d32c487b Mon Sep 17 00:00:00 2001 From: Kelly Rowland Date: Wed, 6 Jan 2016 21:15:47 -0800 Subject: [PATCH 61/61] fix unpublished rational approximation link --- docs/source/methods/tallies.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/methods/tallies.rst b/docs/source/methods/tallies.rst index fd0812245a..65a0989ac7 100644 --- a/docs/source/methods/tallies.rst +++ b/docs/source/methods/tallies.rst @@ -507,6 +507,6 @@ improve the estimate of the percentile. .. _Cauchy distribution: http://en.wikipedia.org/wiki/Cauchy_distribution -.. _unpublished rational approximation: http://home.online.no/~pjacklam/notes/invnorm/ +.. _unpublished rational approximation: https://web.archive.org/web/20150926021742/http://home.online.no/~pjacklam/notes/invnorm/ .. _MC21: http://www.osti.gov/bridge/servlets/purl/903083-HT5p1o/903083.pdf