From 17d50332b29d5b6c293a2fd784417800ef5247f2 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 17 Nov 2015 22:33:00 -0500 Subject: [PATCH 01/49] fixed issue in Python API tally arithmetic with tally multiplication --- openmc/tallies.py | 74 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 20 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 0661ab67b..71c84a280 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1487,10 +1487,16 @@ class Tally(object): other_filters = set(other.filters) filter_intersect = self_filters.intersection(other_filters) - # Align the shared filters to follow in each tally operand + # Align the shared filters in successive order for i, filter in enumerate(filter_intersect): - self_index = self.filters.index(filter) - other_filter = other.filters[self_index] + self_filter = self.filters[i] + other_filter = other.filters[i] + + # If necessary, swap self filter + if self_filter != filter: + self = self.swap_filters(filter, self_filter) + + # If necessary, swap other filter if other_filter != filter: other = other.swap_filters(filter, other_filter) @@ -1559,7 +1565,7 @@ class Tally(object): if len(self.filters) != match and len(other.filters) == match: for filter in cross_filters[0]: new_tally.add_filter(filter) - elif len(other.filters) == match and len(other.filters) != match: + elif len(self.filters) == match and len(other.filters) != match: for filter in cross_filters[1]: new_tally.add_filter(filter) else: @@ -1644,8 +1650,8 @@ class Tally(object): 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 = 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) @@ -1653,7 +1659,8 @@ class Tally(object): 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) + 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)) @@ -1672,7 +1679,11 @@ class Tally(object): self_repeat_factor = other.num_nuclides other_tile_factor = self.num_nuclides - # Replicate the data + # 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) @@ -1680,10 +1691,10 @@ class Tally(object): # NumPy repeat and tile routines return 1D flattened arrays # Reshape arrays as 3D with filters, nuclides and scores axes - self_shape = list(self.mean.shape) - self_shape[1] *= self_repeat_factor 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) if self.scores != other.scores: @@ -1692,7 +1703,11 @@ class Tally(object): self_repeat_factor = other.num_score_bins other_tile_factor = self.num_score_bins - # Replicate the data + # 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) @@ -1700,10 +1715,10 @@ class Tally(object): # NumPy repeat and tile routines return 1D flattened arrays # Reshape arrays as 3D with filters, nuclides and scores axes - self_shape = list(self.mean.shape) - self_shape[2] *= self_repeat_factor 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) data = {} data['self'] = {} @@ -2451,6 +2466,13 @@ class Tally(object): A new tally which encapsulates the sum of data requested. """ + # If user input filter type but no bins, sum across all bins and + # remove the filter + if filter_type in _FILTER_TYPES and len(filter_bins) == 0: + remove_filter = True + else: + remove_filter = False + # If user did not specify any scores, do not sum across scores if len(scores) == 0: scores = [[]] @@ -2467,7 +2489,14 @@ class Tally(object): # Sum across any filter bins specified by the user if filter_type in _FILTER_TYPES: - filter_bins = [[(filter_bin,)] for filter_bin in filter_bins] + + # If user did not specify filter bins, sum across all bins + if len(filter_bins) == 0: + filter = self.find_filter(filter_type) + filter_bins = [[(filter.get_bin(i),)] for i in range(filter.num_bins)] + else: + filter_bins = [[(filter_bin,)] for filter_bin in filter_bins] + filters = [[filter_type]] # If user did not specify a filter type, do not sum across filter bins else: @@ -2492,12 +2521,17 @@ class Tally(object): # Accumulate this Tally slice into the Tally sum tally_sum += tally_slice - # Add back the filter(s) which were summed across to derived tally - for filter_type in summed_filters: - filters = summed_filters[filter_type] - for i in range(1, len(filters)): - filters[i] = CrossFilter(filters[i-1], filters[i], '+') - tally_sum.add_filter(filters[-1]) + # Add back the filter(s) which were summed across to derived tally, + # if filter bins were input; otherwise, leave out summed filter(s) + if remove_filter: + # Rename tally sum indicating a summation over a particular filter + tally_sum.name = 'sum({0}, {1})'.format(self.name, filter_type) + else: + for summed_filter_type in summed_filters: + filters = summed_filters[summed_filter_type] + for i in range(1, len(filters)): + filters[i] = CrossFilter(filters[i-1], filters[i], '+') + tally_sum.add_filter(filters[-1]) return tally_sum From df3b9ed017ccac91ee8331d24726aa80f4648658 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 19 Nov 2015 16:47:55 -0500 Subject: [PATCH 02/49] fixed error in cross.py and added remove_filter attribute to tally summation --- openmc/cross.py | 2 +- openmc/tallies.py | 14 +++++--------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 435557ede..31006cbf7 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -356,7 +356,7 @@ class CrossFilter(object): def type(self, filter_type): if filter_type not in _FILTER_TYPES.values(): msg = 'Unable to set Filter type to "{0}" since it is not one ' \ - 'of the supported types'.format(type) + 'of the supported types'.format(filter_type) raise ValueError(msg) self._type = filter_type diff --git a/openmc/tallies.py b/openmc/tallies.py index 71c84a280..c8090fc17 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2430,7 +2430,7 @@ class Tally(object): return new_tally def summation(self, scores=[], filter_type=None, - filter_bins=[], nuclides=[]): + filter_bins=[], nuclides=[], remove_filter=False): """Vectorized sum of tally data across scores, filter bins and/or nuclides using tally addition. @@ -2459,6 +2459,9 @@ class Tally(object): nuclides : list of str A list of nuclide name strings to sum across (e.g., ['U-235', 'U-238']; default is []) + remove_filter : bool + If a filter is being summed over, this bool indicates whether to + remove that filter in the returned tally. Returns ------- @@ -2466,13 +2469,6 @@ class Tally(object): A new tally which encapsulates the sum of data requested. """ - # If user input filter type but no bins, sum across all bins and - # remove the filter - if filter_type in _FILTER_TYPES and len(filter_bins) == 0: - remove_filter = True - else: - remove_filter = False - # If user did not specify any scores, do not sum across scores if len(scores) == 0: scores = [[]] @@ -2523,7 +2519,7 @@ class Tally(object): # Add back the filter(s) which were summed across to derived tally, # if filter bins were input; otherwise, leave out summed filter(s) - if remove_filter: + if remove_filter and filter_type is not None: # Rename tally sum indicating a summation over a particular filter tally_sum.name = 'sum({0}, {1})'.format(self.name, filter_type) else: From 8c6d14ed23d4e3d4fc8ed349943215d76b95c41c Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 19 Nov 2015 16:50:11 -0500 Subject: [PATCH 03/49] added default in doc string for tally summation remove_filter --- openmc/tallies.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index c8090fc17..c24bc2d4d 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2461,7 +2461,7 @@ class Tally(object): (e.g., ['U-235', 'U-238']; default is []) remove_filter : bool If a filter is being summed over, this bool indicates whether to - remove that filter in the returned tally. + remove that filter in the returned tally. Default is False. Returns ------- From f458e825ce0c52b90dc8c647c4f3ae0b6b749d3a Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 19 Nov 2015 20:54:31 -0500 Subject: [PATCH 04/49] added inline option to swap tally method --- openmc/tallies.py | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index c24bc2d4d..026d0992b 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1494,11 +1494,11 @@ class Tally(object): # If necessary, swap self filter if self_filter != filter: - self = self.swap_filters(filter, self_filter) + self.swap_filters(filter, self_filter, inline=True) # If necessary, swap other filter if other_filter != filter: - other = other.swap_filters(filter, other_filter) + other.swap_filters(filter, other_filter, inline=True) data = self._align_tally_data(other) @@ -1729,7 +1729,7 @@ class Tally(object): data['other']['std. dev.'] = other_std_dev return data - def swap_filters(self, filter1, filter2): + def swap_filters(self, filter1, filter2, inline=False): """Reverse the ordering of two filters in this tally This is a helper method for tally arithmetic which helps align the data @@ -1744,10 +1744,14 @@ class Tally(object): filter2 : Filter The filter to swap with filter1 + inline : bool, optional + Whether to inline operator or return new tally with swapped filters. + Returns ------- swap_tally - A copy of this tally with the filters swapped + If inline is true, a copy of this tally with the filters swapped. + Otherwise, nothing is returned. Raises ------ @@ -1778,7 +1782,15 @@ class Tally(object): 'does not contain such a filter'.format(filter2.type, self.id) raise ValueError(msg) - swap_tally = copy.deepcopy(self) + # 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 inline: + 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) @@ -1808,8 +1820,8 @@ class Tally(object): 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') + 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 @@ -1817,8 +1829,8 @@ class Tally(object): 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') + 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 @@ -1826,8 +1838,8 @@ class Tally(object): if self.mean 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='mean') + data = tally_copy.get_values( + filters=filters, filter_bins=filter_bins, value='mean') indices = swap_tally.get_filter_indices(filters, filter_bins) swap_tally._mean[indices, :, :] = data @@ -1835,12 +1847,13 @@ class Tally(object): if self.std_dev 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='std_dev') + data = tally_copy.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 - return swap_tally + if not inline: + return swap_tally def __add__(self, other): """Adds this tally to another tally or scalar value. From f9204ce66eef7a41944fede279e04d1f2ef3e2d9 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Fri, 20 Nov 2015 13:06:20 -0500 Subject: [PATCH 05/49] fixed bug in cross filter deepcopy and fixed bug in tally arithmetic --- openmc/cross.py | 2 +- openmc/tallies.py | 75 +- .../results_true.dat | 86 +- .../results_true.dat | 46 +- .../results_true.dat | 950 +++++++++--------- 5 files changed, 582 insertions(+), 577 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 31006cbf7..57339e71c 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -309,7 +309,7 @@ class CrossFilter(object): clone._right_filter = self.right_filter clone._binary_op = self.binary_op clone._type = self.type - clone._bins = self.bins + clone._bins = self._bins clone._num_bins = self.num_bins clone._stride = self.stride diff --git a/openmc/tallies.py b/openmc/tallies.py index 026d0992b..f4b30d67f 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1482,25 +1482,30 @@ class Tally(object): new_name = '({0} {1} {2})'.format(self.name, binary_op, other.name) new_tally.name = new_name + # Create copies of self and other tallies to rearrange for tally + # arithmetic + self_copy = copy.deepcopy(self) + other_copy = copy.deepcopy(other) + # Find any shared filters between the two tallies - self_filters = set(self.filters) - other_filters = set(other.filters) + self_filters = set(self_copy.filters) + other_filters = set(other_copy.filters) filter_intersect = self_filters.intersection(other_filters) # Align the shared filters in successive order for i, filter in enumerate(filter_intersect): - self_filter = self.filters[i] - other_filter = other.filters[i] + self_index = self_copy.filters.index(filter) + other_index = other_copy.filters.index(filter) # If necessary, swap self filter - if self_filter != filter: - self.swap_filters(filter, self_filter, inline=True) + if self_index != i: + self_copy.swap_filters(filter, self_copy.filters[i], inline=True) # If necessary, swap other filter - if other_filter != filter: - other.swap_filters(filter, other_filter, inline=True) + if other_index != i: + other_copy.swap_filters(filter, other_copy.filters[i], inline=True) - data = self._align_tally_data(other) + data = self_copy._align_tally_data(other_copy) if binary_op == '+': new_tally._mean = data['self']['mean'] + data['other']['mean'] @@ -1531,16 +1536,16 @@ class Tally(object): new_tally._std_dev = np.abs(new_tally.mean) * \ np.sqrt(first_term**2 + second_term**2) - if self.estimator == other.estimator: - new_tally.estimator = self.estimator - if self.with_summary and other.with_summary: - new_tally.with_summary = self.with_summary - if self.num_realizations == other.num_realizations: - new_tally.num_realizations = self.num_realizations + if self_copy.estimator == other_copy.estimator: + new_tally.estimator = self_copy.estimator + if self_copy.with_summary and other_copy.with_summary: + new_tally.with_summary = self_copy.with_summary + 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.filters == other.filters: - for self_filter in self.filters: + if self_copy.filters == other_copy.filters: + for self_filter in self_copy.filters: new_tally.add_filter(self_filter) # Generate filter "outer products" for non-identical filters @@ -1548,24 +1553,24 @@ class Tally(object): # Find the common longest sequence of shared filters match = 0 - for self_filter, other_filter in zip(self.filters, other.filters): + for self_filter, other_filter in zip(self_copy.filters, other_copy.filters): if self_filter == other_filter: match += 1 else: break - match_filters = self.filters[:match] - cross_filters = [self.filters[match:], other.filters[match:]] + 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.filters) != match and len(other.filters) == match: + 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.filters) == match and len(other.filters) != match: + elif len(self_copy.filters) == match and len(other_copy.filters) != match: for filter in cross_filters[1]: new_tally.add_filter(filter) else: @@ -1574,23 +1579,23 @@ class Tally(object): new_tally.add_filter(new_filter) # Generate score "outer products" - if self.scores == other.scores: - new_tally.num_score_bins = self.num_score_bins - for self_score in self.scores: + if self_copy.scores == other_copy.scores: + 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.num_score_bins * other.num_score_bins - all_scores = [self.scores, other.scores] + 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) # Generate nuclide "outer products" - if self.nuclides == other.nuclides: - for self_nuclide in self.nuclides: + if self_copy.nuclides == other_copy.nuclides: + for self_nuclide in self_copy.nuclides: new_tally.nuclides.append(self_nuclide) else: - all_nuclides = [self.nuclides, other.nuclides] + 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) @@ -1750,7 +1755,7 @@ class Tally(object): Returns ------- swap_tally - If inline is true, a copy of this tally with the filters swapped. + If inline is false, a copy of this tally with the filters swapped. Otherwise, nothing is returned. Raises @@ -1817,7 +1822,7 @@ class Tally(object): 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: + 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( @@ -1826,7 +1831,7 @@ class Tally(object): swap_tally.sum[indices, :, :] = data # Adjust the sum_sq data array to relect the new filter order - if self.sum_sq is not None: + 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( @@ -1835,7 +1840,7 @@ class Tally(object): swap_tally.sum_sq[indices, :, :] = data # Adjust the mean data array to relect the new filter order - if self.mean is not None: + if swap_tally.mean is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] data = tally_copy.get_values( @@ -1844,7 +1849,7 @@ class Tally(object): swap_tally._mean[indices, :, :] = data # Adjust the std_dev data array to relect the new filter order - if self.std_dev is not None: + if swap_tally.std_dev is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] data = tally_copy.get_values( diff --git a/tests/test_mgxs_library_condense/results_true.dat b/tests/test_mgxs_library_condense/results_true.dat index 45891fc30..58e0d14fc 100644 --- a/tests/test_mgxs_library_condense/results_true.dat +++ b/tests/test_mgxs_library_condense/results_true.dat @@ -1,49 +1,49 @@ - material group in nuclide mean std. dev. -0 1 1 total 0.419289 0.01638 material group in nuclide mean std. dev. -0 1 1 total 0.07774 0.003273 material group in group out nuclide mean std. dev. + group in material nuclide mean std. dev. +0 1 1 total 0.419289 0.01638 group in material nuclide mean std. dev. +0 1 1 total 0.07774 0.003273 group in material group out nuclide mean std. dev. 0 1 1 1 total 0.352665 0.015654 material group out nuclide mean std. dev. -0 1 1 total 1 0.119622 material group in nuclide mean std. dev. -0 2 1 total 0.247316 0.009562 material group in nuclide mean std. dev. -0 2 1 total 0 0 material group in group out nuclide mean std. dev. -0 2 1 1 total 0.244838 0.009996 material group out nuclide mean std. dev. -0 2 1 total 0 0 material group in nuclide mean std. dev. -0 3 1 total 0.409938 0.042262 material group in nuclide mean std. dev. -0 3 1 total 0 0 material group in group out nuclide mean std. dev. -0 3 1 1 total 0.403354 0.041386 material group out nuclide mean std. dev. -0 3 1 total 0 0 material group in nuclide mean std. dev. -0 4 1 total 0.344007 0.05352 material group in nuclide mean std. dev. -0 4 1 total 0 0 material group in group out nuclide mean std. dev. -0 4 1 1 total 0.340438 0.052067 material group out nuclide mean std. dev. -0 4 1 total 0 0 material group in nuclide mean std. dev. -0 5 1 total 0 0 material group in nuclide mean std. dev. -0 5 1 total 0 0 material group in group out nuclide mean std. dev. -0 5 1 1 total 0 0 material group out nuclide mean std. dev. -0 5 1 total 0 0 material group in nuclide mean std. dev. -0 6 1 total 0 0 material group in nuclide mean std. dev. -0 6 1 total 0 0 material group in group out nuclide mean std. dev. -0 6 1 1 total 0 0 material group out nuclide mean std. dev. +0 1 1 total 1 0.119622 group in material nuclide mean std. dev. +0 1 2 total 0.247316 0.009562 group in material nuclide mean std. dev. +0 1 2 total 0 0 group in material group out nuclide mean std. dev. +0 1 2 1 total 0.244838 0.009996 material group out nuclide mean std. dev. +0 2 1 total 0 0 group in material nuclide mean std. dev. +0 1 3 total 0.409938 0.042262 group in material nuclide mean std. dev. +0 1 3 total 0 0 group in material group out nuclide mean std. dev. +0 1 3 1 total 0.403354 0.041386 material group out nuclide mean std. dev. +0 3 1 total 0 0 group in material nuclide mean std. dev. +0 1 4 total 0.344007 0.05352 group in material nuclide mean std. dev. +0 1 4 total 0 0 group in material group out nuclide mean std. dev. +0 1 4 1 total 0.340438 0.052067 material group out nuclide mean std. dev. +0 4 1 total 0 0 group in material nuclide mean std. dev. +0 1 5 total 0 0 group in material nuclide mean std. dev. +0 1 5 total 0 0 group in material group out nuclide mean std. dev. +0 1 5 1 total 0 0 material group out nuclide mean std. dev. +0 5 1 total 0 0 group in material nuclide mean std. dev. +0 1 6 total 0 0 group in material nuclide mean std. dev. +0 1 6 total 0 0 group in material group out nuclide mean std. dev. +0 1 6 1 total 0 0 material group out nuclide mean std. dev. 0 6 1 total 0 0 material group in nuclide mean std. dev. 0 7 1 total 0 0 material group in nuclide mean std. dev. 0 7 1 total 0 0 material group in group out nuclide mean std. dev. 0 7 1 1 total 0 0 material group out nuclide mean std. dev. -0 7 1 total 0 0 material group in nuclide mean std. dev. -0 8 1 total 0 0 material group in nuclide mean std. dev. -0 8 1 total 0 0 material group in group out nuclide mean std. dev. -0 8 1 1 total 0 0 material group out nuclide mean std. dev. -0 8 1 total 0 0 material group in nuclide mean std. dev. -0 9 1 total 0.751873 0.559701 material group in nuclide mean std. dev. -0 9 1 total 0 0 material group in group out nuclide mean std. dev. -0 9 1 1 total 0.695491 0.50757 material group out nuclide mean std. dev. -0 9 1 total 0 0 material group in nuclide mean std. dev. -0 10 1 total 0 0 material group in nuclide mean std. dev. -0 10 1 total 0 0 material group in group out nuclide mean std. dev. -0 10 1 1 total 0 0 material group out nuclide mean std. dev. -0 10 1 total 0 0 material group in nuclide mean std. dev. -0 11 1 total 0.457329 0.403578 material group in nuclide mean std. dev. -0 11 1 total 0 0 material group in group out nuclide mean std. dev. -0 11 1 1 total 0.446737 0.392775 material group out nuclide mean std. dev. -0 11 1 total 0 0 material group in nuclide mean std. dev. -0 12 1 total 0.574978 0.38864 material group in nuclide mean std. dev. -0 12 1 total 0 0 material group in group out nuclide mean std. dev. -0 12 1 1 total 0.559478 0.377512 material group out nuclide mean std. dev. +0 7 1 total 0 0 group in material nuclide mean std. dev. +0 1 8 total 0 0 group in material nuclide mean std. dev. +0 1 8 total 0 0 group in material group out nuclide mean std. dev. +0 1 8 1 total 0 0 material group out nuclide mean std. dev. +0 8 1 total 0 0 group in material nuclide mean std. dev. +0 1 9 total 0.751873 0.559701 group in material nuclide mean std. dev. +0 1 9 total 0 0 group in material group out nuclide mean std. dev. +0 1 9 1 total 0.695491 0.50757 material group out nuclide mean std. dev. +0 9 1 total 0 0 group in material nuclide mean std. dev. +0 1 10 total 0 0 group in material nuclide mean std. dev. +0 1 10 total 0 0 group in material group out nuclide mean std. dev. +0 1 10 1 total 0 0 material group out nuclide mean std. dev. +0 10 1 total 0 0 group in material nuclide mean std. dev. +0 1 11 total 0.457329 0.403578 group in material nuclide mean std. dev. +0 1 11 total 0 0 group in material group out nuclide mean std. dev. +0 1 11 1 total 0.446737 0.392775 material group out nuclide mean std. dev. +0 11 1 total 0 0 group in material nuclide mean std. dev. +0 1 12 total 0.574978 0.38864 group in material nuclide mean std. dev. +0 1 12 total 0 0 group in material group out nuclide mean std. dev. +0 1 12 1 total 0.559478 0.377512 material group out nuclide mean std. dev. 0 12 1 total 0 0 \ No newline at end of file diff --git a/tests/test_mgxs_library_no_nuclides/results_true.dat b/tests/test_mgxs_library_no_nuclides/results_true.dat index 761851268..bd69a25a8 100644 --- a/tests/test_mgxs_library_no_nuclides/results_true.dat +++ b/tests/test_mgxs_library_no_nuclides/results_true.dat @@ -1,12 +1,12 @@ - material group in nuclide mean std. dev. + group in material nuclide mean std. dev. 1 1 1 total 0.384379 0.01649 -0 1 2 total 0.812087 0.07419 material group in nuclide mean std. dev. +0 2 1 total 0.812087 0.07419 group in material nuclide mean std. dev. 1 1 1 total 0.02127 0.000894 -0 1 2 total 0.69604 0.053458 material group in group out nuclide mean std. dev. +0 2 1 total 0.69604 0.053458 group in material group out nuclide mean std. dev. 3 1 1 1 total 0.349924 0.016649 2 1 1 2 total 0.000173 0.000173 -1 1 2 1 total 0.001948 0.001952 -0 1 2 2 total 0.379607 0.040078 material group out nuclide mean std. dev. +1 2 1 1 total 0.001948 0.001952 +0 2 1 2 total 0.379607 0.040078 material group out nuclide mean std. dev. 1 1 1 total 1 0.119622 0 1 2 total 0 0.000000 material group in nuclide mean std. dev. 1 2 1 total 0.245043 0.008827 @@ -48,15 +48,15 @@ 1 5 2 1 total 0 0 0 5 2 2 total 0 0 material group out nuclide mean std. dev. 1 5 1 total 0 0 -0 5 2 total 0 0 material group in nuclide mean std. dev. -1 6 1 total 0 0 -0 6 2 total 0 0 material group in nuclide mean std. dev. -1 6 1 total 0 0 -0 6 2 total 0 0 material group in group out nuclide mean std. dev. -3 6 1 1 total 0 0 -2 6 1 2 total 0 0 -1 6 2 1 total 0 0 -0 6 2 2 total 0 0 material group out nuclide mean std. dev. +0 5 2 total 0 0 group in material nuclide mean std. dev. +1 1 6 total 0 0 +0 2 6 total 0 0 group in material nuclide mean std. dev. +1 1 6 total 0 0 +0 2 6 total 0 0 group in material group out nuclide mean std. dev. +3 1 6 1 total 0 0 +2 1 6 2 total 0 0 +1 2 6 1 total 0 0 +0 2 6 2 total 0 0 material group out nuclide mean std. dev. 1 6 1 total 0 0 0 6 2 total 0 0 material group in nuclide mean std. dev. 1 7 1 total 0 0 @@ -78,15 +78,15 @@ 1 8 2 1 total 0 0 0 8 2 2 total 0 0 material group out nuclide mean std. dev. 1 8 1 total 0 0 -0 8 2 total 0 0 material group in nuclide mean std. dev. -1 9 1 total 0.504036 0.379624 -0 9 2 total 1.687095 2.536622 material group in nuclide mean std. dev. -1 9 1 total 0 0 -0 9 2 total 0 0 material group in group out nuclide mean std. dev. -3 9 1 1 total 0.504036 0.379624 -2 9 1 2 total 0.000000 0.000000 -1 9 2 1 total 0.000000 0.000000 -0 9 2 2 total 1.417955 2.158027 material group out nuclide mean std. dev. +0 8 2 total 0 0 group in material nuclide mean std. dev. +1 1 9 total 0.504036 0.379624 +0 2 9 total 1.687095 2.536622 group in material nuclide mean std. dev. +1 1 9 total 0 0 +0 2 9 total 0 0 group in material group out nuclide mean std. dev. +3 1 9 1 total 0.504036 0.379624 +2 1 9 2 total 0.000000 0.000000 +1 2 9 1 total 0.000000 0.000000 +0 2 9 2 total 1.417955 2.158027 material group out nuclide mean std. dev. 1 9 1 total 0 0 0 9 2 total 0 0 material group in nuclide mean std. dev. 1 10 1 total 0 0 diff --git a/tests/test_mgxs_library_nuclides/results_true.dat b/tests/test_mgxs_library_nuclides/results_true.dat index 23ac0e423..eba202d7d 100644 --- a/tests/test_mgxs_library_nuclides/results_true.dat +++ b/tests/test_mgxs_library_nuclides/results_true.dat @@ -1,4 +1,4 @@ - material group in nuclide mean std. dev. + group in material nuclide mean std. dev. 34 1 1 U-234 0.000000 0.000000 35 1 1 U-235 0.008559 0.001742 36 1 1 U-236 0.002643 0.000794 @@ -33,40 +33,40 @@ 65 1 1 Eu-153 0.000173 0.000173 66 1 1 Gd-155 0.000000 0.000000 67 1 1 O-16 0.142506 0.008222 -0 1 2 U-234 0.001948 0.001952 -1 1 2 U-235 0.179956 0.028209 -2 1 2 U-236 0.000000 0.000000 -3 1 2 U-238 0.239279 0.039048 -4 1 2 Np-237 0.000000 0.000000 -5 1 2 Pu-238 0.000000 0.000000 -6 1 2 Pu-239 0.159745 0.015751 -7 1 2 Pu-240 0.007792 0.003677 -8 1 2 Pu-241 0.017533 0.003806 -9 1 2 Pu-242 0.000000 0.000000 -10 1 2 Am-241 0.000000 0.000000 -11 1 2 Am-242m 0.000000 0.000000 -12 1 2 Am-243 0.000000 0.000000 -13 1 2 Cm-242 0.000000 0.000000 -14 1 2 Cm-243 0.000000 0.000000 -15 1 2 Cm-244 0.000000 0.000000 -16 1 2 Cm-245 0.000000 0.000000 -17 1 2 Mo-95 0.002250 0.004232 -18 1 2 Tc-99 0.003544 0.002528 -19 1 2 Ru-101 0.000000 0.000000 -20 1 2 Ru-103 0.000000 0.000000 -21 1 2 Ag-109 0.000000 0.000000 -22 1 2 Xe-135 0.027274 0.004025 -23 1 2 Cs-133 0.000000 0.000000 -24 1 2 Nd-143 0.006532 0.002517 -25 1 2 Nd-145 0.001948 0.001952 -26 1 2 Sm-147 0.000000 0.000000 -27 1 2 Sm-149 0.007792 0.005701 -28 1 2 Sm-150 0.000000 0.000000 -29 1 2 Sm-151 0.000000 0.000000 -30 1 2 Sm-152 0.000000 0.000000 -31 1 2 Eu-153 0.001686 0.001968 -32 1 2 Gd-155 0.000000 0.000000 -33 1 2 O-16 0.154807 0.023798 material group in nuclide mean std. dev. +0 2 1 U-234 0.001948 0.001952 +1 2 1 U-235 0.179956 0.028209 +2 2 1 U-236 0.000000 0.000000 +3 2 1 U-238 0.239279 0.039048 +4 2 1 Np-237 0.000000 0.000000 +5 2 1 Pu-238 0.000000 0.000000 +6 2 1 Pu-239 0.159745 0.015751 +7 2 1 Pu-240 0.007792 0.003677 +8 2 1 Pu-241 0.017533 0.003806 +9 2 1 Pu-242 0.000000 0.000000 +10 2 1 Am-241 0.000000 0.000000 +11 2 1 Am-242m 0.000000 0.000000 +12 2 1 Am-243 0.000000 0.000000 +13 2 1 Cm-242 0.000000 0.000000 +14 2 1 Cm-243 0.000000 0.000000 +15 2 1 Cm-244 0.000000 0.000000 +16 2 1 Cm-245 0.000000 0.000000 +17 2 1 Mo-95 0.002250 0.004232 +18 2 1 Tc-99 0.003544 0.002528 +19 2 1 Ru-101 0.000000 0.000000 +20 2 1 Ru-103 0.000000 0.000000 +21 2 1 Ag-109 0.000000 0.000000 +22 2 1 Xe-135 0.027274 0.004025 +23 2 1 Cs-133 0.000000 0.000000 +24 2 1 Nd-143 0.006532 0.002517 +25 2 1 Nd-145 0.001948 0.001952 +26 2 1 Sm-147 0.000000 0.000000 +27 2 1 Sm-149 0.007792 0.005701 +28 2 1 Sm-150 0.000000 0.000000 +29 2 1 Sm-151 0.000000 0.000000 +30 2 1 Sm-152 0.000000 0.000000 +31 2 1 Eu-153 0.001686 0.001968 +32 2 1 Gd-155 0.000000 0.000000 +33 2 1 O-16 0.154807 0.023798 group in material nuclide mean std. dev. 34 1 1 U-234 6.771527e-06 2.982583e-07 35 1 1 U-235 9.687933e-03 4.305720e-04 36 1 1 U-236 6.279974e-05 3.653120e-06 @@ -101,40 +101,40 @@ 65 1 1 Eu-153 0.000000e+00 0.000000e+00 66 1 1 Gd-155 0.000000e+00 0.000000e+00 67 1 1 O-16 0.000000e+00 0.000000e+00 -0 1 2 U-234 4.267300e-07 3.529845e-08 -1 1 2 U-235 3.629246e-01 2.964548e-02 -2 1 2 U-236 5.921657e-06 4.881464e-07 -3 1 2 U-238 5.196256e-07 4.286610e-08 -4 1 2 Np-237 2.424211e-07 1.741823e-08 -5 1 2 Pu-238 3.255627e-05 2.692686e-06 -6 1 2 Pu-239 2.868384e-01 2.056896e-02 -7 1 2 Pu-240 4.398266e-06 3.658267e-07 -8 1 2 Pu-241 4.607239e-02 3.797176e-03 -9 1 2 Pu-242 8.451967e-08 6.979002e-09 -10 1 2 Am-241 4.678607e-06 3.253889e-07 -11 1 2 Am-242m 1.417675e-04 1.218350e-05 -12 1 2 Am-243 7.648834e-08 6.303843e-09 -13 1 2 Cm-242 9.433314e-07 7.794362e-08 -14 1 2 Cm-243 1.767995e-06 1.454123e-07 -15 1 2 Cm-244 1.533962e-07 1.266951e-08 -16 1 2 Cm-245 1.145063e-05 9.419051e-07 -17 1 2 Mo-95 0.000000e+00 0.000000e+00 -18 1 2 Tc-99 0.000000e+00 0.000000e+00 -19 1 2 Ru-101 0.000000e+00 0.000000e+00 -20 1 2 Ru-103 0.000000e+00 0.000000e+00 -21 1 2 Ag-109 0.000000e+00 0.000000e+00 -22 1 2 Xe-135 0.000000e+00 0.000000e+00 -23 1 2 Cs-133 0.000000e+00 0.000000e+00 -24 1 2 Nd-143 0.000000e+00 0.000000e+00 -25 1 2 Nd-145 0.000000e+00 0.000000e+00 -26 1 2 Sm-147 0.000000e+00 0.000000e+00 -27 1 2 Sm-149 0.000000e+00 0.000000e+00 -28 1 2 Sm-150 0.000000e+00 0.000000e+00 -29 1 2 Sm-151 0.000000e+00 0.000000e+00 -30 1 2 Sm-152 0.000000e+00 0.000000e+00 -31 1 2 Eu-153 0.000000e+00 0.000000e+00 -32 1 2 Gd-155 0.000000e+00 0.000000e+00 -33 1 2 O-16 0.000000e+00 0.000000e+00 material group in group out nuclide mean std. dev. +0 2 1 U-234 4.267300e-07 3.529845e-08 +1 2 1 U-235 3.629246e-01 2.964548e-02 +2 2 1 U-236 5.921657e-06 4.881464e-07 +3 2 1 U-238 5.196256e-07 4.286610e-08 +4 2 1 Np-237 2.424211e-07 1.741823e-08 +5 2 1 Pu-238 3.255627e-05 2.692686e-06 +6 2 1 Pu-239 2.868384e-01 2.056896e-02 +7 2 1 Pu-240 4.398266e-06 3.658267e-07 +8 2 1 Pu-241 4.607239e-02 3.797176e-03 +9 2 1 Pu-242 8.451967e-08 6.979002e-09 +10 2 1 Am-241 4.678607e-06 3.253889e-07 +11 2 1 Am-242m 1.417675e-04 1.218350e-05 +12 2 1 Am-243 7.648834e-08 6.303843e-09 +13 2 1 Cm-242 9.433314e-07 7.794362e-08 +14 2 1 Cm-243 1.767995e-06 1.454123e-07 +15 2 1 Cm-244 1.533962e-07 1.266951e-08 +16 2 1 Cm-245 1.145063e-05 9.419051e-07 +17 2 1 Mo-95 0.000000e+00 0.000000e+00 +18 2 1 Tc-99 0.000000e+00 0.000000e+00 +19 2 1 Ru-101 0.000000e+00 0.000000e+00 +20 2 1 Ru-103 0.000000e+00 0.000000e+00 +21 2 1 Ag-109 0.000000e+00 0.000000e+00 +22 2 1 Xe-135 0.000000e+00 0.000000e+00 +23 2 1 Cs-133 0.000000e+00 0.000000e+00 +24 2 1 Nd-143 0.000000e+00 0.000000e+00 +25 2 1 Nd-145 0.000000e+00 0.000000e+00 +26 2 1 Sm-147 0.000000e+00 0.000000e+00 +27 2 1 Sm-149 0.000000e+00 0.000000e+00 +28 2 1 Sm-150 0.000000e+00 0.000000e+00 +29 2 1 Sm-151 0.000000e+00 0.000000e+00 +30 2 1 Sm-152 0.000000e+00 0.000000e+00 +31 2 1 Eu-153 0.000000e+00 0.000000e+00 +32 2 1 Gd-155 0.000000e+00 0.000000e+00 +33 2 1 O-16 0.000000e+00 0.000000e+00 group in material group out nuclide mean std. dev. 102 1 1 1 U-234 0.000000 0.000000 103 1 1 1 U-235 0.002846 0.001185 104 1 1 1 U-236 0.001951 0.000829 @@ -203,74 +203,74 @@ 99 1 1 2 Eu-153 0.000000 0.000000 100 1 1 2 Gd-155 0.000000 0.000000 101 1 1 2 O-16 0.000173 0.000173 -34 1 2 1 U-234 0.000000 0.000000 -35 1 2 1 U-235 0.000000 0.000000 -36 1 2 1 U-236 0.000000 0.000000 -37 1 2 1 U-238 0.000000 0.000000 -38 1 2 1 Np-237 0.000000 0.000000 -39 1 2 1 Pu-238 0.000000 0.000000 -40 1 2 1 Pu-239 0.000000 0.000000 -41 1 2 1 Pu-240 0.000000 0.000000 -42 1 2 1 Pu-241 0.000000 0.000000 -43 1 2 1 Pu-242 0.000000 0.000000 -44 1 2 1 Am-241 0.000000 0.000000 -45 1 2 1 Am-242m 0.000000 0.000000 -46 1 2 1 Am-243 0.000000 0.000000 -47 1 2 1 Cm-242 0.000000 0.000000 -48 1 2 1 Cm-243 0.000000 0.000000 -49 1 2 1 Cm-244 0.000000 0.000000 -50 1 2 1 Cm-245 0.000000 0.000000 -51 1 2 1 Mo-95 0.000000 0.000000 -52 1 2 1 Tc-99 0.000000 0.000000 -53 1 2 1 Ru-101 0.000000 0.000000 -54 1 2 1 Ru-103 0.000000 0.000000 -55 1 2 1 Ag-109 0.000000 0.000000 -56 1 2 1 Xe-135 0.000000 0.000000 -57 1 2 1 Cs-133 0.000000 0.000000 -58 1 2 1 Nd-143 0.000000 0.000000 -59 1 2 1 Nd-145 0.000000 0.000000 -60 1 2 1 Sm-147 0.000000 0.000000 -61 1 2 1 Sm-149 0.000000 0.000000 -62 1 2 1 Sm-150 0.000000 0.000000 -63 1 2 1 Sm-151 0.000000 0.000000 -64 1 2 1 Sm-152 0.000000 0.000000 -65 1 2 1 Eu-153 0.000000 0.000000 -66 1 2 1 Gd-155 0.000000 0.000000 -67 1 2 1 O-16 0.001948 0.001952 -0 1 2 2 U-234 0.000000 0.000000 -1 1 2 2 U-235 0.010470 0.006106 -2 1 2 2 U-236 0.000000 0.000000 -3 1 2 2 U-238 0.208109 0.039197 -4 1 2 2 Np-237 0.000000 0.000000 -5 1 2 2 Pu-238 0.000000 0.000000 -6 1 2 2 Pu-239 0.000000 0.000000 -7 1 2 2 Pu-240 0.000000 0.000000 -8 1 2 2 Pu-241 0.000000 0.000000 -9 1 2 2 Pu-242 0.000000 0.000000 -10 1 2 2 Am-241 0.000000 0.000000 -11 1 2 2 Am-242m 0.000000 0.000000 -12 1 2 2 Am-243 0.000000 0.000000 -13 1 2 2 Cm-242 0.000000 0.000000 -14 1 2 2 Cm-243 0.000000 0.000000 -15 1 2 2 Cm-244 0.000000 0.000000 -16 1 2 2 Cm-245 0.000000 0.000000 -17 1 2 2 Mo-95 0.000302 0.002551 -18 1 2 2 Tc-99 0.003544 0.002528 -19 1 2 2 Ru-101 0.000000 0.000000 -20 1 2 2 Ru-103 0.000000 0.000000 -21 1 2 2 Ag-109 0.000000 0.000000 -22 1 2 2 Xe-135 0.000000 0.000000 -23 1 2 2 Cs-133 0.000000 0.000000 -24 1 2 2 Nd-143 0.002636 0.002073 -25 1 2 2 Nd-145 0.000000 0.000000 -26 1 2 2 Sm-147 0.000000 0.000000 -27 1 2 2 Sm-149 0.000000 0.000000 -28 1 2 2 Sm-150 0.000000 0.000000 -29 1 2 2 Sm-151 0.000000 0.000000 -30 1 2 2 Sm-152 0.000000 0.000000 -31 1 2 2 Eu-153 0.001686 0.001968 -32 1 2 2 Gd-155 0.000000 0.000000 -33 1 2 2 O-16 0.152859 0.022894 material group out nuclide mean std. dev. +34 2 1 1 U-234 0.000000 0.000000 +35 2 1 1 U-235 0.000000 0.000000 +36 2 1 1 U-236 0.000000 0.000000 +37 2 1 1 U-238 0.000000 0.000000 +38 2 1 1 Np-237 0.000000 0.000000 +39 2 1 1 Pu-238 0.000000 0.000000 +40 2 1 1 Pu-239 0.000000 0.000000 +41 2 1 1 Pu-240 0.000000 0.000000 +42 2 1 1 Pu-241 0.000000 0.000000 +43 2 1 1 Pu-242 0.000000 0.000000 +44 2 1 1 Am-241 0.000000 0.000000 +45 2 1 1 Am-242m 0.000000 0.000000 +46 2 1 1 Am-243 0.000000 0.000000 +47 2 1 1 Cm-242 0.000000 0.000000 +48 2 1 1 Cm-243 0.000000 0.000000 +49 2 1 1 Cm-244 0.000000 0.000000 +50 2 1 1 Cm-245 0.000000 0.000000 +51 2 1 1 Mo-95 0.000000 0.000000 +52 2 1 1 Tc-99 0.000000 0.000000 +53 2 1 1 Ru-101 0.000000 0.000000 +54 2 1 1 Ru-103 0.000000 0.000000 +55 2 1 1 Ag-109 0.000000 0.000000 +56 2 1 1 Xe-135 0.000000 0.000000 +57 2 1 1 Cs-133 0.000000 0.000000 +58 2 1 1 Nd-143 0.000000 0.000000 +59 2 1 1 Nd-145 0.000000 0.000000 +60 2 1 1 Sm-147 0.000000 0.000000 +61 2 1 1 Sm-149 0.000000 0.000000 +62 2 1 1 Sm-150 0.000000 0.000000 +63 2 1 1 Sm-151 0.000000 0.000000 +64 2 1 1 Sm-152 0.000000 0.000000 +65 2 1 1 Eu-153 0.000000 0.000000 +66 2 1 1 Gd-155 0.000000 0.000000 +67 2 1 1 O-16 0.001948 0.001952 +0 2 1 2 U-234 0.000000 0.000000 +1 2 1 2 U-235 0.010470 0.006106 +2 2 1 2 U-236 0.000000 0.000000 +3 2 1 2 U-238 0.208109 0.039197 +4 2 1 2 Np-237 0.000000 0.000000 +5 2 1 2 Pu-238 0.000000 0.000000 +6 2 1 2 Pu-239 0.000000 0.000000 +7 2 1 2 Pu-240 0.000000 0.000000 +8 2 1 2 Pu-241 0.000000 0.000000 +9 2 1 2 Pu-242 0.000000 0.000000 +10 2 1 2 Am-241 0.000000 0.000000 +11 2 1 2 Am-242m 0.000000 0.000000 +12 2 1 2 Am-243 0.000000 0.000000 +13 2 1 2 Cm-242 0.000000 0.000000 +14 2 1 2 Cm-243 0.000000 0.000000 +15 2 1 2 Cm-244 0.000000 0.000000 +16 2 1 2 Cm-245 0.000000 0.000000 +17 2 1 2 Mo-95 0.000302 0.002551 +18 2 1 2 Tc-99 0.003544 0.002528 +19 2 1 2 Ru-101 0.000000 0.000000 +20 2 1 2 Ru-103 0.000000 0.000000 +21 2 1 2 Ag-109 0.000000 0.000000 +22 2 1 2 Xe-135 0.000000 0.000000 +23 2 1 2 Cs-133 0.000000 0.000000 +24 2 1 2 Nd-143 0.002636 0.002073 +25 2 1 2 Nd-145 0.000000 0.000000 +26 2 1 2 Sm-147 0.000000 0.000000 +27 2 1 2 Sm-149 0.000000 0.000000 +28 2 1 2 Sm-150 0.000000 0.000000 +29 2 1 2 Sm-151 0.000000 0.000000 +30 2 1 2 Sm-152 0.000000 0.000000 +31 2 1 2 Eu-153 0.001686 0.001968 +32 2 1 2 Gd-155 0.000000 0.000000 +33 2 1 2 O-16 0.152859 0.022894 material group out nuclide mean std. dev. 34 1 1 U-234 0 0.000000 35 1 1 U-235 1 0.127079 36 1 1 U-236 0 0.000000 @@ -738,175 +738,175 @@ 23 5 2 Cr-54 0 0 24 5 2 C-Nat 0 0 25 5 2 Cu-63 0 0 -26 5 2 Cu-65 0 0 material group in nuclide mean std. dev. -21 6 1 H-1 0 0 -22 6 1 O-16 0 0 -23 6 1 B-10 0 0 -24 6 1 B-11 0 0 -25 6 1 Fe-54 0 0 -26 6 1 Fe-56 0 0 -27 6 1 Fe-57 0 0 -28 6 1 Fe-58 0 0 -29 6 1 Ni-58 0 0 -30 6 1 Ni-60 0 0 -31 6 1 Ni-61 0 0 -32 6 1 Ni-62 0 0 -33 6 1 Ni-64 0 0 -34 6 1 Mn-55 0 0 -35 6 1 Si-28 0 0 -36 6 1 Si-29 0 0 -37 6 1 Si-30 0 0 -38 6 1 Cr-50 0 0 -39 6 1 Cr-52 0 0 -40 6 1 Cr-53 0 0 -41 6 1 Cr-54 0 0 -0 6 2 H-1 0 0 -1 6 2 O-16 0 0 -2 6 2 B-10 0 0 -3 6 2 B-11 0 0 -4 6 2 Fe-54 0 0 -5 6 2 Fe-56 0 0 -6 6 2 Fe-57 0 0 -7 6 2 Fe-58 0 0 -8 6 2 Ni-58 0 0 -9 6 2 Ni-60 0 0 -10 6 2 Ni-61 0 0 -11 6 2 Ni-62 0 0 -12 6 2 Ni-64 0 0 -13 6 2 Mn-55 0 0 -14 6 2 Si-28 0 0 -15 6 2 Si-29 0 0 -16 6 2 Si-30 0 0 -17 6 2 Cr-50 0 0 -18 6 2 Cr-52 0 0 -19 6 2 Cr-53 0 0 -20 6 2 Cr-54 0 0 material group in nuclide mean std. dev. -21 6 1 H-1 0 0 -22 6 1 O-16 0 0 -23 6 1 B-10 0 0 -24 6 1 B-11 0 0 -25 6 1 Fe-54 0 0 -26 6 1 Fe-56 0 0 -27 6 1 Fe-57 0 0 -28 6 1 Fe-58 0 0 -29 6 1 Ni-58 0 0 -30 6 1 Ni-60 0 0 -31 6 1 Ni-61 0 0 -32 6 1 Ni-62 0 0 -33 6 1 Ni-64 0 0 -34 6 1 Mn-55 0 0 -35 6 1 Si-28 0 0 -36 6 1 Si-29 0 0 -37 6 1 Si-30 0 0 -38 6 1 Cr-50 0 0 -39 6 1 Cr-52 0 0 -40 6 1 Cr-53 0 0 -41 6 1 Cr-54 0 0 -0 6 2 H-1 0 0 -1 6 2 O-16 0 0 -2 6 2 B-10 0 0 -3 6 2 B-11 0 0 -4 6 2 Fe-54 0 0 -5 6 2 Fe-56 0 0 -6 6 2 Fe-57 0 0 -7 6 2 Fe-58 0 0 -8 6 2 Ni-58 0 0 -9 6 2 Ni-60 0 0 -10 6 2 Ni-61 0 0 -11 6 2 Ni-62 0 0 -12 6 2 Ni-64 0 0 -13 6 2 Mn-55 0 0 -14 6 2 Si-28 0 0 -15 6 2 Si-29 0 0 -16 6 2 Si-30 0 0 -17 6 2 Cr-50 0 0 -18 6 2 Cr-52 0 0 -19 6 2 Cr-53 0 0 -20 6 2 Cr-54 0 0 material group in group out nuclide mean std. dev. -63 6 1 1 H-1 0 0 -64 6 1 1 O-16 0 0 -65 6 1 1 B-10 0 0 -66 6 1 1 B-11 0 0 -67 6 1 1 Fe-54 0 0 -68 6 1 1 Fe-56 0 0 -69 6 1 1 Fe-57 0 0 -70 6 1 1 Fe-58 0 0 -71 6 1 1 Ni-58 0 0 -72 6 1 1 Ni-60 0 0 -73 6 1 1 Ni-61 0 0 -74 6 1 1 Ni-62 0 0 -75 6 1 1 Ni-64 0 0 -76 6 1 1 Mn-55 0 0 -77 6 1 1 Si-28 0 0 -78 6 1 1 Si-29 0 0 -79 6 1 1 Si-30 0 0 -80 6 1 1 Cr-50 0 0 -81 6 1 1 Cr-52 0 0 -82 6 1 1 Cr-53 0 0 -83 6 1 1 Cr-54 0 0 -42 6 1 2 H-1 0 0 -43 6 1 2 O-16 0 0 -44 6 1 2 B-10 0 0 -45 6 1 2 B-11 0 0 -46 6 1 2 Fe-54 0 0 -47 6 1 2 Fe-56 0 0 -48 6 1 2 Fe-57 0 0 -49 6 1 2 Fe-58 0 0 -50 6 1 2 Ni-58 0 0 -51 6 1 2 Ni-60 0 0 -52 6 1 2 Ni-61 0 0 -53 6 1 2 Ni-62 0 0 -54 6 1 2 Ni-64 0 0 -55 6 1 2 Mn-55 0 0 -56 6 1 2 Si-28 0 0 -57 6 1 2 Si-29 0 0 -58 6 1 2 Si-30 0 0 -59 6 1 2 Cr-50 0 0 -60 6 1 2 Cr-52 0 0 -61 6 1 2 Cr-53 0 0 -62 6 1 2 Cr-54 0 0 -21 6 2 1 H-1 0 0 -22 6 2 1 O-16 0 0 -23 6 2 1 B-10 0 0 -24 6 2 1 B-11 0 0 -25 6 2 1 Fe-54 0 0 -26 6 2 1 Fe-56 0 0 -27 6 2 1 Fe-57 0 0 -28 6 2 1 Fe-58 0 0 -29 6 2 1 Ni-58 0 0 -30 6 2 1 Ni-60 0 0 -31 6 2 1 Ni-61 0 0 -32 6 2 1 Ni-62 0 0 -33 6 2 1 Ni-64 0 0 -34 6 2 1 Mn-55 0 0 -35 6 2 1 Si-28 0 0 -36 6 2 1 Si-29 0 0 -37 6 2 1 Si-30 0 0 -38 6 2 1 Cr-50 0 0 -39 6 2 1 Cr-52 0 0 -40 6 2 1 Cr-53 0 0 -41 6 2 1 Cr-54 0 0 -0 6 2 2 H-1 0 0 -1 6 2 2 O-16 0 0 -2 6 2 2 B-10 0 0 -3 6 2 2 B-11 0 0 -4 6 2 2 Fe-54 0 0 -5 6 2 2 Fe-56 0 0 -6 6 2 2 Fe-57 0 0 -7 6 2 2 Fe-58 0 0 -8 6 2 2 Ni-58 0 0 -9 6 2 2 Ni-60 0 0 -10 6 2 2 Ni-61 0 0 -11 6 2 2 Ni-62 0 0 -12 6 2 2 Ni-64 0 0 -13 6 2 2 Mn-55 0 0 -14 6 2 2 Si-28 0 0 -15 6 2 2 Si-29 0 0 -16 6 2 2 Si-30 0 0 -17 6 2 2 Cr-50 0 0 -18 6 2 2 Cr-52 0 0 -19 6 2 2 Cr-53 0 0 -20 6 2 2 Cr-54 0 0 material group out nuclide mean std. dev. +26 5 2 Cu-65 0 0 group in material nuclide mean std. dev. +21 1 6 H-1 0 0 +22 1 6 O-16 0 0 +23 1 6 B-10 0 0 +24 1 6 B-11 0 0 +25 1 6 Fe-54 0 0 +26 1 6 Fe-56 0 0 +27 1 6 Fe-57 0 0 +28 1 6 Fe-58 0 0 +29 1 6 Ni-58 0 0 +30 1 6 Ni-60 0 0 +31 1 6 Ni-61 0 0 +32 1 6 Ni-62 0 0 +33 1 6 Ni-64 0 0 +34 1 6 Mn-55 0 0 +35 1 6 Si-28 0 0 +36 1 6 Si-29 0 0 +37 1 6 Si-30 0 0 +38 1 6 Cr-50 0 0 +39 1 6 Cr-52 0 0 +40 1 6 Cr-53 0 0 +41 1 6 Cr-54 0 0 +0 2 6 H-1 0 0 +1 2 6 O-16 0 0 +2 2 6 B-10 0 0 +3 2 6 B-11 0 0 +4 2 6 Fe-54 0 0 +5 2 6 Fe-56 0 0 +6 2 6 Fe-57 0 0 +7 2 6 Fe-58 0 0 +8 2 6 Ni-58 0 0 +9 2 6 Ni-60 0 0 +10 2 6 Ni-61 0 0 +11 2 6 Ni-62 0 0 +12 2 6 Ni-64 0 0 +13 2 6 Mn-55 0 0 +14 2 6 Si-28 0 0 +15 2 6 Si-29 0 0 +16 2 6 Si-30 0 0 +17 2 6 Cr-50 0 0 +18 2 6 Cr-52 0 0 +19 2 6 Cr-53 0 0 +20 2 6 Cr-54 0 0 group in material nuclide mean std. dev. +21 1 6 H-1 0 0 +22 1 6 O-16 0 0 +23 1 6 B-10 0 0 +24 1 6 B-11 0 0 +25 1 6 Fe-54 0 0 +26 1 6 Fe-56 0 0 +27 1 6 Fe-57 0 0 +28 1 6 Fe-58 0 0 +29 1 6 Ni-58 0 0 +30 1 6 Ni-60 0 0 +31 1 6 Ni-61 0 0 +32 1 6 Ni-62 0 0 +33 1 6 Ni-64 0 0 +34 1 6 Mn-55 0 0 +35 1 6 Si-28 0 0 +36 1 6 Si-29 0 0 +37 1 6 Si-30 0 0 +38 1 6 Cr-50 0 0 +39 1 6 Cr-52 0 0 +40 1 6 Cr-53 0 0 +41 1 6 Cr-54 0 0 +0 2 6 H-1 0 0 +1 2 6 O-16 0 0 +2 2 6 B-10 0 0 +3 2 6 B-11 0 0 +4 2 6 Fe-54 0 0 +5 2 6 Fe-56 0 0 +6 2 6 Fe-57 0 0 +7 2 6 Fe-58 0 0 +8 2 6 Ni-58 0 0 +9 2 6 Ni-60 0 0 +10 2 6 Ni-61 0 0 +11 2 6 Ni-62 0 0 +12 2 6 Ni-64 0 0 +13 2 6 Mn-55 0 0 +14 2 6 Si-28 0 0 +15 2 6 Si-29 0 0 +16 2 6 Si-30 0 0 +17 2 6 Cr-50 0 0 +18 2 6 Cr-52 0 0 +19 2 6 Cr-53 0 0 +20 2 6 Cr-54 0 0 group in material group out nuclide mean std. dev. +63 1 6 1 H-1 0 0 +64 1 6 1 O-16 0 0 +65 1 6 1 B-10 0 0 +66 1 6 1 B-11 0 0 +67 1 6 1 Fe-54 0 0 +68 1 6 1 Fe-56 0 0 +69 1 6 1 Fe-57 0 0 +70 1 6 1 Fe-58 0 0 +71 1 6 1 Ni-58 0 0 +72 1 6 1 Ni-60 0 0 +73 1 6 1 Ni-61 0 0 +74 1 6 1 Ni-62 0 0 +75 1 6 1 Ni-64 0 0 +76 1 6 1 Mn-55 0 0 +77 1 6 1 Si-28 0 0 +78 1 6 1 Si-29 0 0 +79 1 6 1 Si-30 0 0 +80 1 6 1 Cr-50 0 0 +81 1 6 1 Cr-52 0 0 +82 1 6 1 Cr-53 0 0 +83 1 6 1 Cr-54 0 0 +42 1 6 2 H-1 0 0 +43 1 6 2 O-16 0 0 +44 1 6 2 B-10 0 0 +45 1 6 2 B-11 0 0 +46 1 6 2 Fe-54 0 0 +47 1 6 2 Fe-56 0 0 +48 1 6 2 Fe-57 0 0 +49 1 6 2 Fe-58 0 0 +50 1 6 2 Ni-58 0 0 +51 1 6 2 Ni-60 0 0 +52 1 6 2 Ni-61 0 0 +53 1 6 2 Ni-62 0 0 +54 1 6 2 Ni-64 0 0 +55 1 6 2 Mn-55 0 0 +56 1 6 2 Si-28 0 0 +57 1 6 2 Si-29 0 0 +58 1 6 2 Si-30 0 0 +59 1 6 2 Cr-50 0 0 +60 1 6 2 Cr-52 0 0 +61 1 6 2 Cr-53 0 0 +62 1 6 2 Cr-54 0 0 +21 2 6 1 H-1 0 0 +22 2 6 1 O-16 0 0 +23 2 6 1 B-10 0 0 +24 2 6 1 B-11 0 0 +25 2 6 1 Fe-54 0 0 +26 2 6 1 Fe-56 0 0 +27 2 6 1 Fe-57 0 0 +28 2 6 1 Fe-58 0 0 +29 2 6 1 Ni-58 0 0 +30 2 6 1 Ni-60 0 0 +31 2 6 1 Ni-61 0 0 +32 2 6 1 Ni-62 0 0 +33 2 6 1 Ni-64 0 0 +34 2 6 1 Mn-55 0 0 +35 2 6 1 Si-28 0 0 +36 2 6 1 Si-29 0 0 +37 2 6 1 Si-30 0 0 +38 2 6 1 Cr-50 0 0 +39 2 6 1 Cr-52 0 0 +40 2 6 1 Cr-53 0 0 +41 2 6 1 Cr-54 0 0 +0 2 6 2 H-1 0 0 +1 2 6 2 O-16 0 0 +2 2 6 2 B-10 0 0 +3 2 6 2 B-11 0 0 +4 2 6 2 Fe-54 0 0 +5 2 6 2 Fe-56 0 0 +6 2 6 2 Fe-57 0 0 +7 2 6 2 Fe-58 0 0 +8 2 6 2 Ni-58 0 0 +9 2 6 2 Ni-60 0 0 +10 2 6 2 Ni-61 0 0 +11 2 6 2 Ni-62 0 0 +12 2 6 2 Ni-64 0 0 +13 2 6 2 Mn-55 0 0 +14 2 6 2 Si-28 0 0 +15 2 6 2 Si-29 0 0 +16 2 6 2 Si-30 0 0 +17 2 6 2 Cr-50 0 0 +18 2 6 2 Cr-52 0 0 +19 2 6 2 Cr-53 0 0 +20 2 6 2 Cr-54 0 0 material group out nuclide mean std. dev. 21 6 1 H-1 0 0 22 6 1 O-16 0 0 23 6 1 B-10 0 0 @@ -1368,175 +1368,175 @@ 17 8 2 Cr-50 0 0 18 8 2 Cr-52 0 0 19 8 2 Cr-53 0 0 -20 8 2 Cr-54 0 0 material group in nuclide mean std. dev. -21 9 1 H-1 0.106160 0.179178 -22 9 1 O-16 0.272020 0.171699 -23 9 1 B-10 0.000000 0.000000 -24 9 1 B-11 0.000000 0.000000 -25 9 1 Fe-54 0.000000 0.000000 -26 9 1 Fe-56 0.000000 0.000000 -27 9 1 Fe-57 0.000000 0.000000 -28 9 1 Fe-58 0.000000 0.000000 -29 9 1 Ni-58 0.000000 0.000000 -30 9 1 Ni-60 0.000000 0.000000 -31 9 1 Ni-61 0.000000 0.000000 -32 9 1 Ni-62 0.000000 0.000000 -33 9 1 Ni-64 0.000000 0.000000 -34 9 1 Mn-55 0.085133 0.082479 -35 9 1 Si-28 0.000000 0.000000 -36 9 1 Si-29 0.000000 0.000000 -37 9 1 Si-30 0.000000 0.000000 -38 9 1 Cr-50 0.000000 0.000000 -39 9 1 Cr-52 0.000000 0.000000 -40 9 1 Cr-53 0.040723 0.079827 -41 9 1 Cr-54 0.000000 0.000000 -0 9 2 H-1 1.417955 2.158027 -1 9 2 O-16 0.000000 0.000000 -2 9 2 B-10 0.269141 0.380622 -3 9 2 B-11 0.000000 0.000000 -4 9 2 Fe-54 0.000000 0.000000 -5 9 2 Fe-56 0.000000 0.000000 -6 9 2 Fe-57 0.000000 0.000000 -7 9 2 Fe-58 0.000000 0.000000 -8 9 2 Ni-58 0.000000 0.000000 -9 9 2 Ni-60 0.000000 0.000000 -10 9 2 Ni-61 0.000000 0.000000 -11 9 2 Ni-62 0.000000 0.000000 -12 9 2 Ni-64 0.000000 0.000000 -13 9 2 Mn-55 0.000000 0.000000 -14 9 2 Si-28 0.000000 0.000000 -15 9 2 Si-29 0.000000 0.000000 -16 9 2 Si-30 0.000000 0.000000 -17 9 2 Cr-50 0.000000 0.000000 -18 9 2 Cr-52 0.000000 0.000000 -19 9 2 Cr-53 0.000000 0.000000 -20 9 2 Cr-54 0.000000 0.000000 material group in nuclide mean std. dev. -21 9 1 H-1 0 0 -22 9 1 O-16 0 0 -23 9 1 B-10 0 0 -24 9 1 B-11 0 0 -25 9 1 Fe-54 0 0 -26 9 1 Fe-56 0 0 -27 9 1 Fe-57 0 0 -28 9 1 Fe-58 0 0 -29 9 1 Ni-58 0 0 -30 9 1 Ni-60 0 0 -31 9 1 Ni-61 0 0 -32 9 1 Ni-62 0 0 -33 9 1 Ni-64 0 0 -34 9 1 Mn-55 0 0 -35 9 1 Si-28 0 0 -36 9 1 Si-29 0 0 -37 9 1 Si-30 0 0 -38 9 1 Cr-50 0 0 -39 9 1 Cr-52 0 0 -40 9 1 Cr-53 0 0 -41 9 1 Cr-54 0 0 -0 9 2 H-1 0 0 -1 9 2 O-16 0 0 -2 9 2 B-10 0 0 -3 9 2 B-11 0 0 -4 9 2 Fe-54 0 0 -5 9 2 Fe-56 0 0 -6 9 2 Fe-57 0 0 -7 9 2 Fe-58 0 0 -8 9 2 Ni-58 0 0 -9 9 2 Ni-60 0 0 -10 9 2 Ni-61 0 0 -11 9 2 Ni-62 0 0 -12 9 2 Ni-64 0 0 -13 9 2 Mn-55 0 0 -14 9 2 Si-28 0 0 -15 9 2 Si-29 0 0 -16 9 2 Si-30 0 0 -17 9 2 Cr-50 0 0 -18 9 2 Cr-52 0 0 -19 9 2 Cr-53 0 0 -20 9 2 Cr-54 0 0 material group in group out nuclide mean std. dev. -63 9 1 1 H-1 0.106160 0.179178 -64 9 1 1 O-16 0.272020 0.171699 -65 9 1 1 B-10 0.000000 0.000000 -66 9 1 1 B-11 0.000000 0.000000 -67 9 1 1 Fe-54 0.000000 0.000000 -68 9 1 1 Fe-56 0.000000 0.000000 -69 9 1 1 Fe-57 0.000000 0.000000 -70 9 1 1 Fe-58 0.000000 0.000000 -71 9 1 1 Ni-58 0.000000 0.000000 -72 9 1 1 Ni-60 0.000000 0.000000 -73 9 1 1 Ni-61 0.000000 0.000000 -74 9 1 1 Ni-62 0.000000 0.000000 -75 9 1 1 Ni-64 0.000000 0.000000 -76 9 1 1 Mn-55 0.085133 0.082479 -77 9 1 1 Si-28 0.000000 0.000000 -78 9 1 1 Si-29 0.000000 0.000000 -79 9 1 1 Si-30 0.000000 0.000000 -80 9 1 1 Cr-50 0.000000 0.000000 -81 9 1 1 Cr-52 0.000000 0.000000 -82 9 1 1 Cr-53 0.040723 0.079827 -83 9 1 1 Cr-54 0.000000 0.000000 -42 9 1 2 H-1 0.000000 0.000000 -43 9 1 2 O-16 0.000000 0.000000 -44 9 1 2 B-10 0.000000 0.000000 -45 9 1 2 B-11 0.000000 0.000000 -46 9 1 2 Fe-54 0.000000 0.000000 -47 9 1 2 Fe-56 0.000000 0.000000 -48 9 1 2 Fe-57 0.000000 0.000000 -49 9 1 2 Fe-58 0.000000 0.000000 -50 9 1 2 Ni-58 0.000000 0.000000 -51 9 1 2 Ni-60 0.000000 0.000000 -52 9 1 2 Ni-61 0.000000 0.000000 -53 9 1 2 Ni-62 0.000000 0.000000 -54 9 1 2 Ni-64 0.000000 0.000000 -55 9 1 2 Mn-55 0.000000 0.000000 -56 9 1 2 Si-28 0.000000 0.000000 -57 9 1 2 Si-29 0.000000 0.000000 -58 9 1 2 Si-30 0.000000 0.000000 -59 9 1 2 Cr-50 0.000000 0.000000 -60 9 1 2 Cr-52 0.000000 0.000000 -61 9 1 2 Cr-53 0.000000 0.000000 -62 9 1 2 Cr-54 0.000000 0.000000 -21 9 2 1 H-1 0.000000 0.000000 -22 9 2 1 O-16 0.000000 0.000000 -23 9 2 1 B-10 0.000000 0.000000 -24 9 2 1 B-11 0.000000 0.000000 -25 9 2 1 Fe-54 0.000000 0.000000 -26 9 2 1 Fe-56 0.000000 0.000000 -27 9 2 1 Fe-57 0.000000 0.000000 -28 9 2 1 Fe-58 0.000000 0.000000 -29 9 2 1 Ni-58 0.000000 0.000000 -30 9 2 1 Ni-60 0.000000 0.000000 -31 9 2 1 Ni-61 0.000000 0.000000 -32 9 2 1 Ni-62 0.000000 0.000000 -33 9 2 1 Ni-64 0.000000 0.000000 -34 9 2 1 Mn-55 0.000000 0.000000 -35 9 2 1 Si-28 0.000000 0.000000 -36 9 2 1 Si-29 0.000000 0.000000 -37 9 2 1 Si-30 0.000000 0.000000 -38 9 2 1 Cr-50 0.000000 0.000000 -39 9 2 1 Cr-52 0.000000 0.000000 -40 9 2 1 Cr-53 0.000000 0.000000 -41 9 2 1 Cr-54 0.000000 0.000000 -0 9 2 2 H-1 1.417955 2.158027 -1 9 2 2 O-16 0.000000 0.000000 -2 9 2 2 B-10 0.000000 0.000000 -3 9 2 2 B-11 0.000000 0.000000 -4 9 2 2 Fe-54 0.000000 0.000000 -5 9 2 2 Fe-56 0.000000 0.000000 -6 9 2 2 Fe-57 0.000000 0.000000 -7 9 2 2 Fe-58 0.000000 0.000000 -8 9 2 2 Ni-58 0.000000 0.000000 -9 9 2 2 Ni-60 0.000000 0.000000 -10 9 2 2 Ni-61 0.000000 0.000000 -11 9 2 2 Ni-62 0.000000 0.000000 -12 9 2 2 Ni-64 0.000000 0.000000 -13 9 2 2 Mn-55 0.000000 0.000000 -14 9 2 2 Si-28 0.000000 0.000000 -15 9 2 2 Si-29 0.000000 0.000000 -16 9 2 2 Si-30 0.000000 0.000000 -17 9 2 2 Cr-50 0.000000 0.000000 -18 9 2 2 Cr-52 0.000000 0.000000 -19 9 2 2 Cr-53 0.000000 0.000000 -20 9 2 2 Cr-54 0.000000 0.000000 material group out nuclide mean std. dev. +20 8 2 Cr-54 0 0 group in material nuclide mean std. dev. +21 1 9 H-1 0.106160 0.179178 +22 1 9 O-16 0.272020 0.171699 +23 1 9 B-10 0.000000 0.000000 +24 1 9 B-11 0.000000 0.000000 +25 1 9 Fe-54 0.000000 0.000000 +26 1 9 Fe-56 0.000000 0.000000 +27 1 9 Fe-57 0.000000 0.000000 +28 1 9 Fe-58 0.000000 0.000000 +29 1 9 Ni-58 0.000000 0.000000 +30 1 9 Ni-60 0.000000 0.000000 +31 1 9 Ni-61 0.000000 0.000000 +32 1 9 Ni-62 0.000000 0.000000 +33 1 9 Ni-64 0.000000 0.000000 +34 1 9 Mn-55 0.085133 0.082479 +35 1 9 Si-28 0.000000 0.000000 +36 1 9 Si-29 0.000000 0.000000 +37 1 9 Si-30 0.000000 0.000000 +38 1 9 Cr-50 0.000000 0.000000 +39 1 9 Cr-52 0.000000 0.000000 +40 1 9 Cr-53 0.040723 0.079827 +41 1 9 Cr-54 0.000000 0.000000 +0 2 9 H-1 1.417955 2.158027 +1 2 9 O-16 0.000000 0.000000 +2 2 9 B-10 0.269141 0.380622 +3 2 9 B-11 0.000000 0.000000 +4 2 9 Fe-54 0.000000 0.000000 +5 2 9 Fe-56 0.000000 0.000000 +6 2 9 Fe-57 0.000000 0.000000 +7 2 9 Fe-58 0.000000 0.000000 +8 2 9 Ni-58 0.000000 0.000000 +9 2 9 Ni-60 0.000000 0.000000 +10 2 9 Ni-61 0.000000 0.000000 +11 2 9 Ni-62 0.000000 0.000000 +12 2 9 Ni-64 0.000000 0.000000 +13 2 9 Mn-55 0.000000 0.000000 +14 2 9 Si-28 0.000000 0.000000 +15 2 9 Si-29 0.000000 0.000000 +16 2 9 Si-30 0.000000 0.000000 +17 2 9 Cr-50 0.000000 0.000000 +18 2 9 Cr-52 0.000000 0.000000 +19 2 9 Cr-53 0.000000 0.000000 +20 2 9 Cr-54 0.000000 0.000000 group in material nuclide mean std. dev. +21 1 9 H-1 0 0 +22 1 9 O-16 0 0 +23 1 9 B-10 0 0 +24 1 9 B-11 0 0 +25 1 9 Fe-54 0 0 +26 1 9 Fe-56 0 0 +27 1 9 Fe-57 0 0 +28 1 9 Fe-58 0 0 +29 1 9 Ni-58 0 0 +30 1 9 Ni-60 0 0 +31 1 9 Ni-61 0 0 +32 1 9 Ni-62 0 0 +33 1 9 Ni-64 0 0 +34 1 9 Mn-55 0 0 +35 1 9 Si-28 0 0 +36 1 9 Si-29 0 0 +37 1 9 Si-30 0 0 +38 1 9 Cr-50 0 0 +39 1 9 Cr-52 0 0 +40 1 9 Cr-53 0 0 +41 1 9 Cr-54 0 0 +0 2 9 H-1 0 0 +1 2 9 O-16 0 0 +2 2 9 B-10 0 0 +3 2 9 B-11 0 0 +4 2 9 Fe-54 0 0 +5 2 9 Fe-56 0 0 +6 2 9 Fe-57 0 0 +7 2 9 Fe-58 0 0 +8 2 9 Ni-58 0 0 +9 2 9 Ni-60 0 0 +10 2 9 Ni-61 0 0 +11 2 9 Ni-62 0 0 +12 2 9 Ni-64 0 0 +13 2 9 Mn-55 0 0 +14 2 9 Si-28 0 0 +15 2 9 Si-29 0 0 +16 2 9 Si-30 0 0 +17 2 9 Cr-50 0 0 +18 2 9 Cr-52 0 0 +19 2 9 Cr-53 0 0 +20 2 9 Cr-54 0 0 group in material group out nuclide mean std. dev. +63 1 9 1 H-1 0.106160 0.179178 +64 1 9 1 O-16 0.272020 0.171699 +65 1 9 1 B-10 0.000000 0.000000 +66 1 9 1 B-11 0.000000 0.000000 +67 1 9 1 Fe-54 0.000000 0.000000 +68 1 9 1 Fe-56 0.000000 0.000000 +69 1 9 1 Fe-57 0.000000 0.000000 +70 1 9 1 Fe-58 0.000000 0.000000 +71 1 9 1 Ni-58 0.000000 0.000000 +72 1 9 1 Ni-60 0.000000 0.000000 +73 1 9 1 Ni-61 0.000000 0.000000 +74 1 9 1 Ni-62 0.000000 0.000000 +75 1 9 1 Ni-64 0.000000 0.000000 +76 1 9 1 Mn-55 0.085133 0.082479 +77 1 9 1 Si-28 0.000000 0.000000 +78 1 9 1 Si-29 0.000000 0.000000 +79 1 9 1 Si-30 0.000000 0.000000 +80 1 9 1 Cr-50 0.000000 0.000000 +81 1 9 1 Cr-52 0.000000 0.000000 +82 1 9 1 Cr-53 0.040723 0.079827 +83 1 9 1 Cr-54 0.000000 0.000000 +42 1 9 2 H-1 0.000000 0.000000 +43 1 9 2 O-16 0.000000 0.000000 +44 1 9 2 B-10 0.000000 0.000000 +45 1 9 2 B-11 0.000000 0.000000 +46 1 9 2 Fe-54 0.000000 0.000000 +47 1 9 2 Fe-56 0.000000 0.000000 +48 1 9 2 Fe-57 0.000000 0.000000 +49 1 9 2 Fe-58 0.000000 0.000000 +50 1 9 2 Ni-58 0.000000 0.000000 +51 1 9 2 Ni-60 0.000000 0.000000 +52 1 9 2 Ni-61 0.000000 0.000000 +53 1 9 2 Ni-62 0.000000 0.000000 +54 1 9 2 Ni-64 0.000000 0.000000 +55 1 9 2 Mn-55 0.000000 0.000000 +56 1 9 2 Si-28 0.000000 0.000000 +57 1 9 2 Si-29 0.000000 0.000000 +58 1 9 2 Si-30 0.000000 0.000000 +59 1 9 2 Cr-50 0.000000 0.000000 +60 1 9 2 Cr-52 0.000000 0.000000 +61 1 9 2 Cr-53 0.000000 0.000000 +62 1 9 2 Cr-54 0.000000 0.000000 +21 2 9 1 H-1 0.000000 0.000000 +22 2 9 1 O-16 0.000000 0.000000 +23 2 9 1 B-10 0.000000 0.000000 +24 2 9 1 B-11 0.000000 0.000000 +25 2 9 1 Fe-54 0.000000 0.000000 +26 2 9 1 Fe-56 0.000000 0.000000 +27 2 9 1 Fe-57 0.000000 0.000000 +28 2 9 1 Fe-58 0.000000 0.000000 +29 2 9 1 Ni-58 0.000000 0.000000 +30 2 9 1 Ni-60 0.000000 0.000000 +31 2 9 1 Ni-61 0.000000 0.000000 +32 2 9 1 Ni-62 0.000000 0.000000 +33 2 9 1 Ni-64 0.000000 0.000000 +34 2 9 1 Mn-55 0.000000 0.000000 +35 2 9 1 Si-28 0.000000 0.000000 +36 2 9 1 Si-29 0.000000 0.000000 +37 2 9 1 Si-30 0.000000 0.000000 +38 2 9 1 Cr-50 0.000000 0.000000 +39 2 9 1 Cr-52 0.000000 0.000000 +40 2 9 1 Cr-53 0.000000 0.000000 +41 2 9 1 Cr-54 0.000000 0.000000 +0 2 9 2 H-1 1.417955 2.158027 +1 2 9 2 O-16 0.000000 0.000000 +2 2 9 2 B-10 0.000000 0.000000 +3 2 9 2 B-11 0.000000 0.000000 +4 2 9 2 Fe-54 0.000000 0.000000 +5 2 9 2 Fe-56 0.000000 0.000000 +6 2 9 2 Fe-57 0.000000 0.000000 +7 2 9 2 Fe-58 0.000000 0.000000 +8 2 9 2 Ni-58 0.000000 0.000000 +9 2 9 2 Ni-60 0.000000 0.000000 +10 2 9 2 Ni-61 0.000000 0.000000 +11 2 9 2 Ni-62 0.000000 0.000000 +12 2 9 2 Ni-64 0.000000 0.000000 +13 2 9 2 Mn-55 0.000000 0.000000 +14 2 9 2 Si-28 0.000000 0.000000 +15 2 9 2 Si-29 0.000000 0.000000 +16 2 9 2 Si-30 0.000000 0.000000 +17 2 9 2 Cr-50 0.000000 0.000000 +18 2 9 2 Cr-52 0.000000 0.000000 +19 2 9 2 Cr-53 0.000000 0.000000 +20 2 9 2 Cr-54 0.000000 0.000000 material group out nuclide mean std. dev. 21 9 1 H-1 0 0 22 9 1 O-16 0 0 23 9 1 B-10 0 0 From fb9e676bb7facdd2a4d6a3aba8766c5fc56b6648 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 23 Nov 2015 09:16:38 -0500 Subject: [PATCH 06/49] changed inline to inplace in tallies.py --- openmc/tallies.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index f4b30d67f..77520750c 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1499,11 +1499,11 @@ class Tally(object): # If necessary, swap self filter if self_index != i: - self_copy.swap_filters(filter, self_copy.filters[i], inline=True) + 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], inline=True) + other_copy.swap_filters(filter, other_copy.filters[i], inplace=True) data = self_copy._align_tally_data(other_copy) @@ -1734,7 +1734,7 @@ class Tally(object): data['other']['std. dev.'] = other_std_dev return data - def swap_filters(self, filter1, filter2, inline=False): + def swap_filters(self, filter1, filter2, inplace=False): """Reverse the ordering of two filters in this tally This is a helper method for tally arithmetic which helps align the data @@ -1749,13 +1749,14 @@ class Tally(object): filter2 : Filter The filter to swap with filter1 - inline : bool, optional - Whether to inline operator or return new tally with swapped filters. + inplace : bool, optional + Whether to perform operation inplace or return new tally with the + filters swapped. Returns ------- swap_tally - If inline is false, a copy of this tally with the filters swapped. + If inplace is false, a copy of this tally with the filters swapped. Otherwise, nothing is returned. Raises @@ -1792,7 +1793,7 @@ class Tally(object): tally_copy = copy.deepcopy(self) # Set the swap tally - if inline: + if inplace: swap_tally = self else: swap_tally = copy.deepcopy(self) @@ -1857,7 +1858,7 @@ class Tally(object): indices = swap_tally.get_filter_indices(filters, filter_bins) swap_tally._std_dev[indices, :, :] = data - if not inline: + if not inplace: return swap_tally def __add__(self, other): From db550a05370bc81189134f9cc2fb1cab1596cc3d Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Tue, 24 Nov 2015 21:08:54 -0500 Subject: [PATCH 07/49] Fixed bug casting OpenCG rotations to integers is now double --- openmc/opencg_compatible.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 93c0e5fae..6430b2424 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -726,7 +726,7 @@ def get_openmc_cell(opencg_cell): openmc_cell.fill = get_openmc_material(fill) if opencg_cell.rotation: - rotation = np.asarray(opencg_cell.rotation, dtype=np.int) + rotation = np.asarray(opencg_cell.rotation, dtype=np.float64) openmc_cell.rotation = rotation if opencg_cell.translation: From a11950f94ae890f8c78b2be736ff006d71e19fc4 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Tue, 24 Nov 2015 22:01:12 -0500 Subject: [PATCH 08/49] Now over-riding openmc/opencg geometries in MGXS Library when loading from StatePoint --- openmc/mgxs/library.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 87c6665b2..fa49d24e6 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -361,6 +361,8 @@ class Library(object): raise ValueError(msg) self._sp_filename = statepoint._f.filename + self._openmc_geometry = statepoint.summary.openmc_geometry + self._opencg_geometry = None # Load tallies for each MGXS for each domain and mgxs type for domain in self.domains: From 70e7ce9b3bf27660055211296fe7d18fa2cf5ea2 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 25 Nov 2015 09:34:35 -0800 Subject: [PATCH 09/49] fixed issue with python 2 and 3 discrepancies for tally arithmetic tests --- openmc/tallies.py | 7 +- .../results_true.dat | 86 +++++++++---------- 2 files changed, 47 insertions(+), 46 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 77520750c..a97428565 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1488,9 +1488,10 @@ class Tally(object): other_copy = copy.deepcopy(other) # Find any shared filters between the two tallies - self_filters = set(self_copy.filters) - other_filters = set(other_copy.filters) - filter_intersect = self_filters.intersection(other_filters) + 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): diff --git a/tests/test_mgxs_library_condense/results_true.dat b/tests/test_mgxs_library_condense/results_true.dat index 58e0d14fc..45891fc30 100644 --- a/tests/test_mgxs_library_condense/results_true.dat +++ b/tests/test_mgxs_library_condense/results_true.dat @@ -1,49 +1,49 @@ - group in material nuclide mean std. dev. -0 1 1 total 0.419289 0.01638 group in material nuclide mean std. dev. -0 1 1 total 0.07774 0.003273 group in material group out nuclide mean std. dev. + material group in nuclide mean std. dev. +0 1 1 total 0.419289 0.01638 material group in nuclide mean std. dev. +0 1 1 total 0.07774 0.003273 material group in group out nuclide mean std. dev. 0 1 1 1 total 0.352665 0.015654 material group out nuclide mean std. dev. -0 1 1 total 1 0.119622 group in material nuclide mean std. dev. -0 1 2 total 0.247316 0.009562 group in material nuclide mean std. dev. -0 1 2 total 0 0 group in material group out nuclide mean std. dev. -0 1 2 1 total 0.244838 0.009996 material group out nuclide mean std. dev. -0 2 1 total 0 0 group in material nuclide mean std. dev. -0 1 3 total 0.409938 0.042262 group in material nuclide mean std. dev. -0 1 3 total 0 0 group in material group out nuclide mean std. dev. -0 1 3 1 total 0.403354 0.041386 material group out nuclide mean std. dev. -0 3 1 total 0 0 group in material nuclide mean std. dev. -0 1 4 total 0.344007 0.05352 group in material nuclide mean std. dev. -0 1 4 total 0 0 group in material group out nuclide mean std. dev. -0 1 4 1 total 0.340438 0.052067 material group out nuclide mean std. dev. -0 4 1 total 0 0 group in material nuclide mean std. dev. -0 1 5 total 0 0 group in material nuclide mean std. dev. -0 1 5 total 0 0 group in material group out nuclide mean std. dev. -0 1 5 1 total 0 0 material group out nuclide mean std. dev. -0 5 1 total 0 0 group in material nuclide mean std. dev. -0 1 6 total 0 0 group in material nuclide mean std. dev. -0 1 6 total 0 0 group in material group out nuclide mean std. dev. -0 1 6 1 total 0 0 material group out nuclide mean std. dev. +0 1 1 total 1 0.119622 material group in nuclide mean std. dev. +0 2 1 total 0.247316 0.009562 material group in nuclide mean std. dev. +0 2 1 total 0 0 material group in group out nuclide mean std. dev. +0 2 1 1 total 0.244838 0.009996 material group out nuclide mean std. dev. +0 2 1 total 0 0 material group in nuclide mean std. dev. +0 3 1 total 0.409938 0.042262 material group in nuclide mean std. dev. +0 3 1 total 0 0 material group in group out nuclide mean std. dev. +0 3 1 1 total 0.403354 0.041386 material group out nuclide mean std. dev. +0 3 1 total 0 0 material group in nuclide mean std. dev. +0 4 1 total 0.344007 0.05352 material group in nuclide mean std. dev. +0 4 1 total 0 0 material group in group out nuclide mean std. dev. +0 4 1 1 total 0.340438 0.052067 material group out nuclide mean std. dev. +0 4 1 total 0 0 material group in nuclide mean std. dev. +0 5 1 total 0 0 material group in nuclide mean std. dev. +0 5 1 total 0 0 material group in group out nuclide mean std. dev. +0 5 1 1 total 0 0 material group out nuclide mean std. dev. +0 5 1 total 0 0 material group in nuclide mean std. dev. +0 6 1 total 0 0 material group in nuclide mean std. dev. +0 6 1 total 0 0 material group in group out nuclide mean std. dev. +0 6 1 1 total 0 0 material group out nuclide mean std. dev. 0 6 1 total 0 0 material group in nuclide mean std. dev. 0 7 1 total 0 0 material group in nuclide mean std. dev. 0 7 1 total 0 0 material group in group out nuclide mean std. dev. 0 7 1 1 total 0 0 material group out nuclide mean std. dev. -0 7 1 total 0 0 group in material nuclide mean std. dev. -0 1 8 total 0 0 group in material nuclide mean std. dev. -0 1 8 total 0 0 group in material group out nuclide mean std. dev. -0 1 8 1 total 0 0 material group out nuclide mean std. dev. -0 8 1 total 0 0 group in material nuclide mean std. dev. -0 1 9 total 0.751873 0.559701 group in material nuclide mean std. dev. -0 1 9 total 0 0 group in material group out nuclide mean std. dev. -0 1 9 1 total 0.695491 0.50757 material group out nuclide mean std. dev. -0 9 1 total 0 0 group in material nuclide mean std. dev. -0 1 10 total 0 0 group in material nuclide mean std. dev. -0 1 10 total 0 0 group in material group out nuclide mean std. dev. -0 1 10 1 total 0 0 material group out nuclide mean std. dev. -0 10 1 total 0 0 group in material nuclide mean std. dev. -0 1 11 total 0.457329 0.403578 group in material nuclide mean std. dev. -0 1 11 total 0 0 group in material group out nuclide mean std. dev. -0 1 11 1 total 0.446737 0.392775 material group out nuclide mean std. dev. -0 11 1 total 0 0 group in material nuclide mean std. dev. -0 1 12 total 0.574978 0.38864 group in material nuclide mean std. dev. -0 1 12 total 0 0 group in material group out nuclide mean std. dev. -0 1 12 1 total 0.559478 0.377512 material group out nuclide mean std. dev. +0 7 1 total 0 0 material group in nuclide mean std. dev. +0 8 1 total 0 0 material group in nuclide mean std. dev. +0 8 1 total 0 0 material group in group out nuclide mean std. dev. +0 8 1 1 total 0 0 material group out nuclide mean std. dev. +0 8 1 total 0 0 material group in nuclide mean std. dev. +0 9 1 total 0.751873 0.559701 material group in nuclide mean std. dev. +0 9 1 total 0 0 material group in group out nuclide mean std. dev. +0 9 1 1 total 0.695491 0.50757 material group out nuclide mean std. dev. +0 9 1 total 0 0 material group in nuclide mean std. dev. +0 10 1 total 0 0 material group in nuclide mean std. dev. +0 10 1 total 0 0 material group in group out nuclide mean std. dev. +0 10 1 1 total 0 0 material group out nuclide mean std. dev. +0 10 1 total 0 0 material group in nuclide mean std. dev. +0 11 1 total 0.457329 0.403578 material group in nuclide mean std. dev. +0 11 1 total 0 0 material group in group out nuclide mean std. dev. +0 11 1 1 total 0.446737 0.392775 material group out nuclide mean std. dev. +0 11 1 total 0 0 material group in nuclide mean std. dev. +0 12 1 total 0.574978 0.38864 material group in nuclide mean std. dev. +0 12 1 total 0 0 material group in group out nuclide mean std. dev. +0 12 1 1 total 0.559478 0.377512 material group out nuclide mean std. dev. 0 12 1 total 0 0 \ No newline at end of file From 6de5e48186ef0d91a2d0eb75bcfb082d8884d4f9 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 25 Nov 2015 09:43:16 -0800 Subject: [PATCH 10/49] updated results_true.dat files for tests to reflect changes to tally arithmetic --- .../results_true.dat | 46 +- .../results_true.dat | 950 +++++++++--------- 2 files changed, 498 insertions(+), 498 deletions(-) diff --git a/tests/test_mgxs_library_no_nuclides/results_true.dat b/tests/test_mgxs_library_no_nuclides/results_true.dat index bd69a25a8..761851268 100644 --- a/tests/test_mgxs_library_no_nuclides/results_true.dat +++ b/tests/test_mgxs_library_no_nuclides/results_true.dat @@ -1,12 +1,12 @@ - group in material nuclide mean std. dev. + material group in nuclide mean std. dev. 1 1 1 total 0.384379 0.01649 -0 2 1 total 0.812087 0.07419 group in material nuclide mean std. dev. +0 1 2 total 0.812087 0.07419 material group in nuclide mean std. dev. 1 1 1 total 0.02127 0.000894 -0 2 1 total 0.69604 0.053458 group in material group out nuclide mean std. dev. +0 1 2 total 0.69604 0.053458 material group in group out nuclide mean std. dev. 3 1 1 1 total 0.349924 0.016649 2 1 1 2 total 0.000173 0.000173 -1 2 1 1 total 0.001948 0.001952 -0 2 1 2 total 0.379607 0.040078 material group out nuclide mean std. dev. +1 1 2 1 total 0.001948 0.001952 +0 1 2 2 total 0.379607 0.040078 material group out nuclide mean std. dev. 1 1 1 total 1 0.119622 0 1 2 total 0 0.000000 material group in nuclide mean std. dev. 1 2 1 total 0.245043 0.008827 @@ -48,15 +48,15 @@ 1 5 2 1 total 0 0 0 5 2 2 total 0 0 material group out nuclide mean std. dev. 1 5 1 total 0 0 -0 5 2 total 0 0 group in material nuclide mean std. dev. -1 1 6 total 0 0 -0 2 6 total 0 0 group in material nuclide mean std. dev. -1 1 6 total 0 0 -0 2 6 total 0 0 group in material group out nuclide mean std. dev. -3 1 6 1 total 0 0 -2 1 6 2 total 0 0 -1 2 6 1 total 0 0 -0 2 6 2 total 0 0 material group out nuclide mean std. dev. +0 5 2 total 0 0 material group in nuclide mean std. dev. +1 6 1 total 0 0 +0 6 2 total 0 0 material group in nuclide mean std. dev. +1 6 1 total 0 0 +0 6 2 total 0 0 material group in group out nuclide mean std. dev. +3 6 1 1 total 0 0 +2 6 1 2 total 0 0 +1 6 2 1 total 0 0 +0 6 2 2 total 0 0 material group out nuclide mean std. dev. 1 6 1 total 0 0 0 6 2 total 0 0 material group in nuclide mean std. dev. 1 7 1 total 0 0 @@ -78,15 +78,15 @@ 1 8 2 1 total 0 0 0 8 2 2 total 0 0 material group out nuclide mean std. dev. 1 8 1 total 0 0 -0 8 2 total 0 0 group in material nuclide mean std. dev. -1 1 9 total 0.504036 0.379624 -0 2 9 total 1.687095 2.536622 group in material nuclide mean std. dev. -1 1 9 total 0 0 -0 2 9 total 0 0 group in material group out nuclide mean std. dev. -3 1 9 1 total 0.504036 0.379624 -2 1 9 2 total 0.000000 0.000000 -1 2 9 1 total 0.000000 0.000000 -0 2 9 2 total 1.417955 2.158027 material group out nuclide mean std. dev. +0 8 2 total 0 0 material group in nuclide mean std. dev. +1 9 1 total 0.504036 0.379624 +0 9 2 total 1.687095 2.536622 material group in nuclide mean std. dev. +1 9 1 total 0 0 +0 9 2 total 0 0 material group in group out nuclide mean std. dev. +3 9 1 1 total 0.504036 0.379624 +2 9 1 2 total 0.000000 0.000000 +1 9 2 1 total 0.000000 0.000000 +0 9 2 2 total 1.417955 2.158027 material group out nuclide mean std. dev. 1 9 1 total 0 0 0 9 2 total 0 0 material group in nuclide mean std. dev. 1 10 1 total 0 0 diff --git a/tests/test_mgxs_library_nuclides/results_true.dat b/tests/test_mgxs_library_nuclides/results_true.dat index eba202d7d..23ac0e423 100644 --- a/tests/test_mgxs_library_nuclides/results_true.dat +++ b/tests/test_mgxs_library_nuclides/results_true.dat @@ -1,4 +1,4 @@ - group in material nuclide mean std. dev. + material group in nuclide mean std. dev. 34 1 1 U-234 0.000000 0.000000 35 1 1 U-235 0.008559 0.001742 36 1 1 U-236 0.002643 0.000794 @@ -33,40 +33,40 @@ 65 1 1 Eu-153 0.000173 0.000173 66 1 1 Gd-155 0.000000 0.000000 67 1 1 O-16 0.142506 0.008222 -0 2 1 U-234 0.001948 0.001952 -1 2 1 U-235 0.179956 0.028209 -2 2 1 U-236 0.000000 0.000000 -3 2 1 U-238 0.239279 0.039048 -4 2 1 Np-237 0.000000 0.000000 -5 2 1 Pu-238 0.000000 0.000000 -6 2 1 Pu-239 0.159745 0.015751 -7 2 1 Pu-240 0.007792 0.003677 -8 2 1 Pu-241 0.017533 0.003806 -9 2 1 Pu-242 0.000000 0.000000 -10 2 1 Am-241 0.000000 0.000000 -11 2 1 Am-242m 0.000000 0.000000 -12 2 1 Am-243 0.000000 0.000000 -13 2 1 Cm-242 0.000000 0.000000 -14 2 1 Cm-243 0.000000 0.000000 -15 2 1 Cm-244 0.000000 0.000000 -16 2 1 Cm-245 0.000000 0.000000 -17 2 1 Mo-95 0.002250 0.004232 -18 2 1 Tc-99 0.003544 0.002528 -19 2 1 Ru-101 0.000000 0.000000 -20 2 1 Ru-103 0.000000 0.000000 -21 2 1 Ag-109 0.000000 0.000000 -22 2 1 Xe-135 0.027274 0.004025 -23 2 1 Cs-133 0.000000 0.000000 -24 2 1 Nd-143 0.006532 0.002517 -25 2 1 Nd-145 0.001948 0.001952 -26 2 1 Sm-147 0.000000 0.000000 -27 2 1 Sm-149 0.007792 0.005701 -28 2 1 Sm-150 0.000000 0.000000 -29 2 1 Sm-151 0.000000 0.000000 -30 2 1 Sm-152 0.000000 0.000000 -31 2 1 Eu-153 0.001686 0.001968 -32 2 1 Gd-155 0.000000 0.000000 -33 2 1 O-16 0.154807 0.023798 group in material nuclide mean std. dev. +0 1 2 U-234 0.001948 0.001952 +1 1 2 U-235 0.179956 0.028209 +2 1 2 U-236 0.000000 0.000000 +3 1 2 U-238 0.239279 0.039048 +4 1 2 Np-237 0.000000 0.000000 +5 1 2 Pu-238 0.000000 0.000000 +6 1 2 Pu-239 0.159745 0.015751 +7 1 2 Pu-240 0.007792 0.003677 +8 1 2 Pu-241 0.017533 0.003806 +9 1 2 Pu-242 0.000000 0.000000 +10 1 2 Am-241 0.000000 0.000000 +11 1 2 Am-242m 0.000000 0.000000 +12 1 2 Am-243 0.000000 0.000000 +13 1 2 Cm-242 0.000000 0.000000 +14 1 2 Cm-243 0.000000 0.000000 +15 1 2 Cm-244 0.000000 0.000000 +16 1 2 Cm-245 0.000000 0.000000 +17 1 2 Mo-95 0.002250 0.004232 +18 1 2 Tc-99 0.003544 0.002528 +19 1 2 Ru-101 0.000000 0.000000 +20 1 2 Ru-103 0.000000 0.000000 +21 1 2 Ag-109 0.000000 0.000000 +22 1 2 Xe-135 0.027274 0.004025 +23 1 2 Cs-133 0.000000 0.000000 +24 1 2 Nd-143 0.006532 0.002517 +25 1 2 Nd-145 0.001948 0.001952 +26 1 2 Sm-147 0.000000 0.000000 +27 1 2 Sm-149 0.007792 0.005701 +28 1 2 Sm-150 0.000000 0.000000 +29 1 2 Sm-151 0.000000 0.000000 +30 1 2 Sm-152 0.000000 0.000000 +31 1 2 Eu-153 0.001686 0.001968 +32 1 2 Gd-155 0.000000 0.000000 +33 1 2 O-16 0.154807 0.023798 material group in nuclide mean std. dev. 34 1 1 U-234 6.771527e-06 2.982583e-07 35 1 1 U-235 9.687933e-03 4.305720e-04 36 1 1 U-236 6.279974e-05 3.653120e-06 @@ -101,40 +101,40 @@ 65 1 1 Eu-153 0.000000e+00 0.000000e+00 66 1 1 Gd-155 0.000000e+00 0.000000e+00 67 1 1 O-16 0.000000e+00 0.000000e+00 -0 2 1 U-234 4.267300e-07 3.529845e-08 -1 2 1 U-235 3.629246e-01 2.964548e-02 -2 2 1 U-236 5.921657e-06 4.881464e-07 -3 2 1 U-238 5.196256e-07 4.286610e-08 -4 2 1 Np-237 2.424211e-07 1.741823e-08 -5 2 1 Pu-238 3.255627e-05 2.692686e-06 -6 2 1 Pu-239 2.868384e-01 2.056896e-02 -7 2 1 Pu-240 4.398266e-06 3.658267e-07 -8 2 1 Pu-241 4.607239e-02 3.797176e-03 -9 2 1 Pu-242 8.451967e-08 6.979002e-09 -10 2 1 Am-241 4.678607e-06 3.253889e-07 -11 2 1 Am-242m 1.417675e-04 1.218350e-05 -12 2 1 Am-243 7.648834e-08 6.303843e-09 -13 2 1 Cm-242 9.433314e-07 7.794362e-08 -14 2 1 Cm-243 1.767995e-06 1.454123e-07 -15 2 1 Cm-244 1.533962e-07 1.266951e-08 -16 2 1 Cm-245 1.145063e-05 9.419051e-07 -17 2 1 Mo-95 0.000000e+00 0.000000e+00 -18 2 1 Tc-99 0.000000e+00 0.000000e+00 -19 2 1 Ru-101 0.000000e+00 0.000000e+00 -20 2 1 Ru-103 0.000000e+00 0.000000e+00 -21 2 1 Ag-109 0.000000e+00 0.000000e+00 -22 2 1 Xe-135 0.000000e+00 0.000000e+00 -23 2 1 Cs-133 0.000000e+00 0.000000e+00 -24 2 1 Nd-143 0.000000e+00 0.000000e+00 -25 2 1 Nd-145 0.000000e+00 0.000000e+00 -26 2 1 Sm-147 0.000000e+00 0.000000e+00 -27 2 1 Sm-149 0.000000e+00 0.000000e+00 -28 2 1 Sm-150 0.000000e+00 0.000000e+00 -29 2 1 Sm-151 0.000000e+00 0.000000e+00 -30 2 1 Sm-152 0.000000e+00 0.000000e+00 -31 2 1 Eu-153 0.000000e+00 0.000000e+00 -32 2 1 Gd-155 0.000000e+00 0.000000e+00 -33 2 1 O-16 0.000000e+00 0.000000e+00 group in material group out nuclide mean std. dev. +0 1 2 U-234 4.267300e-07 3.529845e-08 +1 1 2 U-235 3.629246e-01 2.964548e-02 +2 1 2 U-236 5.921657e-06 4.881464e-07 +3 1 2 U-238 5.196256e-07 4.286610e-08 +4 1 2 Np-237 2.424211e-07 1.741823e-08 +5 1 2 Pu-238 3.255627e-05 2.692686e-06 +6 1 2 Pu-239 2.868384e-01 2.056896e-02 +7 1 2 Pu-240 4.398266e-06 3.658267e-07 +8 1 2 Pu-241 4.607239e-02 3.797176e-03 +9 1 2 Pu-242 8.451967e-08 6.979002e-09 +10 1 2 Am-241 4.678607e-06 3.253889e-07 +11 1 2 Am-242m 1.417675e-04 1.218350e-05 +12 1 2 Am-243 7.648834e-08 6.303843e-09 +13 1 2 Cm-242 9.433314e-07 7.794362e-08 +14 1 2 Cm-243 1.767995e-06 1.454123e-07 +15 1 2 Cm-244 1.533962e-07 1.266951e-08 +16 1 2 Cm-245 1.145063e-05 9.419051e-07 +17 1 2 Mo-95 0.000000e+00 0.000000e+00 +18 1 2 Tc-99 0.000000e+00 0.000000e+00 +19 1 2 Ru-101 0.000000e+00 0.000000e+00 +20 1 2 Ru-103 0.000000e+00 0.000000e+00 +21 1 2 Ag-109 0.000000e+00 0.000000e+00 +22 1 2 Xe-135 0.000000e+00 0.000000e+00 +23 1 2 Cs-133 0.000000e+00 0.000000e+00 +24 1 2 Nd-143 0.000000e+00 0.000000e+00 +25 1 2 Nd-145 0.000000e+00 0.000000e+00 +26 1 2 Sm-147 0.000000e+00 0.000000e+00 +27 1 2 Sm-149 0.000000e+00 0.000000e+00 +28 1 2 Sm-150 0.000000e+00 0.000000e+00 +29 1 2 Sm-151 0.000000e+00 0.000000e+00 +30 1 2 Sm-152 0.000000e+00 0.000000e+00 +31 1 2 Eu-153 0.000000e+00 0.000000e+00 +32 1 2 Gd-155 0.000000e+00 0.000000e+00 +33 1 2 O-16 0.000000e+00 0.000000e+00 material group in group out nuclide mean std. dev. 102 1 1 1 U-234 0.000000 0.000000 103 1 1 1 U-235 0.002846 0.001185 104 1 1 1 U-236 0.001951 0.000829 @@ -203,74 +203,74 @@ 99 1 1 2 Eu-153 0.000000 0.000000 100 1 1 2 Gd-155 0.000000 0.000000 101 1 1 2 O-16 0.000173 0.000173 -34 2 1 1 U-234 0.000000 0.000000 -35 2 1 1 U-235 0.000000 0.000000 -36 2 1 1 U-236 0.000000 0.000000 -37 2 1 1 U-238 0.000000 0.000000 -38 2 1 1 Np-237 0.000000 0.000000 -39 2 1 1 Pu-238 0.000000 0.000000 -40 2 1 1 Pu-239 0.000000 0.000000 -41 2 1 1 Pu-240 0.000000 0.000000 -42 2 1 1 Pu-241 0.000000 0.000000 -43 2 1 1 Pu-242 0.000000 0.000000 -44 2 1 1 Am-241 0.000000 0.000000 -45 2 1 1 Am-242m 0.000000 0.000000 -46 2 1 1 Am-243 0.000000 0.000000 -47 2 1 1 Cm-242 0.000000 0.000000 -48 2 1 1 Cm-243 0.000000 0.000000 -49 2 1 1 Cm-244 0.000000 0.000000 -50 2 1 1 Cm-245 0.000000 0.000000 -51 2 1 1 Mo-95 0.000000 0.000000 -52 2 1 1 Tc-99 0.000000 0.000000 -53 2 1 1 Ru-101 0.000000 0.000000 -54 2 1 1 Ru-103 0.000000 0.000000 -55 2 1 1 Ag-109 0.000000 0.000000 -56 2 1 1 Xe-135 0.000000 0.000000 -57 2 1 1 Cs-133 0.000000 0.000000 -58 2 1 1 Nd-143 0.000000 0.000000 -59 2 1 1 Nd-145 0.000000 0.000000 -60 2 1 1 Sm-147 0.000000 0.000000 -61 2 1 1 Sm-149 0.000000 0.000000 -62 2 1 1 Sm-150 0.000000 0.000000 -63 2 1 1 Sm-151 0.000000 0.000000 -64 2 1 1 Sm-152 0.000000 0.000000 -65 2 1 1 Eu-153 0.000000 0.000000 -66 2 1 1 Gd-155 0.000000 0.000000 -67 2 1 1 O-16 0.001948 0.001952 -0 2 1 2 U-234 0.000000 0.000000 -1 2 1 2 U-235 0.010470 0.006106 -2 2 1 2 U-236 0.000000 0.000000 -3 2 1 2 U-238 0.208109 0.039197 -4 2 1 2 Np-237 0.000000 0.000000 -5 2 1 2 Pu-238 0.000000 0.000000 -6 2 1 2 Pu-239 0.000000 0.000000 -7 2 1 2 Pu-240 0.000000 0.000000 -8 2 1 2 Pu-241 0.000000 0.000000 -9 2 1 2 Pu-242 0.000000 0.000000 -10 2 1 2 Am-241 0.000000 0.000000 -11 2 1 2 Am-242m 0.000000 0.000000 -12 2 1 2 Am-243 0.000000 0.000000 -13 2 1 2 Cm-242 0.000000 0.000000 -14 2 1 2 Cm-243 0.000000 0.000000 -15 2 1 2 Cm-244 0.000000 0.000000 -16 2 1 2 Cm-245 0.000000 0.000000 -17 2 1 2 Mo-95 0.000302 0.002551 -18 2 1 2 Tc-99 0.003544 0.002528 -19 2 1 2 Ru-101 0.000000 0.000000 -20 2 1 2 Ru-103 0.000000 0.000000 -21 2 1 2 Ag-109 0.000000 0.000000 -22 2 1 2 Xe-135 0.000000 0.000000 -23 2 1 2 Cs-133 0.000000 0.000000 -24 2 1 2 Nd-143 0.002636 0.002073 -25 2 1 2 Nd-145 0.000000 0.000000 -26 2 1 2 Sm-147 0.000000 0.000000 -27 2 1 2 Sm-149 0.000000 0.000000 -28 2 1 2 Sm-150 0.000000 0.000000 -29 2 1 2 Sm-151 0.000000 0.000000 -30 2 1 2 Sm-152 0.000000 0.000000 -31 2 1 2 Eu-153 0.001686 0.001968 -32 2 1 2 Gd-155 0.000000 0.000000 -33 2 1 2 O-16 0.152859 0.022894 material group out nuclide mean std. dev. +34 1 2 1 U-234 0.000000 0.000000 +35 1 2 1 U-235 0.000000 0.000000 +36 1 2 1 U-236 0.000000 0.000000 +37 1 2 1 U-238 0.000000 0.000000 +38 1 2 1 Np-237 0.000000 0.000000 +39 1 2 1 Pu-238 0.000000 0.000000 +40 1 2 1 Pu-239 0.000000 0.000000 +41 1 2 1 Pu-240 0.000000 0.000000 +42 1 2 1 Pu-241 0.000000 0.000000 +43 1 2 1 Pu-242 0.000000 0.000000 +44 1 2 1 Am-241 0.000000 0.000000 +45 1 2 1 Am-242m 0.000000 0.000000 +46 1 2 1 Am-243 0.000000 0.000000 +47 1 2 1 Cm-242 0.000000 0.000000 +48 1 2 1 Cm-243 0.000000 0.000000 +49 1 2 1 Cm-244 0.000000 0.000000 +50 1 2 1 Cm-245 0.000000 0.000000 +51 1 2 1 Mo-95 0.000000 0.000000 +52 1 2 1 Tc-99 0.000000 0.000000 +53 1 2 1 Ru-101 0.000000 0.000000 +54 1 2 1 Ru-103 0.000000 0.000000 +55 1 2 1 Ag-109 0.000000 0.000000 +56 1 2 1 Xe-135 0.000000 0.000000 +57 1 2 1 Cs-133 0.000000 0.000000 +58 1 2 1 Nd-143 0.000000 0.000000 +59 1 2 1 Nd-145 0.000000 0.000000 +60 1 2 1 Sm-147 0.000000 0.000000 +61 1 2 1 Sm-149 0.000000 0.000000 +62 1 2 1 Sm-150 0.000000 0.000000 +63 1 2 1 Sm-151 0.000000 0.000000 +64 1 2 1 Sm-152 0.000000 0.000000 +65 1 2 1 Eu-153 0.000000 0.000000 +66 1 2 1 Gd-155 0.000000 0.000000 +67 1 2 1 O-16 0.001948 0.001952 +0 1 2 2 U-234 0.000000 0.000000 +1 1 2 2 U-235 0.010470 0.006106 +2 1 2 2 U-236 0.000000 0.000000 +3 1 2 2 U-238 0.208109 0.039197 +4 1 2 2 Np-237 0.000000 0.000000 +5 1 2 2 Pu-238 0.000000 0.000000 +6 1 2 2 Pu-239 0.000000 0.000000 +7 1 2 2 Pu-240 0.000000 0.000000 +8 1 2 2 Pu-241 0.000000 0.000000 +9 1 2 2 Pu-242 0.000000 0.000000 +10 1 2 2 Am-241 0.000000 0.000000 +11 1 2 2 Am-242m 0.000000 0.000000 +12 1 2 2 Am-243 0.000000 0.000000 +13 1 2 2 Cm-242 0.000000 0.000000 +14 1 2 2 Cm-243 0.000000 0.000000 +15 1 2 2 Cm-244 0.000000 0.000000 +16 1 2 2 Cm-245 0.000000 0.000000 +17 1 2 2 Mo-95 0.000302 0.002551 +18 1 2 2 Tc-99 0.003544 0.002528 +19 1 2 2 Ru-101 0.000000 0.000000 +20 1 2 2 Ru-103 0.000000 0.000000 +21 1 2 2 Ag-109 0.000000 0.000000 +22 1 2 2 Xe-135 0.000000 0.000000 +23 1 2 2 Cs-133 0.000000 0.000000 +24 1 2 2 Nd-143 0.002636 0.002073 +25 1 2 2 Nd-145 0.000000 0.000000 +26 1 2 2 Sm-147 0.000000 0.000000 +27 1 2 2 Sm-149 0.000000 0.000000 +28 1 2 2 Sm-150 0.000000 0.000000 +29 1 2 2 Sm-151 0.000000 0.000000 +30 1 2 2 Sm-152 0.000000 0.000000 +31 1 2 2 Eu-153 0.001686 0.001968 +32 1 2 2 Gd-155 0.000000 0.000000 +33 1 2 2 O-16 0.152859 0.022894 material group out nuclide mean std. dev. 34 1 1 U-234 0 0.000000 35 1 1 U-235 1 0.127079 36 1 1 U-236 0 0.000000 @@ -738,175 +738,175 @@ 23 5 2 Cr-54 0 0 24 5 2 C-Nat 0 0 25 5 2 Cu-63 0 0 -26 5 2 Cu-65 0 0 group in material nuclide mean std. dev. -21 1 6 H-1 0 0 -22 1 6 O-16 0 0 -23 1 6 B-10 0 0 -24 1 6 B-11 0 0 -25 1 6 Fe-54 0 0 -26 1 6 Fe-56 0 0 -27 1 6 Fe-57 0 0 -28 1 6 Fe-58 0 0 -29 1 6 Ni-58 0 0 -30 1 6 Ni-60 0 0 -31 1 6 Ni-61 0 0 -32 1 6 Ni-62 0 0 -33 1 6 Ni-64 0 0 -34 1 6 Mn-55 0 0 -35 1 6 Si-28 0 0 -36 1 6 Si-29 0 0 -37 1 6 Si-30 0 0 -38 1 6 Cr-50 0 0 -39 1 6 Cr-52 0 0 -40 1 6 Cr-53 0 0 -41 1 6 Cr-54 0 0 -0 2 6 H-1 0 0 -1 2 6 O-16 0 0 -2 2 6 B-10 0 0 -3 2 6 B-11 0 0 -4 2 6 Fe-54 0 0 -5 2 6 Fe-56 0 0 -6 2 6 Fe-57 0 0 -7 2 6 Fe-58 0 0 -8 2 6 Ni-58 0 0 -9 2 6 Ni-60 0 0 -10 2 6 Ni-61 0 0 -11 2 6 Ni-62 0 0 -12 2 6 Ni-64 0 0 -13 2 6 Mn-55 0 0 -14 2 6 Si-28 0 0 -15 2 6 Si-29 0 0 -16 2 6 Si-30 0 0 -17 2 6 Cr-50 0 0 -18 2 6 Cr-52 0 0 -19 2 6 Cr-53 0 0 -20 2 6 Cr-54 0 0 group in material nuclide mean std. dev. -21 1 6 H-1 0 0 -22 1 6 O-16 0 0 -23 1 6 B-10 0 0 -24 1 6 B-11 0 0 -25 1 6 Fe-54 0 0 -26 1 6 Fe-56 0 0 -27 1 6 Fe-57 0 0 -28 1 6 Fe-58 0 0 -29 1 6 Ni-58 0 0 -30 1 6 Ni-60 0 0 -31 1 6 Ni-61 0 0 -32 1 6 Ni-62 0 0 -33 1 6 Ni-64 0 0 -34 1 6 Mn-55 0 0 -35 1 6 Si-28 0 0 -36 1 6 Si-29 0 0 -37 1 6 Si-30 0 0 -38 1 6 Cr-50 0 0 -39 1 6 Cr-52 0 0 -40 1 6 Cr-53 0 0 -41 1 6 Cr-54 0 0 -0 2 6 H-1 0 0 -1 2 6 O-16 0 0 -2 2 6 B-10 0 0 -3 2 6 B-11 0 0 -4 2 6 Fe-54 0 0 -5 2 6 Fe-56 0 0 -6 2 6 Fe-57 0 0 -7 2 6 Fe-58 0 0 -8 2 6 Ni-58 0 0 -9 2 6 Ni-60 0 0 -10 2 6 Ni-61 0 0 -11 2 6 Ni-62 0 0 -12 2 6 Ni-64 0 0 -13 2 6 Mn-55 0 0 -14 2 6 Si-28 0 0 -15 2 6 Si-29 0 0 -16 2 6 Si-30 0 0 -17 2 6 Cr-50 0 0 -18 2 6 Cr-52 0 0 -19 2 6 Cr-53 0 0 -20 2 6 Cr-54 0 0 group in material group out nuclide mean std. dev. -63 1 6 1 H-1 0 0 -64 1 6 1 O-16 0 0 -65 1 6 1 B-10 0 0 -66 1 6 1 B-11 0 0 -67 1 6 1 Fe-54 0 0 -68 1 6 1 Fe-56 0 0 -69 1 6 1 Fe-57 0 0 -70 1 6 1 Fe-58 0 0 -71 1 6 1 Ni-58 0 0 -72 1 6 1 Ni-60 0 0 -73 1 6 1 Ni-61 0 0 -74 1 6 1 Ni-62 0 0 -75 1 6 1 Ni-64 0 0 -76 1 6 1 Mn-55 0 0 -77 1 6 1 Si-28 0 0 -78 1 6 1 Si-29 0 0 -79 1 6 1 Si-30 0 0 -80 1 6 1 Cr-50 0 0 -81 1 6 1 Cr-52 0 0 -82 1 6 1 Cr-53 0 0 -83 1 6 1 Cr-54 0 0 -42 1 6 2 H-1 0 0 -43 1 6 2 O-16 0 0 -44 1 6 2 B-10 0 0 -45 1 6 2 B-11 0 0 -46 1 6 2 Fe-54 0 0 -47 1 6 2 Fe-56 0 0 -48 1 6 2 Fe-57 0 0 -49 1 6 2 Fe-58 0 0 -50 1 6 2 Ni-58 0 0 -51 1 6 2 Ni-60 0 0 -52 1 6 2 Ni-61 0 0 -53 1 6 2 Ni-62 0 0 -54 1 6 2 Ni-64 0 0 -55 1 6 2 Mn-55 0 0 -56 1 6 2 Si-28 0 0 -57 1 6 2 Si-29 0 0 -58 1 6 2 Si-30 0 0 -59 1 6 2 Cr-50 0 0 -60 1 6 2 Cr-52 0 0 -61 1 6 2 Cr-53 0 0 -62 1 6 2 Cr-54 0 0 -21 2 6 1 H-1 0 0 -22 2 6 1 O-16 0 0 -23 2 6 1 B-10 0 0 -24 2 6 1 B-11 0 0 -25 2 6 1 Fe-54 0 0 -26 2 6 1 Fe-56 0 0 -27 2 6 1 Fe-57 0 0 -28 2 6 1 Fe-58 0 0 -29 2 6 1 Ni-58 0 0 -30 2 6 1 Ni-60 0 0 -31 2 6 1 Ni-61 0 0 -32 2 6 1 Ni-62 0 0 -33 2 6 1 Ni-64 0 0 -34 2 6 1 Mn-55 0 0 -35 2 6 1 Si-28 0 0 -36 2 6 1 Si-29 0 0 -37 2 6 1 Si-30 0 0 -38 2 6 1 Cr-50 0 0 -39 2 6 1 Cr-52 0 0 -40 2 6 1 Cr-53 0 0 -41 2 6 1 Cr-54 0 0 -0 2 6 2 H-1 0 0 -1 2 6 2 O-16 0 0 -2 2 6 2 B-10 0 0 -3 2 6 2 B-11 0 0 -4 2 6 2 Fe-54 0 0 -5 2 6 2 Fe-56 0 0 -6 2 6 2 Fe-57 0 0 -7 2 6 2 Fe-58 0 0 -8 2 6 2 Ni-58 0 0 -9 2 6 2 Ni-60 0 0 -10 2 6 2 Ni-61 0 0 -11 2 6 2 Ni-62 0 0 -12 2 6 2 Ni-64 0 0 -13 2 6 2 Mn-55 0 0 -14 2 6 2 Si-28 0 0 -15 2 6 2 Si-29 0 0 -16 2 6 2 Si-30 0 0 -17 2 6 2 Cr-50 0 0 -18 2 6 2 Cr-52 0 0 -19 2 6 2 Cr-53 0 0 -20 2 6 2 Cr-54 0 0 material group out nuclide mean std. dev. +26 5 2 Cu-65 0 0 material group in nuclide mean std. dev. +21 6 1 H-1 0 0 +22 6 1 O-16 0 0 +23 6 1 B-10 0 0 +24 6 1 B-11 0 0 +25 6 1 Fe-54 0 0 +26 6 1 Fe-56 0 0 +27 6 1 Fe-57 0 0 +28 6 1 Fe-58 0 0 +29 6 1 Ni-58 0 0 +30 6 1 Ni-60 0 0 +31 6 1 Ni-61 0 0 +32 6 1 Ni-62 0 0 +33 6 1 Ni-64 0 0 +34 6 1 Mn-55 0 0 +35 6 1 Si-28 0 0 +36 6 1 Si-29 0 0 +37 6 1 Si-30 0 0 +38 6 1 Cr-50 0 0 +39 6 1 Cr-52 0 0 +40 6 1 Cr-53 0 0 +41 6 1 Cr-54 0 0 +0 6 2 H-1 0 0 +1 6 2 O-16 0 0 +2 6 2 B-10 0 0 +3 6 2 B-11 0 0 +4 6 2 Fe-54 0 0 +5 6 2 Fe-56 0 0 +6 6 2 Fe-57 0 0 +7 6 2 Fe-58 0 0 +8 6 2 Ni-58 0 0 +9 6 2 Ni-60 0 0 +10 6 2 Ni-61 0 0 +11 6 2 Ni-62 0 0 +12 6 2 Ni-64 0 0 +13 6 2 Mn-55 0 0 +14 6 2 Si-28 0 0 +15 6 2 Si-29 0 0 +16 6 2 Si-30 0 0 +17 6 2 Cr-50 0 0 +18 6 2 Cr-52 0 0 +19 6 2 Cr-53 0 0 +20 6 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 6 1 H-1 0 0 +22 6 1 O-16 0 0 +23 6 1 B-10 0 0 +24 6 1 B-11 0 0 +25 6 1 Fe-54 0 0 +26 6 1 Fe-56 0 0 +27 6 1 Fe-57 0 0 +28 6 1 Fe-58 0 0 +29 6 1 Ni-58 0 0 +30 6 1 Ni-60 0 0 +31 6 1 Ni-61 0 0 +32 6 1 Ni-62 0 0 +33 6 1 Ni-64 0 0 +34 6 1 Mn-55 0 0 +35 6 1 Si-28 0 0 +36 6 1 Si-29 0 0 +37 6 1 Si-30 0 0 +38 6 1 Cr-50 0 0 +39 6 1 Cr-52 0 0 +40 6 1 Cr-53 0 0 +41 6 1 Cr-54 0 0 +0 6 2 H-1 0 0 +1 6 2 O-16 0 0 +2 6 2 B-10 0 0 +3 6 2 B-11 0 0 +4 6 2 Fe-54 0 0 +5 6 2 Fe-56 0 0 +6 6 2 Fe-57 0 0 +7 6 2 Fe-58 0 0 +8 6 2 Ni-58 0 0 +9 6 2 Ni-60 0 0 +10 6 2 Ni-61 0 0 +11 6 2 Ni-62 0 0 +12 6 2 Ni-64 0 0 +13 6 2 Mn-55 0 0 +14 6 2 Si-28 0 0 +15 6 2 Si-29 0 0 +16 6 2 Si-30 0 0 +17 6 2 Cr-50 0 0 +18 6 2 Cr-52 0 0 +19 6 2 Cr-53 0 0 +20 6 2 Cr-54 0 0 material group in group out nuclide mean std. dev. +63 6 1 1 H-1 0 0 +64 6 1 1 O-16 0 0 +65 6 1 1 B-10 0 0 +66 6 1 1 B-11 0 0 +67 6 1 1 Fe-54 0 0 +68 6 1 1 Fe-56 0 0 +69 6 1 1 Fe-57 0 0 +70 6 1 1 Fe-58 0 0 +71 6 1 1 Ni-58 0 0 +72 6 1 1 Ni-60 0 0 +73 6 1 1 Ni-61 0 0 +74 6 1 1 Ni-62 0 0 +75 6 1 1 Ni-64 0 0 +76 6 1 1 Mn-55 0 0 +77 6 1 1 Si-28 0 0 +78 6 1 1 Si-29 0 0 +79 6 1 1 Si-30 0 0 +80 6 1 1 Cr-50 0 0 +81 6 1 1 Cr-52 0 0 +82 6 1 1 Cr-53 0 0 +83 6 1 1 Cr-54 0 0 +42 6 1 2 H-1 0 0 +43 6 1 2 O-16 0 0 +44 6 1 2 B-10 0 0 +45 6 1 2 B-11 0 0 +46 6 1 2 Fe-54 0 0 +47 6 1 2 Fe-56 0 0 +48 6 1 2 Fe-57 0 0 +49 6 1 2 Fe-58 0 0 +50 6 1 2 Ni-58 0 0 +51 6 1 2 Ni-60 0 0 +52 6 1 2 Ni-61 0 0 +53 6 1 2 Ni-62 0 0 +54 6 1 2 Ni-64 0 0 +55 6 1 2 Mn-55 0 0 +56 6 1 2 Si-28 0 0 +57 6 1 2 Si-29 0 0 +58 6 1 2 Si-30 0 0 +59 6 1 2 Cr-50 0 0 +60 6 1 2 Cr-52 0 0 +61 6 1 2 Cr-53 0 0 +62 6 1 2 Cr-54 0 0 +21 6 2 1 H-1 0 0 +22 6 2 1 O-16 0 0 +23 6 2 1 B-10 0 0 +24 6 2 1 B-11 0 0 +25 6 2 1 Fe-54 0 0 +26 6 2 1 Fe-56 0 0 +27 6 2 1 Fe-57 0 0 +28 6 2 1 Fe-58 0 0 +29 6 2 1 Ni-58 0 0 +30 6 2 1 Ni-60 0 0 +31 6 2 1 Ni-61 0 0 +32 6 2 1 Ni-62 0 0 +33 6 2 1 Ni-64 0 0 +34 6 2 1 Mn-55 0 0 +35 6 2 1 Si-28 0 0 +36 6 2 1 Si-29 0 0 +37 6 2 1 Si-30 0 0 +38 6 2 1 Cr-50 0 0 +39 6 2 1 Cr-52 0 0 +40 6 2 1 Cr-53 0 0 +41 6 2 1 Cr-54 0 0 +0 6 2 2 H-1 0 0 +1 6 2 2 O-16 0 0 +2 6 2 2 B-10 0 0 +3 6 2 2 B-11 0 0 +4 6 2 2 Fe-54 0 0 +5 6 2 2 Fe-56 0 0 +6 6 2 2 Fe-57 0 0 +7 6 2 2 Fe-58 0 0 +8 6 2 2 Ni-58 0 0 +9 6 2 2 Ni-60 0 0 +10 6 2 2 Ni-61 0 0 +11 6 2 2 Ni-62 0 0 +12 6 2 2 Ni-64 0 0 +13 6 2 2 Mn-55 0 0 +14 6 2 2 Si-28 0 0 +15 6 2 2 Si-29 0 0 +16 6 2 2 Si-30 0 0 +17 6 2 2 Cr-50 0 0 +18 6 2 2 Cr-52 0 0 +19 6 2 2 Cr-53 0 0 +20 6 2 2 Cr-54 0 0 material group out nuclide mean std. dev. 21 6 1 H-1 0 0 22 6 1 O-16 0 0 23 6 1 B-10 0 0 @@ -1368,175 +1368,175 @@ 17 8 2 Cr-50 0 0 18 8 2 Cr-52 0 0 19 8 2 Cr-53 0 0 -20 8 2 Cr-54 0 0 group in material nuclide mean std. dev. -21 1 9 H-1 0.106160 0.179178 -22 1 9 O-16 0.272020 0.171699 -23 1 9 B-10 0.000000 0.000000 -24 1 9 B-11 0.000000 0.000000 -25 1 9 Fe-54 0.000000 0.000000 -26 1 9 Fe-56 0.000000 0.000000 -27 1 9 Fe-57 0.000000 0.000000 -28 1 9 Fe-58 0.000000 0.000000 -29 1 9 Ni-58 0.000000 0.000000 -30 1 9 Ni-60 0.000000 0.000000 -31 1 9 Ni-61 0.000000 0.000000 -32 1 9 Ni-62 0.000000 0.000000 -33 1 9 Ni-64 0.000000 0.000000 -34 1 9 Mn-55 0.085133 0.082479 -35 1 9 Si-28 0.000000 0.000000 -36 1 9 Si-29 0.000000 0.000000 -37 1 9 Si-30 0.000000 0.000000 -38 1 9 Cr-50 0.000000 0.000000 -39 1 9 Cr-52 0.000000 0.000000 -40 1 9 Cr-53 0.040723 0.079827 -41 1 9 Cr-54 0.000000 0.000000 -0 2 9 H-1 1.417955 2.158027 -1 2 9 O-16 0.000000 0.000000 -2 2 9 B-10 0.269141 0.380622 -3 2 9 B-11 0.000000 0.000000 -4 2 9 Fe-54 0.000000 0.000000 -5 2 9 Fe-56 0.000000 0.000000 -6 2 9 Fe-57 0.000000 0.000000 -7 2 9 Fe-58 0.000000 0.000000 -8 2 9 Ni-58 0.000000 0.000000 -9 2 9 Ni-60 0.000000 0.000000 -10 2 9 Ni-61 0.000000 0.000000 -11 2 9 Ni-62 0.000000 0.000000 -12 2 9 Ni-64 0.000000 0.000000 -13 2 9 Mn-55 0.000000 0.000000 -14 2 9 Si-28 0.000000 0.000000 -15 2 9 Si-29 0.000000 0.000000 -16 2 9 Si-30 0.000000 0.000000 -17 2 9 Cr-50 0.000000 0.000000 -18 2 9 Cr-52 0.000000 0.000000 -19 2 9 Cr-53 0.000000 0.000000 -20 2 9 Cr-54 0.000000 0.000000 group in material nuclide mean std. dev. -21 1 9 H-1 0 0 -22 1 9 O-16 0 0 -23 1 9 B-10 0 0 -24 1 9 B-11 0 0 -25 1 9 Fe-54 0 0 -26 1 9 Fe-56 0 0 -27 1 9 Fe-57 0 0 -28 1 9 Fe-58 0 0 -29 1 9 Ni-58 0 0 -30 1 9 Ni-60 0 0 -31 1 9 Ni-61 0 0 -32 1 9 Ni-62 0 0 -33 1 9 Ni-64 0 0 -34 1 9 Mn-55 0 0 -35 1 9 Si-28 0 0 -36 1 9 Si-29 0 0 -37 1 9 Si-30 0 0 -38 1 9 Cr-50 0 0 -39 1 9 Cr-52 0 0 -40 1 9 Cr-53 0 0 -41 1 9 Cr-54 0 0 -0 2 9 H-1 0 0 -1 2 9 O-16 0 0 -2 2 9 B-10 0 0 -3 2 9 B-11 0 0 -4 2 9 Fe-54 0 0 -5 2 9 Fe-56 0 0 -6 2 9 Fe-57 0 0 -7 2 9 Fe-58 0 0 -8 2 9 Ni-58 0 0 -9 2 9 Ni-60 0 0 -10 2 9 Ni-61 0 0 -11 2 9 Ni-62 0 0 -12 2 9 Ni-64 0 0 -13 2 9 Mn-55 0 0 -14 2 9 Si-28 0 0 -15 2 9 Si-29 0 0 -16 2 9 Si-30 0 0 -17 2 9 Cr-50 0 0 -18 2 9 Cr-52 0 0 -19 2 9 Cr-53 0 0 -20 2 9 Cr-54 0 0 group in material group out nuclide mean std. dev. -63 1 9 1 H-1 0.106160 0.179178 -64 1 9 1 O-16 0.272020 0.171699 -65 1 9 1 B-10 0.000000 0.000000 -66 1 9 1 B-11 0.000000 0.000000 -67 1 9 1 Fe-54 0.000000 0.000000 -68 1 9 1 Fe-56 0.000000 0.000000 -69 1 9 1 Fe-57 0.000000 0.000000 -70 1 9 1 Fe-58 0.000000 0.000000 -71 1 9 1 Ni-58 0.000000 0.000000 -72 1 9 1 Ni-60 0.000000 0.000000 -73 1 9 1 Ni-61 0.000000 0.000000 -74 1 9 1 Ni-62 0.000000 0.000000 -75 1 9 1 Ni-64 0.000000 0.000000 -76 1 9 1 Mn-55 0.085133 0.082479 -77 1 9 1 Si-28 0.000000 0.000000 -78 1 9 1 Si-29 0.000000 0.000000 -79 1 9 1 Si-30 0.000000 0.000000 -80 1 9 1 Cr-50 0.000000 0.000000 -81 1 9 1 Cr-52 0.000000 0.000000 -82 1 9 1 Cr-53 0.040723 0.079827 -83 1 9 1 Cr-54 0.000000 0.000000 -42 1 9 2 H-1 0.000000 0.000000 -43 1 9 2 O-16 0.000000 0.000000 -44 1 9 2 B-10 0.000000 0.000000 -45 1 9 2 B-11 0.000000 0.000000 -46 1 9 2 Fe-54 0.000000 0.000000 -47 1 9 2 Fe-56 0.000000 0.000000 -48 1 9 2 Fe-57 0.000000 0.000000 -49 1 9 2 Fe-58 0.000000 0.000000 -50 1 9 2 Ni-58 0.000000 0.000000 -51 1 9 2 Ni-60 0.000000 0.000000 -52 1 9 2 Ni-61 0.000000 0.000000 -53 1 9 2 Ni-62 0.000000 0.000000 -54 1 9 2 Ni-64 0.000000 0.000000 -55 1 9 2 Mn-55 0.000000 0.000000 -56 1 9 2 Si-28 0.000000 0.000000 -57 1 9 2 Si-29 0.000000 0.000000 -58 1 9 2 Si-30 0.000000 0.000000 -59 1 9 2 Cr-50 0.000000 0.000000 -60 1 9 2 Cr-52 0.000000 0.000000 -61 1 9 2 Cr-53 0.000000 0.000000 -62 1 9 2 Cr-54 0.000000 0.000000 -21 2 9 1 H-1 0.000000 0.000000 -22 2 9 1 O-16 0.000000 0.000000 -23 2 9 1 B-10 0.000000 0.000000 -24 2 9 1 B-11 0.000000 0.000000 -25 2 9 1 Fe-54 0.000000 0.000000 -26 2 9 1 Fe-56 0.000000 0.000000 -27 2 9 1 Fe-57 0.000000 0.000000 -28 2 9 1 Fe-58 0.000000 0.000000 -29 2 9 1 Ni-58 0.000000 0.000000 -30 2 9 1 Ni-60 0.000000 0.000000 -31 2 9 1 Ni-61 0.000000 0.000000 -32 2 9 1 Ni-62 0.000000 0.000000 -33 2 9 1 Ni-64 0.000000 0.000000 -34 2 9 1 Mn-55 0.000000 0.000000 -35 2 9 1 Si-28 0.000000 0.000000 -36 2 9 1 Si-29 0.000000 0.000000 -37 2 9 1 Si-30 0.000000 0.000000 -38 2 9 1 Cr-50 0.000000 0.000000 -39 2 9 1 Cr-52 0.000000 0.000000 -40 2 9 1 Cr-53 0.000000 0.000000 -41 2 9 1 Cr-54 0.000000 0.000000 -0 2 9 2 H-1 1.417955 2.158027 -1 2 9 2 O-16 0.000000 0.000000 -2 2 9 2 B-10 0.000000 0.000000 -3 2 9 2 B-11 0.000000 0.000000 -4 2 9 2 Fe-54 0.000000 0.000000 -5 2 9 2 Fe-56 0.000000 0.000000 -6 2 9 2 Fe-57 0.000000 0.000000 -7 2 9 2 Fe-58 0.000000 0.000000 -8 2 9 2 Ni-58 0.000000 0.000000 -9 2 9 2 Ni-60 0.000000 0.000000 -10 2 9 2 Ni-61 0.000000 0.000000 -11 2 9 2 Ni-62 0.000000 0.000000 -12 2 9 2 Ni-64 0.000000 0.000000 -13 2 9 2 Mn-55 0.000000 0.000000 -14 2 9 2 Si-28 0.000000 0.000000 -15 2 9 2 Si-29 0.000000 0.000000 -16 2 9 2 Si-30 0.000000 0.000000 -17 2 9 2 Cr-50 0.000000 0.000000 -18 2 9 2 Cr-52 0.000000 0.000000 -19 2 9 2 Cr-53 0.000000 0.000000 -20 2 9 2 Cr-54 0.000000 0.000000 material group out nuclide mean std. dev. +20 8 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 9 1 H-1 0.106160 0.179178 +22 9 1 O-16 0.272020 0.171699 +23 9 1 B-10 0.000000 0.000000 +24 9 1 B-11 0.000000 0.000000 +25 9 1 Fe-54 0.000000 0.000000 +26 9 1 Fe-56 0.000000 0.000000 +27 9 1 Fe-57 0.000000 0.000000 +28 9 1 Fe-58 0.000000 0.000000 +29 9 1 Ni-58 0.000000 0.000000 +30 9 1 Ni-60 0.000000 0.000000 +31 9 1 Ni-61 0.000000 0.000000 +32 9 1 Ni-62 0.000000 0.000000 +33 9 1 Ni-64 0.000000 0.000000 +34 9 1 Mn-55 0.085133 0.082479 +35 9 1 Si-28 0.000000 0.000000 +36 9 1 Si-29 0.000000 0.000000 +37 9 1 Si-30 0.000000 0.000000 +38 9 1 Cr-50 0.000000 0.000000 +39 9 1 Cr-52 0.000000 0.000000 +40 9 1 Cr-53 0.040723 0.079827 +41 9 1 Cr-54 0.000000 0.000000 +0 9 2 H-1 1.417955 2.158027 +1 9 2 O-16 0.000000 0.000000 +2 9 2 B-10 0.269141 0.380622 +3 9 2 B-11 0.000000 0.000000 +4 9 2 Fe-54 0.000000 0.000000 +5 9 2 Fe-56 0.000000 0.000000 +6 9 2 Fe-57 0.000000 0.000000 +7 9 2 Fe-58 0.000000 0.000000 +8 9 2 Ni-58 0.000000 0.000000 +9 9 2 Ni-60 0.000000 0.000000 +10 9 2 Ni-61 0.000000 0.000000 +11 9 2 Ni-62 0.000000 0.000000 +12 9 2 Ni-64 0.000000 0.000000 +13 9 2 Mn-55 0.000000 0.000000 +14 9 2 Si-28 0.000000 0.000000 +15 9 2 Si-29 0.000000 0.000000 +16 9 2 Si-30 0.000000 0.000000 +17 9 2 Cr-50 0.000000 0.000000 +18 9 2 Cr-52 0.000000 0.000000 +19 9 2 Cr-53 0.000000 0.000000 +20 9 2 Cr-54 0.000000 0.000000 material group in nuclide mean std. dev. +21 9 1 H-1 0 0 +22 9 1 O-16 0 0 +23 9 1 B-10 0 0 +24 9 1 B-11 0 0 +25 9 1 Fe-54 0 0 +26 9 1 Fe-56 0 0 +27 9 1 Fe-57 0 0 +28 9 1 Fe-58 0 0 +29 9 1 Ni-58 0 0 +30 9 1 Ni-60 0 0 +31 9 1 Ni-61 0 0 +32 9 1 Ni-62 0 0 +33 9 1 Ni-64 0 0 +34 9 1 Mn-55 0 0 +35 9 1 Si-28 0 0 +36 9 1 Si-29 0 0 +37 9 1 Si-30 0 0 +38 9 1 Cr-50 0 0 +39 9 1 Cr-52 0 0 +40 9 1 Cr-53 0 0 +41 9 1 Cr-54 0 0 +0 9 2 H-1 0 0 +1 9 2 O-16 0 0 +2 9 2 B-10 0 0 +3 9 2 B-11 0 0 +4 9 2 Fe-54 0 0 +5 9 2 Fe-56 0 0 +6 9 2 Fe-57 0 0 +7 9 2 Fe-58 0 0 +8 9 2 Ni-58 0 0 +9 9 2 Ni-60 0 0 +10 9 2 Ni-61 0 0 +11 9 2 Ni-62 0 0 +12 9 2 Ni-64 0 0 +13 9 2 Mn-55 0 0 +14 9 2 Si-28 0 0 +15 9 2 Si-29 0 0 +16 9 2 Si-30 0 0 +17 9 2 Cr-50 0 0 +18 9 2 Cr-52 0 0 +19 9 2 Cr-53 0 0 +20 9 2 Cr-54 0 0 material group in group out nuclide mean std. dev. +63 9 1 1 H-1 0.106160 0.179178 +64 9 1 1 O-16 0.272020 0.171699 +65 9 1 1 B-10 0.000000 0.000000 +66 9 1 1 B-11 0.000000 0.000000 +67 9 1 1 Fe-54 0.000000 0.000000 +68 9 1 1 Fe-56 0.000000 0.000000 +69 9 1 1 Fe-57 0.000000 0.000000 +70 9 1 1 Fe-58 0.000000 0.000000 +71 9 1 1 Ni-58 0.000000 0.000000 +72 9 1 1 Ni-60 0.000000 0.000000 +73 9 1 1 Ni-61 0.000000 0.000000 +74 9 1 1 Ni-62 0.000000 0.000000 +75 9 1 1 Ni-64 0.000000 0.000000 +76 9 1 1 Mn-55 0.085133 0.082479 +77 9 1 1 Si-28 0.000000 0.000000 +78 9 1 1 Si-29 0.000000 0.000000 +79 9 1 1 Si-30 0.000000 0.000000 +80 9 1 1 Cr-50 0.000000 0.000000 +81 9 1 1 Cr-52 0.000000 0.000000 +82 9 1 1 Cr-53 0.040723 0.079827 +83 9 1 1 Cr-54 0.000000 0.000000 +42 9 1 2 H-1 0.000000 0.000000 +43 9 1 2 O-16 0.000000 0.000000 +44 9 1 2 B-10 0.000000 0.000000 +45 9 1 2 B-11 0.000000 0.000000 +46 9 1 2 Fe-54 0.000000 0.000000 +47 9 1 2 Fe-56 0.000000 0.000000 +48 9 1 2 Fe-57 0.000000 0.000000 +49 9 1 2 Fe-58 0.000000 0.000000 +50 9 1 2 Ni-58 0.000000 0.000000 +51 9 1 2 Ni-60 0.000000 0.000000 +52 9 1 2 Ni-61 0.000000 0.000000 +53 9 1 2 Ni-62 0.000000 0.000000 +54 9 1 2 Ni-64 0.000000 0.000000 +55 9 1 2 Mn-55 0.000000 0.000000 +56 9 1 2 Si-28 0.000000 0.000000 +57 9 1 2 Si-29 0.000000 0.000000 +58 9 1 2 Si-30 0.000000 0.000000 +59 9 1 2 Cr-50 0.000000 0.000000 +60 9 1 2 Cr-52 0.000000 0.000000 +61 9 1 2 Cr-53 0.000000 0.000000 +62 9 1 2 Cr-54 0.000000 0.000000 +21 9 2 1 H-1 0.000000 0.000000 +22 9 2 1 O-16 0.000000 0.000000 +23 9 2 1 B-10 0.000000 0.000000 +24 9 2 1 B-11 0.000000 0.000000 +25 9 2 1 Fe-54 0.000000 0.000000 +26 9 2 1 Fe-56 0.000000 0.000000 +27 9 2 1 Fe-57 0.000000 0.000000 +28 9 2 1 Fe-58 0.000000 0.000000 +29 9 2 1 Ni-58 0.000000 0.000000 +30 9 2 1 Ni-60 0.000000 0.000000 +31 9 2 1 Ni-61 0.000000 0.000000 +32 9 2 1 Ni-62 0.000000 0.000000 +33 9 2 1 Ni-64 0.000000 0.000000 +34 9 2 1 Mn-55 0.000000 0.000000 +35 9 2 1 Si-28 0.000000 0.000000 +36 9 2 1 Si-29 0.000000 0.000000 +37 9 2 1 Si-30 0.000000 0.000000 +38 9 2 1 Cr-50 0.000000 0.000000 +39 9 2 1 Cr-52 0.000000 0.000000 +40 9 2 1 Cr-53 0.000000 0.000000 +41 9 2 1 Cr-54 0.000000 0.000000 +0 9 2 2 H-1 1.417955 2.158027 +1 9 2 2 O-16 0.000000 0.000000 +2 9 2 2 B-10 0.000000 0.000000 +3 9 2 2 B-11 0.000000 0.000000 +4 9 2 2 Fe-54 0.000000 0.000000 +5 9 2 2 Fe-56 0.000000 0.000000 +6 9 2 2 Fe-57 0.000000 0.000000 +7 9 2 2 Fe-58 0.000000 0.000000 +8 9 2 2 Ni-58 0.000000 0.000000 +9 9 2 2 Ni-60 0.000000 0.000000 +10 9 2 2 Ni-61 0.000000 0.000000 +11 9 2 2 Ni-62 0.000000 0.000000 +12 9 2 2 Ni-64 0.000000 0.000000 +13 9 2 2 Mn-55 0.000000 0.000000 +14 9 2 2 Si-28 0.000000 0.000000 +15 9 2 2 Si-29 0.000000 0.000000 +16 9 2 2 Si-30 0.000000 0.000000 +17 9 2 2 Cr-50 0.000000 0.000000 +18 9 2 2 Cr-52 0.000000 0.000000 +19 9 2 2 Cr-53 0.000000 0.000000 +20 9 2 2 Cr-54 0.000000 0.000000 material group out nuclide mean std. dev. 21 9 1 H-1 0 0 22 9 1 O-16 0 0 23 9 1 B-10 0 0 From fca533e3d1ee24f12448e32feb049f3724e9411c Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Wed, 25 Nov 2015 12:45:57 -0500 Subject: [PATCH 11/49] Added __eq__ and __ne__ method to Cell, Universe, Lattice and Material classes in Python API --- openmc/material.py | 23 ++++++++++ openmc/region.py | 11 +++++ openmc/universe.py | 109 ++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 133 insertions(+), 10 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index 292fc82ca..caad3a1cd 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -83,6 +83,29 @@ class Material(object): # If specified, this file will be used instead of composition values self._distrib_otf_file = None + def __eq__(self, other): + if not isinstance(other, Material): + return False + elif self.id != other.id: + return False + elif self.name != other.name: + return False + elif self.density != other.density: + return False + elif self.density_units != other.density_units: + return False + elif self._nuclides != other.nuclides: + return False + elif self._elements != other._elements: + return False + elif self._sab != other._sab: + return False + else: + return True + + def __ne__(self, other): + return not self == other + def __repr__(self): string = 'Material\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) diff --git a/openmc/region.py b/openmc/region.py index 97069d797..936e6e512 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -29,6 +29,17 @@ class Region(object): def __str__(self): return '' + def __eq__(self, other): + if not isinstance(other, type(self)): + return False + elif str(self) != str(other): + return False + else: + return True + + def __ne__(self, other): + return not self == other + @staticmethod def from_expression(expression, surfaces): """Generate a region given an infix expression. diff --git a/openmc/universe.py b/openmc/universe.py index b74dde656..1fb29e260 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -73,6 +73,29 @@ class Cell(object): self._translation = None self._offsets = None + def __eq__(self, other): + if not isinstance(other, Cell): + return False + elif self.id != other.id: + return False + elif self.name != other.name: + return False + # FIXME: This won't work for materials fills since OpenMC only outputs + # nuclide densities in units of atom/b-cm irregardless of input units + # elif self.fill != other.fill: + # return False + elif self.region != other.region: + return False + elif self.rotation != other.rotation: + return False + elif self.translation != other.translation: + return False + else: + return True + + def __ne__(self, other): + return not self == other + def __repr__(self): string = 'Cell\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) @@ -443,6 +466,31 @@ class Universe(object): self._cell_offsets = OrderedDict() self._num_regions = 0 + def __eq__(self, other): + if not isinstance(other, Universe): + return False + elif self.id != other.id: + return False + elif self.name != other.name: + return False + elif self.cells != other.cells: + return False + else: + return True + + def __ne__(self, other): + return not self == other + + def __repr__(self): + string = 'Universe\n' + string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) + string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) + string += '{0: <16}{1}{2}\n'.format('\tCells', '=\t', + list(self._cells.keys())) + string += '{0: <16}{1}{2}\n'.format('\t# Regions', '=\t', + self._num_regions) + return string + @property def id(self): return self._id @@ -630,16 +678,6 @@ class Universe(object): return universes - def __repr__(self): - string = 'Universe\n' - string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) - string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) - string += '{0: <16}{1}{2}\n'.format('\tCells', '=\t', - list(self._cells.keys())) - string += '{0: <16}{1}{2}\n'.format('\t# Regions', '=\t', - self._num_regions) - return string - def create_xml_subelement(self, xml_element): # Iterate over all Cells @@ -695,6 +733,25 @@ class Lattice(object): self._outer = None self._universes = None + def __eq__(self, other): + if not isinstance(other, Lattice): + return False + elif self.id != other.id: + return False + elif self.name != other.name: + return False + elif self.pitch != other.pitch: + return False + elif self.outer != other.outer: + return False + elif self.universes != other.universes: + return False + else: + return True + + def __ne__(self, other): + return not self == other + @property def id(self): return self._id @@ -894,6 +951,21 @@ class RectLattice(Lattice): self._lower_left = None self._offsets = None + def __eq__(self, other): + if not isinstance(other, RectLattice): + return False + elif not super(RectLattice, self).__eq__(other): + return False + elif self.dimension != other.dimension: + return False + elif self.lower_left != other.lower_left: + return False + else: + return True + + def __ne__(self, other): + return not self == other + def __repr__(self): string = 'RectLattice\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) @@ -1111,6 +1183,23 @@ class HexLattice(Lattice): self._num_axial = None self._center = None + def __eq__(self, other): + if not isinstance(other, HexLattice): + return False + elif not super(HexLattice, self).__eq__(other): + return False + elif self.num_rings != other.num_rings: + return False + elif self.num_axial != other.num_axial: + return False + elif self.center != other.center: + return False + else: + return True + + def __ne__(self, other): + return not self == other + def __repr__(self): string = 'HexLattice\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) From 8c0d269843bb222a61e46e488a96b3b58c5def6e Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Wed, 25 Nov 2015 13:44:20 -0500 Subject: [PATCH 12/49] Commented out material density and nuclides comparision on __eq__ - need to confer with @paulromano on how to properly implement this --- openmc/material.py | 18 ++++++++++-------- openmc/universe.py | 6 ++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index caad3a1cd..5138cc59e 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -90,14 +90,16 @@ class Material(object): return False elif self.name != other.name: return False - elif self.density != other.density: - return False - elif self.density_units != other.density_units: - return False - elif self._nuclides != other.nuclides: - return False - elif self._elements != other._elements: - return False + # FIXME: This won't work since OpenMC only outputs densities in units + # of atom/b-cm in summary.h5 irregardless of input units, and it we + # cannot compute the sum percent in Python since we lack AWR + # elif self.density != other.density: + # return False + # FIXME: The nuclide densities are different in summary.h5??? + # elif self._nuclides != other._nuclides: + # return False + # elif self._elements != other._elements: + # return False elif self._sab != other._sab: return False else: diff --git a/openmc/universe.py b/openmc/universe.py index 1fb29e260..0eb77cdf9 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -80,10 +80,8 @@ class Cell(object): return False elif self.name != other.name: return False - # FIXME: This won't work for materials fills since OpenMC only outputs - # nuclide densities in units of atom/b-cm irregardless of input units - # elif self.fill != other.fill: - # return False + elif self.fill != other.fill: + return False elif self.region != other.region: return False elif self.rotation != other.rotation: From a7c923a82c8bfc6debc3042de9c886a7d8d52b7b Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Wed, 25 Nov 2015 14:15:54 -0500 Subject: [PATCH 13/49] The openmc geometry setter for the mgxs library now clears any old opencg geometry --- openmc/mgxs/library.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index fa49d24e6..0bf973254 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -203,6 +203,7 @@ class Library(object): def openmc_geometry(self, openmc_geometry): cv.check_type('openmc_geometry', openmc_geometry, openmc.Geometry) self._openmc_geometry = openmc_geometry + self._opencg_geometry = None @name.setter def name(self, name): @@ -362,7 +363,6 @@ class Library(object): self._sp_filename = statepoint._f.filename self._openmc_geometry = statepoint.summary.openmc_geometry - self._opencg_geometry = None # Load tallies for each MGXS for each domain and mgxs type for domain in self.domains: From d1bec8a814e22f2c396e21dad8baad4272948eb8 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 25 Nov 2015 14:22:28 -0800 Subject: [PATCH 14/49] updated tally-arithmetic.ipynb notebook based on updates to tally arithmetic --- .../pythonapi/examples/tally-arithmetic.ipynb | 508 +++++++++--------- 1 file changed, 268 insertions(+), 240 deletions(-) diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index fce805f18..3ec974e05 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/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMjhUMjE6MTU6MDYtMDQ6MDDSDNQdAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTI4\nVDIxOjE1OjA2LTA0OjAwo1FsoQAAAABJRU5ErkJggg==\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": [ "" ] @@ -573,8 +592,8 @@ " 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: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-10-28 21:15:07\n", + " Git SHA1: 74ffcb447521c968fb64fdaa63e40598783f2fba\n", + " Date/Time: 2015-11-25 14:20:51\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -615,13 +634,13 @@ " 11/1 1.07867 1.05536 +/- 0.01277\n", " 12/1 1.04203 1.05345 +/- 0.01096\n", " 13/1 1.04482 1.05237 +/- 0.00955\n", - " 14/1 1.04117 1.05113 +/- 0.00852\n", - " 15/1 1.07581 1.05360 +/- 0.00801\n", - " 16/1 1.04235 1.05257 +/- 0.00731\n", - " 17/1 1.02710 1.05045 +/- 0.00701\n", - " 18/1 1.01970 1.04809 +/- 0.00687\n", - " 19/1 1.01022 1.04538 +/- 0.00691\n", - " 20/1 1.01449 1.04332 +/- 0.00675\n", + " 14/1 1.04116 1.05113 +/- 0.00852\n", + " 15/1 1.07569 1.05358 +/- 0.00800\n", + " 16/1 1.04188 1.05252 +/- 0.00732\n", + " 17/1 1.03775 1.05129 +/- 0.00679\n", + " 18/1 0.98462 1.04616 +/- 0.00808\n", + " 19/1 1.08613 1.04902 +/- 0.00801\n", + " 20/1 1.00571 1.04613 +/- 0.00800\n", " Creating state point statepoint.20.h5...\n", "\n", " ===========================================================================\n", @@ -631,27 +650,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 6.3800E-01 seconds\n", - " Reading cross sections = 1.3500E-01 seconds\n", - " Total time in simulation = 2.3556E+01 seconds\n", - " Time in transport only = 2.3532E+01 seconds\n", - " Time in inactive batches = 3.1100E+00 seconds\n", - " Time in active batches = 2.0446E+01 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 = 1.0000E-03 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", - " Total time for finalization = 3.0000E-03 seconds\n", - " Total time elapsed = 2.4210E+01 seconds\n", - " Calculation Rate (inactive) = 4019.29 neutrons/second\n", - " Calculation Rate (active) = 1834.10 neutrons/second\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", - " k-effective (Collision) = 1.03935 +/- 0.00682\n", - " k-effective (Track-length) = 1.04332 +/- 0.00675\n", - " k-effective (Absorption) = 1.03845 +/- 0.00598\n", - " Combined k-effective = 1.04024 +/- 0.00523\n", + " k-effective (Collision) = 1.04597 +/- 0.00663\n", + " k-effective (Track-length) = 1.04613 +/- 0.00800\n", + " k-effective (Absorption) = 1.04087 +/- 0.00627\n", + " Combined k-effective = 1.04322 +/- 0.00570\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -742,7 +761,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", @@ -756,10 +775,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
0total(nu-fission / absorption)1.0401660.009069 total (nu-fission / absorption) 1.040687 0.010913
\n", @@ -767,7 +786,7 @@ ], "text/plain": [ " nuclide score mean std. dev.\n", - "0 total (nu-fission / absorption) 1.040166 0.009069" + "0 total (nu-fission / absorption) 1.040687 0.010913" ] }, "execution_count": 26, @@ -802,7 +821,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", @@ -817,19 +836,19 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
0(0.0e+00 - 6.2e-01)totalabsorption0.959380.008187 (0.0e+00 - 6.2e-01) total absorption 0.959302 0.010033
\n", "
" ], "text/plain": [ - " energy [MeV] nuclide score mean std. dev.\n", - "0 (0.0e+00 - 6.2e-01) total absorption 0.95938 0.008187" + " energy [MeV] nuclide score mean std. dev.\n", + "0 (0.0e+00 - 6.2e-01) total absorption 0.959302 0.010033" ] }, "execution_count": 27, @@ -862,11 +881,12 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -876,18 +896,19 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
energy [MeV]nuclidescoremean
0totalnu-fission1.0908990.010602 (0.0e+00 - 6.2e-01) total nu-fission 1.09103 0.012491
\n", "
" ], "text/plain": [ - " nuclide score mean std. dev.\n", - "0 total nu-fission 1.090899 0.010602" + " energy [MeV] nuclide score mean std. dev.\n", + "0 (0.0e+00 - 6.2e-01) total nu-fission 1.09103 0.012491" ] }, "execution_count": 28, @@ -921,7 +942,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", @@ -937,12 +958,12 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
0(0.0e+00 - 6.2e-01)10000totalabsorption0.8034130.007031 (0.0e+00 - 6.2e-01) 10000 total absorption 0.803182 0.008664
\n", @@ -950,7 +971,7 @@ ], "text/plain": [ " energy [MeV] cell nuclide score mean std. dev.\n", - "0 (0.0e+00 - 6.2e-01) 10000 total absorption 0.803413 0.007031" + "0 (0.0e+00 - 6.2e-01) 10000 total absorption 0.803182 0.008664" ] }, "execution_count": 29, @@ -982,12 +1003,13 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -997,19 +1019,23 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
energy [MeV]cellnuclidescoremean
0(0.0e+00 - 6.2e-01)total(nu-fission / absorption)1.2370530.011765 (0.0e+00 - 6.2e-01) 10000 total (nu-fission / absorption) 1.237982 0.014179
\n", "
" ], "text/plain": [ - " energy [MeV] nuclide score mean std. dev.\n", - "0 (0.0e+00 - 6.2e-01) total (nu-fission / absorption) 1.237053 0.011765" + " energy [MeV] cell nuclide score mean \\\n", + "0 (0.0e+00 - 6.2e-01) 10000 total (nu-fission / absorption) 1.237982 \n", + "\n", + " std. dev. \n", + "0 0.014179 " ] }, "execution_count": 30, @@ -1040,12 +1066,13 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -1055,22 +1082,23 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
energy [MeV]cellnuclidescoremean
0(0.0e+00 - 6.2e-01)total(((absorption * nu-fission) * absorption) * (n...1.0401660.019018 (0.0e+00 - 6.2e-01) 10000 total (((absorption * nu-fission) * absorption) * (n... 1.040687 0.022989
\n", "
" ], "text/plain": [ - " energy [MeV] nuclide \\\n", - "0 (0.0e+00 - 6.2e-01) total \n", + " energy [MeV] cell nuclide \\\n", + "0 (0.0e+00 - 6.2e-01) 10000 total \n", "\n", " score mean std. dev. \n", - "0 (((absorption * nu-fission) * absorption) * (n... 1.040166 0.019018 " + "0 (((absorption * nu-fission) * absorption) * (n... 1.040687 0.022989 " ] }, "execution_count": 31, @@ -1118,7 +1146,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", @@ -1134,100 +1162,100 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
010000(0.0e+00 - 6.3e-07)(U-238 / total)(nu-fission / flux)6.657029e-077.377419e-09 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (nu-fission / flux) 0.000001 8.078651e-09
110000(0.0e+00 - 6.3e-07)(U-238 / total)(scatter / flux)2.099891e-012.303838e-03 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (scatter / flux) 0.209990 2.449396e-03
210000(0.0e+00 - 6.3e-07)(U-235 / total)(nu-fission / flux)3.564204e-013.951669e-03 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (nu-fission / flux) 0.356117 4.364366e-03
310000(0.0e+00 - 6.3e-07)(U-235 / total)(scatter / flux)5.555330e-036.101004e-05 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (scatter / flux) 0.005555 6.495710e-05
410000(6.3e-07 - 2.0e+01)(U-238 / total)(nu-fission / flux)7.154887e-038.053460e-05 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (nu-fission / flux) 0.007190 7.596666e-05
510000(6.3e-07 - 2.0e+01)(U-238 / total)(scatter / flux)2.277701e-011.079289e-03 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (scatter / flux) 0.227843 1.024510e-03
610000(6.3e-07 - 2.0e+01)(U-235 / total)(nu-fission / flux)8.066738e-035.254797e-05 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (nu-fission / flux) 0.008086 6.251590e-05
710000(6.3e-07 - 2.0e+01)(U-235 / total)(scatter / flux)3.366802e-031.647058e-05 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (scatter / flux) 0.003365 1.646663e-05
\n", "
" ], "text/plain": [ - " cell energy [MeV] nuclide score \\\n", - "0 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (nu-fission / flux) \n", - "1 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (scatter / flux) \n", - "2 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (nu-fission / flux) \n", - "3 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (scatter / flux) \n", - "4 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (nu-fission / flux) \n", - "5 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (scatter / flux) \n", - "6 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (nu-fission / flux) \n", - "7 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (scatter / flux) \n", + " cell energy [MeV] nuclide score mean \\\n", + "0 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (nu-fission / flux) 0.000001 \n", + "1 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (scatter / flux) 0.209990 \n", + "2 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (nu-fission / flux) 0.356117 \n", + "3 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (scatter / flux) 0.005555 \n", + "4 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (nu-fission / flux) 0.007190 \n", + "5 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (scatter / flux) 0.227843 \n", + "6 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (nu-fission / flux) 0.008086 \n", + "7 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (scatter / flux) 0.003365 \n", "\n", - " mean std. dev. \n", - "0 6.657029e-07 7.377419e-09 \n", - "1 2.099891e-01 2.303838e-03 \n", - "2 3.564204e-01 3.951669e-03 \n", - "3 5.555330e-03 6.101004e-05 \n", - "4 7.154887e-03 8.053460e-05 \n", - "5 2.277701e-01 1.079289e-03 \n", - "6 8.066738e-03 5.254797e-05 \n", - "7 3.366802e-03 1.647058e-05 " + " std. dev. \n", + "0 8.078651e-09 \n", + "1 2.449396e-03 \n", + "2 4.364366e-03 \n", + "3 6.495710e-05 \n", + "4 7.596666e-05 \n", + "5 1.024510e-03 \n", + "6 6.251590e-05 \n", + "7 1.646663e-05 " ] }, "execution_count": 33, @@ -1258,11 +1286,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 6.65702880e-07]\n", - " [ 3.56420449e-01]]\n", + "[[[ 6.65302296e-07]\n", + " [ 3.56116716e-01]]\n", "\n", - " [[ 7.15488656e-03]\n", - " [ 8.06673774e-03]]]\n" + " [[ 7.19004460e-03]\n", + " [ 8.08598751e-03]]]\n" ] } ], @@ -1290,9 +1318,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.00555533]]\n", + "[[[ 0.00555516]]\n", "\n", - " [[ 0.0033668 ]]]\n" + " [[ 0.00336498]]]\n" ] } ], @@ -1314,8 +1342,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.22777006]\n", - " [ 0.0033668 ]]]\n" + "[[[ 0.22784316]\n", + " [ 0.00336498]]]\n" ] } ], @@ -1344,7 +1372,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", @@ -1360,39 +1388,39 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
010000(0.0e+00 - 6.3e-07)U-238nu-fission0.0000021.283958e-08 10000 (0.0e+00 - 6.3e-07) U-238 nu-fission 0.000002 1.450189e-08
110000(0.0e+00 - 6.3e-07)U-235nu-fission0.8685536.880390e-03 10000 (0.0e+00 - 6.3e-07) U-235 nu-fission 0.870882 7.895515e-03
210000(6.3e-07 - 2.0e+01)U-238nu-fission0.0821498.837250e-04 10000 (6.3e-07 - 2.0e+01) U-238 nu-fission 0.082484 8.253437e-04
310000(6.3e-07 - 2.0e+01)U-235nu-fission0.0926185.195308e-04 10000 (6.3e-07 - 2.0e+01) U-235 nu-fission 0.092762 6.444580e-04
\n", @@ -1400,10 +1428,10 @@ ], "text/plain": [ " cell energy [MeV] nuclide score mean std. dev.\n", - "0 10000 (0.0e+00 - 6.3e-07) U-238 nu-fission 0.000002 1.283958e-08\n", - "1 10000 (0.0e+00 - 6.3e-07) U-235 nu-fission 0.868553 6.880390e-03\n", - "2 10000 (6.3e-07 - 2.0e+01) U-238 nu-fission 0.082149 8.837250e-04\n", - "3 10000 (6.3e-07 - 2.0e+01) U-235 nu-fission 0.092618 5.195308e-04" + "0 10000 (0.0e+00 - 6.3e-07) U-238 nu-fission 0.000002 1.450189e-08\n", + "1 10000 (0.0e+00 - 6.3e-07) U-235 nu-fission 0.870882 7.895515e-03\n", + "2 10000 (6.3e-07 - 2.0e+01) U-238 nu-fission 0.082484 8.253437e-04\n", + "3 10000 (6.3e-07 - 2.0e+01) U-235 nu-fission 0.092762 6.444580e-04" ] }, "execution_count": 37, @@ -1427,7 +1455,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", @@ -1443,84 +1471,84 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
010002(1.0e-08 - 1.1e-07)H-1scatter4.6193980.040124 10002 (1.0e-08 - 1.1e-07) H-1 scatter 4.630154 0.044512
110002(1.1e-07 - 1.2e-06)H-1scatter2.0307570.011239 10002 (1.1e-07 - 1.2e-06) H-1 scatter 2.042984 0.011429
210002(1.2e-06 - 1.3e-05)H-1scatter1.6584880.009777 10002 (1.2e-06 - 1.3e-05) H-1 scatter 1.657517 0.008617
310002(1.3e-05 - 1.4e-04)H-1scatter1.8530020.007378 10002 (1.3e-05 - 1.4e-04) H-1 scatter 1.863326 0.008848
410002(1.4e-04 - 1.5e-03)H-1scatter2.0507730.012484 10002 (1.4e-04 - 1.5e-03) H-1 scatter 2.043916 0.014195
510002(1.5e-03 - 1.6e-02)H-1scatter2.1317590.007821 10002 (1.5e-03 - 1.6e-02) H-1 scatter 2.134458 0.007561
610002(1.6e-02 - 1.7e-01)H-1scatter2.2137100.015159 10002 (1.6e-02 - 1.7e-01) H-1 scatter 2.209947 0.013848
710002(1.7e-01 - 1.9e+00)H-1scatter2.0119250.009406 10002 (1.7e-01 - 1.9e+00) H-1 scatter 2.006967 0.009368
810002(1.9e+00 - 2.0e+01)H-1scatter0.3712800.003949 10002 (1.9e+00 - 2.0e+01) H-1 scatter 0.373895 0.002964
\n", @@ -1528,15 +1556,15 @@ ], "text/plain": [ " cell energy [MeV] nuclide score mean std. dev.\n", - "0 10002 (1.0e-08 - 1.1e-07) H-1 scatter 4.619398 0.040124\n", - "1 10002 (1.1e-07 - 1.2e-06) H-1 scatter 2.030757 0.011239\n", - "2 10002 (1.2e-06 - 1.3e-05) H-1 scatter 1.658488 0.009777\n", - "3 10002 (1.3e-05 - 1.4e-04) H-1 scatter 1.853002 0.007378\n", - "4 10002 (1.4e-04 - 1.5e-03) H-1 scatter 2.050773 0.012484\n", - "5 10002 (1.5e-03 - 1.6e-02) H-1 scatter 2.131759 0.007821\n", - "6 10002 (1.6e-02 - 1.7e-01) H-1 scatter 2.213710 0.015159\n", - "7 10002 (1.7e-01 - 1.9e+00) H-1 scatter 2.011925 0.009406\n", - "8 10002 (1.9e+00 - 2.0e+01) H-1 scatter 0.371280 0.003949" + "0 10002 (1.0e-08 - 1.1e-07) H-1 scatter 4.630154 0.044512\n", + "1 10002 (1.1e-07 - 1.2e-06) H-1 scatter 2.042984 0.011429\n", + "2 10002 (1.2e-06 - 1.3e-05) H-1 scatter 1.657517 0.008617\n", + "3 10002 (1.3e-05 - 1.4e-04) H-1 scatter 1.863326 0.008848\n", + "4 10002 (1.4e-04 - 1.5e-03) H-1 scatter 2.043916 0.014195\n", + "5 10002 (1.5e-03 - 1.6e-02) H-1 scatter 2.134458 0.007561\n", + "6 10002 (1.6e-02 - 1.7e-01) H-1 scatter 2.209947 0.013848\n", + "7 10002 (1.7e-01 - 1.9e+00) H-1 scatter 2.006967 0.009368\n", + "8 10002 (1.9e+00 - 2.0e+01) H-1 scatter 0.373895 0.002964" ] }, "execution_count": 38, @@ -1569,7 +1597,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "2.7.10" } }, "nbformat": 4, From 4be3c64da91ac224c1f4ff2056cf68253589eed5 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 29 Nov 2015 09:00:47 -0500 Subject: [PATCH 15/49] Added __hash__ routines to all Python classes based on __repr__ methods --- openmc/element.py | 2 +- openmc/filter.py | 2 +- openmc/geometry.py | 2 +- openmc/material.py | 3 +++ openmc/mesh.py | 3 +++ openmc/nuclide.py | 2 +- openmc/tallies.py | 16 +--------------- openmc/universe.py | 12 ++++++++++++ 8 files changed, 23 insertions(+), 19 deletions(-) diff --git a/openmc/element.py b/openmc/element.py index d395b434f..cdc422ed2 100644 --- a/openmc/element.py +++ b/openmc/element.py @@ -58,7 +58,7 @@ class Element(object): return not self == other def __hash__(self): - return hash((self._name, self._xs)) + return hash(str(self)) def __repr__(self): string = 'Element - {0}\n'.format(self._name) diff --git a/openmc/filter.py b/openmc/filter.py index 2c4915f51..4c058c085 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -81,7 +81,7 @@ class Filter(object): return not self == other def __hash__(self): - return hash((self.type, tuple(self.bins))) + return hash(str(self)) def __deepcopy__(self, memo): existing = memo.get(id(self)) diff --git a/openmc/geometry.py b/openmc/geometry.py index e848e0cdd..c0b248780 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -147,7 +147,7 @@ class Geometry(object): if cell._type == 'normal': material_cells.add(cell) - material_cells = list(material_cells) + material_cells = list(set(material_cells)) material_cells.sort(key=lambda x: x.id) return material_cells diff --git a/openmc/material.py b/openmc/material.py index 5138cc59e..88c844308 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -108,6 +108,9 @@ class Material(object): def __ne__(self, other): return not self == other + def __hash__(self): + return hash(str(self)) + def __repr__(self): string = 'Material\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) diff --git a/openmc/mesh.py b/openmc/mesh.py index 3b66076b7..b963a25a8 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -189,6 +189,9 @@ class Mesh(object): cv.check_length('mesh width', width, 2, 3) self._width = width + def __hash__(self): + return hash(str(self)) + def __repr__(self): string = 'Mesh\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 2dd8eb153..b95601bf7 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -61,7 +61,7 @@ class Nuclide(object): return not self == other def __hash__(self): - return hash((self._name, self._xs)) + return hash(str(self)) def __repr__(self): string = 'Nuclide - {0}\n'.format(self._name) diff --git a/openmc/tallies.py b/openmc/tallies.py index 0661ab67b..8498fbb5b 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -190,21 +190,7 @@ class Tally(object): return not self == other def __hash__(self): - hashable = [] - - for filter in self.filters: - hashable.append((filter.type, tuple(filter.bins))) - - for nuclide in self.nuclides: - hashable.append(nuclide.name) - - for score in self.scores: - hashable.append(score) - - hashable.append(self.estimator) - hashable.append(self.name) - - return hash(tuple(hashable)) + return hash(str(self)) def __repr__(self): string = 'Tally\n' diff --git a/openmc/universe.py b/openmc/universe.py index 0eb77cdf9..9a8262af3 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -94,6 +94,9 @@ class Cell(object): def __ne__(self, other): return not self == other + def __hash__(self): + return hash(str(self)) + def __repr__(self): string = 'Cell\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) @@ -479,6 +482,9 @@ class Universe(object): def __ne__(self, other): return not self == other + def __hash__(self): + return hash(str(self)) + def __repr__(self): string = 'Universe\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) @@ -964,6 +970,9 @@ class RectLattice(Lattice): def __ne__(self, other): return not self == other + def __hash__(self): + return hash(str(self)) + def __repr__(self): string = 'RectLattice\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) @@ -1198,6 +1207,9 @@ class HexLattice(Lattice): def __ne__(self, other): return not self == other + def __hash__(self): + return hash(str(self)) + def __repr__(self): string = 'HexLattice\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) From f09ec9582b731500d19405957b88c998cfd77f5d Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 29 Nov 2015 09:06:25 -0500 Subject: [PATCH 16/49] Shortened FIXME block in Material.__eq__ --- openmc/material.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index 88c844308..9e0a6b93b 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -90,16 +90,15 @@ class Material(object): return False elif self.name != other.name: return False - # FIXME: This won't work since OpenMC only outputs densities in units - # of atom/b-cm in summary.h5 irregardless of input units, and it we + # FIXME: We cannot compare densities since OpenMC outputs densities + # in atom/b-cm in summary.h5 irregardless of input units, and we # cannot compute the sum percent in Python since we lack AWR - # elif self.density != other.density: + #elif self.density != other.density: # return False - # FIXME: The nuclide densities are different in summary.h5??? - # elif self._nuclides != other._nuclides: - # return False - # elif self._elements != other._elements: + #elif self._nuclides != other._nuclides: # return False + #elif self._elements != other._elements: + # return False elif self._sab != other._sab: return False else: From d26a86f5f1862c34ae4444a8dfca926471c6ccda Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 29 Nov 2015 09:13:28 -0500 Subject: [PATCH 17/49] Reverted to set notation in Geometry.get_all_material_cells() now that __hash__ is implemented everywhere --- openmc/geometry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/geometry.py b/openmc/geometry.py index c0b248780..e848e0cdd 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -147,7 +147,7 @@ class Geometry(object): if cell._type == 'normal': material_cells.add(cell) - material_cells = list(set(material_cells)) + material_cells = list(material_cells) material_cells.sort(key=lambda x: x.id) return material_cells From 061021cd4b5093e203b6376837fb1b89d7ed14c2 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 29 Nov 2015 16:20:25 -0600 Subject: [PATCH 18/49] Fix check for surface crossed when calculating distance to boundary for complex cells. --- src/geometry.F90 | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index 22f5c3a15..519505426 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -120,6 +120,7 @@ contains stack(i_stack) = (actual_sense .eqv. (token > 0)) end if end select + end do if (i_stack == 1) then @@ -598,8 +599,9 @@ contains real(8) :: d_lat ! distance to lattice boundary real(8) :: d_surf ! distance to surface real(8) :: x0,y0,z0 ! coefficients for surface + real(8) :: xyz_cross(3) logical :: coincident ! is particle on surface? - type(Cell), pointer :: cl + type(Cell), pointer :: c class(Surface), pointer :: surf class(Lattice), pointer :: lat @@ -615,7 +617,7 @@ contains LEVEL_LOOP: do j = 1, p % n_coord ! get pointer to cell on this level - cl => cells(p % coord(j) % cell) + c => cells(p % coord(j) % cell) ! copy directional cosines u = p % coord(j) % uvw(1) @@ -625,8 +627,8 @@ contains ! ======================================================================= ! FIND MINIMUM DISTANCE TO SURFACE IN THIS CELL - SURFACE_LOOP: do i = 1, size(cl%region) - index_surf = cl%region(i) + SURFACE_LOOP: do i = 1, size(c % region) + index_surf = c % region(i) coincident = (index_surf == p % surface) ! ignore this token if it corresponds to an operator rather than a @@ -635,14 +637,14 @@ contains if (index_surf >= OP_UNION) cycle ! Calculate distance to surface - surf => surfaces(index_surf)%obj - d = surf%distance(p%coord(j)%xyz, p%coord(j)%uvw, coincident) + surf => surfaces(index_surf) % obj + d = surf % distance(p % coord(j) % xyz, p % coord(j) % uvw, coincident) ! Check if calculated distance is new minimum if (d < d_surf) then if (abs(d - d_surf)/d_surf >= FP_PRECISION) then d_surf = d - level_surf_cross = -cl % region(i) + level_surf_cross = -c % region(i) end if end if end do SURFACE_LOOP @@ -848,14 +850,31 @@ contains if (d_surf < d_lat) then if ((dist - d_surf)/dist >= FP_REL_PRECISION) then dist = d_surf - surface_crossed = level_surf_cross + + ! If the cell is not simple, it is possible that both the negative and + ! positive half-space were given in the region specification. Thus, we + ! have to explicitly check which half-space the particle would be + ! traveling into if the surface is crossed + if (.not. c % simple) then + xyz_cross(:) = p % coord(j) % xyz + d_surf*p % coord(j) % uvw + surf => surfaces(abs(level_surf_cross)) % obj + if (dot_product(p % coord(j) % uvw, & + surf % normal(xyz_cross)) > ZERO) then + surface_crossed = abs(level_surf_cross) + else + surface_crossed = -abs(level_surf_cross) + end if + else + surface_crossed = level_surf_cross + end if + lattice_translation(:) = [0, 0, 0] next_level = j end if else if ((dist - d_lat)/dist >= FP_REL_PRECISION) then dist = d_lat - surface_crossed = None + surface_crossed = NONE lattice_translation(:) = level_lat_trans next_level = j end if From 6f5cdf174f005a44d920eae8ebae3299af5547bd Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 29 Nov 2015 21:39:03 -0500 Subject: [PATCH 19/49] Initial implementation with trio of MGXS IPython Notebooks --- .gitignore | 4 +- .../pythonapi/examples/MGXS-Part-I.ipynb | 1091 ++++++++ .../pythonapi/examples/MGXS-Part-II.ipynb | 1972 +++++++++++++ .../pythonapi/examples/MGXS-Part-III.ipynb | 1633 +++++++++++ .../examples/multi-group-cross-sections.ipynb | 2454 ----------------- .../examples/pandas-dataframes.ipynb | 4 +- .../pythonapi/examples/post-processing.ipynb | 378 ++- openmc/opencg_compatible.py | 2 +- 8 files changed, 5052 insertions(+), 2486 deletions(-) create mode 100644 docs/source/pythonapi/examples/MGXS-Part-I.ipynb create mode 100644 docs/source/pythonapi/examples/MGXS-Part-II.ipynb create mode 100644 docs/source/pythonapi/examples/MGXS-Part-III.ipynb delete mode 100644 docs/source/pythonapi/examples/multi-group-cross-sections.ipynb diff --git a/.gitignore b/.gitignore index b2bdeba7a..136491a4b 100644 --- a/.gitignore +++ b/.gitignore @@ -71,4 +71,6 @@ docs/source/pythonapi/examples/*.xml docs/source/pythonapi/examples/*.png docs/source/pythonapi/examples/*.xls docs/source/pythonapi/examples/mgxs -docs/source/pythonapi/examples/tracks \ No newline at end of file +docs/source/pythonapi/examples/tracks +docs/source/pythonapi/examples/fission-rates +docs/source/pythonapi/examples/plots \ No newline at end of file diff --git a/docs/source/pythonapi/examples/MGXS-Part-I.ipynb b/docs/source/pythonapi/examples/MGXS-Part-I.ipynb new file mode 100644 index 000000000..0bba3bfe0 --- /dev/null +++ b/docs/source/pythonapi/examples/MGXS-Part-I.ipynb @@ -0,0 +1,1091 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This IPython Notebook introduces the use of the `openmc.mgxs` module to calculate multi-group cross sections for an infinite homogeneous medium. In particular, this Notebook introduces the the following features:\n", + "\n", + "* Creation of multi-group cross sections for an **infinite homogeneous medium**\n", + "* Use of **tally arithmetic** to manipulate multi-group cross sections\n", + "\n", + "**Note:** This Notebook illustrates the use of Pandas DataFrames to containerize multi-group cross section data. We recommend using Pandas >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import openmc\n", + "import openmc.mgxs as mgxs\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We first construct a simple homogeneous infinite medium problem to illustrate use of the `openmc.mgxs` module to generate multi-group cross sections." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate some Nuclides\n", + "h1 = openmc.Nuclide('H-1')\n", + "o16 = openmc.Nuclide('O-16')\n", + "u235 = openmc.Nuclide('U-235')\n", + "u238 = openmc.Nuclide('U-238')\n", + "zr90 = openmc.Nuclide('Zr-90')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the nuclides we defined, we will now create a material for the homogeneous medium." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a Material and register the Nuclides\n", + "inf_medium = openmc.Material(name='moderator')\n", + "inf_medium.set_density('g/cc', 5.)\n", + "inf_medium.add_nuclide(h1, 0.028999667)\n", + "inf_medium.add_nuclide(o16, 0.01450188)\n", + "inf_medium.add_nuclide(u235, 0.000114142)\n", + "inf_medium.add_nuclide(u238, 0.006886019)\n", + "inf_medium.add_nuclide(zr90, 0.002116053)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our material, we can now create a materials file object that can be exported to an actual XML file." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a MaterialsFile, register all Materials, and export to XML\n", + "materials_file = openmc.MaterialsFile()\n", + "materials_file.default_xs = '71c'\n", + "materials_file.add_material(inf_medium)\n", + "materials_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's move on to the geometry. This problem will be a simple square cell with reflective boundary conditions to simulate an infinite homogeneous medium. The first step is to create the outer bounding surfaces of the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate boundary Planes\n", + "min_x = openmc.XPlane(boundary_type='reflective', x0=-0.63)\n", + "max_x = openmc.XPlane(boundary_type='reflective', x0=0.63)\n", + "min_y = openmc.YPlane(boundary_type='reflective', y0=-0.63)\n", + "max_y = openmc.YPlane(boundary_type='reflective', y0=0.63)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the surfaces defined, we can now create a cell that is defined by intersections of half-spaces created by the surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a Cell\n", + "cell = openmc.Cell(cell_id=1, name='cell')\n", + "\n", + "# Register bounding Surfaces with the Cell\n", + "cell.region = +min_x & -max_x & +min_y & -max_y\n", + "\n", + "# Fill the Cell with the Material\n", + "cell.fill = inf_medium" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenMC requires that there is a \"root\" universe. Let us create a root universe and add our square cell to it." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate Universe\n", + "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", + "root_universe.add_cell(cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "openmc_geometry = openmc.Geometry()\n", + "openmc_geometry.root_universe = root_universe\n", + "\n", + "# Instantiate a GeometryFile\n", + "geometry_file = openmc.GeometryFile()\n", + "geometry_file.geometry = openmc_geometry\n", + "\n", + "# Export to \"geometry.xml\"\n", + "geometry_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# OpenMC simulation parameters\n", + "batches = 50\n", + "inactive = 10\n", + "particles = 2500\n", + "\n", + "# Instantiate a SettingsFile\n", + "settings_file = openmc.SettingsFile()\n", + "settings_file.batches = batches\n", + "settings_file.inactive = inactive\n", + "settings_file.particles = particles\n", + "settings_file.output = {'tallies': True, 'summary': True}\n", + "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", + "settings_file.set_source_space('fission', bounds)\n", + "\n", + "# Export to \"settings.xml\"\n", + "settings_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we are ready to generate multi-group cross sections! First, let's define a 2-group structure using the built-in `EnergyGroups` class." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a 2-group EnergyGroups object\n", + "groups = mgxs.EnergyGroups()\n", + "groups.group_edges = np.array([0., 0.625e-6, 20.])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now use the fine and coarse `EnergyGroups` objects, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", + "\n", + "* `TotalXS`\n", + "* `TransportXS`\n", + "* `AbsorptionXS`\n", + "* `CaptureXS`\n", + "* `FissionXS`\n", + "* `NuFissionXS`\n", + "* `ScatterXS`\n", + "* `NuScatterXS`\n", + "* `ScatterMatrixXS`\n", + "* `NuScatterMatrixXS`\n", + "* `Chi`\n", + "\n", + "These classes provide us with an interface to generate the tally inputs as well as perform post-processing of OpenMC's tally data to compute the respective multi-group cross sections. In this case, let's create the multi-group total, absorption and scattering cross sections with our 2-group structure." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a few different sections\n", + "total = mgxs.TotalXS(domain=cell, domain_type='cell', groups=groups)\n", + "absorption = mgxs.AbsorptionXS(domain=cell, domain_type='cell', groups=groups)\n", + "scattering = mgxs.ScatterXS(domain=cell, domain_type='cell', groups=groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each multi-group cross section object stores its tallies in a Python dictionary called `tallies`. We can inspect the tallies in the dictionary for our `Absorption` object as follows. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "OrderedDict([('flux', Tally\n", + "\tID =\t10000\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tcell\t[1]\n", + " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t['flux']\n", + "\tEstimator =\ttracklength\n", + "), ('absorption', Tally\n", + "\tID =\t10001\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tcell\t[1]\n", + " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t['absorption']\n", + "\tEstimator =\ttracklength\n", + ")])" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "absorption.tallies" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `Absorption` object includes tracklength tallies for the 'absorption' and 'flux' scores in the 2-group structure in cell 1. Now that each multi-group cross section object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate an empty TalliesFile\n", + "tallies_file = openmc.TalliesFile()\n", + "\n", + "# Add total tallies to the tallies file\n", + "for tally in total.tallies.values():\n", + " tallies_file.add_tally(tally)\n", + "\n", + "# Add absorption tallies to the tallies file\n", + "for tally in absorption.tallies.values():\n", + " tallies_file.add_tally(tally)\n", + "\n", + "# Add scattering tallies to the tallies file\n", + "for tally in scattering.tallies.values():\n", + " tallies_file.add_tally(tally)\n", + " \n", + "# Export to \"tallies.xml\"\n", + "tallies_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we a have a complete set of inputs, so we can go ahead and run our simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " .d88888b. 888b d888 .d8888b.\n", + " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", + " 888 888 88888b.d88888 888 888\n", + " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", + " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", + " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", + " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", + " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", + "__________________888______________________________________________________\n", + " 888\n", + " 888\n", + "\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: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", + " Date/Time: 2015-11-29 17:50:29\n", + " MPI Processes: 1\n", + "\n", + " ===========================================================================\n", + " ========================> INITIALIZATION <=========================\n", + " ===========================================================================\n", + "\n", + " Reading settings XML file...\n", + " Reading cross sections XML file...\n", + " Reading geometry XML file...\n", + " Reading materials XML file...\n", + " Reading tallies XML file...\n", + " Building neighboring cells lists for each surface...\n", + " Loading ACE cross section table: 1001.71c\n", + " Loading ACE cross section table: 8016.71c\n", + " Loading ACE cross section table: 92235.71c\n", + " Loading ACE cross section table: 92238.71c\n", + " Loading ACE cross section table: 40090.71c\n", + " Maximum neutron transport energy: 20.0000 MeV for 1001.71c\n", + " Initializing source particles...\n", + "\n", + " ===========================================================================\n", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 1.19804 \n", + " 2/1 1.12945 \n", + " 3/1 1.15573 \n", + " 4/1 1.13929 \n", + " 5/1 1.16300 \n", + " 6/1 1.22117 \n", + " 7/1 1.19012 \n", + " 8/1 1.11299 \n", + " 9/1 1.16066 \n", + " 10/1 1.12566 \n", + " 11/1 1.20854 \n", + " 12/1 1.14691 1.17773 +/- 0.03082\n", + " 13/1 1.17204 1.17583 +/- 0.01789\n", + " 14/1 1.14148 1.16724 +/- 0.01529\n", + " 15/1 1.17272 1.16834 +/- 0.01189\n", + " 16/1 1.18575 1.17124 +/- 0.01014\n", + " 17/1 1.20498 1.17606 +/- 0.00983\n", + " 18/1 1.14754 1.17249 +/- 0.00923\n", + " 19/1 1.18141 1.17348 +/- 0.00820\n", + " 20/1 1.15074 1.17121 +/- 0.00768\n", + " 21/1 1.15914 1.17011 +/- 0.00703\n", + " 22/1 1.14586 1.16809 +/- 0.00673\n", + " 23/1 1.18999 1.16978 +/- 0.00642\n", + " 24/1 1.15101 1.16844 +/- 0.00609\n", + " 25/1 1.13791 1.16640 +/- 0.00602\n", + " 26/1 1.19791 1.16837 +/- 0.00597\n", + " 27/1 1.19818 1.17012 +/- 0.00587\n", + " 28/1 1.14160 1.16854 +/- 0.00576\n", + " 29/1 1.11487 1.16571 +/- 0.00614\n", + " 30/1 1.17538 1.16620 +/- 0.00584\n", + " 31/1 1.20210 1.16791 +/- 0.00581\n", + " 32/1 1.20078 1.16940 +/- 0.00574\n", + " 33/1 1.14624 1.16839 +/- 0.00558\n", + " 34/1 1.14618 1.16747 +/- 0.00542\n", + " 35/1 1.16866 1.16752 +/- 0.00520\n", + " 36/1 1.18565 1.16821 +/- 0.00504\n", + " 37/1 1.16824 1.16821 +/- 0.00485\n", + " 38/1 1.18299 1.16874 +/- 0.00471\n", + " 39/1 1.21418 1.17031 +/- 0.00480\n", + " 40/1 1.11167 1.16835 +/- 0.00504\n", + " 41/1 1.11545 1.16665 +/- 0.00516\n", + " 42/1 1.11114 1.16491 +/- 0.00529\n", + " 43/1 1.14227 1.16423 +/- 0.00517\n", + " 44/1 1.14104 1.16355 +/- 0.00506\n", + " 45/1 1.16756 1.16366 +/- 0.00492\n", + " 46/1 1.13065 1.16274 +/- 0.00487\n", + " 47/1 1.11251 1.16139 +/- 0.00492\n", + " 48/1 1.14731 1.16101 +/- 0.00481\n", + " 49/1 1.16691 1.16117 +/- 0.00469\n", + " 50/1 1.19679 1.16206 +/- 0.00465\n", + " Creating state point statepoint.50.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 4.2800E-01 seconds\n", + " Reading cross sections = 8.9000E-02 seconds\n", + " Total time in simulation = 1.4506E+01 seconds\n", + " Time in transport only = 1.4496E+01 seconds\n", + " Time in inactive batches = 1.7910E+00 seconds\n", + " Time in active batches = 1.2715E+01 seconds\n", + " Time synchronizing fission bank = 1.0000E-03 seconds\n", + " Sampling source sites = 0.0000E+00 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 0.0000E+00 seconds\n", + " Total time elapsed = 1.4943E+01 seconds\n", + " Calculation Rate (inactive) = 13958.7 neutrons/second\n", + " Calculation Rate (active) = 7864.73 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.16131 +/- 0.00453\n", + " k-effective (Track-length) = 1.16206 +/- 0.00465\n", + " k-effective (Absorption) = 1.16096 +/- 0.00364\n", + " Combined k-effective = 1.16120 +/- 0.00325\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Remove old HDF5 (summary, statepoint) files\n", + "!rm statepoint.*\n", + "\n", + "# Run OpenMC\n", + "executor = openmc.Executor()\n", + "executor.run_simulation()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tally Data Processing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and \"reading\" the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the last statepoint file\n", + "sp = openmc.StatePoint('statepoint.50.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the summary file and link it with the statepoint\n", + "su = openmc.Summary('summary.h5')\n", + "sp.link_with_summary(su)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the statepoint into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the tallies from the statepoint into each MGXS object\n", + "total.load_from_statepoint(sp)\n", + "absorption.load_from_statepoint(sp)\n", + "scattering.load_from_statepoint(sp)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Voila! Our multi-group cross sections are now ready to rock 'n roll!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extracting and Storing MGXS Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's first inspect our total cross section by printing it to the screen." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\ttotal\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t1\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t6.81e-01 +/- 1.88e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.40e+00 +/- 5.91e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "total.print_xs()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since the `openmc.mgxs` module uses tally arithmetic under-the-hood, the cross section is stored as a \"derived\" tally. This means that it can be queried and manipulated using all of the same method supported for the `Tally` class in the OpenMC Python API. For example, we can construct a Pandas DataFrame of the multi-group cross section data." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
111total0.6683230.001264
012total1.2932580.007624
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "1 1 1 total 0.668323 0.001264\n", + "0 1 2 total 1.293258 0.007624" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = scattering.get_pandas_dataframe()\n", + "df.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each multi-group cross section object can be easily exported to a variety of file formats, including CSV, Excel, and LaTeX for storage or data processing." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "absorption.export_xs_data(filename='absorption-xs', format='excel')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following code snippet shows how to export all of three cross sections to the same HDF5 binary data store." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "total.build_hdf5_store(filename='mgxs', append=True)\n", + "absorption.build_hdf5_store(filename='mgxs', append=True)\n", + "scattering.build_hdf5_store(filename='mgxs', append=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Comparing MGXS with Tally Arithmetic" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we illustrate how one can leverage OpenMC's tally arithmetic data processing feature with `MGXS` objects. The `openmc.mgxs` module uses tally arithmetic to compute multi-group cross sections with automated uncertainty propagation. Each `MGXS` object includes an `xs_tally` attribute which is a \"derived\" tally based on the tallies needed to compute the cross section type of interest. These derived tallies can be used in subsequent tally arithmetic operations. For example, we can use tally artithmetic to confirm that the `TotalXS` is equal to the sum of the `AbsorptionXS` and `ScatterXS` objects." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total(((total / flux) - (absorption / flux)) - (sca...4.884981e-150.011274
11(6.3e-07 - 2.0e+01)total(((total / flux) - (absorption / flux)) - (sca...1.221245e-150.001802
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide \\\n", + "0 1 (0.0e+00 - 6.3e-07) total \n", + "1 1 (6.3e-07 - 2.0e+01) total \n", + "\n", + " score mean std. dev. \n", + "0 (((total / flux) - (absorption / flux)) - (sca... 4.884981e-15 0.011274 \n", + "1 (((total / flux) - (absorption / flux)) - (sca... 1.221245e-15 0.001802 " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to compute the difference between the total, absorption and scattering\n", + "difference = total.xs_tally - absorption.xs_tally - scattering.xs_tally\n", + "\n", + "# The difference is a derived tally which can generate Pandas DataFrames for inspection\n", + "difference.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similarly, we can use tally arithmetic to compute the ratio of `AbsorptionXS` and `ScatterXS` to the `TotalXS`." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total((absorption / flux) / (total / flux))0.0762190.000651
11(6.3e-07 - 2.0e+01)total((absorption / flux) / (total / flux))0.0193190.000086
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score \\\n", + "0 1 (0.0e+00 - 6.3e-07) total ((absorption / flux) / (total / flux)) \n", + "1 1 (6.3e-07 - 2.0e+01) total ((absorption / flux) / (total / flux)) \n", + "\n", + " mean std. dev. \n", + "0 0.076219 0.000651 \n", + "1 0.019319 0.000086 " + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to compute the absorption-to-total MGXS ratio\n", + "absorption_to_total = absorption.xs_tally / total.xs_tally\n", + "\n", + "# The absorption-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", + "absorption_to_total.get_pandas_dataframe()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total((scatter / flux) / (total / flux))0.9237810.007714
11(6.3e-07 - 2.0e+01)total((scatter / flux) / (total / flux))0.9806810.002617
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score \\\n", + "0 1 (0.0e+00 - 6.3e-07) total ((scatter / flux) / (total / flux)) \n", + "1 1 (6.3e-07 - 2.0e+01) total ((scatter / flux) / (total / flux)) \n", + "\n", + " mean std. dev. \n", + "0 0.923781 0.007714 \n", + "1 0.980681 0.002617 " + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to compute the scattering-to-total MGXS ratio\n", + "scattering_to_total = scattering.xs_tally / total.xs_tally\n", + "\n", + "# The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", + "scattering_to_total.get_pandas_dataframe()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total(((absorption / flux) / (total / flux)) + ((sc...10.007741
11(6.3e-07 - 2.0e+01)total(((absorption / flux) / (total / flux)) + ((sc...10.002619
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide \\\n", + "0 1 (0.0e+00 - 6.3e-07) total \n", + "1 1 (6.3e-07 - 2.0e+01) total \n", + "\n", + " score mean std. dev. \n", + "0 (((absorption / flux) / (total / flux)) + ((sc... 1 0.007741 \n", + "1 (((absorption / flux) / (total / flux)) + ((sc... 1 0.002619 " + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to ensure that the absorption- and scattering-to-total MGXS ratios sum to unity\n", + "sum_ratio = absorption_to_total + scattering_to_total\n", + "\n", + "# The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", + "sum_ratio.get_pandas_dataframe()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/pythonapi/examples/MGXS-Part-II.ipynb b/docs/source/pythonapi/examples/MGXS-Part-II.ipynb new file mode 100644 index 000000000..2976df22b --- /dev/null +++ b/docs/source/pythonapi/examples/MGXS-Part-II.ipynb @@ -0,0 +1,1972 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This IPython Notebook illustrates the use of the `openmc.mgxs` module to calculate multi-group cross sections for a heterogeneous fuel pin cell geometry. In particular, this Notebook illustrates the following features:\n", + "\n", + "* Creation of multi-group cross sections on a **heterogeneous geometry**\n", + "* Calculation of cross sections on a **nuclide-by-nuclide basis**\n", + "* Built-in features for **energy condensation** in downstream data processing\n", + "* The use of **PyNE for plot** continuous energy vs. multi-group cross sections\n", + "* **Validation** of multi-group cross sections with **OpenMOC**\n", + "\n", + "**Note:** This Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook in its entirety, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries. In addition, this Notebook illustrates the use of Pandas DataFrames to containerize multi-group cross section data. We recommend using Pandas >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning: This call to matplotlib.use() has no effect\n", + "because the backend has already been chosen;\n", + "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", + "or matplotlib.backends is imported for the first time.\n", + "\n", + " warnings.warn(_use_error_msg)\n", + "/usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:9: QAWarning: pyne.rxname is not yet QA compliant.\n", + "/usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:9: QAWarning: pyne.ace is not yet QA compliant.\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "import openmc\n", + "import openmc.mgxs as mgxs\n", + "import openmoc\n", + "from openmoc.compatible import get_openmoc_geometry\n", + "import pyne.ace\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this section we show how to compute multi-group cross sections for a fuel pin cell. In addition, we will illustrate how to use some of the more advanced features in `openmc.mgxs` such as nuclide-by-nuclide microscopic cross section tallies and downstream energy group condensation." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate some Nuclides\n", + "h1 = openmc.Nuclide('H-1')\n", + "o16 = openmc.Nuclide('O-16')\n", + "u235 = openmc.Nuclide('U-235')\n", + "u238 = openmc.Nuclide('U-238')\n", + "zr90 = openmc.Nuclide('Zr-90')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the nuclides we defined, we will now create three distinct materials for water, clad and fuel." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# 1.6 enriched fuel\n", + "fuel = openmc.Material(name='1.6% Fuel')\n", + "fuel.set_density('g/cm3', 10.31341)\n", + "fuel.add_nuclide(u235, 3.7503e-4)\n", + "fuel.add_nuclide(u238, 2.2625e-2)\n", + "fuel.add_nuclide(o16, 4.6007e-2)\n", + "\n", + "# borated water\n", + "water = openmc.Material(name='Borated Water')\n", + "water.set_density('g/cm3', 0.740582)\n", + "water.add_nuclide(h1, 4.9457e-2)\n", + "water.add_nuclide(o16, 2.4732e-2)\n", + "\n", + "# zircaloy\n", + "zircaloy = openmc.Material(name='Zircaloy')\n", + "zircaloy.set_density('g/cm3', 6.55)\n", + "zircaloy.add_nuclide(zr90, 7.2758e-3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our materials, we can now create a materials file object that can be exported to an actual XML file." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a MaterialsFile, add Materials\n", + "materials_file = openmc.MaterialsFile()\n", + "materials_file.add_material(fuel)\n", + "materials_file.add_material(water)\n", + "materials_file.add_material(zircaloy)\n", + "materials_file.default_xs = '71c'\n", + "\n", + "# Export to \"materials.xml\"\n", + "materials_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's move on to the geometry. Our problem will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces -- in this case two cylinders and six reflective planes." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create cylinders for the fuel and clad\n", + "fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218)\n", + "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n", + "\n", + "# Create boundary planes to surround the geometry\n", + "# Use both reflective and vacuum boundaries to make life interesting\n", + "min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective')\n", + "max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective')\n", + "min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective')\n", + "max_y = openmc.YPlane(y0=+0.63, boundary_type='reflective')\n", + "min_z = openmc.ZPlane(z0=-0.63, boundary_type='reflective')\n", + "max_z = openmc.ZPlane(z0=+0.63, boundary_type='reflective')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the surfaces defined, we can now create cells that are defined by intersections of half-spaces created by the surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create a Universe to encapsulate a fuel pin\n", + "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", + "\n", + "# Create fuel Cell\n", + "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", + "fuel_cell.fill = fuel\n", + "fuel_cell.region = -fuel_outer_radius\n", + "pin_cell_universe.add_cell(fuel_cell)\n", + "\n", + "# Create a clad Cell\n", + "clad_cell = openmc.Cell(name='1.6% Clad')\n", + "clad_cell.fill = zircaloy\n", + "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", + "pin_cell_universe.add_cell(clad_cell)\n", + "\n", + "# Create a moderator Cell\n", + "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", + "moderator_cell.fill = water\n", + "moderator_cell.region = +clad_outer_radius\n", + "pin_cell_universe.add_cell(moderator_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenMC requires that there is a \"root\" universe. Let us create a root cell that is filled by the pin cell universe and then assign it to the root universe." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create root Cell\n", + "root_cell = openmc.Cell(name='root cell')\n", + "root_cell.region = +min_x & -max_x & +min_y & -max_y\n", + "root_cell.fill = pin_cell_universe\n", + "\n", + "# Create root Universe\n", + "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", + "root_universe.add_cell(root_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "openmc_geometry = openmc.Geometry()\n", + "openmc_geometry.root_universe = root_universe\n", + "\n", + "# Instantiate a GeometryFile\n", + "geometry_file = openmc.GeometryFile()\n", + "geometry_file.geometry = openmc_geometry\n", + "\n", + "# Export to \"geometry.xml\"\n", + "geometry_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 190 active batches each with 10000 particles." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# OpenMC simulation parameters\n", + "batches = 50\n", + "inactive = 10\n", + "particles = 10000\n", + "\n", + "# Instantiate a SettingsFile\n", + "settings_file = openmc.SettingsFile()\n", + "settings_file.batches = batches\n", + "settings_file.inactive = inactive\n", + "settings_file.particles = particles\n", + "settings_file.output = {'tallies': True, 'summary': True}\n", + "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", + "settings_file.set_source_space('fission', bounds)\n", + "\n", + "# Activate tally precision triggers\n", + "settings_file.trigger_active = True\n", + "settings_file.trigger_max_batches = settings_file.batches * 4\n", + "\n", + "# Export to \"settings.xml\"\n", + "settings_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define a \"fine\" 8-group and \"coarse\" 2-group structures using the built-in `EnergyGroups` class." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a \"fine\" 8-group EnergyGroups object\n", + "fine_groups = mgxs.EnergyGroups()\n", + "fine_groups.group_edges = np.array([0., 0.058e-6, 0.14e-6, 0.28e-6,\n", + " 0.625e-6, 4.e-6, 5.53e-3, 821.e-3, 20.])\n", + "\n", + "# Instantiate a \"coarse\" 2-group EnergyGroups object\n", + "coarse_groups = mgxs.EnergyGroups()\n", + "coarse_groups.group_edges = np.array([0., 0.625e-6, 20.])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we will instantiate a variety of `MGXS` objects needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define transport, nu-fission, nu-scatter and chi cross sections for each of the three cells in the fuel pin with the 8-group structure as our energy groups." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Extract all Cells filled by Materials\n", + "openmc_cells = openmc_geometry.get_all_material_cells()\n", + "\n", + "# Create dictionary to store multi-group cross sections for all cells\n", + "xs_library = {}\n", + "\n", + "# Instantiate 8-group cross sections for each cell\n", + "for cell in openmc_cells:\n", + " xs_library[cell.id] = {}\n", + " xs_library[cell.id]['transport'] = mgxs.TransportXS(groups=fine_groups)\n", + " xs_library[cell.id]['fission'] = mgxs.FissionXS(groups=fine_groups)\n", + " xs_library[cell.id]['nu-fission'] = mgxs.NuFissionXS(groups=fine_groups)\n", + " xs_library[cell.id]['nu-scatter'] = mgxs.NuScatterMatrixXS(groups=fine_groups)\n", + " xs_library[cell.id]['chi'] = mgxs.Chi(groups=fine_groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we showcase the use of OpenMC's tally trigger feature in conjunction with the `openmc.mgxs` module. In particular, we will assign a tally trigger of 1E-2 on the standard deviation for each of the tallies used to compute multi-group cross sections." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create a tally trigger for +/- 0.01 on each tally used to compute the multi-group cross sections\n", + "tally_trigger = openmc.Trigger('std_dev', 1E-2)\n", + "\n", + "# Add the tally trigger to each of the multi-group cross section tallies\n", + "for cell in openmc_cells:\n", + " for mgxs_type in xs_library[cell.id]:\n", + " xs_library[cell.id][mgxs_type].tally_trigger = tally_trigger" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we must loop over all cells to set the cross section domains to the various cells - fuel, clad and moderator - included in the geometry. In addition, we will set each cross section to tally cross sections on a per-nuclide basis through the use of the `by_nuclide` instance attribute. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate an empty TalliesFile\n", + "tallies_file = openmc.TalliesFile()\n", + "\n", + "# Iterate over all cells and cross section types\n", + "for cell in openmc_cells:\n", + " for rxn_type in xs_library[cell.id]:\n", + "\n", + " # Set the cross sections domain type to the cell\n", + " xs_library[cell.id][rxn_type].domain = cell\n", + " xs_library[cell.id][rxn_type].domain_type = 'cell'\n", + " \n", + " # Tally cross sections by nuclide (e.g., micro cross sections)\n", + " xs_library[cell.id][rxn_type].by_nuclide = True\n", + " \n", + " # Add OpenMC tallies to the tallies file for XML generation\n", + " for tally in xs_library[cell.id][rxn_type].tallies.values():\n", + " tallies_file.add_tally(tally, merge=True)\n", + "\n", + "# Export to \"tallies.xml\"\n", + "tallies_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we a have a complete set of inputs, so we can go ahead and run our simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " .d88888b. 888b d888 .d8888b.\n", + " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", + " 888 888 88888b.d88888 888 888\n", + " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", + " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", + " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", + " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", + " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", + "__________________888______________________________________________________\n", + " 888\n", + " 888\n", + "\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: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", + " Date/Time: 2015-11-29 21:22:25\n", + " MPI Processes: 1\n", + "\n", + " ===========================================================================\n", + " ========================> INITIALIZATION <=========================\n", + " ===========================================================================\n", + "\n", + " Reading settings XML file...\n", + " Reading cross sections XML file...\n", + " Reading geometry XML file...\n", + " Reading materials XML file...\n", + " Reading tallies XML file...\n", + " Building neighboring cells lists for each surface...\n", + " Loading ACE cross section table: 92235.71c\n", + " Loading ACE cross section table: 92238.71c\n", + " Loading ACE cross section table: 8016.71c\n", + " Loading ACE cross section table: 1001.71c\n", + " Loading ACE cross section table: 40090.71c\n", + " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", + " Initializing source particles...\n", + "\n", + " ===========================================================================\n", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 1.22593 \n", + " 2/1 1.24245 \n", + " 3/1 1.24545 \n", + " 4/1 1.21868 \n", + " 5/1 1.22429 \n", + " 6/1 1.22607 \n", + " 7/1 1.21456 \n", + " 8/1 1.23816 \n", + " 9/1 1.25060 \n", + " 10/1 1.22806 \n", + " 11/1 1.19821 \n", + " 12/1 1.19897 1.19859 +/- 0.00038\n", + " 13/1 1.22119 1.20612 +/- 0.00754\n", + " 14/1 1.20701 1.20634 +/- 0.00533\n", + " 15/1 1.24784 1.21464 +/- 0.00927\n", + " 16/1 1.22413 1.21622 +/- 0.00773\n", + " 17/1 1.25050 1.22112 +/- 0.00817\n", + " 18/1 1.22006 1.22099 +/- 0.00707\n", + " 19/1 1.22813 1.22178 +/- 0.00629\n", + " 20/1 1.22791 1.22239 +/- 0.00566\n", + " 21/1 1.22729 1.22284 +/- 0.00514\n", + " 22/1 1.19867 1.22083 +/- 0.00510\n", + " 23/1 1.23796 1.22214 +/- 0.00488\n", + " 24/1 1.22412 1.22228 +/- 0.00452\n", + " 25/1 1.22638 1.22256 +/- 0.00421\n", + " 26/1 1.22181 1.22251 +/- 0.00394\n", + " 27/1 1.19055 1.22063 +/- 0.00415\n", + " 28/1 1.20683 1.21986 +/- 0.00399\n", + " 29/1 1.21689 1.21971 +/- 0.00378\n", + " 30/1 1.23670 1.22056 +/- 0.00368\n", + " 31/1 1.21396 1.22024 +/- 0.00352\n", + " 32/1 1.21389 1.21995 +/- 0.00337\n", + " 33/1 1.24649 1.22111 +/- 0.00342\n", + " 34/1 1.23204 1.22156 +/- 0.00330\n", + " 35/1 1.20768 1.22101 +/- 0.00322\n", + " 36/1 1.22271 1.22107 +/- 0.00309\n", + " 37/1 1.21796 1.22096 +/- 0.00298\n", + " 38/1 1.23842 1.22158 +/- 0.00293\n", + " 39/1 1.23080 1.22190 +/- 0.00285\n", + " 40/1 1.23572 1.22236 +/- 0.00279\n", + " 41/1 1.21691 1.22218 +/- 0.00271\n", + " 42/1 1.24616 1.22293 +/- 0.00272\n", + " 43/1 1.21903 1.22282 +/- 0.00264\n", + " 44/1 1.22967 1.22302 +/- 0.00257\n", + " 45/1 1.22053 1.22295 +/- 0.00250\n", + " 46/1 1.24087 1.22344 +/- 0.00248\n", + " 47/1 1.20251 1.22288 +/- 0.00248\n", + " 48/1 1.20331 1.22236 +/- 0.00246\n", + " 49/1 1.22724 1.22249 +/- 0.00240\n", + " 50/1 1.24798 1.22313 +/- 0.00243\n", + " Triggers unsatisfied, max unc./thresh. is 1.32110 for scatter-p1 in tally 10054\n", + " The estimated number of batches is 80\n", + " Creating state point statepoint.050.h5...\n", + " 51/1 1.22253 1.22311 +/- 0.00237\n", + " 52/1 1.24330 1.22359 +/- 0.00236\n", + " 53/1 1.23251 1.22380 +/- 0.00231\n", + " 54/1 1.21133 1.22352 +/- 0.00228\n", + " 55/1 1.24503 1.22399 +/- 0.00228\n", + " 56/1 1.22013 1.22391 +/- 0.00223\n", + " 57/1 1.23877 1.22423 +/- 0.00220\n", + " 58/1 1.23793 1.22451 +/- 0.00218\n", + " 59/1 1.21018 1.22422 +/- 0.00215\n", + " 60/1 1.22417 1.22422 +/- 0.00211\n", + " 61/1 1.23094 1.22435 +/- 0.00207\n", + " 62/1 1.23310 1.22452 +/- 0.00204\n", + " 63/1 1.22488 1.22453 +/- 0.00200\n", + " 64/1 1.22702 1.22457 +/- 0.00196\n", + " 65/1 1.18834 1.22391 +/- 0.00204\n", + " 66/1 1.23112 1.22404 +/- 0.00200\n", + " 67/1 1.21611 1.22390 +/- 0.00197\n", + " 68/1 1.22513 1.22392 +/- 0.00194\n", + " 69/1 1.21741 1.22381 +/- 0.00191\n", + " 70/1 1.22484 1.22383 +/- 0.00188\n", + " 71/1 1.19662 1.22338 +/- 0.00190\n", + " 72/1 1.23315 1.22354 +/- 0.00187\n", + " 73/1 1.22796 1.22361 +/- 0.00185\n", + " 74/1 1.21417 1.22346 +/- 0.00182\n", + " 75/1 1.21020 1.22326 +/- 0.00181\n", + " 76/1 1.23413 1.22343 +/- 0.00179\n", + " 77/1 1.22184 1.22340 +/- 0.00176\n", + " 78/1 1.20309 1.22310 +/- 0.00176\n", + " 79/1 1.23458 1.22327 +/- 0.00174\n", + " 80/1 1.20724 1.22304 +/- 0.00173\n", + " Triggers satisfied for batch 80\n", + " Creating state point statepoint.080.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 4.1800E-01 seconds\n", + " Reading cross sections = 8.7000E-02 seconds\n", + " Total time in simulation = 2.3349E+02 seconds\n", + " Time in transport only = 2.3343E+02 seconds\n", + " Time in inactive batches = 1.4263E+01 seconds\n", + " Time in active batches = 2.1923E+02 seconds\n", + " Time synchronizing fission bank = 2.5000E-02 seconds\n", + " Sampling source sites = 2.1000E-02 seconds\n", + " SEND/RECV source sites = 4.0000E-03 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 9.0000E-03 seconds\n", + " Total time elapsed = 2.3396E+02 seconds\n", + " Calculation Rate (inactive) = 7011.15 neutrons/second\n", + " Calculation Rate (active) = 1824.61 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.22327 +/- 0.00148\n", + " k-effective (Track-length) = 1.22304 +/- 0.00173\n", + " k-effective (Absorption) = 1.22407 +/- 0.00129\n", + " Combined k-effective = 1.22373 +/- 0.00113\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Delete old HDF5 files\n", + "!rm *.h5\n", + "\n", + "# Run OpenMC with the output throttled!\n", + "executor = openmc.Executor()\n", + "executor.run_simulation(output=True, mpi_procs=3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tally Data Processing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and \"reading\" the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the last statepoint file\n", + "sp = openmc.StatePoint('statepoint.080.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Load the summary file and link it with the statepoint\n", + "su = openmc.Summary('summary.h5')\n", + "sp.link_with_summary(su)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The statepoint is now ready to be analyzed by our multi-group cross sections. Next, we load the tallies from the statepoint into each object to compute the cross sections using tally arithmetic." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Iterate over all cells and cross section types\n", + "for cell in openmc_cells:\n", + " for rxn_type in xs_library[cell.id]:\n", + " xs_library[cell.id][rxn_type].load_from_statepoint(sp)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That's it! Our multi-group cross sections are now ready for the big spotlight. This time we have cross sections in three distinct spatial zones - fuel, clad and moderator - on a per-nuclide basis." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extracting and Storing MGXS Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's first inspect one of our cross sections by printing it to the screen as a microscopic cross section in units of barns." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tNuclide =\tU-235\n", + "\tCross Sections [barns]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t3.31e+00 +/- 1.88e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t3.97e+00 +/- 1.24e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t5.50e+01 +/- 2.02e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t8.83e+01 +/- 3.56e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t2.90e+02 +/- 4.54e-01%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t4.49e+02 +/- 4.10e-01%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.87e+02 +/- 2.56e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 2.82e-01%\n", + "\n", + "\tNuclide =\tU-238\n", + "\tCross Sections [barns]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t1.06e+00 +/- 2.30e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t1.21e-03 +/- 2.25e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t5.82e-04 +/- 3.09e+00%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t6.54e-06 +/- 3.27e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.07e-05 +/- 4.39e-01%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.55e-05 +/- 4.12e-01%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.30e-05 +/- 2.57e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t4.24e-05 +/- 2.81e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "nufission = xs_library[fuel_cell.id]['nu-fission']\n", + "nufission.print_xs(xs_type='micro', nuclides=['U-235', 'U-238'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our multi-group cross sections are capable of summing across all nuclides to provide us with macroscopic cross sections as well." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t2.52e-02 +/- 2.19e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t1.51e-03 +/- 1.22e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t2.06e-02 +/- 2.02e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t3.31e-02 +/- 3.56e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.09e-01 +/- 4.54e-01%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.69e-01 +/- 4.10e-01%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.58e-01 +/- 2.56e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t5.40e-01 +/- 2.82e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "nufission = xs_library[fuel_cell.id]['nu-fission']\n", + "nufission.print_xs(xs_type='macro', nuclides='sum')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Although a printed report is nice, it is not scalable or flexible. Let's extract the cross section data for the moderator as a Pandas DataFrame." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup ingroup outnuclidemeanstd. dev.
1261000211H-10.2340220.003645
1271000211O-161.5603050.006280
1241000212H-11.5880250.002815
1251000212O-160.2851470.001392
1221000213H-10.0107760.000186
1231000213O-160.0000000.000000
1201000214H-10.0000230.000010
1211000214O-160.0000000.000000
1181000215H-10.0000000.000000
1191000215O-160.0000000.000000
\n", + "
" + ], + "text/plain": [ + " cell group in group out nuclide mean std. dev.\n", + "126 10002 1 1 H-1 0.234022 0.003645\n", + "127 10002 1 1 O-16 1.560305 0.006280\n", + "124 10002 1 2 H-1 1.588025 0.002815\n", + "125 10002 1 2 O-16 0.285147 0.001392\n", + "122 10002 1 3 H-1 0.010776 0.000186\n", + "123 10002 1 3 O-16 0.000000 0.000000\n", + "120 10002 1 4 H-1 0.000023 0.000010\n", + "121 10002 1 4 O-16 0.000000 0.000000\n", + "118 10002 1 5 H-1 0.000000 0.000000\n", + "119 10002 1 5 O-16 0.000000 0.000000" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nuscatter = xs_library[moderator_cell.id]['nu-scatter']\n", + "df = nuscatter.get_pandas_dataframe(xs_type='micro')\n", + "df.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we illustate how one can easily take multi-group cross sections and condense them down to a coarser energy group structure using. The `get_condensed_xs(...)` class method takes in as a parameter an `EnergyGroups` object with a coarse(r) group structure and returns a new multi-group cross section condensed to the coarse groups. We illustrate this process below using the 2-group structure created earlier." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Extract the 16-group transport cross section for the fuel\n", + "fine_xs = xs_library[fuel_cell.id]['transport']\n", + "\n", + "# Condense to the 2-group structure\n", + "condense_xs = fine_xs.get_condensed_xs(coarse_groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Group condensation is as simple as that! We now have a new coarse 2-group cross section in addition to our original 16-group cross section. Let's inspect the 2-group cross section by printing it to the screen and extracting a Pandas DataFrame as we have already learned how to do." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\ttransport\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tNuclide =\tU-235\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t7.81e-03 +/- 4.75e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 1.89e-01%\n", + "\n", + "\tNuclide =\tU-238\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t2.17e-01 +/- 1.31e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t2.53e-01 +/- 2.08e-01%\n", + "\n", + "\tNuclide =\tO-16\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 1.50e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.74e-01 +/- 2.66e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "condense_xs.print_xs()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
3100001U-23520.8281270.098842
4100001U-2389.5822950.012550
5100001O-163.1573580.004725
0100002U-235485.2176490.916465
1100002U-23811.1760810.023196
2100002O-163.7881670.010090
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "3 10000 1 U-235 20.828127 0.098842\n", + "4 10000 1 U-238 9.582295 0.012550\n", + "5 10000 1 O-16 3.157358 0.004725\n", + "0 10000 2 U-235 485.217649 0.916465\n", + "1 10000 2 U-238 11.176081 0.023196\n", + "2 10000 2 O-16 3.788167 0.010090" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = condense_xs.get_pandas_dataframe(xs_type='micro')\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Verification with OpenMOC" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's verify our cross sections using OpenMOC. First, we use OpenCG construct an equivalent OpenMOC geometry." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create an OpenMOC Geometry from the OpenCG Geometry\n", + "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we we can inject the multi-group cross sections into the equivalent fuel pin cell OpenMOC geometry." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Get all OpenMOC cells in the gometry\n", + "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", + "\n", + "# Inject multi-group cross sections into OpenMOC Materials\n", + "# NOTE: This code will work for 1, 10, or 1,000s of cells\n", + "# as is the case for a complicated geometry like BEAVRS\n", + "for cell_id, cell in openmoc_cells.items():\n", + " \n", + " # Ignore the root cell\n", + " if cell.getName() == 'root cell':\n", + " continue\n", + " \n", + " # Get a reference to the Material filling this Cell\n", + " openmoc_material = cell.getFillMaterial()\n", + " \n", + " # Set the number of energy groups for the Material\n", + " openmoc_material.setNumEnergyGroups(fine_groups.num_groups)\n", + " \n", + " # Extract the appropriate cross section objects for this cell\n", + " transport = xs_library[cell_id]['transport']\n", + " nufission = xs_library[cell_id]['nu-fission']\n", + " nuscatter = xs_library[cell_id]['nu-scatter']\n", + " chi = xs_library[cell_id]['chi']\n", + " \n", + " # Inject NumPy arrays of cross section data into the Material\n", + " # NOTE: In each case we must sum across nuclides to get the\n", + " # macroscopic cross sections needed by OpenMOC\n", + " openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setChi(chi.get_xs(nuclides='sum').flatten())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are now ready to run OpenMOC to verify our cross-sections from OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Computing the eigenvalue...\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.574633\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.679931\tres = 4.254E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.660910\tres = 1.832E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.658975\tres = 2.798E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.642976\tres = 2.927E-03\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.625710\tres = 2.428E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.606521\tres = 2.685E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.587277\tres = 3.067E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.568777\tres = 3.173E-02\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.551415\tres = 3.150E-02\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.535708\tres = 3.052E-02\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.521916\tres = 2.849E-02\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.510222\tres = 2.575E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.500691\tres = 2.241E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.493392\tres = 1.868E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.488318\tres = 1.458E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.485438\tres = 1.028E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.484705\tres = 5.896E-03\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.486046\tres = 1.510E-03\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.489362\tres = 2.766E-03\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.494546\tres = 6.824E-03\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.501482\tres = 1.059E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.510042\tres = 1.402E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.520095\tres = 1.707E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.531508\tres = 1.971E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.544145\tres = 2.194E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.557872\tres = 2.378E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.572558\tres = 2.523E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.588073\tres = 2.632E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.604293\tres = 2.710E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.621101\tres = 2.758E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.638383\tres = 2.781E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.656033\tres = 2.782E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.673951\tres = 2.765E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.692044\tres = 2.731E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.710228\tres = 2.685E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.728423\tres = 2.628E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.746559\tres = 2.562E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.764569\tres = 2.490E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.782397\tres = 2.413E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.799990\tres = 2.332E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.817302\tres = 2.249E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.834293\tres = 2.164E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.850928\tres = 2.079E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.867178\tres = 1.994E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.883019\tres = 1.910E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.898428\tres = 1.827E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.913391\tres = 1.745E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.927893\tres = 1.665E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.941926\tres = 1.588E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.955484\tres = 1.512E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.968564\tres = 1.439E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.981163\tres = 1.369E-02\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.993284\tres = 1.301E-02\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.004930\tres = 1.235E-02\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.016106\tres = 1.172E-02\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.026818\tres = 1.112E-02\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.037075\tres = 1.054E-02\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.046885\tres = 9.989E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.056259\tres = 9.459E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.065207\tres = 8.954E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.073742\tres = 8.471E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.081873\tres = 8.012E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.089615\tres = 7.573E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.096981\tres = 7.156E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.103982\tres = 6.760E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.110632\tres = 6.382E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.116945\tres = 6.024E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.122933\tres = 5.684E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.128609\tres = 5.361E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.133986\tres = 5.055E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.139077\tres = 4.764E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.143893\tres = 4.490E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.148448\tres = 4.228E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.152754\tres = 3.982E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.156821\tres = 3.749E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.160661\tres = 3.528E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.164285\tres = 3.319E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.167703\tres = 3.122E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.170925\tres = 2.936E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.173962\tres = 2.759E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.176824\tres = 2.594E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.179518\tres = 2.437E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.182054\tres = 2.289E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.184440\tres = 2.150E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.186684\tres = 2.018E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.188794\tres = 1.895E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.190777\tres = 1.778E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.192641\tres = 1.668E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.194391\tres = 1.565E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.196034\tres = 1.467E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.197577\tres = 1.376E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.199024\tres = 1.290E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.200382\tres = 1.209E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.201656\tres = 1.133E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.202850\tres = 1.061E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.203970\tres = 9.941E-04\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.205018\tres = 9.307E-04\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.206002\tres = 8.706E-04\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.206923\tres = 8.158E-04\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.207785\tres = 7.636E-04\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.208592\tres = 7.144E-04\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.209347\tres = 6.684E-04\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.210055\tres = 6.249E-04\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.210716\tres = 5.849E-04\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.211335\tres = 5.465E-04\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.211915\tres = 5.115E-04\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.212455\tres = 4.782E-04\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.212962\tres = 4.461E-04\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.213435\tres = 4.176E-04\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.213877\tres = 3.900E-04\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.214290\tres = 3.643E-04\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.214676\tres = 3.404E-04\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.215038\tres = 3.181E-04\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.215375\tres = 2.973E-04\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.215689\tres = 2.771E-04\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.215982\tres = 2.585E-04\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.216257\tres = 2.416E-04\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.216513\tres = 2.258E-04\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.216752\tres = 2.105E-04\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.216975\tres = 1.963E-04\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.217183\tres = 1.834E-04\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.217377\tres = 1.709E-04\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.217558\tres = 1.594E-04\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.217728\tres = 1.488E-04\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.217885\tres = 1.388E-04\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.218033\tres = 1.297E-04\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.218170\tres = 1.206E-04\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.218296\tres = 1.126E-04\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.218416\tres = 1.041E-04\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.218527\tres = 9.807E-05\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.218631\tres = 9.109E-05\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.218727\tres = 8.502E-05\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.218817\tres = 7.897E-05\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.218901\tres = 7.364E-05\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.218979\tres = 6.886E-05\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.219051\tres = 6.353E-05\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.219120\tres = 5.977E-05\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.219183\tres = 5.590E-05\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.219242\tres = 5.170E-05\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.219296\tres = 4.832E-05\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.219347\tres = 4.486E-05\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.219395\tres = 4.185E-05\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.219439\tres = 3.868E-05\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.219480\tres = 3.650E-05\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.219518\tres = 3.379E-05\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.219554\tres = 3.107E-05\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.219587\tres = 2.929E-05\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.219618\tres = 2.709E-05\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.219647\tres = 2.542E-05\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.219674\tres = 2.362E-05\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.219699\tres = 2.199E-05\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.219722\tres = 2.070E-05\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.219743\tres = 1.878E-05\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.219763\tres = 1.770E-05\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.219782\tres = 1.628E-05\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.219799\tres = 1.526E-05\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.219815\tres = 1.387E-05\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.219830\tres = 1.319E-05\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.219844\tres = 1.208E-05\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.219857\tres = 1.150E-05\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.219869\tres = 1.055E-05\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.219880\tres = 1.008E-05\n" + ] + } + ], + "source": [ + "# Generate tracks for OpenMOC\n", + "openmoc_geometry.initializeFlatSourceRegions()\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", + "track_generator.generateTracks()\n", + "\n", + "# Run OpenMOC\n", + "solver = openmoc.CPUSolver(track_generator)\n", + "solver.computeEigenvalue()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We report the eigenvalues computed by OpenMC and OpenMOC here together to summarize our results." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.223729\n", + "openmoc keff = 1.219880\n", + "bias [pcm]: -384.9\n" + ] + } + ], + "source": [ + "# Print report of keff and bias with OpenMC\n", + "openmoc_keff = solver.getKeff()\n", + "openmc_keff = sp.k_combined[0]\n", + "bias = (openmoc_keff - openmc_keff) * 1e5\n", + "\n", + "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", + "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", + "print('bias [pcm]: {0:1.1f}'.format(bias))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As a sanity check, let's run a simulation with the coarse 2-group cross sections to ensure that they produce a reasonable result." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)\n", + "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", + "\n", + "# Inject multi-group cross sections into OpenMOC Materials\n", + "for cell_id, cell in openmoc_cells.items():\n", + " \n", + " # Ignore the root cell\n", + " if cell.getName() == 'root cell':\n", + " continue\n", + " \n", + " openmoc_material = cell.getFillMaterial()\n", + " openmoc_material.setNumEnergyGroups(coarse_groups.num_groups)\n", + " \n", + " # Extract the appropriate cross section objects for this cell\n", + " transport = xs_library[cell_id]['transport']\n", + " nufission = xs_library[cell_id]['nu-fission']\n", + " nuscatter = xs_library[cell_id]['nu-scatter']\n", + " chi = xs_library[cell_id]['chi']\n", + " \n", + " # Perform group condensation\n", + " transport = transport.get_condensed_xs(coarse_groups)\n", + " nufission = nufission.get_condensed_xs(coarse_groups)\n", + " nuscatter = nuscatter.get_condensed_xs(coarse_groups)\n", + " chi = chi.get_condensed_xs(coarse_groups)\n", + " \n", + " # Inject NumPy arrays of cross section data into the Material\n", + " openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setChi(chi.get_xs(nuclides='sum').flatten())" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Computing the eigenvalue...\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.495594\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.557313\tres = 5.044E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.518115\tres = 1.245E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.509017\tres = 7.033E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.496280\tres = 1.756E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.488358\tres = 2.502E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.482660\tres = 1.596E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.479524\tres = 1.167E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.478569\tres = 6.497E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.479591\tres = 1.992E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.482389\tres = 2.136E-03\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.486774\tres = 5.834E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.492576\tres = 9.091E-03\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.499632\tres = 1.192E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.507800\tres = 1.433E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.516944\tres = 1.635E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.526943\tres = 1.801E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.537682\tres = 1.934E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.549061\tres = 2.038E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.560985\tres = 2.116E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.573368\tres = 2.172E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.586133\tres = 2.207E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.599208\tres = 2.226E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.612528\tres = 2.231E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.626036\tres = 2.223E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.639676\tres = 2.205E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.653403\tres = 2.179E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.667171\tres = 2.146E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.680942\tres = 2.107E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.694682\tres = 2.064E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.708357\tres = 2.018E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.721941\tres = 1.969E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.735408\tres = 1.918E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.748735\tres = 1.865E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.761905\tres = 1.812E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.774898\tres = 1.759E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.787701\tres = 1.705E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.800300\tres = 1.652E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.812684\tres = 1.599E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.824845\tres = 1.548E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.836773\tres = 1.496E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.848463\tres = 1.446E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.859909\tres = 1.397E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.871106\tres = 1.349E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.882052\tres = 1.302E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.892746\tres = 1.257E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.903184\tres = 1.212E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.913368\tres = 1.169E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.923297\tres = 1.128E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.932973\tres = 1.087E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.942395\tres = 1.048E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.951568\tres = 1.010E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.960491\tres = 9.733E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.969169\tres = 9.378E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 0.977605\tres = 9.035E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 0.985801\tres = 8.704E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 0.993762\tres = 8.384E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.001492\tres = 8.075E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.008993\tres = 7.778E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.016272\tres = 7.490E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.023330\tres = 7.214E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.030175\tres = 6.945E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.036810\tres = 6.689E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.043239\tres = 6.441E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.049467\tres = 6.200E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.055499\tres = 5.970E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.061339\tres = 5.748E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.066994\tres = 5.533E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.072466\tres = 5.328E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.077761\tres = 5.128E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.082883\tres = 4.937E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.087837\tres = 4.753E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.092628\tres = 4.575E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.097261\tres = 4.404E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.101738\tres = 4.240E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.106067\tres = 4.080E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.110248\tres = 3.929E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.114289\tres = 3.781E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.118192\tres = 3.639E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.121963\tres = 3.502E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.125604\tres = 3.372E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.129120\tres = 3.245E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.132515\tres = 3.124E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.135791\tres = 3.006E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.138955\tres = 2.893E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.142009\tres = 2.786E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.144955\tres = 2.681E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.147798\tres = 2.580E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.150540\tres = 2.483E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.153187\tres = 2.389E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.155740\tres = 2.300E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.158202\tres = 2.214E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.160576\tres = 2.130E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.162866\tres = 2.050E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.165075\tres = 1.973E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.167203\tres = 1.899E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.169257\tres = 1.827E-03\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.171236\tres = 1.759E-03\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.173143\tres = 1.693E-03\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.174982\tres = 1.629E-03\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.176754\tres = 1.568E-03\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.178463\tres = 1.508E-03\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.180109\tres = 1.452E-03\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.181695\tres = 1.397E-03\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.183225\tres = 1.344E-03\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.184698\tres = 1.294E-03\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.186116\tres = 1.245E-03\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.187483\tres = 1.198E-03\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.188801\tres = 1.152E-03\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.190070\tres = 1.110E-03\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.191292\tres = 1.067E-03\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.192470\tres = 1.026E-03\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.193603\tres = 9.889E-04\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.194696\tres = 9.502E-04\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.195748\tres = 9.155E-04\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.196760\tres = 8.807E-04\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.197736\tres = 8.464E-04\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.198675\tres = 8.155E-04\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.199580\tres = 7.844E-04\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.200452\tres = 7.551E-04\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.201290\tres = 7.262E-04\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.202098\tres = 6.981E-04\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.202876\tres = 6.728E-04\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.203624\tres = 6.471E-04\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.204346\tres = 6.219E-04\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.205039\tres = 5.993E-04\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.205708\tres = 5.756E-04\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.206351\tres = 5.551E-04\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.206970\tres = 5.328E-04\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.207566\tres = 5.132E-04\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.208140\tres = 4.943E-04\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.208691\tres = 4.749E-04\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.209223\tres = 4.564E-04\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.209734\tres = 4.396E-04\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.210228\tres = 4.231E-04\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.210702\tres = 4.076E-04\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.211158\tres = 3.916E-04\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.211597\tres = 3.767E-04\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.212019\tres = 3.628E-04\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.212425\tres = 3.484E-04\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.212817\tres = 3.350E-04\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.213193\tres = 3.227E-04\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.213556\tres = 3.106E-04\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.213904\tres = 2.989E-04\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.214240\tres = 2.869E-04\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.214563\tres = 2.770E-04\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.214874\tres = 2.659E-04\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.215172\tres = 2.557E-04\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.215459\tres = 2.457E-04\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.215737\tres = 2.361E-04\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.216003\tres = 2.281E-04\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.216260\tres = 2.194E-04\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.216507\tres = 2.109E-04\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.216744\tres = 2.028E-04\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.216972\tres = 1.950E-04\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.217193\tres = 1.876E-04\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.217403\tres = 1.809E-04\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.217607\tres = 1.733E-04\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.217802\tres = 1.673E-04\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.217990\tres = 1.603E-04\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.218171\tres = 1.544E-04\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.218346\tres = 1.486E-04\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.218513\tres = 1.429E-04\n", + "[ NORMAL ] Iteration 163:\tk_eff = 1.218674\tres = 1.376E-04\n", + "[ NORMAL ] Iteration 164:\tk_eff = 1.218829\tres = 1.322E-04\n", + "[ NORMAL ] Iteration 165:\tk_eff = 1.218979\tres = 1.274E-04\n", + "[ NORMAL ] Iteration 166:\tk_eff = 1.219123\tres = 1.225E-04\n", + "[ NORMAL ] Iteration 167:\tk_eff = 1.219261\tres = 1.181E-04\n", + "[ NORMAL ] Iteration 168:\tk_eff = 1.219394\tres = 1.132E-04\n", + "[ NORMAL ] Iteration 169:\tk_eff = 1.219522\tres = 1.090E-04\n", + "[ NORMAL ] Iteration 170:\tk_eff = 1.219645\tres = 1.049E-04\n", + "[ NORMAL ] Iteration 171:\tk_eff = 1.219763\tres = 1.008E-04\n", + "[ NORMAL ] Iteration 172:\tk_eff = 1.219877\tres = 9.716E-05\n", + "[ NORMAL ] Iteration 173:\tk_eff = 1.219986\tres = 9.353E-05\n", + "[ NORMAL ] Iteration 174:\tk_eff = 1.220091\tres = 8.948E-05\n", + "[ NORMAL ] Iteration 175:\tk_eff = 1.220192\tres = 8.598E-05\n", + "[ NORMAL ] Iteration 176:\tk_eff = 1.220290\tres = 8.274E-05\n", + "[ NORMAL ] Iteration 177:\tk_eff = 1.220384\tres = 7.979E-05\n", + "[ NORMAL ] Iteration 178:\tk_eff = 1.220474\tres = 7.672E-05\n", + "[ NORMAL ] Iteration 179:\tk_eff = 1.220561\tres = 7.406E-05\n", + "[ NORMAL ] Iteration 180:\tk_eff = 1.220644\tres = 7.136E-05\n", + "[ NORMAL ] Iteration 181:\tk_eff = 1.220725\tres = 6.812E-05\n", + "[ NORMAL ] Iteration 182:\tk_eff = 1.220802\tres = 6.605E-05\n", + "[ NORMAL ] Iteration 183:\tk_eff = 1.220877\tres = 6.346E-05\n", + "[ NORMAL ] Iteration 184:\tk_eff = 1.220948\tres = 6.086E-05\n", + "[ NORMAL ] Iteration 185:\tk_eff = 1.221016\tres = 5.825E-05\n", + "[ NORMAL ] Iteration 186:\tk_eff = 1.221083\tres = 5.620E-05\n", + "[ NORMAL ] Iteration 187:\tk_eff = 1.221146\tres = 5.433E-05\n", + "[ NORMAL ] Iteration 188:\tk_eff = 1.221208\tres = 5.215E-05\n", + "[ NORMAL ] Iteration 189:\tk_eff = 1.221267\tres = 5.031E-05\n", + "[ NORMAL ] Iteration 190:\tk_eff = 1.221323\tres = 4.820E-05\n", + "[ NORMAL ] Iteration 191:\tk_eff = 1.221377\tres = 4.623E-05\n", + "[ NORMAL ] Iteration 192:\tk_eff = 1.221430\tres = 4.449E-05\n", + "[ NORMAL ] Iteration 193:\tk_eff = 1.221480\tres = 4.287E-05\n", + "[ NORMAL ] Iteration 194:\tk_eff = 1.221529\tres = 4.123E-05\n", + "[ NORMAL ] Iteration 195:\tk_eff = 1.221575\tres = 3.993E-05\n", + "[ NORMAL ] Iteration 196:\tk_eff = 1.221620\tres = 3.779E-05\n", + "[ NORMAL ] Iteration 197:\tk_eff = 1.221663\tres = 3.667E-05\n", + "[ NORMAL ] Iteration 198:\tk_eff = 1.221705\tres = 3.541E-05\n", + "[ NORMAL ] Iteration 199:\tk_eff = 1.221744\tres = 3.378E-05\n", + "[ NORMAL ] Iteration 200:\tk_eff = 1.221782\tres = 3.233E-05\n", + "[ NORMAL ] Iteration 201:\tk_eff = 1.221820\tres = 3.127E-05\n", + "[ NORMAL ] Iteration 202:\tk_eff = 1.221855\tres = 3.033E-05\n", + "[ NORMAL ] Iteration 203:\tk_eff = 1.221889\tres = 2.911E-05\n", + "[ NORMAL ] Iteration 204:\tk_eff = 1.221922\tres = 2.775E-05\n", + "[ NORMAL ] Iteration 205:\tk_eff = 1.221954\tres = 2.682E-05\n", + "[ NORMAL ] Iteration 206:\tk_eff = 1.221984\tres = 2.580E-05\n", + "[ NORMAL ] Iteration 207:\tk_eff = 1.222013\tres = 2.467E-05\n", + "[ NORMAL ] Iteration 208:\tk_eff = 1.222041\tres = 2.365E-05\n", + "[ NORMAL ] Iteration 209:\tk_eff = 1.222068\tres = 2.298E-05\n", + "[ NORMAL ] Iteration 210:\tk_eff = 1.222094\tres = 2.216E-05\n", + "[ NORMAL ] Iteration 211:\tk_eff = 1.222119\tres = 2.115E-05\n", + "[ NORMAL ] Iteration 212:\tk_eff = 1.222143\tres = 2.038E-05\n", + "[ NORMAL ] Iteration 213:\tk_eff = 1.222166\tres = 1.954E-05\n", + "[ NORMAL ] Iteration 214:\tk_eff = 1.222188\tres = 1.879E-05\n", + "[ NORMAL ] Iteration 215:\tk_eff = 1.222209\tres = 1.810E-05\n", + "[ NORMAL ] Iteration 216:\tk_eff = 1.222230\tres = 1.741E-05\n", + "[ NORMAL ] Iteration 217:\tk_eff = 1.222250\tres = 1.694E-05\n", + "[ NORMAL ] Iteration 218:\tk_eff = 1.222269\tres = 1.617E-05\n", + "[ NORMAL ] Iteration 219:\tk_eff = 1.222287\tres = 1.574E-05\n", + "[ NORMAL ] Iteration 220:\tk_eff = 1.222305\tres = 1.497E-05\n", + "[ NORMAL ] Iteration 221:\tk_eff = 1.222322\tres = 1.452E-05\n", + "[ NORMAL ] Iteration 222:\tk_eff = 1.222338\tres = 1.381E-05\n", + "[ NORMAL ] Iteration 223:\tk_eff = 1.222354\tres = 1.330E-05\n", + "[ NORMAL ] Iteration 224:\tk_eff = 1.222369\tres = 1.285E-05\n", + "[ NORMAL ] Iteration 225:\tk_eff = 1.222383\tres = 1.230E-05\n", + "[ NORMAL ] Iteration 226:\tk_eff = 1.222397\tres = 1.170E-05\n", + "[ NORMAL ] Iteration 227:\tk_eff = 1.222410\tres = 1.124E-05\n", + "[ NORMAL ] Iteration 228:\tk_eff = 1.222423\tres = 1.095E-05\n", + "[ NORMAL ] Iteration 229:\tk_eff = 1.222436\tres = 1.047E-05\n", + "[ NORMAL ] Iteration 230:\tk_eff = 1.222448\tres = 1.009E-05\n" + ] + } + ], + "source": [ + "# Generate tracks for OpenMOC\n", + "openmoc_geometry.initializeFlatSourceRegions()\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", + "track_generator.generateTracks()\n", + "\n", + "# Run OpenMOC\n", + "solver = openmoc.CPUSolver(track_generator)\n", + "solver.computeEigenvalue()" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.223729\n", + "openmoc keff = 1.222448\n", + "bias [pcm]: -128.1\n" + ] + } + ], + "source": [ + "# Print report of keff and bias with OpenMC\n", + "openmoc_keff = solver.getKeff()\n", + "openmc_keff = sp.k_combined[0]\n", + "bias = (openmoc_keff - openmc_keff) * 1e5\n", + "\n", + "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", + "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", + "print('bias [pcm]: {0:1.1f}'.format(bias))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is a non-trivial bias in both the 2-group and 8-group cases. In the case of the pin cell, one can show that these biases do not converge to <100 pcm with more particle histories. In the case of heterogeneous geometries, additional measures must be taken to address the following three sources of bias:\n", + "\n", + "* Appropriate transport-corrected cross sections\n", + "* Spatial discretization of OpenMOC's mesh\n", + "* Constant-in-angle multi-group cross sections" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## Visualizing MGXS Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is often insightful to generate visual depictions of multi-group cross sections. There are many different types of plots which may be useful for MGXS visualization, only a few of which will be shown here for inspiration.\n", + "\n", + "One particularly useful visualization is a comparison of the continuous energy and multi-group cross sections for a particular nuclide and reaction type. We illustrate one option for generating such plots with the use of the open source PyNE library to parse continuous energy multi-group cross sections from the cross section data library provided with OpenMC. First, we instantiate a `pyne.ace.Library` object for U-235 as follows." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a PyNE ACE continuous energy cross sections library\n", + "pyne_lib = pyne.ace.Library('../../../../data/nndc/293.6K/U_235_293.6K.ace')\n", + "pyne_lib.read('92235.71c')\n", + "\n", + "# Extract the U-235 data from the library\n", + "u235 = pyne_lib.tables['92235.71c']\n", + "\n", + "# Extract the continuous energy fission U-235 cross section data\n", + "fission = u235.reactions[18]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we use matplotlib to plot the multi-group and continuous energy cross sections on a single plot." + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create a loglog plot of the U-235 continuous energy fission cross section \n", + "plt.loglog(u235.energy, fission.sigma, color='b', linewidth=1)\n", + "\n", + "# Extract energy group bounds and MGXS values to plot\n", + "nufission = xs_library[fuel_cell.id]['fission']\n", + "energy_groups = nufission.energy_groups\n", + "x = energy_groups.group_edges\n", + "y = nufission.get_xs(nuclides=['U-235'], order_groups='decreasing', xs_type='micro')\n", + "\n", + "# Fix low energy bound to the value defined by the ACE library\n", + "x[0] = u235.energy[0]\n", + "\n", + "# Extend the mgxs values array for matplotlib's step plot\n", + "y = np.insert(y, 0, y[0])\n", + "\n", + "# Create a step plot for the MGXS\n", + "plt.plot(x, y, drawstyle='steps', color='r', linewidth=3)\n", + "\n", + "plt.title('U-235 Fission Cross Section')\n", + "plt.xlabel('Energy [MeV]')\n", + "plt.ylabel('Micro Fission XS')\n", + "plt.legend(['Continuous', 'Multi-Group'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another useful illustration are scattering matrix sparsity structures. First, we extract Pandas DataFrames for the H-1 and O-16 scattering matrices." + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Construct a Pandas DataFrame for the microscopic nu-scattering matrix\n", + "nuscatter = xs_library[moderator_cell.id]['nu-scatter']\n", + "df = nuscatter.get_pandas_dataframe(xs_type='micro')\n", + "\n", + "# Slice DataFrame in two for each nuclide's mean values\n", + "h1 = df[df['nuclide'] == 'H-1']['mean']\n", + "o16 = df[df['nuclide'] == 'O-16']['mean']\n", + "\n", + "# Cast DataFrames as NumPy arrays\n", + "h1 = h1.as_matrix()\n", + "o16 = o16.as_matrix()\n", + "\n", + "# Reshape arrays to 2D matrix for plotting\n", + "h1.shape = (fine_groups.num_groups, fine_groups.num_groups)\n", + "o16.shape = (fine_groups.num_groups, fine_groups.num_groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Matplotlib's `imshow` routine can be used to plot the matrices to illustrate their sparsity structures." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWkAAADFCAYAAACW0gNvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAG6RJREFUeJzt3XuclNV9x/HPghdA0SiKCIKJl58oRV+SwCaKJaJGTFEo\n3qKmarwk8ZpbbbUSA/XWmhhjlFSxTdXaYkVQ4/1+wwuoqdag+NNoFEExEC+ISoXd/nHOhGHdmefM\n7szsM8v3/Xrxeu3M/PbMmeX3nOec8zxnDoiIiIiIiIiIiIiIiIiIiIiIiIhIBzR1dQWymFkLsI27\nLy567ljgKHffr8Tv7Aj8N7CsVEyMOx04AVgf2AB4FDjV3T/sYF2/Brzo7gvNrD/Q7O63VljGKcBW\n7n5OR+rQTnl/AP7o7iPbPD8Z+Efg8+7+RkYZJ7j7v5Z47T7gb9392WrUt7szs+8BxxNyrgfwIDDZ\n3ZeWiG8CzgDOA77q7o8XvTYauALoBbwOfNPd32qnjCOAHwEbxfd9Hji5vdjEzzAK+NjdnzezDYDD\n3f0/KixjInCgux/fkTq0U95DwE7AIHdvKXr+m8C1hL/dIxllnOjuV5V47RrgBne/vRr1rUSPer9h\nrZnZUGA28HhG3Djgu8AYd98Z2IWQxBd14u1/CAyJP48FDqrkl82syd2nVauBLrKlme3Q5rmJwDsJ\ndRoA/F2p1919XzXQaczsAuAIYFxRzr0HPGRmvUr82hXAYGBJm7I2IXREjnP3HYC7Y9lt33MX4BJg\nUnxPA/4A/LoTH+U4YNf48wjg6Ep+Oeb5zdVqoIusJBx3xb4BlO2ExDr1pMSxH+t7TFc00ADrdcWb\nVkFrmdeWA2OAAwln1lL+AnjF3d8FcPeVZnYc0AJgZlsA/044kD4k9BbvNbOtgGuAbYENgcvc/RIz\nO5eQIEPN7FeE3s96ZraRux9pZhOAcwkngleAI919mZlNAQYCuwHXm9mmhN7AibF3cAswCfgC8Ki7\nHxHrdyxwIfA2cCnwa3dv76TbCtxFOIDPjb/7F8C7QL9CkJkdBJxPGFEsB4539+cIJ7tBZvZCrOPL\nwFWEA/NrwMPAUUAz4YQ3IZZ3D3CTu/9Lmf+DdYaZbQ58D9itMCp099XAmWa2D/A3hL9rW79y9+fM\nbHyb5ycAz7j7vFhWqc7FMGBJYbTk7i1mdhYhdzGz3sCVwGjgE+B8d/9PM+tDyP/dCDkxy93PMLPv\nxroeaGaDgO8Dm5jZw+4+xsz2BH4BfA5YSsjz12K+HghsAjxrZvOJo2Ezu5owEvgK4STiwAR3/9jM\n9gf+FfiAkOcXAbu2M/orzvP74mfbjHDcvEacNTCzrwCXA30Ix/rp7n4/cC+waczzrwNXE0bWBwMn\nxBPsVcDHwGTgi+7eambTgffcvWRHprMapSfddlqm5DSNuy9y9z+Vi4nuA75mZleb2Tgz6+vuy919\nRXz9n4Dfufv2wDHAjDi0mwy8EXsl+wAXmtkgd/8xsIiQlBcREmFmbKC3Iwy5Do/lPUjoIRV8HTjA\n3S8hJFvxSWg8sC8hefc2s6/EA35afP8RwP6UP3HdSOhRFHwDmFl4YGbrEZLy2+6+E+HE8LP48rfi\n593F3T+N77ONu+/k7q8X1fcXhMZ8v3hC2kgN9Fq+TPg7vtLOa7cSOhafEU+U7dkVWGZms83sJTOb\nYWb92ombAwwxs1vMbKKZbe7un7j7+/H1HwHruft2wH7A5Wa2NXAysKm7DyXk2LFmtoe7XwHMA86I\neX4W8ERsoPsCvwHOdPcdCY3qDUV12Q/4rruf0U49DwEOA7YHtgQmxt7tNcAJ7j4M2BHYuMTfA+A2\nYJyZrR8fH0zIZVhzfEwHLo7H7z+x5jj8FrA65vkfYvyI+Pjx+LjV3WcTeuYnmNnuwN5AtUe+a2mU\nRvohM3ux8A+4gPKNUqY4RN+T8De4BlgaE35wDDkAmFEUu627/x9wOnBqfP41Qk/2C+28RRNrThTj\ngIfc/cX4+ErgIDMr/P2fjCcWWPvk0grc6O4r3f0jQg9jW0Kv1d39BXdvBX5F+ZPSK8AKM9stPp4E\nzCr6W6wCBrr7E/GpOcB27dSn4DPDvjgPeCLwc0IP/8Qy9VkXbQ78scRr78TXK7EZYSTzt4Te8krC\niXItcd55FPAW8EvgHTO718yGx5ADgOtj7CLCKO4td/8ZYUoMd38PmM+anChWnB97AW/Gninufj2w\nQ9Ex9bK7/77E57nN3d+Lo4vnCdOGBmzg7nfHmF9Svs1aDjxG6PQAHE6YEio2ovB5yc7zO0u8zynA\nmYTj7mR3/6RMnTqtUaY7xvjaFw6PAb4Zf74WGElo0Pap5GKIuz9DnE8zsxGE6YD/BvYAtiDMFxZi\nCz3skYTe82BgNbA12Se7zwF/GU8wBe+xZrrh3TK/+37Rz6uBnrG8PxU9v5hsM4AjYy/j9TjVUvz6\nKWZ2NGEY3Is47VPCn9p70t3/x8w+AD519xcS6rQuWUqY1mrPVsASMxtJGHEBzHb3s8uU9x5wn7u/\nCmBmlxKG+5/h7i8Trr8UrtmcCdwZc7htnn8U43YEfm5mOxHybjDZ89ifA7Zvk+efxPeAEnlDOHY/\nKHq8mtA2fY61j42UY7uQ508AW8epouLXjwBOi73+nhlllcrzRWb2JGF65r6EOnVKozTSbf35rOfu\npS5alO1px7mzP8TeA+7+WzM7kzUXHJcShl1vxPjPE6YzriMMl66Mz7+ZUN9FhAPq0Hbq0baeKSOE\nD1h72Ld1Rnwr4eTzEKHxvb74RTPbg3BxcKS7v2Fm+xGGhRUxs78CPgU2NLMD3L1UT2Rd9ASwuZnt\n6u7/2+a18cCl7v4UsHNiea8Thv8FLYTGbS1x9PSxuzuAuy8ws9MIJ//NWZPnhfhtgGWE6bSngIPi\n3OuchDotJtzdNLLtC0WjuFSFhrs4zwck/M4dhLofQdGUXqzDIEJej3L3/40nopcqrFfhs+wOPAuc\nROhR10yjTHd0RNac9FHAFfEqeWFe9ghCQwZhbu3Y+Now4BnCmXdL4Lfx+WMIFwL7xt/5lDAMBfg/\nQk8A4B5gLzP7Qvy9UWZWGJq2N9/e1OZxsdZYl13NbPs4ZXJCxmcljkQWE+b9bmrzcn/CkHthvGBU\n+FyFz7RxnB8sycw2Igy3TyFMCU2LZQkQ54DPB/4jnvAxs/XM7ELC//H1ZX69oDgXbgbGxIvAAN8m\nXPxqa3/gunjBu3BL3zeB+e6+jJDnhdHk1oTc3oKQ58/GBno/wgmhvTz/lHAxEGAusLWFW/Qws+3i\nSLeSz1X8+GVgfTMrzNd/l4xOjLuvJBxvZ/DZqY4tgRXAS/F4/3as50bxc/Qws+KTwmfakHi8TQd+\nQLgQPNnMSo2QqqIRGun2/lPaXlz7MzM708w+Jvwh9zazj82svWHg94EFwFNmtoBwRt2ScAEB4O+B\nbczsNcIQ6og49/Rj4CYze45whfhKYHpsgG8k3KHxfUKijDWzuXEK5sT4ey8Q5tYKB2Xbz9Le47W4\n+9vAPxAuQD4BlL3/s8gMwsXQD9o8fyehAf89Ych8CfC+md0APEcY9r1VNLfYVhMwBbjV3efHHuH9\nxLtJJHD3iwl5eWucEphPOJHvG68LfIaZfRjzeQhwf8zn0e6+kJCrN5mZE3qZP2znPS8inJQfiHn+\nCuFi14Ex5BLCPPXrwAPAj2LZ5wEXm9nzhLnmqcBUC3dH3AT8s5n9jHAHxEAzW0SYFz8EuCzm+WzW\nXDgsl+ft5ny8BnQScLWZ/ZZwjLaQPdqcQVgjsaDN3+JZQk/bCXPXvwGeJBxHiwlz1K/Hz/jnerRx\nErDI3e+Of6dphJsEaib3i1kkW+zpP+rulV58EmkYsce7nHDXyfKurk+9NEJPWtqIw+RFhWEl4Sp2\n2cU7Io3IzOaZ2WHx4eHAC+tSAw3qSTcsC8tqLyScaBcTFp+82rW1EqmueIF/GtCbcLHzpHhXloiI\niIiISBlVne548sknk1YBDh8+nOeff75szLvvllvfscaee+7JY489VjamX7/2Vst+1rBhw5g/f35S\nrMrqmrJGjRrVJVN0s2bNysztffbZh/vvvz+zrAMOOCAzZsMNN2TlypWZcb17986MkcbQ1NTUbm53\nyYXDPn2qd/ts3759s4MSVbNeKqvryuoqm266adXK6tFD1/QlUCaIiOSYGmkRkRxTIy0ikmOZX7Bk\nZpcQvhqzFfieuz9d81qJ1IFyWxpB2Z50/GKTHdx9D8K+bL+sS61Eaky5LY0ia7pjLPEb0+KXlWzW\n5luiRBqVclsaQlYjPYDwfbMFfyT7u4tFGoFyWxpCpV/630SZrwkcPnx48v2uzc3NFb51aePGjata\nWSNHfub7ylVWTsp66qmnqvZe7Sib2/vss0/SfdCTJk2qWoW0UEUgu5FezNq7IQykzBY2WasIC5qb\nm5k7d27ZmNQVh+PGjeOuu9rdNejPUlccjhw5smoNgcrqurISVZTbKSsJJ02axOzZszPjUlYc9u7d\nm48//jgpTrq3rOmOewhf4l3YA3BR0V5/Io1MuS0NoWwjHXePfsbMHmPN1kgiDU+5LY0ic07a3c+q\nR0VE6k25LY1AKw5FRHJMjbSISI6pkRYRyTE10iIiOVbpYpayKvmi8qzYVatWJZeVFbto0aKkckaO\nHJkZO2jQoOR6SfeRukglJa7EBhxraW1tTVoYtnr16syYHj160NLSkhQn+aP/FRGRHFMjLSKSY2qk\nRURyTI20iEiOqZEWEcmxpEbazHY1s9+bmb7fQLoV5bbkXWYjbWZ9gIuBu2tfHZH6UW5LI0jpSa8E\nxgNLalwXkXpTbkvupXwL3mpgtZnVoToi9aPclkaQvfQpMrOfAEvdfVqpmBUrVrSmbp8lUqmnnnqK\nUaNGJedsqpTcbm1tLbm1lkg1NJVYilrVZeHz589PikvZKmnJkrQR6Pjx47ntttvKxqQuMZ84cSI3\n33xz2ZjUZeF53VpqXSgr71KXhafEaVl491fJ/0rVezAiOaHcltzK7Emb2ZeBq4D+wCoz+w4wxt3T\ndooVySnltjSClAuHTwLD61AXkbpSbksj0CSUiEiOqZEWEckxNdIiIjmmRlpEJMeqep90NW211VZV\ni507d25yWW+++WbZ11PuXS1YvHhx2dcHDBiQXFbKfa6pdUtZl1HJ55TKpK6LSYlLube5paWF9dbL\nPtRT1hPonuv6019SRCTH1EiLiOSYGmkRkRxTIy0ikmNqpEVEcizp7g4zuwgYHeMvdPebalorkTpQ\nXksjSNk+a29gmLvvAYwDflHzWonUmPJaGkXKdMcjwGHx5/eBjcxMN9FKo1NeS0NI3T5rRXx4PHC7\nu2uXCmloymtpFJVsnzUBOAvYz92Xtxej7bOklmqxfVZKXoO2z5La69T2WWa2PyGRx5VL5Gpun5Uq\npazUZeGnnnoql19+edmYwYMHJ5U1YcIEbrnllrIxqcvCm5ubkz5DylLuUaNGMW/evKqU1ejbZ6Xm\ndZ6lLgtPidOy8HxK2ZllU+CnwFh3f6/2VRKpPeW1NIqUnvThQD9gppkVnjva3RfWrFYitae8loaQ\ncuFwOjC9DnURqRvltTQKTRyJiOSYGmkRkRxTIy0ikmNqpEVEciy322dVU3Nzc9ViK9nWa/fddy/7\n+rXXXptcp3vvvTczbvjw4UnlvfXWW5kxffv2TSpr+fLs24s32GCDpLJWrlyZFCdrpNyznBrXr1+/\nzJhly5ax5ZZbZsYtWrQoqV69evXik08+SYpbV6knLSKSY2qkRURyTI20iEiOqZEWEckxNdIiIjmW\n8gVLfYCrgf5AL+Bcd7+9xvUSqSnltTSKlJ70eGCeu3+VsJPFz2taI5H6UF5LQ0j5gqUbih4OAfQt\nYdLwlNfSKJIXs5jZ48AgQg9EpFtQXkveVbQVkZntBlzr7ru197q2z5JamjNnDnvttVfVN4vNymvQ\n9llSe6W2z8pMeDP7IvBO4cvQzWw+MMbdl7aNnTdvXlIi53XbpZSyUpeFDxkyhDfeeKNsTOqy8MmT\nJ3PeeedlxqUsC0/Z1gvSloWPHTuWBx54IDMuZVn46NGjmTNnTmZctRrpSvIa1o1GOnVZeEqcloVX\nrlQjnXLhcC/ghwBmthWwcalEFmkgymtpCCmN9BVAfzN7BLgNOLm2VRKpC+W1NISUuzs+AY6qQ11E\n6kZ5LY1CKw5FRHJMjbSISI6pkRYRyTE10iIiOaZGWkQkx9aJPQ6racmSJUlxQ4YMyYydPHly8vum\nxJ5yyimZMRMmTOCee+7JjBs6dGhmzNixY5k/f35m3MCBAzNjIP1vK7WxdGnabeIpcSNHjkwq6+mn\nn2b06NGZcXfccUdmTP/+/XnnnXeS4hqJetIiIjmmRlpEJMfUSIuI5JgaaRGRHEtqpM2st5n93syO\nqXWFROpJuS15l9qTngwsA7r91zXKOke5LbmW2Uib2VBgKHA7FW4SIJJnym1pBCk96Z8CP6h1RUS6\ngHJbcq9s78HMjga2cvefmtkU4DV3v6ZUvLbPklqaNWsWhxxySLV2Zqkot9eFnVmka5XamSVrxeHX\nge3MbBKwDbDSzBa6e7t7JqWsPoPG3j6rmmWlrspKlbLicNq0aUlxKSsOTzvtNC677LLMuJQVhwcf\nfDCzZs3KjKuiinJ7XZByHmpqakqKq2TF4Ze+9KXMuHV5xWHZRtrdv1H42cx+QuhtrLNJLN2Hclsa\nhe6TFhHJseQvWHL3qbWsiEhXUW5LnqknLSKSY2qkRURyTI20iEiOqZEWEckxNdIiIjmm7bO60Ny5\nc5Pimpubk2JTFpakxh166KGZMaeddhoPPfRQZtyIESNSqsWCBQuS4qQ2Six461Bcam6nxk6cODEz\n5tZbb+X444/PjLv00kszY7bbbjteffXVpLhaU09aRCTH1EiLiOSYGmkRkRxTIy0ikmOZFw7N7KvA\nTOB38ann3f30WlZKpNaU19IoUu/ueNDdD6tpTUTqT3ktuZc63aGthaQ7Ul5L7qX0pFuBXczsFmBz\nYKq731fbaonUnPJaGkJmT8LMBgJ7uvtMM9sOeBDY3t1XtY3V9llSS+effz6TJ0+u1vZZyXkN2j5L\naq+j22fh7osJF1hw91fN7G1gEPB621htn1VZWS0tLUllpa44TNmyqEePHknvm7LicNasWRx88MGZ\ncSkrDs8++2zOP//8zLhqqSSvpXKrV69OiuvZs2dSbOqKwwMPPDAzrtutODSzI+P2QphZf6A/sKjW\nFROpJeW1NIqUOenfAP9lZnOAnsBJpYaEIg1EeS0NIWW640PgoDrURaRulNfSKLTiUEQkx9RIi4jk\nmBppEZEcUyMtIpJjaqRFRHJM22d1oR490s+RKbGPPvpoZsyYMWOS4i644IKkeqXEpSxEOPvss7nu\nuuuS3lPyr2fPnlWNnT17dlJZKXEpC17uuusuTj755My4q666KjNm8ODBLFy4MDOuFPWkRURyTI20\niEiOqZEWEckxNdIiIjmWdOHQzI4CzgBWAee4+x01rZVIHSivpRGkfAteP+AcYE9gPDCh1pUSqTXl\ntTSKlJ70vsB97r4CWAF8p7ZVEqkL5bU0hJRGelugT9xmaDNgirs/UNtqidSc8loaQsr2WWcCXwH+\nGvg8YYflbduL1fZZUks777wzCxYsqNb2Wcl5Ddo+S2pr4cKFDBkypGPbZwFvA0+4ewvwqpktN7Mt\n3H1p20Btn9W1ZX300UeZMWPGjOHhhx/OjBswYEBmzE477cRLL72UGZey4vDFF19k5513zoyrouS8\nlq736aefZsasv/76SXGpKw7HjRuXGZeXFYf3AGPNrClebNlYiSzdgPJaGkJmIx037LwReBK4Azi1\n1pUSqTXltTSKpPuk3X06ML3GdRGpK+W1NAKtOBQRyTE10iIiOaZGWkQkx9RIi4jkmBppEZEc0/ZZ\n3UivXr2qFjdjxozMmClTpiTFLViwIKleqXGy7ll//fWrFjdz5sykslLiBg0alBnzwQcfMGzYsKT3\nbI960iIiOaZGWkQkx9RIi4jkmBppEZEcy7xwaGbHAX9T9NSX3L1v7aokUnvKa2kUmY20u/8a+DWA\nmf0lcGitKyVSa8praRSV3oJ3DnBkLSoi0oWU15JbyXPSZjYSeMPd36lhfUTqSnkteZe8FZGZXQn8\np7s/UipG22dJLTU1NUEFOZsiJa9B22dJbW2yySYsX768w9tnFYwBTikXoO2zuraslpaWzJjm5mbm\nzp2bGXfnnXdmxkyZMoUpU6Zkxk2dOjUzprW1tdAI11tmXkv3snz58syYvn37JsWlrjjcZJNNkurW\nnqTpDjMbCHzo7qs6/E4iOaO8lkaQOic9AFhSy4qIdAHlteRe6vZZvwX+qsZ1Eakr5bU0Aq04FBHJ\nMTXSIiI5pkZaRCTH1EiLiOSYGmkRERERERERERERERERERERERERERHpbur6Bb5mdgnQDLQC33P3\npztZ3q7ATcDP3X1aJ8u6CBhN+NKpC939pg6U0Qe4GugP9ALOdffbO1mv3sDvgH9092s6Uc5XgZmx\nLIDn3f30TpR3FHAGsAo4x93v6GA53WJD2Grmdt7yOpaTy9xeF/K60j0OO8zMxgA7uPseZjaUsAno\nHp0orw9wMXB3Feq2NzAs1m1z4H8IB0mlxgPz3P1nZjYEuBfoVCIDk4FlhIO/sx5098M6W4iZ9SPs\nCzgC6AtMBTqUzN1hQ9hq5nZO8xryndvdOq/r1kgDY4kJ4u4LzGwzM9vY3T/sYHkrCYlzZhXq9ggw\nL/78PrCRmTW5e0XJ4+43FD0cAizsTKXiAT+UcDBUY9RTrZHTvsB97r4CWAF8p0rlNuqGsNXM7dzl\nNeQ+t7t1XtezkR4APFP0+I/A1sDLHSnM3VcDq82s0xWLZa2ID48Hbu9IIheY2ePAIMLB1hk/JWzt\n9K1OlgOht7KLmd0CbA5Mdff7OljWtkCfWNZmwBR3f6AzlWvwDWGrltt5zmvIZW53+7zuyu/uaKI6\nQ/iqMbMJwHHAqZ0px933AA4CrutEXY4GHnH3N6hOT+FlQtJNAI4B/s3MOnqS7kE4IP4aOBb49yrU\n7wTCnGd3kKvcrlZeQy5zu9vndT0b6cWEHkfBQOCtOr5/WWa2P3AWMM7ds3egbL+ML5rZYAB3fw5Y\nz8y26GCVvg4camZPEHpBPzazsR0sC3df7O4z48+vAm8TekQd8TbwhLu3xLKWd+JzFowBHu9kGV0l\nt7ldjbyO5eQyt9eFvK7ndMc9hIn46WY2AlgU5346q9O9TDPblDD8Guvu73WiqL0IQ6YfmNlWwMbu\nvrQjBbn7N4rq9xPgtc4MvczsSGBHd59qZv0JV+kXdbC4e4CrzeyfCT2PDn/OWLdG3xC2Frmdp7yG\nnOb2upDXdWuk3f0JM3vGzB4DVhPmozrMzL4MXEX4T1llZt8Bxrj7ux0o7nCgHzCzaC7waHev9OLI\nFYTh1iNAb+DkDtSlVn4D/JeZzQF6Aid1NHncfbGZ3Qg8GZ/q7DC6oTeErWZu5zSvIb+5rbwWERER\nERERERERERERERERERERERERERERqZb/B98nk0xNtqkyAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create plot of the H-1 scattering matrix\n", + "fig = plt.subplot(121)\n", + "fig.imshow(h1, interpolation='nearest')\n", + "plt.title('H-1 Scattering Matrix')\n", + "\n", + "# Create plot of the O-16 scattering matrix\n", + "fig2 = plt.subplot(122)\n", + "fig2.imshow(o16, interpolation='nearest')\n", + "plt.title('O-16 Scattering Matrix')\n", + "\n", + "# Show the plot on screen\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/pythonapi/examples/MGXS-Part-III.ipynb b/docs/source/pythonapi/examples/MGXS-Part-III.ipynb new file mode 100644 index 000000000..4a8cfbc6b --- /dev/null +++ b/docs/source/pythonapi/examples/MGXS-Part-III.ipynb @@ -0,0 +1,1633 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This IPython Notebook illustrates the use of the **`openmc.mgxs.Library`** class. The `Library` class is designed to help automate the calculation of multi-group cross sections for use cases with one or more domains, cross section types, and/or nuclides. In particular, this Notebook illustrates the following features:\n", + "\n", + "* Calculation of multi-group cross sections for a **fuel assembly**\n", + "* Automated creation, manipulation and storage of `MGXS` with **`openmc.mgxs.Library`**\n", + "* **Validation** of multi-group cross sections with **OpenMOC**\n", + "* Steady-state pin-by-pin **fission rates comparison** between OpenMC and OpenMOC\n", + "\n", + "**Note:** This Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook in its entirety, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries. In addition, this Notebook illustrates the use of Pandas DataFrames to containerize multi-group cross section data. We recommend using Pandas >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import math\n", + "import pickle\n", + "from IPython.display import Image\n", + "import matplotlib.pylab as pylab\n", + "import numpy as np\n", + "\n", + "import openmc\n", + "import openmc.mgxs\n", + "from openmc.statepoint import StatePoint\n", + "from openmc.summary import Summary\n", + "\n", + "import openmoc\n", + "import openmoc.process\n", + "from openmoc.compatible import get_openmoc_geometry\n", + "from openmoc.materialize import load_openmc_mgxs_lib\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate some Nuclides\n", + "h1 = openmc.Nuclide('H-1')\n", + "b10 = openmc.Nuclide('B-10')\n", + "o16 = openmc.Nuclide('O-16')\n", + "u235 = openmc.Nuclide('U-235')\n", + "u238 = openmc.Nuclide('U-238')\n", + "zr90 = openmc.Nuclide('Zr-90')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the nuclides we defined, we will now create three materials for the fuel, water, and cladding of the fuel pins." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# 1.6 enriched fuel\n", + "fuel = openmc.Material(name='1.6% Fuel')\n", + "fuel.set_density('g/cm3', 10.31341)\n", + "fuel.add_nuclide(u235, 3.7503e-4)\n", + "fuel.add_nuclide(u238, 2.2625e-2)\n", + "fuel.add_nuclide(o16, 4.6007e-2)\n", + "\n", + "# borated water\n", + "water = openmc.Material(name='Borated Water')\n", + "water.set_density('g/cm3', 0.740582)\n", + "water.add_nuclide(h1, 4.9457e-2)\n", + "water.add_nuclide(o16, 2.4732e-2)\n", + "water.add_nuclide(b10, 8.0042e-6)\n", + "\n", + "# zircaloy\n", + "zircaloy = openmc.Material(name='Zircaloy')\n", + "zircaloy.set_density('g/cm3', 6.55)\n", + "zircaloy.add_nuclide(zr90, 7.2758e-3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our three materials, we can now create a materials file object that can be exported to an actual XML file." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a MaterialsFile, add Materials\n", + "materials_file = openmc.MaterialsFile()\n", + "materials_file.add_material(fuel)\n", + "materials_file.add_material(water)\n", + "materials_file.add_material(zircaloy)\n", + "materials_file.default_xs = '71c'\n", + "\n", + "# Export to \"materials.xml\"\n", + "materials_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's move on to the geometry. This problem will be a square array of fuel pins and control rod guide tubes for which we can use OpenMC's lattice/universe feature. The basic universe will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces for fuel and clad, as well as the outer bounding surfaces of the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create cylinders for the fuel and clad\n", + "fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218)\n", + "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n", + "\n", + "# Create boundary planes to surround the geometry\n", + "min_x = openmc.XPlane(x0=-10.71, boundary_type='reflective')\n", + "max_x = openmc.XPlane(x0=+10.71, boundary_type='reflective')\n", + "min_y = openmc.YPlane(y0=-10.71, boundary_type='reflective')\n", + "max_y = openmc.YPlane(y0=+10.71, boundary_type='reflective')\n", + "min_z = openmc.ZPlane(z0=-10., boundary_type='reflective')\n", + "max_z = openmc.ZPlane(z0=+10., boundary_type='reflective')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the surfaces defined, we can now construct a fuel pin cell from cells that are defined by intersections of half-spaces created by the surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create a Universe to encapsulate a fuel pin\n", + "fuel_pin_universe = openmc.Universe(name='1.6% Fuel Pin')\n", + "\n", + "# Create fuel Cell\n", + "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", + "fuel_cell.fill = fuel\n", + "fuel_cell.region = -fuel_outer_radius\n", + "fuel_pin_universe.add_cell(fuel_cell)\n", + "\n", + "# Create a clad Cell\n", + "clad_cell = openmc.Cell(name='1.6% Clad')\n", + "clad_cell.fill = zircaloy\n", + "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", + "fuel_pin_universe.add_cell(clad_cell)\n", + "\n", + "# Create a moderator Cell\n", + "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", + "moderator_cell.fill = water\n", + "moderator_cell.region = +clad_outer_radius\n", + "fuel_pin_universe.add_cell(moderator_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Likewise, we can construct a control rod guide tube with the same surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create a Universe to encapsulate a control rod guide tube\n", + "guide_tube_universe = openmc.Universe(name='Guide Tube')\n", + "\n", + "# Create fuel Cell\n", + "guide_tube_cell = openmc.Cell(name='Guide Tube Water')\n", + "guide_tube_cell.fill = water\n", + "guide_tube_cell.region = -fuel_outer_radius\n", + "guide_tube_universe.add_cell(guide_tube_cell)\n", + "\n", + "# Create a clad Cell\n", + "clad_cell = openmc.Cell(name='Guide Clad')\n", + "clad_cell.fill = zircaloy\n", + "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", + "guide_tube_universe.add_cell(clad_cell)\n", + "\n", + "# Create a moderator Cell\n", + "moderator_cell = openmc.Cell(name='Guide Tube Moderator')\n", + "moderator_cell.fill = water\n", + "moderator_cell.region = +clad_outer_radius\n", + "guide_tube_universe.add_cell(moderator_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the pin cell universe, we can construct a 17x17 rectangular lattice with a 1.26cm pitch." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create fuel assembly Lattice\n", + "assembly = openmc.RectLattice(name='1.6% Fuel Assembly')\n", + "assembly.dimension = (17, 17)\n", + "assembly.pitch = (1.26, 1.26)\n", + "assembly.lower_left = [-1.26 * 17. / 2.0] * 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we create a NumPy array of fuel pin and guide tube universes for the lattice." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create array indices for guide tube locations in lattice\n", + "template_x = np.array([5, 8, 11, 3, 13, 2, 5, 8, 11, 14, 2, 5, 8,\n", + " 11, 14, 2, 5, 8, 11, 14, 3, 13, 5, 8, 11])\n", + "template_y = np.array([2, 2, 2, 3, 3, 5, 5, 5, 5, 5, 8, 8, 8, 8,\n", + " 8, 11, 11, 11, 11, 11, 13, 13, 14, 14, 14])\n", + "\n", + "# Initialize an empty 17x17 array of the lattice universes\n", + "universes = np.empty((17, 17), dtype=openmc.Universe)\n", + "\n", + "# Fill the array with the fuel pin and guide tube universes\n", + "universes[:,:] = fuel_pin_universe\n", + "universes[template_x, template_y] = guide_tube_universe\n", + "\n", + "# Store the array of universes in the lattice\n", + "assembly.universes = universes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenMC requires that there is a \"root\" universe. Let us create a root cell that is filled by the pin cell universe and then assign it to the root universe." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create root Cell\n", + "root_cell = openmc.Cell(name='root cell')\n", + "root_cell.fill = assembly\n", + "\n", + "# Add boundary planes\n", + "root_cell.region = +min_x & -max_x & +min_y & -max_y & +min_z & -max_z\n", + "\n", + "# Create root Universe\n", + "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", + "root_universe.add_cell(root_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "geometry = openmc.Geometry()\n", + "geometry.root_universe = root_universe" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a GeometryFile\n", + "geometry_file = openmc.GeometryFile()\n", + "geometry_file.geometry = geometry\n", + "\n", + "# Export to \"geometry.xml\"\n", + "geometry_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the geometry and materials finished, we now just need to define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# OpenMC simulation parameters\n", + "batches = 50\n", + "inactive = 10\n", + "particles = 2500\n", + "\n", + "# Instantiate a SettingsFile\n", + "settings_file = openmc.SettingsFile()\n", + "settings_file.batches = batches\n", + "settings_file.inactive = inactive\n", + "settings_file.particles = particles\n", + "settings_file.output = {'tallies': False, 'summary': True}\n", + "source_bounds = [-10.71, -10.71, -10, 10.71, 10.71, 10.]\n", + "settings_file.set_source_space('fission', source_bounds)\n", + "\n", + "# Export to \"settings.xml\"\n", + "settings_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us also create a plot file that we can use to verify that our pin cell geometry was created successfully." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a Plot\n", + "plot = openmc.Plot(plot_id=1)\n", + "plot.filename = 'materials-xy'\n", + "plot.origin = [0, 0, 0]\n", + "plot.width = [21.5, 21.5]\n", + "plot.pixels = [250, 250]\n", + "plot.color = 'mat'\n", + "\n", + "# Instantiate a PlotsFile, add Plot, and export to \"plots.xml\"\n", + "plot_file = openmc.PlotsFile()\n", + "plot_file.add_plot(plot)\n", + "plot_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the plots.xml file, we can now generate and view the plot. OpenMC outputs plots in .ppm format, which can be converted into a compressed format like .png with the convert utility." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run openmc in plotting mode\n", + "executor = openmc.Executor()\n", + "executor.plot_geometry(output=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAASWSURB\nVGje7Zs7buMwEEBzieRcaYaB48KVisSFj7Cn4BFU2I37LVan8BFc5ABb2ICtpSSaHP5EUqOAzsIO\nAjwEGjjiZ/hEDZ+eiJ9noHxe6fHvW4BPDmwHEMAaYBdAEb+5Amu/YNlyQLgP4xGhiG9avmwvsBF/\nt/FkY2vj69NLD1f41Z6Yiw3Gvy728ceVuhLhwY8bA0fij8EgO/6wjH2pF/lKxvf3tNG3Z+BRt4oH\nh/Znt5bu+iQd+/Z/Xp8BmiO8X0X/n7KQNbWIZ1wMJjEUPwBuuI1hfcMZxv9Pj19/AexrYH84KASF\nV41nhe8Ku/4f+nSpu3eNsdadjpBLFPF6pIE76Hx4QeiMfy/yVQi/cf6mxx900jk4ScfGlc4/q9v8\nc9sPxhpN4wn3n+qepeqeAK5x/3WZfieGx+8h6Uv8DCNHeAfjv3Q8q0VjwJCesrFbP2X+7NZPidAj\nE7hAyGTSFOvnLX8erfw9YCV+BL4p7DL1gH3SNvK3Z/0Qn3HE64dn/eLifx1Fd/62eP4NVyLsJx1C\nce2bf/7mfL+Kt6UB+ivtm+YasT88u6Yi2z+M+lrpT432J4F9pw+mZOH+rP3pLP2pEzFhaiCdzESG\ncOvBO5g/peMt6d2lYo39d0ivNUvwXyE6KhVb/ssh7r8LMRAs/1XrD0DcfxfiP8DrD54/AFV0/av6\neP/6acQH/NcTr/KH6JCYCnezMOi/8v5H/be7f9N/tdNyluC/sv3V+rnWTvuxUNj/tbax81+u0fDf\nSuttOt7B/Ckd3zVvb7rafzFq6XWxifqv0f8x/2XZ+PBfw39tFb5YyPTz//z+u9P+a+KnTvoO3sH4\nLx3fiyzXTutgbxrgx8F/bdNNR+2/Uq/YuH9dLRXW60cVk14DK2P/aJkinQ7yDfZfR3pH/Feg47/5\n32/6r196/cgVDu3/liK9DgLyX2260U5vMfr9dxvBh/+i+CzptVHE73V69WOj/ddBT/53toKdTV8j\n/5vrT9b+7/eun9P2f6P+m7T/G/GPkP/m481/6xHpHcNu/PJhKFbi18SFi2DhHcyf0vHYf09Sb4ON\n/iXR9d/J/U8Zf5dZxj91/s3ovzzqv3b+IfvvSNL1o5V/belNzP8P/5XxqdLhxdn9N6ZiQf+d6n8z\n+OeP919K+5P7nzr+Ss+f0vHU/EfNv8T8T11/frr/Uv1jFv+l+Ffp8V88ng9YwTT/pz5/EPuf+vz1\nH/pv1vM39fmfvP9A3f8oPn8Kx1P336j7f8T9x//Bf4n7z6T9b+r+O9l/qe8fSs+f0vHU91/U92+z\n+m/++8d7eX869f0v9f0z+f039f176fFfOp5xWv0Htf4E9fSU+hfsv1Pqb/D4h2n1P9T6I2r9E6n+\nilr/Ra4/o9a/lZ4/peOp9ZcbYv0nsf70pXUe2rLqX19acv0ttf7XfmjOrT+2kxbE/Dd4fmZC/TW5\n/ptaf156/pSOp55/mNF/Wx8y238vD//1+++k80fk80/U81elx3/peMZp5/+o5w8b2vlH7/7viP8m\nnJ/JPf9Zev/X9oes87fYf21MOf9LPn9MPf9cdv78A0xugrwgDfcHAAAAJXRFWHRkYXRlOmNyZWF0\nZQAyMDE1LTExLTI5VDE3OjIwOjAxLTA1OjAwddLLfAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0x\nMS0yOVQxNzoyMDowMS0wNTowMASPc8AAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Convert OpenMC's funky ppm to png\n", + "!convert materials-xy.ppm materials-xy.png\n", + "\n", + "# Display the materials plot inline\n", + "Image(filename='materials-xy.png')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see from the plot, we have a nice array of pin cells with fuel, cladding, and water!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create an MGXS Library" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define a 2-group structure using the built-in `EnergyGroups` class." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a 2-group EnergyGroups object\n", + "groups = openmc.mgxs.EnergyGroups()\n", + "groups.group_edges = np.array([0., 0.625e-6, 20.])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we will instantiate an `openmc.mgxs.Library` for the energy groups with our the fuel assembly geometry." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Initialize an 2-group MGXS Library for OpenMOC\n", + "mgxs_lib = openmc.mgxs.Library(geometry)\n", + "mgxs_lib.energy_groups = groups" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we must specify to the `Library` which types of cross sections to compute. In particular, the following are the multi-group cross section `MGXS` subclasses are mapped to type string codes mapped accepted by the `Library` class:\n", + "\n", + "* `TotalXS` (`\"total\"`)\n", + "* `TransportXS` (`\"transport\"`)\n", + "* `AbsorptionXS` (`\"absorption\"`)\n", + "* `CaptureXS` (`\"capture\"`)\n", + "* `FissionXS` (`\"fission\"`)\n", + "* `NuFissionXS` (`\"nu-fission\"`)\n", + "* `ScatterXS` (`\"scatter\"`)\n", + "* `NuScatterXS` (`\"nu-scatter\"`)\n", + "* `ScatterMatrixXS` (`\"scatter matrix\"`)\n", + "* `NuScatterMatrixXS` (`\"nu-scatter matrix\"`)\n", + "* `Chi` (`\"chi\"`)\n", + "\n", + "In this case, let's create the multi-group cross sections needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define `\"transport\"`, `\"nu-fission\"`, `\"nu-scatter matrix\"` and `\"chi\"` cross sections for our `Library`.\n", + "\n", + "**Note**: A variety of different approximate transport-corrected total multi-group cross sections (and corresponding scattering matrices) can be found in the literature. At the present time, the `openmc.mgxs` module only supports the \"P0\" transport correction. This correction can be turned on or off through the boolean `Library.correction` property which may take values of `\"P0\"` (default) or `None`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Specify multi-group cross section types to compute\n", + "mgxs_lib.mgxs_types = [\"transport\", \"nu-fission\", \"nu-scatter matrix\", \"chi\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we must specify the type of domain over which we would like the `Library` to compute multi-group cross sections. The domain type corresponds to the type of tally filter to be used in the tallies created to compute multi-group cross sections. At the present time, the `Library` supports `\"material,\"` `\"cell,\"` and `\"universe\"` domain types. We will use a `\"cell\"` domain type here to compute cross sections in each of the cells for our fuel and guide tube pin cells." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Specify a \"cell\" domain type for the cross section tally filters\n", + "mgxs_lib.domain_type = \"cell\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can easily instruct the `Library` to compute multi-group cross sections on a nuclide-by-nuclide basis as was first illustrated in MGXS: Part II with the boolean `Library.by_nuclide` property. By default, `by_nuclide` is set to `False`, but we will set it to `True` here." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Compute cross sections on a nuclide-by-nuclide basis\n", + "mgxs_lib.by_nuclide = True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lastly, we use the `Library` to construct all of the tallies needed to compute all of the requested multi-group cross sections in each domain and nuclide." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Construct all tallies needed for the multi-group cross section library\n", + "mgxs_lib.build_library()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The tallies can now be export to a \"tallies.xml\" input file for OpenMC. \n", + "\n", + "**NOTE**: At this point the `Library` has constructed nearly 100 distinct `Tally`. The overhead to tally in OpenMC scales as $O(N)$ for $N$ tallies, which can become a bottleneck for large tally datasets. To compensate for this, the Python API's `Tally`, `Filter` and `TalliesFile` classes allow for the smart *merging* of tallies when possible. The `Library` class supports this runtime optimization with the use of the optional `merge` paramter (`False` by default) for the `Library.add_to_tallies_file(...)` method, as shown below." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create a \"tallies.xml\" file for the MGXS Library\n", + "tallies_file = openmc.TalliesFile()\n", + "mgxs_lib.add_to_tallies_file(tallies_file, merge=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition, we instantiate a fission rate mesh tally to compare with OpenMOC." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a tally Mesh\n", + "mesh = openmc.Mesh(mesh_id=1)\n", + "mesh.type = 'regular'\n", + "mesh.dimension = [17, 17]\n", + "mesh.lower_left = [-10.71, -10.71]\n", + "mesh.width = [1.26, 1.26]\n", + "\n", + "# Instantiate tally Filter\n", + "mesh_filter = openmc.Filter()\n", + "mesh_filter.mesh = mesh\n", + "\n", + "# Instantiate the Tally\n", + "tally = openmc.Tally(name='mesh tally')\n", + "tally.add_filter(mesh_filter)\n", + "tally.add_score('fission')\n", + "tally.add_score('nu-fission')\n", + "\n", + "# Add mesh and Tally to TalliesFile\n", + "tallies_file.add_mesh(mesh)\n", + "tallies_file.add_tally(tally)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Export all tallies to a \"tallies.xml\" file\n", + "tallies_file.export_to_xml()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " .d88888b. 888b d888 .d8888b.\n", + " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", + " 888 888 88888b.d88888 888 888\n", + " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", + " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", + " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", + " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", + " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", + "__________________888______________________________________________________\n", + " 888\n", + " 888\n", + "\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: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", + " Date/Time: 2015-11-29 17:20:02\n", + " MPI Processes: 1\n", + "\n", + " ===========================================================================\n", + " ========================> INITIALIZATION <=========================\n", + " ===========================================================================\n", + "\n", + " Reading settings XML file...\n", + " Reading cross sections XML file...\n", + " Reading geometry XML file...\n", + " Reading materials XML file...\n", + " Reading tallies XML file...\n", + " Building neighboring cells lists for each surface...\n", + " Loading ACE cross section table: 92235.71c\n", + " Loading ACE cross section table: 92238.71c\n", + " Loading ACE cross section table: 8016.71c\n", + " Loading ACE cross section table: 1001.71c\n", + " Loading ACE cross section table: 5010.71c\n", + " Loading ACE cross section table: 40090.71c\n", + " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", + " Initializing source particles...\n", + "\n", + " ===========================================================================\n", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 1.02650 \n", + " 2/1 1.01386 \n", + " 3/1 1.01045 \n", + " 4/1 1.05511 \n", + " 5/1 1.04873 \n", + " 6/1 1.04558 \n", + " 7/1 1.03840 \n", + " 8/1 1.02086 \n", + " 9/1 1.08845 \n", + " 10/1 1.03932 \n", + " 11/1 1.01271 \n", + " 12/1 1.03448 1.02360 +/- 0.01088\n", + " 13/1 1.04395 1.03038 +/- 0.00925\n", + " 14/1 1.05477 1.03648 +/- 0.00894\n", + " 15/1 1.00485 1.03015 +/- 0.00938\n", + " 16/1 1.04523 1.03267 +/- 0.00806\n", + " 17/1 1.01328 1.02990 +/- 0.00735\n", + " 18/1 1.01476 1.02800 +/- 0.00664\n", + " 19/1 1.01490 1.02655 +/- 0.00604\n", + " 20/1 1.00926 1.02482 +/- 0.00567\n", + " 21/1 0.98504 1.02120 +/- 0.00627\n", + " 22/1 1.00397 1.01977 +/- 0.00591\n", + " 23/1 1.02556 1.02021 +/- 0.00545\n", + " 24/1 0.99808 1.01863 +/- 0.00529\n", + " 25/1 0.99638 1.01715 +/- 0.00514\n", + " 26/1 0.99615 1.01584 +/- 0.00499\n", + " 27/1 1.01843 1.01599 +/- 0.00469\n", + " 28/1 1.00315 1.01528 +/- 0.00447\n", + " 29/1 1.00633 1.01480 +/- 0.00426\n", + " 30/1 1.02159 1.01514 +/- 0.00405\n", + " 31/1 1.03395 1.01604 +/- 0.00396\n", + " 32/1 1.02672 1.01652 +/- 0.00381\n", + " 33/1 1.03778 1.01745 +/- 0.00375\n", + " 34/1 1.03807 1.01831 +/- 0.00369\n", + " 35/1 1.07854 1.02072 +/- 0.00428\n", + " 36/1 1.03524 1.02128 +/- 0.00415\n", + " 37/1 1.03100 1.02164 +/- 0.00401\n", + " 38/1 1.03853 1.02224 +/- 0.00391\n", + " 39/1 1.04089 1.02288 +/- 0.00383\n", + " 40/1 1.02150 1.02284 +/- 0.00370\n", + " 41/1 0.98470 1.02161 +/- 0.00379\n", + " 42/1 1.00658 1.02114 +/- 0.00370\n", + " 43/1 0.98652 1.02009 +/- 0.00373\n", + " 44/1 1.02787 1.02032 +/- 0.00363\n", + " 45/1 0.98800 1.01939 +/- 0.00364\n", + " 46/1 1.00286 1.01893 +/- 0.00357\n", + " 47/1 1.02559 1.01911 +/- 0.00348\n", + " 48/1 1.03729 1.01959 +/- 0.00342\n", + " 49/1 1.02538 1.01974 +/- 0.00333\n", + " 50/1 1.01478 1.01962 +/- 0.00325\n", + " Creating state point statepoint.50.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 4.0000E-01 seconds\n", + " Reading cross sections = 8.4000E-02 seconds\n", + " Total time in simulation = 3.8366E+01 seconds\n", + " Time in transport only = 3.8351E+01 seconds\n", + " Time in inactive batches = 3.6930E+00 seconds\n", + " Time in active batches = 3.4673E+01 seconds\n", + " Time synchronizing fission bank = 1.0000E-03 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 0.0000E+00 seconds\n", + " Total time elapsed = 3.8780E+01 seconds\n", + " Calculation Rate (inactive) = 6769.56 neutrons/second\n", + " Calculation Rate (active) = 2884.09 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.01805 +/- 0.00261\n", + " k-effective (Track-length) = 1.01962 +/- 0.00325\n", + " k-effective (Absorption) = 1.01554 +/- 0.00339\n", + " Combined k-effective = 1.01711 +/- 0.00235\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Remove old HDF5 (summary, statepoint) files\n", + "!rm statepoint.*\n", + "\n", + "# Run OpenMC\n", + "executor.run_simulation()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tally Data Processing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and \"reading\" the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the last statepoint file\n", + "sp = openmc.StatePoint('statepoint.50.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "su = openmc.Summary('summary.h5')\n", + "sp.link_with_summary(su)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The statepoint is now ready to be analyzed by the `Library`. We simply have to load the tallies from the statepoint into the `Library` and our `MGXS` objects will compute the cross sections for us under-the-hood." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Initialize MGXS Library with OpenMC statepoint data\n", + "mgxs_lib.load_from_statepoint(sp)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Voila! Our multi-group cross sections are now ready to rock 'n roll!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extracting and Storing MGXS Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `Library` supports a rich API to automate a variety of tasks, including multi-group cross section data retrieval and storage. We will highlight a few of these features here. First, the `Library.get_mgxs(...)` method allows one to extract an `MGXS` object from the `Library` for a particular domain and cross section type. The following cell illustrates how one may extract the `NuFissionXS` object for the fuel cell." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Retrieve the NuFissionXS object for the fuel cell from the library\n", + "fuel_mgxs = mgxs_lib.get_mgxs(fuel_cell, 'nu-fission')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `NuFissionXS` object supports all of the methods described previously the `openmc.mgxs` tutorials, such as Pandas DataFrames:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
3100001U-2358.063513e-034.062984e-05
4100001U-2387.335515e-034.459335e-05
5100001O-160.000000e+000.000000e+00
0100002U-2353.613274e-011.902492e-03
1100002U-2386.738424e-073.536787e-09
2100002O-160.000000e+000.000000e+00
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "3 10000 1 U-235 8.063513e-03 4.062984e-05\n", + "4 10000 1 U-238 7.335515e-03 4.459335e-05\n", + "5 10000 1 O-16 0.000000e+00 0.000000e+00\n", + "0 10000 2 U-235 3.613274e-01 1.902492e-03\n", + "1 10000 2 U-238 6.738424e-07 3.536787e-09\n", + "2 10000 2 O-16 0.000000e+00 0.000000e+00" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = fuel_mgxs.get_pandas_dataframe()\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similarly, we can use the `MGXS.print_xs(...)` method to view a string representation of the multi-group cross section data." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tNuclide =\tU-235\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t8.06e-03 +/- 5.04e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t3.61e-01 +/- 5.27e-01%\n", + "\n", + "\tNuclide =\tU-238\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t7.34e-03 +/- 6.08e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t6.74e-07 +/- 5.25e-01%\n", + "\n", + "\tNuclide =\tO-16\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t0.00e+00 +/- nan%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t0.00e+00 +/- nan%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "fuel_mgxs.print_xs()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One can export the entire `Library` to HDF5 with the `Library.build_hdf5_store(...)` method as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Store the cross section data in an \"mgxs/mgxs.h5\" HDF5 binary file\n", + "mgxs_lib.build_hdf5_store(filename='mgxs.h5', directory='mgxs')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The HDF5 store will contain the numerical multi-group cross section data indexed by domain, nuclide and cross section type. Some data workflows may be optimized by storing and retrieving binary representations of the `MGXS` objects in the `Library`. This feature is supported through the `Library.dump_to_file(...)` and `Library.load_from_file(...)` routines which use Python's `pickle` module. This is illustrated as follows." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Store a complete binary representation of the Library and\n", + "# its MGXS objects in a pickled binary file \"mgxs/mgxs.pkl\"\n", + "mgxs_lib.dump_to_file(filename='mgxs', directory='mgxs')" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a new MGXS Library from the complete binary representation\n", + "# stored in the pickled binary file \"mgxs/mgxs.pkl\"\n", + "mgxs_lib = openmc.mgxs.Library.load_from_file(filename='mgxs', directory='mgxs')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `Library` class may be used to leverage the energy condensation features supported by the `MGXS` class and illutrated in earlier tutorials on `openmc.mgxs`. In particular, one can use the `Library.get_condensed_library(...)` with a coarse group structure which is a subset of the original \"fine\" group structure as shown below." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create a 1-group structure\n", + "coarse_groups = openmc.mgxs.EnergyGroups(group_edges=[0., 20.])\n", + "\n", + "# Create a new MGXS Library on the coarse 1-group structure\n", + "coarse_mgxs_lib = mgxs_lib.get_condensed_library(coarse_groups)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
0100001U-2350.0743830.000280
1100001U-2380.0059590.000036
2100001O-160.0000000.000000
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "0 10000 1 U-235 0.074383 0.000280\n", + "1 10000 1 U-238 0.005959 0.000036\n", + "2 10000 1 O-16 0.000000 0.000000" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Retrieve the NuFissionXS object for the fuel cell from the 1-group library\n", + "coarse_fuel_mgxs = coarse_mgxs_lib.get_mgxs(fuel_cell, 'nu-fission')\n", + "\n", + "# Show the Pandas DataFrame for the 1-group MGXS\n", + "coarse_fuel_mgxs.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Verification with OpenMOC" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Of course it is always a good idea to verify that one's cross sections are accurate. We can easily do so here with the deterministic transport code OpenMOC. We will extract an OpenCG geometry from the summary file and convert it into an equivalent OpenMOC geometry." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create an OpenMOC Geometry from the OpenCG Geometry\n", + "openmoc_geometry = get_openmoc_geometry(mgxs_lib.opencg_geometry)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we can inject the multi-group cross sections into the equivalent fuel assembly OpenMOC geometry. The `openmoc.materialize` module is seamlessly integrated to support the loading of `Library` objects from OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the library into the OpenMOC geometry\n", + "materials = load_openmc_mgxs_lib(mgxs_lib, openmoc_geometry)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are now ready to run OpenMOC to verify our cross-sections from OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Computing the eigenvalue...\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.854316\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.801593\tres = 1.522E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.761131\tres = 6.380E-02\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.731467\tres = 5.066E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.709897\tres = 3.910E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.695110\tres = 2.954E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.685966\tres = 2.085E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.681511\tres = 1.317E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.680926\tres = 6.520E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.683509\tres = 1.046E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.688659\tres = 3.848E-03\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.695860\tres = 7.565E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.704674\tres = 1.048E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.714726\tres = 1.269E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.725700\tres = 1.428E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.737329\tres = 1.537E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.749388\tres = 1.604E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.761690\tres = 1.637E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.774081\tres = 1.643E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.786432\tres = 1.628E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.798638\tres = 1.597E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.810618\tres = 1.553E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.822303\tres = 1.501E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.833643\tres = 1.443E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.844598\tres = 1.380E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.855140\tres = 1.315E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.865249\tres = 1.249E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.874914\tres = 1.183E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.884128\tres = 1.118E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.892891\tres = 1.054E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.901206\tres = 9.920E-03\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.909080\tres = 9.320E-03\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.916523\tres = 8.745E-03\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.923546\tres = 8.194E-03\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.930162\tres = 7.669E-03\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.936387\tres = 7.171E-03\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.942236\tres = 6.698E-03\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.947725\tres = 6.252E-03\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.952869\tres = 5.830E-03\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.957687\tres = 5.433E-03\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.962193\tres = 5.060E-03\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.966404\tres = 4.710E-03\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.970337\tres = 4.381E-03\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.974006\tres = 4.073E-03\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.977426\tres = 3.785E-03\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.980613\tres = 3.515E-03\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.983580\tres = 3.264E-03\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.986341\tres = 3.029E-03\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.988908\tres = 2.809E-03\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.991293\tres = 2.605E-03\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.993509\tres = 2.415E-03\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.995566\tres = 2.238E-03\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.997475\tres = 2.073E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.999246\tres = 1.920E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.000888\tres = 1.777E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.002409\tres = 1.645E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.003818\tres = 1.522E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.005123\tres = 1.408E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.006331\tres = 1.302E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.007450\tres = 1.203E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.008484\tres = 1.112E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.009440\tres = 1.028E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.010324\tres = 9.496E-04\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.011141\tres = 8.771E-04\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.011897\tres = 8.100E-04\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.012594\tres = 7.478E-04\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.013238\tres = 6.903E-04\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.013833\tres = 6.371E-04\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.014382\tres = 5.879E-04\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.014889\tres = 5.424E-04\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.015357\tres = 5.004E-04\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.015789\tres = 4.615E-04\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.016187\tres = 4.255E-04\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.016554\tres = 3.923E-04\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.016892\tres = 3.617E-04\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.017204\tres = 3.333E-04\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.017492\tres = 3.072E-04\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.017757\tres = 2.831E-04\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.018001\tres = 2.608E-04\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.018226\tres = 2.403E-04\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.018433\tres = 2.213E-04\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.018624\tres = 2.038E-04\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.018800\tres = 1.877E-04\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.018962\tres = 1.728E-04\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.019110\tres = 1.591E-04\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.019248\tres = 1.465E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.019374\tres = 1.348E-04\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.019490\tres = 1.241E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.019597\tres = 1.142E-04\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.019695\tres = 1.051E-04\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.019786\tres = 9.670E-05\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.019869\tres = 8.895E-05\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.019946\tres = 8.183E-05\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.020016\tres = 7.528E-05\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.020081\tres = 6.922E-05\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.020141\tres = 6.368E-05\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.020195\tres = 5.857E-05\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.020246\tres = 5.385E-05\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.020292\tres = 4.954E-05\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.020335\tres = 4.553E-05\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.020374\tres = 4.185E-05\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.020410\tres = 3.848E-05\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.020443\tres = 3.537E-05\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.020474\tres = 3.253E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.020502\tres = 2.989E-05\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.020527\tres = 2.746E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.020551\tres = 2.526E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.020573\tres = 2.319E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.020593\tres = 2.134E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.020611\tres = 1.960E-05\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.020628\tres = 1.800E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.020643\tres = 1.652E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.020657\tres = 1.518E-05\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.020670\tres = 1.398E-05\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.020682\tres = 1.283E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.020693\tres = 1.178E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.020704\tres = 1.083E-05\n" + ] + } + ], + "source": [ + "# Generate tracks for OpenMOC\n", + "openmoc_geometry.initializeFlatSourceRegions()\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, 32, 0.1)\n", + "track_generator.generateTracks()\n", + "\n", + "# Run OpenMOC\n", + "solver = openmoc.CPUSolver(track_generator)\n", + "solver.computeEigenvalue()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We report the eigenvalues computed by OpenMC and OpenMOC here together to summarize our results." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.017105\n", + "openmoc keff = 1.020704\n", + "bias [pcm]: 359.8\n" + ] + } + ], + "source": [ + "# Print report of keff and bias with OpenMC\n", + "openmoc_keff = solver.getKeff()\n", + "openmc_keff = sp.k_combined[0]\n", + "bias = (openmoc_keff - openmc_keff) * 1e5\n", + "\n", + "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", + "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", + "print('bias [pcm]: {0:1.1f}'.format(bias))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is a non-trivial bias between the eigenvalues computed by OpenMC and OpenMOC. One can show that these biases do not converge to <100 pcm with more particle histories. For heterogeneous geometries, additional measures must be taken to address the following three sources of bias:\n", + "\n", + "* Appropriate transport-corrected cross sections\n", + "* Spatial discretization of OpenMOC's mesh\n", + "* Constant-in-angle multi-group cross sections" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Flux and Pin Power Visualizations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will conclude this tutorial by illustrating how to visualize the fission rates computed by OpenMOC and OpenMC. First, we extract OpenMC's volume-averaged fission rates from each fuel pin into a 2D 17x17 NumPy array." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Get the OpenMC fission rate mesh tally data\n", + "mesh_tally = sp.get_tally(name='mesh tally')\n", + "openmc_fission_rates = mesh_tally.get_values(scores=['nu-fission'])\n", + "\n", + "# Reshape array to 2D for plotting\n", + "openmc_fission_rates.shape = (17,17)\n", + "\n", + "# Compute volume-average rates from OpenMC's volume-integrated fission rates\n", + "openmc_fission_rates /= math.pi * fuel_outer_radius.r**2\n", + "\n", + "# Normalize to the average pin power\n", + "openmc_fission_rates /= np.mean(openmc_fission_rates)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we extract OpenMOC's volume-averaged fission rates into a 2D 17x17 NumPy array." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Export OpenMOC's fission rates for each pin cell instance in the fuel assembly\n", + "openmoc.process.compute_fission_rates(solver)\n", + "\n", + "# Open the pickle file with the fission rates\n", + "fission_rates = pickle.load(open('fission-rates/fission-rates.pkl', 'rb' ))\n", + "\n", + "# Allocate array for fission rates in each fuel pin\n", + "openmoc_fission_rates = np.zeros((17, 17))\n", + "\n", + "# Extract fission rates for each fuel pin\n", + "for key, value in fission_rates.items():\n", + " lat_x = int(key.split(':')[1].split()[3][1:-1])\n", + " lat_y = int(key.split(':')[1].split()[4][:-1]) \n", + " openmoc_fission_rates[lat_x, lat_y] = value\n", + "\n", + "# Normalize to the average pin fission rate\n", + "openmoc_fission_rates /= np.mean(openmoc_fission_rates)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can easily use Matplotlib to visualize the fission rates from OpenMC and OpenMOC side-by-side." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot OpenMC's fission rates in the left subplot\n", + "fig = pylab.subplot(121)\n", + "pylab.imshow(openmc_fission_rates, interpolation='none', cmap='jet')\n", + "pylab.grid()\n", + "pylab.title('OpenMC Fission Rates')\n", + "\n", + "# Plot OpenMOC's fission rates in the right subplot\n", + "fig2 = pylab.subplot(122)\n", + "pylab.imshow(openmoc_fission_rates, interpolation='none', cmap='jet')\n", + "pylab.grid()\n", + "pylab.title('OpenMOC Fission Rates')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb deleted file mode 100644 index f4e4b59ef..000000000 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ /dev/null @@ -1,2454 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This notebook demonstrates how to use the **``openmc.mgxs``** module to generate multi-group cross sections with OpenMC.\n", - "\n", - "**Note:** that this Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning: This call to matplotlib.use() has no effect\n", - "because the backend has already been chosen;\n", - "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", - "or matplotlib.backends is imported for the first time.\n", - "\n", - " warnings.warn(_use_error_msg)\n" - ] - } - ], - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "import openmc\n", - "import openmc.mgxs as mgxs\n", - "import openmoc\n", - "from openmoc.compatible import get_openmoc_geometry\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Infinite Homogeneous Medium" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We first construct a simple homogeneous infinite medium problem to illustrate use of the `openmc.mgxs` module to generate multi-group cross sections." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generate Inputs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate some Nuclides\n", - "h1 = openmc.Nuclide('H-1')\n", - "o16 = openmc.Nuclide('O-16')\n", - "u235 = openmc.Nuclide('U-235')\n", - "u238 = openmc.Nuclide('U-238')\n", - "zr90 = openmc.Nuclide('Zr-90')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the nuclides we defined, we will now create a material for the homogeneous medium." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a Material and register the Nuclides\n", - "inf_medium = openmc.Material(name='moderator')\n", - "inf_medium.set_density('g/cc', 5.)\n", - "inf_medium.add_nuclide(h1, 0.028999667)\n", - "inf_medium.add_nuclide(o16, 0.01450188)\n", - "inf_medium.add_nuclide(u235, 0.000114142)\n", - "inf_medium.add_nuclide(u238, 0.006886019)\n", - "inf_medium.add_nuclide(zr90, 0.002116053)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With our material, we can now create a materials file object that can be exported to an actual XML file." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a MaterialsFile, register all Materials, and export to XML\n", - "materials_file = openmc.MaterialsFile()\n", - "materials_file.default_xs = '71c'\n", - "materials_file.add_material(inf_medium)\n", - "materials_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's move on to the geometry. This problem will be a simple square cell with reflective boundary conditions to simulate an infinite homogeneous medium. The first step is to create the outer bounding surfaces of the problem." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate boundary Planes\n", - "min_x = openmc.XPlane(boundary_type='reflective', x0=-0.63)\n", - "max_x = openmc.XPlane(boundary_type='reflective', x0=0.63)\n", - "min_y = openmc.YPlane(boundary_type='reflective', y0=-0.63)\n", - "max_y = openmc.YPlane(boundary_type='reflective', y0=0.63)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the surfaces defined, we can now create a cell that is defined by intersections of half-spaces created by the surfaces." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate a Cell\n", - "cell = openmc.Cell(cell_id=1, name='cell')\n", - "\n", - "# Register bounding Surfaces with the Cell\n", - "cell.region = +min_x & -max_x & +min_y & -max_y\n", - "\n", - "# Fill the Cell with the Material\n", - "cell.fill = inf_medium" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "OpenMC requires that there is a \"root\" universe. Let us create a root universe and add our square cell to it." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate Universe\n", - "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", - "root_universe.add_cell(cell)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create Geometry and set root Universe\n", - "openmc_geometry = openmc.Geometry()\n", - "openmc_geometry.root_universe = root_universe\n", - "\n", - "# Instantiate a GeometryFile\n", - "geometry_file = openmc.GeometryFile()\n", - "geometry_file.geometry = openmc_geometry\n", - "\n", - "# Export to \"geometry.xml\"\n", - "geometry_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# OpenMC simulation parameters\n", - "batches = 50\n", - "inactive = 10\n", - "particles = 2500\n", - "\n", - "# Instantiate a SettingsFile\n", - "settings_file = openmc.SettingsFile()\n", - "settings_file.batches = batches\n", - "settings_file.inactive = inactive\n", - "settings_file.particles = particles\n", - "settings_file.output = {'tallies': True, 'summary': True}\n", - "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", - "settings_file.set_source_space('box', bounds)\n", - "\n", - "# Export to \"settings.xml\"\n", - "settings_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define a \"fine\" 8-group and \"coarse\" 2-group structures using the built-in `EnergyGroups` class." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a \"fine\" 8-group EneryGroups object\n", - "fine_groups = mgxs.EnergyGroups()\n", - "fine_groups.group_edges = np.array([0., 0.058e-6, 0.14e-6, 0.28e-6,\n", - " 0.625e-6, 4.e-6, 5.53e-3, 821.e-3, 20.])\n", - "\n", - "# Instantiate a \"coarse\" 2-group EneryGroups object\n", - "coarse_groups = mgxs.EnergyGroups()\n", - "coarse_groups.group_edges = np.array([0., 0.625e-6, 20.])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now use the fine and coarse `EnergyGroups` objects, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", - "\n", - "* `TotalXS`\n", - "* `TransportXS`\n", - "* `AbsorptionXS`\n", - "* `CaptureXS`\n", - "* `FissionXS`\n", - "* `NuFissionXS`\n", - "* `ScatterXS`\n", - "* `NuScatterXS`\n", - "* `ScatterMatrixXS`\n", - "* `NuScatterMatrixXS`\n", - "* `Chi`\n", - "\n", - "These classes provide us with an interface to generate the tally inputs as well as perform post-processing of OpenMC's tally data to compute the respective multi-group cross sections. In this case, let's create the multi-group cross sections needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define total, nu-fission, nu-scatter and chi cross sections for our infinite medium cell as the domain and our fine 8-group structure as our energy groups." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate cross sections needed for an OpenMOC simulation\n", - "transport = mgxs.TransportXS(domain=cell, domain_type='cell', groups=fine_groups)\n", - "nufission = mgxs.NuFissionXS(domain=cell, domain_type='cell', groups=fine_groups)\n", - "nuscatter = mgxs.NuScatterMatrixXS(domain=cell, domain_type='cell', groups=fine_groups)\n", - "chi = mgxs.Chi(domain=cell, domain_type='cell', groups=fine_groups)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each multi-group cross section object stores its tallies in a Python dictionary called `tallies`. We can inspect the tallies in the dictionary for our `NuFission` object as follows. " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "OrderedDict([('flux', Tally\n", - "\tID =\t10000\n", - "\tName =\t\n", - "\tFilters =\t\n", - " \t\tcell\t[1]\n", - " \t\tenergy\t[ 0.00000000e+00 5.80000000e-08 1.40000000e-07 2.80000000e-07\n", - " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n", - " 2.00000000e+01]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t['flux']\n", - "\tEstimator =\ttracklength\n", - "), ('nu-fission', Tally\n", - "\tID =\t10001\n", - "\tName =\t\n", - "\tFilters =\t\n", - " \t\tcell\t[1]\n", - " \t\tenergy\t[ 0.00000000e+00 5.80000000e-08 1.40000000e-07 2.80000000e-07\n", - " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n", - " 2.00000000e+01]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t['nu-fission']\n", - "\tEstimator =\ttracklength\n", - ")])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nufission.tallies" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `NuFission` object includes tracklength tallies for the 'nu-fission' and 'flux' scores in the 8-group structure in cell 1. Now that each multi-group cross section object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate an empty TalliesFile\n", - "tallies_file = openmc.TalliesFile()\n", - "\n", - "# Add transport tallies to the tallies file\n", - "for tally in transport.tallies.values():\n", - " tallies_file.add_tally(tally, merge=True)\n", - "\n", - "# Add nu-fission tallies to the tallies file\n", - "for tally in nufission.tallies.values():\n", - " tallies_file.add_tally(tally, merge=True)\n", - "\n", - "# Add nu-scatter tallies to the tallies file\n", - "for tally in nuscatter.tallies.values():\n", - " tallies_file.add_tally(tally, merge=True)\n", - "\n", - "# Add chi tallies to the tallies file \n", - "for tally in chi.tallies.values():\n", - " tallies_file.add_tally(tally, merge=True)\n", - " \n", - "# Export to \"tallies.xml\"\n", - "tallies_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we a have a complete set of inputs, so we can go ahead and run our simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - " .d88888b. 888b d888 .d8888b.\n", - " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", - " 888 888 88888b.d88888 888 888\n", - " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", - " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", - " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", - " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", - " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", - "__________________888______________________________________________________\n", - " 888\n", - " 888\n", - "\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: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-11-01 21:28:30\n", - " MPI Processes: 1\n", - "\n", - " ===========================================================================\n", - " ========================> INITIALIZATION <=========================\n", - " ===========================================================================\n", - "\n", - " Reading settings XML file...\n", - " Reading cross sections XML file...\n", - " Reading geometry XML file...\n", - " Reading materials XML file...\n", - " Reading tallies XML file...\n", - " Building neighboring cells lists for each surface...\n", - " Loading ACE cross section table: 1001.71c\n", - " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 92235.71c\n", - " Loading ACE cross section table: 92238.71c\n", - " Loading ACE cross section table: 40090.71c\n", - " Maximum neutron transport energy: 20.0000 MeV for 1001.71c\n", - " Initializing source particles...\n", - "\n", - " ===========================================================================\n", - " ====================> K EIGENVALUE SIMULATION <====================\n", - " ===========================================================================\n", - "\n", - " Bat./Gen. k Average k \n", - " ========= ======== ==================== \n", - " 1/1 1.19804 \n", - " 2/1 1.12945 \n", - " 3/1 1.15573 \n", - " 4/1 1.13929 \n", - " 5/1 1.16300 \n", - " 6/1 1.22117 \n", - " 7/1 1.19012 \n", - " 8/1 1.11299 \n", - " 9/1 1.16066 \n", - " 10/1 1.12566 \n", - " 11/1 1.20854 \n", - " 12/1 1.14691 1.17773 +/- 0.03082\n", - " 13/1 1.17204 1.17583 +/- 0.01789\n", - " 14/1 1.14148 1.16724 +/- 0.01529\n", - " 15/1 1.17272 1.16834 +/- 0.01189\n", - " 16/1 1.18575 1.17124 +/- 0.01014\n", - " 17/1 1.20498 1.17606 +/- 0.00983\n", - " 18/1 1.14754 1.17249 +/- 0.00923\n", - " 19/1 1.18141 1.17348 +/- 0.00820\n", - " 20/1 1.15074 1.17121 +/- 0.00768\n", - " 21/1 1.15914 1.17011 +/- 0.00703\n", - " 22/1 1.14586 1.16809 +/- 0.00673\n", - " 23/1 1.18999 1.16978 +/- 0.00642\n", - " 24/1 1.15101 1.16844 +/- 0.00609\n", - " 25/1 1.13791 1.16640 +/- 0.00602\n", - " 26/1 1.19791 1.16837 +/- 0.00597\n", - " 27/1 1.19818 1.17012 +/- 0.00587\n", - " 28/1 1.14160 1.16854 +/- 0.00576\n", - " 29/1 1.11487 1.16571 +/- 0.00614\n", - " 30/1 1.17538 1.16620 +/- 0.00584\n", - " 31/1 1.20210 1.16791 +/- 0.00581\n", - " 32/1 1.20078 1.16940 +/- 0.00574\n", - " 33/1 1.14624 1.16839 +/- 0.00558\n", - " 34/1 1.14618 1.16747 +/- 0.00542\n", - " 35/1 1.16866 1.16752 +/- 0.00520\n", - " 36/1 1.18565 1.16821 +/- 0.00504\n", - " 37/1 1.16824 1.16821 +/- 0.00485\n", - " 38/1 1.18299 1.16874 +/- 0.00471\n", - " 39/1 1.21418 1.17031 +/- 0.00480\n", - " 40/1 1.11167 1.16835 +/- 0.00504\n", - " 41/1 1.11545 1.16665 +/- 0.00516\n", - " 42/1 1.11114 1.16491 +/- 0.00529\n", - " 43/1 1.14227 1.16423 +/- 0.00517\n", - " 44/1 1.14104 1.16355 +/- 0.00506\n", - " 45/1 1.16756 1.16366 +/- 0.00492\n", - " 46/1 1.13065 1.16274 +/- 0.00487\n", - " 47/1 1.11251 1.16139 +/- 0.00492\n", - " 48/1 1.14731 1.16101 +/- 0.00481\n", - " 49/1 1.16691 1.16117 +/- 0.00469\n", - " 50/1 1.19679 1.16206 +/- 0.00465\n", - " Creating state point statepoint.50.h5...\n", - "\n", - " ===========================================================================\n", - " ======================> SIMULATION FINISHED <======================\n", - " ===========================================================================\n", - "\n", - "\n", - " =======================> TIMING STATISTICS <=======================\n", - "\n", - " Total time for initialization = 1.9120E+00 seconds\n", - " Reading cross sections = 4.8600E-01 seconds\n", - " Total time in simulation = 6.1145E+01 seconds\n", - " Time in transport only = 6.0977E+01 seconds\n", - " Time in inactive batches = 8.1390E+00 seconds\n", - " Time in active batches = 5.3006E+01 seconds\n", - " Time synchronizing fission bank = 1.6000E-02 seconds\n", - " Sampling source sites = 1.2000E-02 seconds\n", - " SEND/RECV source sites = 3.0000E-03 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", - " Total time for finalization = 1.0000E-02 seconds\n", - " Total time elapsed = 6.3104E+01 seconds\n", - " Calculation Rate (inactive) = 3071.63 neutrons/second\n", - " Calculation Rate (active) = 1886.58 neutrons/second\n", - "\n", - " ============================> RESULTS <============================\n", - "\n", - " k-effective (Collision) = 1.16131 +/- 0.00453\n", - " k-effective (Track-length) = 1.16206 +/- 0.00465\n", - " k-effective (Absorption) = 1.16096 +/- 0.00364\n", - " Combined k-effective = 1.16120 +/- 0.00325\n", - " Leakage Fraction = 0.00000 +/- 0.00000\n", - "\n" - ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Run OpenMC!\n", - "executor = openmc.Executor()\n", - "executor.run_simulation()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Tally Data Processing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and 'reading' the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Load the last statepoint file\n", - "sp = openmc.StatePoint('statepoint.50.h5')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Load the summary file and link it with the statepoint\n", - "su = openmc.Summary('summary.h5')\n", - "sp.link_with_summary(su)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the statepoint into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1514: RuntimeWarning: invalid value encountered in true_divide\n" - ] - } - ], - "source": [ - "# Load the tallies from the statepoint into each MGXS object\n", - "transport.load_from_statepoint(sp)\n", - "nufission.load_from_statepoint(sp)\n", - "nuscatter.load_from_statepoint(sp)\n", - "chi.load_from_statepoint(sp)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Voila! Our multi-group cross sections are now ready to rock 'n roll!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Cross Section Data Visualization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's first inspect our fission production cross section by printing it to the screen." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\tnu-fission\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t1\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t1.11e-02 +/- 7.69e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t6.59e-04 +/- 2.97e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t8.95e-03 +/- 5.12e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t1.45e-02 +/- 7.10e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t4.71e-02 +/- 1.02e+00%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t7.29e-02 +/- 8.86e-01%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t1.11e-01 +/- 6.67e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t2.38e-01 +/- 7.71e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "nufission.print_xs()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since the `openmc.mgxs` module uses tally arithmetic under-the-hood, the cross section is stored as a \"derived\" tally. This means that it can be queried and manipulated using all of the same method supported for the `Tally` class in the OpenMC Python API. For example, we can construct a Pandas DataFrame of the multi-group cross section data." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1264: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup ingroup outnuclidemeanstd. dev.
63111total0.0769700.001012
62112total0.0878760.000344
61113total0.0004180.000023
60114total0.0000000.000000
59115total0.0000000.000000
58116total0.0000000.000000
57117total0.0000000.000000
56118total0.0000000.000000
55121total0.0000000.000000
54122total0.2664990.001265
\n", - "
" - ], - "text/plain": [ - " cell group in group out nuclide mean std. dev.\n", - "63 1 1 1 total 0.076970 0.001012\n", - "62 1 1 2 total 0.087876 0.000344\n", - "61 1 1 3 total 0.000418 0.000023\n", - "60 1 1 4 total 0.000000 0.000000\n", - "59 1 1 5 total 0.000000 0.000000\n", - "58 1 1 6 total 0.000000 0.000000\n", - "57 1 1 7 total 0.000000 0.000000\n", - "56 1 1 8 total 0.000000 0.000000\n", - "55 1 2 1 total 0.000000 0.000000\n", - "54 1 2 2 total 0.266499 0.001265" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = nuscatter.get_pandas_dataframe()\n", - "df.head(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each multi-group cross section object can be easily exported to a variety of file formats, including CSV, Excel, and LaTeX for storage or data processing." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "transport.export_xs_data(filename='transport-xs', format='excel')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following code snippet shows how to export all of four cross sections to the same HDF5 binary data store." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "transport.build_hdf5_store(filename='mgxs', append=True)\n", - "nufission.build_hdf5_store(filename='mgxs', append=True)\n", - "nuscatter.build_hdf5_store(filename='mgxs', append=True)\n", - "chi.build_hdf5_store(filename='mgxs', append=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Verification with OpenMOC" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Of course it is always a good idea to verify that one's cross sections are accurate. We can easily do so here with the deterministic transport code OpenMOC. We will extract an OpenCG geometry from the summary file and convert it into an equivalent OpenMOC geometry." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create an OpenMOC Geometry from the OpenCG Geometry\n", - "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, we can inject the multi-group cross sections into the equivalent infinite homogeneous medium OpenMOC geometry." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Get all OpenMOC cells in the gometry\n", - "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", - "\n", - "# Inject multi-group cross sections into OpenMOC Materials\n", - "for cell_id, cell in openmoc_cells.items():\n", - " \n", - " # Get a reference to the Material filling this Cell\n", - " openmoc_material = cell.getFillMaterial()\n", - " \n", - " # Set the number of energy groups for the Material\n", - " openmoc_material.setNumEnergyGroups(fine_groups.num_groups)\n", - " \n", - " # Inject NumPy arrays of cross section data into the Material\n", - " openmoc_material.setSigmaT(transport.get_xs().flatten())\n", - " openmoc_material.setNuSigmaF(nufission.get_xs().flatten())\n", - " openmoc_material.setSigmaS(nuscatter.get_xs().flatten())\n", - " openmoc_material.setChi(chi.get_xs().flatten())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We are now ready to run OpenMOC to verify our cross-sections from OpenMC." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ NORMAL ] Ray tracing for track segmentation...\n", - "[ NORMAL ] Dumping tracks to file...\n", - "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.685184\tres = 1.483E-316\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.785642\tres = 3.148E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.750185\tres = 1.466E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.728846\tres = 4.513E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.695632\tres = 2.844E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.663357\tres = 4.557E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.632339\tres = 4.640E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.604187\tres = 4.676E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.579451\tres = 4.452E-02\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.558474\tres = 4.094E-02\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.541436\tres = 3.620E-02\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.528380\tres = 3.051E-02\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.519273\tres = 2.411E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.513991\tres = 1.724E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.512364\tres = 1.017E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.514171\tres = 3.165E-03\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.519155\tres = 3.527E-03\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.527038\tres = 9.693E-03\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.537524\tres = 1.518E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.550310\tres = 1.990E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.565096\tres = 2.379E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.581585\tres = 2.687E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.599493\tres = 2.918E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.618548\tres = 3.079E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.638497\tres = 3.179E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.659105\tres = 3.225E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.680156\tres = 3.228E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.701457\tres = 3.194E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.722832\tres = 3.132E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.744127\tres = 3.047E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.765209\tres = 2.946E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.785961\tres = 2.833E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.806283\tres = 2.712E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.826093\tres = 2.586E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.845324\tres = 2.457E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.863921\tres = 2.328E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.881841\tres = 2.200E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.899055\tres = 2.074E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.915540\tres = 1.952E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.931284\tres = 1.834E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.946283\tres = 1.720E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.960536\tres = 1.610E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.974052\tres = 1.506E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.986841\tres = 1.407E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.998920\tres = 1.313E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 1.010307\tres = 1.224E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 1.021023\tres = 1.140E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 1.031091\tres = 1.061E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 1.040537\tres = 9.861E-03\n", - "[ NORMAL ] Iteration 49:\tk_eff = 1.049386\tres = 9.161E-03\n", - "[ NORMAL ] Iteration 50:\tk_eff = 1.057664\tres = 8.504E-03\n", - "[ NORMAL ] Iteration 51:\tk_eff = 1.065399\tres = 7.889E-03\n", - "[ NORMAL ] Iteration 52:\tk_eff = 1.072617\tres = 7.313E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 1.079345\tres = 6.775E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 1.085610\tres = 6.273E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.091437\tres = 5.804E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.096851\tres = 5.367E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.101878\tres = 4.961E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.106540\tres = 4.583E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.110861\tres = 4.231E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.114862\tres = 3.905E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.118564\tres = 3.602E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.121987\tres = 3.321E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.125150\tres = 3.060E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.128070\tres = 2.819E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.130764\tres = 2.595E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.133249\tres = 2.389E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.135539\tres = 2.197E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.137649\tres = 2.021E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.139591\tres = 1.858E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.141378\tres = 1.707E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.143021\tres = 1.568E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.144532\tres = 1.440E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.145920\tres = 1.322E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.147196\tres = 1.213E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.148366\tres = 1.113E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.149440\tres = 1.020E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.150426\tres = 9.355E-04\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.151330\tres = 8.574E-04\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.152158\tres = 7.856E-04\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.152918\tres = 7.196E-04\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.153613\tres = 6.590E-04\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.154250\tres = 6.033E-04\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.154833\tres = 5.522E-04\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.155367\tres = 5.053E-04\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.155856\tres = 4.623E-04\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.156303\tres = 4.228E-04\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.156711\tres = 3.866E-04\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.157085\tres = 3.535E-04\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.157427\tres = 3.231E-04\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.157739\tres = 2.952E-04\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.158024\tres = 2.697E-04\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.158285\tres = 2.464E-04\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.158523\tres = 2.251E-04\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.158740\tres = 2.055E-04\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.158939\tres = 1.876E-04\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.159120\tres = 1.713E-04\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.159285\tres = 1.563E-04\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.159436\tres = 1.427E-04\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.159574\tres = 1.302E-04\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.159699\tres = 1.188E-04\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.159814\tres = 1.083E-04\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.159918\tres = 9.880E-05\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.160014\tres = 9.009E-05\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.160101\tres = 8.215E-05\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.160180\tres = 7.490E-05\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.160252\tres = 6.827E-05\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.160318\tres = 6.223E-05\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.160378\tres = 5.672E-05\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.160432\tres = 5.169E-05\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.160482\tres = 4.710E-05\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.160528\tres = 4.291E-05\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.160569\tres = 3.909E-05\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.160607\tres = 3.561E-05\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.160641\tres = 3.244E-05\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.160672\tres = 2.954E-05\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.160700\tres = 2.691E-05\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.160726\tres = 2.450E-05\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.160750\tres = 2.231E-05\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.160771\tres = 2.031E-05\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.160791\tres = 1.849E-05\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.160809\tres = 1.684E-05\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.160825\tres = 1.533E-05\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.160840\tres = 1.395E-05\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.160853\tres = 1.270E-05\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.160865\tres = 1.156E-05\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.160876\tres = 1.052E-05\n" - ] - } - ], - "source": [ - "# Generate tracks for OpenMOC\n", - "openmoc_geometry.initializeFlatSourceRegions()\n", - "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", - "track_generator.generateTracks()\n", - "\n", - "# Run OpenMOC\n", - "solver = openmoc.CPUSolver(track_generator)\n", - "solver.computeEigenvalue()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We report the eigenvalues computed by OpenMC and OpenMOC here together to summarize our results." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "openmc keff = 1.161200\n", - "openmoc keff = 1.160876\n", - "bias [pcm]: -32.4\n" - ] - } - ], - "source": [ - "# Print report of keff and bias with OpenMC\n", - "openmoc_keff = solver.getKeff()\n", - "openmc_keff = sp.k_combined[0]\n", - "bias = (openmoc_keff - openmc_keff) * 1e5\n", - "\n", - "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", - "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", - "print('bias [pcm]: {0:1.1f}'.format(bias))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Although there is a non-trivial bias, one can easily run the preceding code with more particle histories to show that both codes converge to the same eigenvalue with <10 pcm bias. It should be noted that this discrepancy is due to use of tracklength tallies for `NuFission`, while one must use more slowly converging analog tallies for `TransportXS`, `NuScatterMatrixXS` and `Chi` (which require an 'energyout' filter)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Fuel Pin Cell" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this section we show how to compute multi-group cross sections for a fuel pin cell. In addition, we will illustrate how to use some of the more advanced features in `openmc.mgxs` such as nuclide-by-nuclide microscopic cross section tallies and downstream energy group condensation." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generate Inputs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "this time we separate our nuclides into three distinct materials for water, clad and fuel." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# 1.6 enriched fuel\n", - "fuel = openmc.Material(name='1.6% Fuel')\n", - "fuel.set_density('g/cm3', 10.31341)\n", - "fuel.add_nuclide(u235, 3.7503e-4)\n", - "fuel.add_nuclide(u238, 2.2625e-2)\n", - "fuel.add_nuclide(o16, 4.6007e-2)\n", - "\n", - "# borated water\n", - "water = openmc.Material(name='Borated Water')\n", - "water.set_density('g/cm3', 0.740582)\n", - "water.add_nuclide(h1, 4.9457e-2)\n", - "water.add_nuclide(o16, 2.4732e-2)\n", - "\n", - "# zircaloy\n", - "zircaloy = openmc.Material(name='Zircaloy')\n", - "zircaloy.set_density('g/cm3', 6.55)\n", - "zircaloy.add_nuclide(zr90, 7.2758e-3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With our materials, we can now create a materials file object that can be exported to an actual XML file." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a MaterialsFile, add Materials\n", - "materials_file = openmc.MaterialsFile()\n", - "materials_file.add_material(fuel)\n", - "materials_file.add_material(water)\n", - "materials_file.add_material(zircaloy)\n", - "materials_file.default_xs = '71c'\n", - "\n", - "# Export to \"materials.xml\"\n", - "materials_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's move on to the geometry. Our problem will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces -- in this case two cylinders and six reflective planes." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create cylinders for the fuel and clad\n", - "fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218)\n", - "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n", - "\n", - "# Create boundary planes to surround the geometry\n", - "# Use both reflective and vacuum boundaries to make life interesting\n", - "min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective')\n", - "max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective')\n", - "min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective')\n", - "max_y = openmc.YPlane(y0=+0.63, boundary_type='reflective')\n", - "min_z = openmc.ZPlane(z0=-0.63, boundary_type='reflective')\n", - "max_z = openmc.ZPlane(z0=+0.63, boundary_type='reflective')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the surfaces defined, we can now create cells that are defined by intersections of half-spaces created by the surfaces." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create a Universe to encapsulate a fuel pin\n", - "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", - "\n", - "# Create fuel Cell\n", - "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", - "fuel_cell.fill = fuel\n", - "fuel_cell.region = -fuel_outer_radius\n", - "pin_cell_universe.add_cell(fuel_cell)\n", - "\n", - "# Create a clad Cell\n", - "clad_cell = openmc.Cell(name='1.6% Clad')\n", - "clad_cell.fill = zircaloy\n", - "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", - "pin_cell_universe.add_cell(clad_cell)\n", - "\n", - "# Create a moderator Cell\n", - "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", - "moderator_cell.fill = water\n", - "moderator_cell.region = +clad_outer_radius\n", - "pin_cell_universe.add_cell(moderator_cell)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "OpenMC requires that there is a \"root\" universe. Let us create a root cell that is filled by the pin cell universe and then assign it to the root universe." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create root Cell\n", - "root_cell = openmc.Cell(name='root cell')\n", - "root_cell.region = +min_x & -max_x & +min_y & -max_y\n", - "root_cell.fill = pin_cell_universe\n", - "\n", - "# Create root Universe\n", - "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", - "root_universe.add_cell(root_cell)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create Geometry and set root Universe\n", - "openmc_geometry = openmc.Geometry()\n", - "openmc_geometry.root_universe = root_universe\n", - "\n", - "# Instantiate a GeometryFile\n", - "geometry_file = openmc.GeometryFile()\n", - "geometry_file.geometry = openmc_geometry\n", - "\n", - "# Export to \"geometry.xml\"\n", - "geometry_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will reuse our settings from the previous simulation. Now, we let's create transport, nu-fission, nu-scatter and chi multi-group cross sections for each cell." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Extract all Cells filled by Materials\n", - "openmc_cells = openmc_geometry.get_all_material_cells()\n", - "\n", - "# Create dictionary to store multi-group cross sections for all cells\n", - "xs_library = {}\n", - "\n", - "# Instantiate 8-group cross sections for each cell\n", - "for cell in openmc_cells:\n", - " xs_library[cell.id] = {}\n", - " xs_library[cell.id]['transport'] = mgxs.TransportXS(groups=fine_groups)\n", - " xs_library[cell.id]['nu-fission'] = mgxs.NuFissionXS(groups=fine_groups)\n", - " xs_library[cell.id]['nu-scatter'] = mgxs.NuScatterMatrixXS(groups=fine_groups)\n", - " xs_library[cell.id]['chi'] = mgxs.Chi(groups=fine_groups)" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create a tally trigger set to +/- 0.01 for each tally\n", - "# used to compute the multi-group cross sections\n", - "tally_trigger = openmc.Trigger('std_dev', 1E-2)\n", - "\n", - "# Add the tally trigger to each of the multi-group cross section tallies\n", - "for cell in openmc_cells:\n", - " for mgxs_type in xs_library[cell.id]:\n", - " xs_library[cell.id][mgxs_type].tally_trigger = tally_trigger\n", - " \n", - "# Set the trigger to active in the \"settings.xml\" file\n", - "settings_file.trigger_active = True\n", - "settings_file.particles *= 4\n", - "settings_file.trigger_max_batches = settings_file.batches * 4\n", - "settings_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this case, we did not give our cross sections a spatial domain in their constructors. Instead, we will loop over all cells to set each cross sections domain. In addition, we will set each cross section to tally cross sections on a per-nuclide basis through the use of the `by_nuclide` instance attribute. " - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate an empty TalliesFile\n", - "tallies_file = openmc.TalliesFile()\n", - "\n", - "# Iterate over all cells and cross section types\n", - "for cell in openmc_cells:\n", - " for rxn_type in xs_library[cell.id]:\n", - "\n", - " # Set the cross sections domain type to the cell\n", - " xs_library[cell.id][rxn_type].domain = cell\n", - " xs_library[cell.id][rxn_type].domain_type = 'cell'\n", - " \n", - " # Tally cross sections by nuclide (e.g., micro cross sections)\n", - " xs_library[cell.id][rxn_type].by_nuclide = True\n", - " \n", - " # Add OpenMC tallies to the tallies file for XML generation\n", - " for tally in xs_library[cell.id][rxn_type].tallies.values():\n", - " tallies_file.add_tally(tally, merge=True)\n", - "\n", - "# Export to \"tallies.xml\"\n", - "tallies_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we a have a complete set of inputs, so we can go ahead and run our simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - " .d88888b. 888b d888 .d8888b.\n", - " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", - " 888 888 88888b.d88888 888 888\n", - " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", - " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", - " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", - " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", - " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", - "__________________888______________________________________________________\n", - " 888\n", - " 888\n", - "\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: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-11-01 21:29:37\n", - " MPI Processes: 1\n", - "\n", - " ===========================================================================\n", - " ========================> INITIALIZATION <=========================\n", - " ===========================================================================\n", - "\n", - " Reading settings XML file...\n", - " Reading cross sections XML file...\n", - " Reading geometry XML file...\n", - " Reading materials XML file...\n", - " Reading tallies XML file...\n", - " Building neighboring cells lists for each surface...\n", - " Loading ACE cross section table: 92235.71c\n", - " Loading ACE cross section table: 92238.71c\n", - " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 1001.71c\n", - " Loading ACE cross section table: 40090.71c\n", - " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", - " Initializing source particles...\n", - "\n", - " ===========================================================================\n", - " ====================> K EIGENVALUE SIMULATION <====================\n", - " ===========================================================================\n", - "\n", - " Bat./Gen. k Average k \n", - " ========= ======== ==================== \n", - " 1/1 1.23985 \n", - " 2/1 1.24082 \n", - " 3/1 1.22031 \n", - " 4/1 1.21649 \n", - " 5/1 1.23229 \n", - " 6/1 1.21957 \n", - " 7/1 1.22515 \n", - " 8/1 1.21309 \n", - " 9/1 1.23939 \n", - " 10/1 1.23865 \n", - " 11/1 1.22776 \n", - " 12/1 1.21661 1.22219 +/- 0.00558\n", - " 13/1 1.22202 1.22213 +/- 0.00322\n", - " 14/1 1.23251 1.22473 +/- 0.00345\n", - " 15/1 1.23965 1.22771 +/- 0.00401\n", - " 16/1 1.21441 1.22549 +/- 0.00395\n", - " 17/1 1.23348 1.22663 +/- 0.00353\n", - " 18/1 1.21121 1.22471 +/- 0.00361\n", - " 19/1 1.20506 1.22252 +/- 0.00386\n", - " 20/1 1.22275 1.22255 +/- 0.00346\n", - " 21/1 1.21700 1.22204 +/- 0.00317\n", - " 22/1 1.20841 1.22091 +/- 0.00311\n", - " 23/1 1.21302 1.22030 +/- 0.00292\n", - " 24/1 1.22504 1.22064 +/- 0.00272\n", - " 25/1 1.22325 1.22081 +/- 0.00254\n", - " 26/1 1.22988 1.22138 +/- 0.00244\n", - " 27/1 1.21374 1.22093 +/- 0.00234\n", - " 28/1 1.21434 1.22056 +/- 0.00224\n", - " 29/1 1.24678 1.22194 +/- 0.00253\n", - " 30/1 1.22600 1.22215 +/- 0.00240\n", - " 31/1 1.22783 1.22242 +/- 0.00230\n", - " 32/1 1.23107 1.22281 +/- 0.00223\n", - " 33/1 1.23041 1.22314 +/- 0.00216\n", - " 34/1 1.21147 1.22266 +/- 0.00212\n", - " 35/1 1.23184 1.22302 +/- 0.00207\n", - " 36/1 1.22513 1.22310 +/- 0.00199\n", - " 37/1 1.22969 1.22335 +/- 0.00193\n", - " 38/1 1.21288 1.22297 +/- 0.00190\n", - " 39/1 1.23967 1.22355 +/- 0.00192\n", - " 40/1 1.21419 1.22324 +/- 0.00188\n", - " 41/1 1.23212 1.22352 +/- 0.00184\n", - " 42/1 1.20703 1.22301 +/- 0.00185\n", - " 43/1 1.24153 1.22357 +/- 0.00188\n", - " 44/1 1.23561 1.22392 +/- 0.00186\n", - " 45/1 1.20369 1.22335 +/- 0.00190\n", - " 46/1 1.24517 1.22395 +/- 0.00194\n", - " 47/1 1.22985 1.22411 +/- 0.00189\n", - " 48/1 1.23570 1.22442 +/- 0.00187\n", - " 49/1 1.22288 1.22438 +/- 0.00182\n", - " 50/1 1.20470 1.22389 +/- 0.00184\n", - " Triggers unsatisfied, max unc./thresh. is 1.18932 for flux in tally 10080\n", - " The estimated number of batches is 67\n", - " Creating state point statepoint.050.h5...\n", - " 51/1 1.24158 1.22432 +/- 0.00185\n", - " 52/1 1.24407 1.22479 +/- 0.00186\n", - " 53/1 1.23412 1.22500 +/- 0.00183\n", - " 54/1 1.25172 1.22561 +/- 0.00189\n", - " 55/1 1.22653 1.22563 +/- 0.00185\n", - " 56/1 1.24741 1.22610 +/- 0.00187\n", - " 57/1 1.24342 1.22647 +/- 0.00186\n", - " 58/1 1.20365 1.22600 +/- 0.00189\n", - " 59/1 1.23576 1.22620 +/- 0.00186\n", - " 60/1 1.21398 1.22595 +/- 0.00184\n", - " 61/1 1.22186 1.22587 +/- 0.00180\n", - " 62/1 1.23502 1.22605 +/- 0.00178\n", - " 63/1 1.23328 1.22618 +/- 0.00175\n", - " 64/1 1.23990 1.22644 +/- 0.00173\n", - " 65/1 1.23283 1.22655 +/- 0.00171\n", - " 66/1 1.21605 1.22637 +/- 0.00169\n", - " 67/1 1.22322 1.22631 +/- 0.00166\n", - " Triggers satisfied for batch 67\n", - " Creating state point statepoint.067.h5...\n", - "\n", - " ===========================================================================\n", - " ======================> SIMULATION FINISHED <======================\n", - " ===========================================================================\n", - "\n", - "\n", - " =======================> TIMING STATISTICS <=======================\n", - "\n", - " Total time for initialization = 2.0080E+00 seconds\n", - " Reading cross sections = 4.3400E-01 seconds\n", - " Total time in simulation = 9.0060E+02 seconds\n", - " Time in transport only = 9.0020E+02 seconds\n", - " Time in inactive batches = 7.3259E+01 seconds\n", - " Time in active batches = 8.2734E+02 seconds\n", - " Time synchronizing fission bank = 6.9000E-02 seconds\n", - " Sampling source sites = 4.7000E-02 seconds\n", - " SEND/RECV source sites = 2.2000E-02 seconds\n", - " Time accumulating tallies = 5.0000E-03 seconds\n", - " Total time for finalization = 7.7000E-02 seconds\n", - " Total time elapsed = 9.0285E+02 seconds\n", - " Calculation Rate (inactive) = 1365.02 neutrons/second\n", - " Calculation Rate (active) = 483.479 neutrons/second\n", - "\n", - " ============================> RESULTS <============================\n", - "\n", - " k-effective (Collision) = 1.22548 +/- 0.00143\n", - " k-effective (Track-length) = 1.22631 +/- 0.00166\n", - " k-effective (Absorption) = 1.22204 +/- 0.00138\n", - " Combined k-effective = 1.22386 +/- 0.00114\n", - " Leakage Fraction = 0.00000 +/- 0.00000\n", - "\n" - ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Delete old HDF5 files\n", - "!rm *.h5\n", - "\n", - "# Run OpenMC with the output throttled!\n", - "executor = openmc.Executor()\n", - "executor.run_simulation(output=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Tally Data Processing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our simulation ran successfully and created a statepoint file with all the tally data in it. As before, we begin our analysis here loading the statepoint file." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Load the last statepoint and summary files\n", - "sp = openmc.StatePoint('statepoint.067.h5')\n", - "su = openmc.Summary('summary.h5')\n", - "sp.link_with_summary(su)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The statepoint is now ready to be analyzed by our multi-group cross sections. Next, we load the tallies from the statepoint into each object and to compute the cross sections using tally arithmetic." - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Iterate over all cells and cross section types\n", - "for cell in openmc_cells:\n", - " for rxn_type in xs_library[cell.id]:\n", - " xs_library[cell.id][rxn_type].load_from_statepoint(sp)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That's it! Our multi-group cross sections are now ready for the big spotlight. This time we have cross sections in three distinct spatial zones - fuel, clad and moderator - on a per-nuclide basis." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Cross Section Data Visualization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's first inspect one of our cross sections by printing it to the screen as a microscopic cross section in units of barns." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\tnu-fission\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t10000\n", - "\tNuclide =\tU-235\n", - "\tCross Sections [barns]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t3.31e+00 +/- 2.13e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t3.96e+00 +/- 1.54e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t5.51e+01 +/- 2.36e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t8.83e+01 +/- 3.76e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t2.89e+02 +/- 4.10e-01%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t4.49e+02 +/- 4.94e-01%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.87e+02 +/- 3.44e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 2.37e-01%\n", - "\n", - "\tNuclide =\tU-238\n", - "\tCross Sections [barns]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t1.06e+00 +/- 2.47e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t1.21e-03 +/- 3.07e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t5.72e-04 +/- 3.47e+00%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t6.54e-06 +/- 3.29e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.07e-05 +/- 4.20e-01%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.55e-05 +/- 4.94e-01%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.30e-05 +/- 3.44e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t4.24e-05 +/- 2.37e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "nufission = xs_library[fuel_cell.id]['nu-fission']\n", - "nufission.print_xs(xs_type='micro', nuclides=['U-235', 'U-238'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our multi-group cross sections are capable of summing across all nuclides to provide us with macroscopic cross sections as well." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\tnu-fission\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t10000\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t2.53e-02 +/- 2.35e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t1.51e-03 +/- 1.51e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t2.07e-02 +/- 2.36e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t3.31e-02 +/- 3.76e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.09e-01 +/- 4.10e-01%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.69e-01 +/- 4.94e-01%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.58e-01 +/- 3.44e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t5.40e-01 +/- 2.37e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "nufission = xs_library[fuel_cell.id]['nu-fission']\n", - "nufission.print_xs(xs_type='macro', nuclides='sum')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Although a printed report is nice, it is not scalable or flexible. Let's extract the cross section data for the moderator as a Pandas DataFrame." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup ingroup outnuclidemeanstd. dev.
1261000211H-10.2338960.004410
1271000211O-161.5644880.007478
1241000212H-11.5899750.003196
1251000212O-160.2836970.001986
1221000213H-10.0108460.000225
1231000213O-160.0000000.000000
1201000214H-10.0000000.000000
1211000214O-160.0000000.000000
1181000215H-10.0000000.000000
1191000215O-160.0000000.000000
\n", - "
" - ], - "text/plain": [ - " cell group in group out nuclide mean std. dev.\n", - "126 10002 1 1 H-1 0.233896 0.004410\n", - "127 10002 1 1 O-16 1.564488 0.007478\n", - "124 10002 1 2 H-1 1.589975 0.003196\n", - "125 10002 1 2 O-16 0.283697 0.001986\n", - "122 10002 1 3 H-1 0.010846 0.000225\n", - "123 10002 1 3 O-16 0.000000 0.000000\n", - "120 10002 1 4 H-1 0.000000 0.000000\n", - "121 10002 1 4 O-16 0.000000 0.000000\n", - "118 10002 1 5 H-1 0.000000 0.000000\n", - "119 10002 1 5 O-16 0.000000 0.000000" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nuscatter = xs_library[moderator_cell.id]['nu-scatter']\n", - "df = nuscatter.get_pandas_dataframe(xs_type='micro')\n", - "df.head(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can easily use the Pandas DataFrame to extract the H-1 and O-16 scattering matrices separately." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Slice DataFrame in two for each nuclide's mean values\n", - "h1 = df[df['nuclide'] == 'H-1']['mean']\n", - "o16 = df[df['nuclide'] == 'O-16']['mean']\n", - "\n", - "# Cast DataFrames as NumPy arrays\n", - "h1 = h1.as_matrix()\n", - "o16 = o16.as_matrix()\n", - "\n", - "# Reshape arrays to 2D matrix for plotting\n", - "h1.shape = (fine_groups.num_groups, fine_groups.num_groups)\n", - "o16.shape = (fine_groups.num_groups, fine_groups.num_groups)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Matplotlib's `imshow` routine can be used to plot the matrices to illustrate their sparsity structures." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\nAAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Create plot of the H-1 scattering matrix\n", - "fig = plt.subplot(121)\n", - "fig.imshow(h1, interpolation='nearest')\n", - "plt.title('H-1 Scattering Matrix')\n", - "\n", - "# Create plot of the O-16 scattering matrix\n", - "fig2 = plt.subplot(122)\n", - "fig2.imshow(o16, interpolation='nearest')\n", - "plt.title('O-16 Scattering Matrix')\n", - "\n", - "# Show the plot on screen\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we illustate how one can easily take multi-group cross sections and condense them down to a coarser energy group structure using. The `get_condensed_xs(...)` class method takes in as a parameter an `EnergyGroups` object with a coarse(r) group structure and returns a new multi-group cross section condensed to the coarse groups. We illustrate this process below using the 2-group structure created earlier." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Extract the 16-group transport cross section for the fuel\n", - "fine_xs = xs_library[fuel_cell.id]['transport']\n", - "\n", - "# Condense to the 2-group structure\n", - "condense_xs = fine_xs.get_condensed_xs(coarse_groups)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Group condensation is as simple as that! We now have a new coarse 2-group cross section in addition to our original 16-group cross section. Let's inspect the 2-group cross section by printing it to the screen and extracting a Pandas DataFrame as we have already learned how to do." - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\ttransport\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t10000\n", - "\tNuclide =\tU-235\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t7.81e-03 +/- 4.72e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 2.09e-01%\n", - "\n", - "\tNuclide =\tU-238\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t2.17e-01 +/- 1.58e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t2.54e-01 +/- 2.46e-01%\n", - "\n", - "\tNuclide =\tO-16\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 1.73e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.75e-01 +/- 2.64e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "condense_xs.print_xs()" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup innuclidemeanstd. dev.
3100001U-23520.8327040.098310
4100001U-2389.5744350.015117
5100001O-163.1619190.005466
0100002U-235484.1335131.011870
1100002U-23811.2151520.027565
2100002O-163.7988330.010031
\n", - "
" - ], - "text/plain": [ - " cell group in nuclide mean std. dev.\n", - "3 10000 1 U-235 20.832704 0.098310\n", - "4 10000 1 U-238 9.574435 0.015117\n", - "5 10000 1 O-16 3.161919 0.005466\n", - "0 10000 2 U-235 484.133513 1.011870\n", - "1 10000 2 U-238 11.215152 0.027565\n", - "2 10000 2 O-16 3.798833 0.010031" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = condense_xs.get_pandas_dataframe(xs_type='micro')\n", - "df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Verification with OpenMOC" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, let's verify our cross sections using OpenMOC. First, we use OpenCG construct an equivalent OpenMOC geometry just as we did before." - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create an OpenMOC Geometry from the OpenCG Geometry\n", - "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Likewise, we can inject the multi-group cross sections into the equivalent fuel pin cell OpenMOC geometry." - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Get all OpenMOC cells in the gometry\n", - "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", - "\n", - "# Inject multi-group cross sections into OpenMOC Materials\n", - "# NOTE: This code will work for 1, 10, or 1,000s of cells\n", - "# as is the case for a complicated geometry like BEAVRS\n", - "for cell_id, cell in openmoc_cells.items():\n", - " \n", - " # Ignore the root cell\n", - " if cell.getName() == 'root cell':\n", - " continue\n", - " \n", - " # Get a reference to the Material filling this Cell\n", - " openmoc_material = cell.getFillMaterial()\n", - " \n", - " # Set the number of energy groups for the Material\n", - " openmoc_material.setNumEnergyGroups(fine_groups.num_groups)\n", - " \n", - " # Extract the appropriate cross section objects for this cell\n", - " transport = xs_library[cell_id]['transport']\n", - " nufission = xs_library[cell_id]['nu-fission']\n", - " nuscatter = xs_library[cell_id]['nu-scatter']\n", - " chi = xs_library[cell_id]['chi']\n", - " \n", - " # Inject NumPy arrays of cross section data into the Material\n", - " # NOTE: In each case we must sum across nuclides to get the\n", - " # macroscopic cross sections needed by OpenMOC\n", - " openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten())\n", - " openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten())\n", - " openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten())\n", - " openmoc_material.setChi(chi.get_xs(nuclides='sum').flatten())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We are now ready to run OpenMOC to verify our cross-sections from OpenMC." - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Throttle OpenMOC output to screen\n", - "openmoc.log.set_log_level('WARNING')\n", - "\n", - "# Generate tracks for OpenMOC\n", - "openmoc_geometry.initializeFlatSourceRegions()\n", - "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", - "track_generator.generateTracks()\n", - "\n", - "# Run OpenMOC\n", - "solver = openmoc.CPUSolver(track_generator)\n", - "solver.computeEigenvalue()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We report the eigenvalues computed by OpenMC and OpenMOC here together to summarize our results." - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "openmc keff = 1.223863\n", - "openmoc keff = 1.222517\n", - "bias [pcm]: -134.7\n" - ] - } - ], - "source": [ - "# Print report of keff and bias with OpenMC\n", - "openmoc_keff = solver.getKeff()\n", - "openmc_keff = sp.k_combined[0]\n", - "bias = (openmoc_keff - openmc_keff) * 1e5\n", - "\n", - "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", - "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", - "print('bias [pcm]: {0:1.1f}'.format(bias))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As a sanity check, let's run a simulation with the coarse 2-group cross sections to ensure that they produce a reasonable result." - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)\n", - "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", - "\n", - "# Inject multi-group cross sections into OpenMOC Materials\n", - "for cell_id, cell in openmoc_cells.items():\n", - " \n", - " # Ignore the root cell\n", - " if cell.getName() == 'root cell':\n", - " continue\n", - " \n", - " openmoc_material = cell.getFillMaterial()\n", - " openmoc_material.setNumEnergyGroups(coarse_groups.num_groups)\n", - " \n", - " # Extract the appropriate cross section objects for this cell\n", - " transport = xs_library[cell_id]['transport']\n", - " nufission = xs_library[cell_id]['nu-fission']\n", - " nuscatter = xs_library[cell_id]['nu-scatter']\n", - " chi = xs_library[cell_id]['chi']\n", - " \n", - " # Perform group condensation\n", - " transport = transport.get_condensed_xs(coarse_groups)\n", - " nufission = nufission.get_condensed_xs(coarse_groups)\n", - " nuscatter = nuscatter.get_condensed_xs(coarse_groups)\n", - " chi = chi.get_condensed_xs(coarse_groups)\n", - " \n", - " # Inject NumPy arrays of cross section data into the Material\n", - " openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten())\n", - " openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten())\n", - " openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten())\n", - " openmoc_material.setChi(chi.get_xs(nuclides='sum').flatten())" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Generate tracks for OpenMOC\n", - "openmoc_geometry.initializeFlatSourceRegions()\n", - "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", - "track_generator.generateTracks()\n", - "\n", - "# Run OpenMOC\n", - "solver = openmoc.CPUSolver(track_generator)\n", - "solver.computeEigenvalue()" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "openmc keff = 1.223863\n", - "openmoc keff = 1.225691\n", - "bias [pcm]: 182.7\n" - ] - } - ], - "source": [ - "# Print report of keff and bias with OpenMC\n", - "openmoc_keff = solver.getKeff()\n", - "openmc_keff = sp.k_combined[0]\n", - "bias = (openmoc_keff - openmc_keff) * 1e5\n", - "\n", - "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", - "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", - "print('bias [pcm]: {0:1.1f}'.format(bias))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There is a non-trivial bias in both the 2-group and 8-group cases. In the case of the pin cell, one can show that these biases do not converge to <100 pcm with more particle histories. In the case of heterogeneous geometries, additional measures must be taken to address the following three sources of bias:\n", - "\n", - "* Appropriate transport-corrected cross sections\n", - "* Spatial discretization of OpenMOC's mesh\n", - "* Constant-in-angle multi-group cross sections" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index 1e4c3c9cd..763cdd9ef 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -126,7 +126,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now let's move on to the geometry. This problem will be a square array of fuel pins, which we can use OpenMC's lattice/universe feature for. The basic universe will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces for fuel and clad, as well as the outer bounding surfaces of the problem." + "Now let's move on to the geometry. This problem will be a square array of fuel pins and control rod guide tubes for which we can use OpenMC's lattice/universe feature. The basic universe will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces for fuel and clad, as well as the outer bounding surfaces of the problem." ] }, { @@ -155,7 +155,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "With the surfaces defined, we can now create cells that are defined by intersections of half-spaces created by the surfaces." + "With the surfaces defined, we can now construct a fuel pin cell from cells that are defined by intersections of half-spaces created by the surfaces." ] }, { diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index 87ae42b41..6e2dd9429 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -347,7 +347,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMjhUMjE6MDQ6NDItMDQ6MDCMRUoKAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTI4\nVDIxOjA0OjQyLTA0OjAw/RjytgAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTEtMjlUMTY6NDY6NTMtMDU6MDCSkLewAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTExLTI5\nVDE2OjQ2OjUzLTA1OjAw480PDAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -413,7 +413,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": { "collapsed": true }, @@ -432,7 +432,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": { "collapsed": false, "scrolled": true @@ -458,8 +458,8 @@ " 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: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-10-28 21:04:43\n", + " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", + " Date/Time: 2015-11-29 16:46:53\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -520,8 +520,116 @@ " 31/1 1.04883 1.04094 +/- 0.00388\n", " 32/1 1.03557 1.04070 +/- 0.00371\n", " 33/1 1.02947 1.04021 +/- 0.00358\n", - " 34/1 1.03651 1.04006 +/- 0.00343\n" + " 34/1 1.03651 1.04006 +/- 0.00343\n", + " 35/1 1.03331 1.03979 +/- 0.00330\n", + " 36/1 1.05947 1.04054 +/- 0.00326\n", + " 37/1 1.05093 1.04093 +/- 0.00316\n", + " 38/1 1.06787 1.04189 +/- 0.00319\n", + " 39/1 1.01451 1.04095 +/- 0.00322\n", + " 40/1 1.02351 1.04037 +/- 0.00317\n", + " 41/1 1.04826 1.04062 +/- 0.00307\n", + " 42/1 1.04228 1.04067 +/- 0.00298\n", + " 43/1 1.03214 1.04041 +/- 0.00290\n", + " 44/1 1.04950 1.04068 +/- 0.00282\n", + " 45/1 1.06616 1.04141 +/- 0.00284\n", + " 46/1 1.07039 1.04221 +/- 0.00287\n", + " 47/1 1.00292 1.04115 +/- 0.00299\n", + " 48/1 1.04477 1.04125 +/- 0.00291\n", + " 49/1 1.03360 1.04105 +/- 0.00284\n", + " 50/1 1.04783 1.04122 +/- 0.00277\n", + " 51/1 1.03985 1.04119 +/- 0.00271\n", + " 52/1 1.02507 1.04080 +/- 0.00267\n", + " 53/1 1.03477 1.04066 +/- 0.00261\n", + " 54/1 1.00412 1.03983 +/- 0.00268\n", + " 55/1 1.02239 1.03945 +/- 0.00265\n", + " 56/1 1.04308 1.03952 +/- 0.00259\n", + " 57/1 1.05534 1.03986 +/- 0.00256\n", + " 58/1 1.06667 1.04042 +/- 0.00257\n", + " 59/1 1.06458 1.04091 +/- 0.00256\n", + " 60/1 1.00304 1.04015 +/- 0.00262\n", + " 61/1 1.05038 1.04036 +/- 0.00258\n", + " 62/1 1.02904 1.04014 +/- 0.00254\n", + " 63/1 1.00249 1.03943 +/- 0.00259\n", + " 64/1 1.01779 1.03903 +/- 0.00257\n", + " 65/1 1.05335 1.03929 +/- 0.00254\n", + " 66/1 1.06231 1.03970 +/- 0.00253\n", + " 67/1 1.02382 1.03942 +/- 0.00250\n", + " 68/1 1.03796 1.03939 +/- 0.00245\n", + " 69/1 1.03672 1.03935 +/- 0.00241\n", + " 70/1 1.02926 1.03918 +/- 0.00238\n", + " 71/1 1.05834 1.03950 +/- 0.00236\n", + " 72/1 1.04332 1.03956 +/- 0.00232\n", + " 73/1 1.05613 1.03982 +/- 0.00230\n", + " 74/1 1.01963 1.03950 +/- 0.00228\n", + " 75/1 1.02228 1.03924 +/- 0.00226\n", + " 76/1 1.04842 1.03938 +/- 0.00223\n", + " 77/1 1.02157 1.03911 +/- 0.00222\n", + " 78/1 1.02810 1.03895 +/- 0.00219\n", + " 79/1 1.05030 1.03912 +/- 0.00216\n", + " 80/1 1.02391 1.03890 +/- 0.00214\n", + " 81/1 1.02488 1.03870 +/- 0.00212\n", + " 82/1 1.04957 1.03885 +/- 0.00210\n", + " 83/1 1.03499 1.03880 +/- 0.00207\n", + " 84/1 1.05922 1.03907 +/- 0.00206\n", + " 85/1 1.05898 1.03934 +/- 0.00205\n", + " 86/1 1.02242 1.03912 +/- 0.00204\n", + " 87/1 1.03278 1.03904 +/- 0.00201\n", + " 88/1 1.06134 1.03932 +/- 0.00201\n", + " 89/1 1.04521 1.03940 +/- 0.00198\n", + " 90/1 1.04277 1.03944 +/- 0.00196\n", + " 91/1 1.04214 1.03947 +/- 0.00193\n", + " 92/1 1.05610 1.03967 +/- 0.00192\n", + " 93/1 1.04531 1.03974 +/- 0.00190\n", + " 94/1 1.01534 1.03945 +/- 0.00190\n", + " 95/1 1.03971 1.03945 +/- 0.00187\n", + " 96/1 1.07183 1.03983 +/- 0.00189\n", + " 97/1 1.07214 1.04020 +/- 0.00191\n", + " 98/1 1.03710 1.04017 +/- 0.00188\n", + " 99/1 1.02532 1.04000 +/- 0.00187\n", + " 100/1 1.03965 1.04000 +/- 0.00185\n", + " Creating state point statepoint.100.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 3.7900E-01 seconds\n", + " Reading cross sections = 8.7000E-02 seconds\n", + " Total time in simulation = 2.2064E+02 seconds\n", + " Time in transport only = 2.2060E+02 seconds\n", + " Time in inactive batches = 8.7100E+00 seconds\n", + " Time in active batches = 2.1193E+02 seconds\n", + " Time synchronizing fission bank = 1.4000E-02 seconds\n", + " Sampling source sites = 8.0000E-03 seconds\n", + " SEND/RECV source sites = 2.0000E-03 seconds\n", + " Time accumulating tallies = 1.3000E-02 seconds\n", + " Total time for finalization = 1.6600E-01 seconds\n", + " Total time elapsed = 2.2120E+02 seconds\n", + " Calculation Rate (inactive) = 5740.53 neutrons/second\n", + " Calculation Rate (active) = 2123.37 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.03912 +/- 0.00160\n", + " k-effective (Track-length) = 1.04000 +/- 0.00185\n", + " k-effective (Absorption) = 1.04240 +/- 0.00156\n", + " Combined k-effective = 1.04078 +/- 0.00127\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -545,7 +653,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": { "collapsed": false, "scrolled": true @@ -565,11 +673,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10000\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tmesh\t[10000]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t[u'flux', u'fission']\n", + "\tEstimator =\ttracklength\n", + "\n" + ] + } + ], "source": [ "tally = sp.get_tally(scores=['flux'])\n", "print(tally)" @@ -584,11 +708,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[ 0.4107676 , 0. ]],\n", + "\n", + " [[ 0.40849402, 0. ]],\n", + "\n", + " [[ 0.41014343, 0. ]],\n", + "\n", + " ..., \n", + " [[ 0.41049467, 0. ]],\n", + "\n", + " [[ 0.40982242, 0. ]],\n", + "\n", + " [[ 0.40996987, 0. ]]])" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tally.sum" ] @@ -602,11 +748,52 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(10000, 1, 2)\n" + ] + }, + { + "data": { + "text/plain": [ + "(array([[[ 0.00456408, 0. ]],\n", + " \n", + " [[ 0.00453882, 0. ]],\n", + " \n", + " [[ 0.00455715, 0. ]],\n", + " \n", + " ..., \n", + " [[ 0.00456105, 0. ]],\n", + " \n", + " [[ 0.00455358, 0. ]],\n", + " \n", + " [[ 0.00455522, 0. ]]]),\n", + " array([[[ 1.95085625e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.78129859e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.89709648e-05, 0.00000000e+00]],\n", + " \n", + " ..., \n", + " [[ 1.56286612e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.65813279e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.67530331e-05, 0.00000000e+00]]]))" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "print(tally.mean.shape)\n", "(tally.mean, tally.std_dev)" @@ -621,11 +808,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10000\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tmesh\t[10000]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t[u'flux']\n", + "\tEstimator =\ttracklength\n", + "\n" + ] + } + ], "source": [ "flux = tally.get_slice(scores=['flux'])\n", "fission = tally.get_slice(scores=['fission'])\n", @@ -641,7 +844,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": { "collapsed": false }, @@ -655,11 +858,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "fig = plt.subplot(121)\n", "fig.imshow(flux.mean)\n", @@ -676,11 +900,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\nTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Determine relative error\n", "relative_error = np.zeros_like(flux.std_dev)\n", @@ -707,11 +942,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([ (1.0, [0.2712169917165897, -0.04844236597355761, -0.1887902218343974], [0.3889598463000694, 0.8470657529949065, 0.36220139158953857], 2.2746035619924734, 0),\n", + " (1.0, [0.080729018085932, 0.19838688738571317, -0.38053428394017363], [-0.6604834049157511, -0.6893239101986768, 0.2976478097673534], 0.7833467555325838, 0),\n", + " (1.0, [0.019430574216787868, 0.06594180627832635, 0.23329810254580194], [-0.7472138923667574, 0.13227244377548197, -0.651287493870243], 1.1632342240714935, 0),\n", + " ...,\n", + " (1.0, [0.18544614514351207, -0.0113070561851496, 0.5468392238881264], [-0.8006491411918817, 0.43855795172388223, -0.4082007786475368], 1.4358240241589555, 0),\n", + " (1.0, [0.18544614514351207, -0.0113070561851496, 0.5468392238881264], [-0.5150076397044656, -0.34922134026850293, 0.7828228321575105], 1.5771133724329802, 0),\n", + " (1.0, [-0.2722999793764598, 0.22680062445008103, 0.2987060438567475], [0.9207818175032396, -0.2884020326181676, 0.26265017063984586], 2.932342523379745, 0)], \n", + " dtype=[('wgt', '" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nluKTIylGlUqYsKkZZ/mbetoFju0tliVNMWOz/EnQvh/v08Djdeszgd8lyzuJY2Y+3+OQuiCW9w/K\nLpZ8LHJY9cFOLypJ6l9pBjmUJOkZBg5JUiYGDklSJgYOSUDocjsw0Pxjl1vV67hVPRL2qpJyEkuP\nn34WSx53YwZASZKeYeCQJGVi4JAkZWLgkCRlYuCQJGVi4JCkLhkaat3luVLpderSszuuJCCerqJT\nVTfz3+64kqSuMnBIkjIxcEiSMjFwSJIyMXBIkjIxcEiSMjFwSJIyMXBIkjIxcEiSMjFwSJIy6Ubg\nOALYANwPnNrimHOS/euAQ5Jtc4HrgfXA3cDJxSZTkpRG0YFjEFhFCB4HAsuA+Q3HLAb2A/YHTgDO\nTbY/BfwN8HJgIXBik3MlSV1WdOBYAGwENhMCwWpgacMxS4BLkuWbgFnAPsAvgTuS7b8F7gX2LTa5\nkqSJFB04ZgNb6ta3JtsmOmZOwzHDhCqsm3JOnyQpo+kFXz/tIMGNw/vWn/ds4ArgFELJY5yRkZFn\nlqvVKtVqNVMCpamkUoHR0eb7hoa6mxZ1T61Wo1ar5Xa9oufjWAiMENo4AE4DdgBn1h1zHlAjVGNB\naEhfBDwE7AH8O/A94Owm13c+DikD59yIl/Nx7HIrodF7GJgBHAOsaThmDXBcsrwQ+DUhaAwAFwH3\n0DxoSJJ6oOiqqu3AScC1hB5WFxEauVck+88Hrib0rNoIPAYsT/a9FngPcCdwe7LtNOCagtMsSWrD\nqWOlKcSqqnhN1P60bVt+95psVZWBQ5pCDBzllPf/W+xtHJKkPmPgkCRlYuCQJGVi4JAkZWLgkPpM\npRIaU5t9fDtcebBXldRn7DnVf+xVJUkqNQOHJCkTA4ckKRMDh1RSrRrBbQBX0Wwcl0rKRvCpw8Zx\nSVKpGTgkSZkYOCRJmRg4JEmZGDgkSZkYOCRJmRg4JEmZGDgkKXJDQ81f9qxUepMeXwCUSsoXANXp\nz4AvAEp9zLk1FCNLHFLELFWoHUsc0hRlqUJlY+CQuqBdcIDwV2Ozz7ZtvU231IxVVVIXWOWkIlhV\nJUkqBQOHlBPbKjRVWFUl5cTqKHWbVVWSpFKY3usESJI6MzYUSStFlYCtqpJyYlWVysKqKqmLbACX\nLHFImViqUD+wxCEVoFXJwlKFVHzgOALYANwPnNrimHOS/euAQzKeKxVidNQhQKRWigwcg8AqQgA4\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Create log-spaced energy bins from 1 keV to 100 MeV\n", "energy_bins = np.logspace(-3,1)\n", @@ -773,11 +1066,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(-0.5, 0.5)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/lib/pymodules/python2.7/matplotlib/collections.py:548: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + " if self._edgecolors == 'face':\n" + ] + }, + { + "data": { + "image/png": "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\ngg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "plt.quiver(sp.source['xyz'][:,0], sp.source['xyz'][:,1],\n", " sp.source['uvw'][:,0], sp.source['uvw'][:,1],\n", diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 6430b2424..afa57c78d 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -882,7 +882,7 @@ def get_opencg_lattice(openmc_lattice): outer = openmc_lattice.outer if len(pitch) == 2: - new_pitch = np.ones(3, dtype=np.float64) + new_pitch = np.ones(3, dtype=np.float64) * np.inf new_pitch[:2] = pitch pitch = new_pitch From 2fb2b889bebfeaa2d8487760b5005ebbebca844f Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Mon, 30 Nov 2015 21:05:52 -0500 Subject: [PATCH 20/49] All MGXS IPython Notebooks are up-to-date and ready to go! --- .../pythonapi/examples/MGXS-Part-I.ipynb | 163 +++-- .../pythonapi/examples/MGXS-Part-II.ipynb | 180 +++--- .../pythonapi/examples/MGXS-Part-III.ipynb | 582 +++--------------- .../source/pythonapi/examples/images/mgxs.png | Bin 0 -> 54562 bytes .../examples/pandas-dataframes.ipynb | 6 +- 5 files changed, 307 insertions(+), 624 deletions(-) create mode 100644 docs/source/pythonapi/examples/images/mgxs.png diff --git a/docs/source/pythonapi/examples/MGXS-Part-I.ipynb b/docs/source/pythonapi/examples/MGXS-Part-I.ipynb index 0bba3bfe0..3eca44a26 100644 --- a/docs/source/pythonapi/examples/MGXS-Part-I.ipynb +++ b/docs/source/pythonapi/examples/MGXS-Part-I.ipynb @@ -6,10 +6,100 @@ "source": [ "This IPython Notebook introduces the use of the `openmc.mgxs` module to calculate multi-group cross sections for an infinite homogeneous medium. In particular, this Notebook introduces the the following features:\n", "\n", + "* **General equations** for scalar-flux averaged multi-group cross sections\n", "* Creation of multi-group cross sections for an **infinite homogeneous medium**\n", "* Use of **tally arithmetic** to manipulate multi-group cross sections\n", "\n", - "**Note:** This Notebook illustrates the use of Pandas DataFrames to containerize multi-group cross section data. We recommend using Pandas >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases." + "**Note:** This Notebook illustrates the use of [Pandas](http://pandas.pydata.org/) `DataFrames` to containerize multi-group cross section data. We recommend using [Pandas](http://pandas.pydata.org/) >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases of [Pandas](http://pandas.pydata.org/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction to Multi-Group Cross Sections (MGXS)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Many Monte Carlo-based neutron particle transport codes, including OpenMC, use continuous energy nuclear cross section data. However, most deterministic neutron transport codes use *multi-group cross sections* defined over discretized energy bins or *energy groups*. An example of U-235's fission continuous energy cross section along with a 16-group cross section computed for a light water reactor spectrum is displayed below:\n", + "\n", + "\n", + "\n", + "A variety of tools employing different methodologies have been developed over the years to compute multi-group cross sections for certain applications, including NJOY (LANL), MC$^2$-3 (ANL), and Serpent (VTT). The `openmc.mgxs` Python module is designed to leverage OpenMC's tally system to calculate multi-group cross sections with arbitrary energy discretizations for fine-mesh heterogeneous deterministic neutron transport applications.\n", + "\n", + "Before proceeding to illustrate how one may use the `openmc.mgxs` module, it is worthwhile to define the general equations used to calculate multi-group cross sections. This is only intended as a brief overview of the methodology used by `openmc.mgxs` - we refer the interested reader to the large body of literature on the subject for a more comprehensive understanding of this complex topic." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Introductory Notation\n", + "The continuous real-valued microscopic cross section may be denoted $\\sigma_{n,x}(\\mathbf{r}, E)$ for position vector $\\mathbf{r}$, energy $E$, nuclide $n$ and interaction type $x$. Similarly, the scalar neutron flux may be denoted by $\\Phi(\\mathbf{r},E)$ for position $\\mathbf{r}$ and energy $E$. **Note**: Although nuclear cross sections are dependent on the temperature $T$ of the interacting medium, the temperature variable is neglected here for brevity." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Spatial and Energy Discretization\n", + "The energy domain for critical systems such as thermal reactors spans more than 10 orders of magnitude of neutron energies from 10$^{-5}$ - 10$^7$ eV. The multi-group approximation discretization divides this energy range into one or more energy groups. In particular, for $G$ total groups, we denote an energy group index $g$ such that $g \\in \\{1, 2, ..., G\\}$. The energy group indices are defined such that the smaller group the higher the energy, and vice versa. The integration over neutron energies across a discrete energy group is commonly referred to as **energy condensation**.\n", + "\n", + "Multi-group cross sections are computed for discretized spatial zones in the geometry of interest. The spatial zones may be defined on a structured and regular fuel assembly or pin cell mesh, or an unstructured mesh such as the constructive solid geometry used by OpenMC. For a geometry with $K$ distinct spatial zones, we designate each spatial zone an index $k$ such that $k \\in \\{1, 2, ..., K\\}$. The volume of each spatial zone is denoted by $V_{k}$. The integration over discrete spatial zones is commonly referred to as **spatial homogenization**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### General Scalar-Flux Weighted MGXS\n", + "The multi-group cross sections computed by `openmc.mgxs` are defined as a *scalar flux-weighted average* of the microscopic cross sections across each discrete energy group. This formulation is employed in order to preserve the reaction rates within each energy group and spatial zone. In particular, spatial homogenization and energy condensation are used to compute the general multi-group cross section $\\sigma_{n,x,k,g}$ as follows:\n", + "\n", + "$$\\sigma_{n,x,k,g} = \\frac{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\sigma_{n,x}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\Phi(\\mathbf{r},E')}$$\n", + "\n", + "This scalar flux-weighted average microscopic cross section is computed by `openmc.mgxs` for most multi-group cross sections, including total, absorption, and fission reaction types. These double integrals are stochastically computed with OpenMC's tally system - in particular, [filters](https://mit-crpg.github.io/openmc/pythonapi/filter.html) on the energy range and spatial zone (material, cell or universe) define the bounds of integration for both numerator and denominator." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multi-Group Scattering Matrices\n", + "The general multi-group cross section $\\sigma_{n,x,k,g}$ is a vector of $G$ values for each energy group $g$. The equation presented above only discretizes the energy of the incoming neutron and neglects the outgoing energy of the neutron (if any). Hence, this formulation must be extended to account for the outgoing energy of neutrons in the discretized scattering matrix cross section used by deterministic neutron transport codes. \n", + "\n", + "We denote the incoming and outgoing neutron energy groups as $g$ and $g'$ for the microscopic scattering matrix cross section $\\sigma_{n,s}(\\mathbf{r},E)$. As before, spatial homogenization and energy condensation are used to find the multi-group scattering matrix cross section $\\sigma_{n,s,k,g \\to g'}$ as follows:\n", + "\n", + "$$\\sigma_{n,s,k,g\\rightarrow g'} = \\frac{\\int_{E_{g'}}^{E_{g'-1}}\\mathrm{d}E''\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\sigma_{n,s}(\\mathbf{r},E'\\rightarrow E'')\\Phi(\\mathbf{r},E')}{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\Phi(\\mathbf{r},E')}$$\n", + "\n", + "This scalar flux-weighted multi-group microscopic scattering matrix is computed using OpenMC tallies with both energy in and energy out filters." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multi-Group Fission Spectrum\n", + "The energy spectrum of neutrons emitted from fission is denoted by $\\chi_{n}(\\mathbf{r},E' \\rightarrow E'')$ for incoming and outgoing energies $E'$ and $E''$, respectively. Unlike the multi-group cross sections $\\sigma_{n,x,k,g}$ considered up to this point, the fission spectrum is a probability distribution and must sum to unity. The outgoing energy is typically much less dependent on the incoming energy for fission than for scattering interactions. As a result, it is common practice to integrate over the incoming neutron energy when computing the multi-group fission spectrum. The fission spectrum may be simplified as $\\chi_{n}(\\mathbf{r},E)$ with outgoing energy $E$.\n", + "\n", + "Unlike the multi-group cross sections defined up to this point, the multi-group fission spectrum is weighted by the fission production rate rather than the scalar flux. This formulation is intended to preserve the total fission production rate in the multi-group deterministic calculation. In order to mathematically define the multi-group fission spectrum, we denote the microscopic fission cross section as $\\sigma_{n,f}(\\mathbf{r},E)$ and the average number of neutrons emitted from fission interactions with nuclide $n$ as $\\nu_{n}(\\mathbf{r},E)$. The multi-group fission spectrum $\\chi_{n,k,g}$ is then the probability of fission neutrons emitted into energy group $g$. \n", + "\n", + "Similar to before, spatial homogenization and energy condensation are used to find the multi-group fission spectrum $\\chi_{n,k,g}$ as follows:\n", + "\n", + "$$\\chi_{n,k,g'} = \\frac{\\int_{E_{g'}}^{E_{g'-1}}\\mathrm{d}E''\\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\chi_{n}(\\mathbf{r},E'\\rightarrow E'')\\nu_{n}(\\mathbf{r},E')\\sigma_{n,f}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}{\\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\nu_{n}(\\mathbf{r},E')\\sigma_{n,f}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}$$\n", + "\n", + "The fission production-weighted multi-group fission spectrum is computed using OpenMC tallies with both energy in and energy out filters.\n", + "\n", + "This concludes our brief overview on the methodology to compute multi-group cross sections. The following sections detail more concretely how users may employ the `openmc.mgxs` module to power simulation workflows requiring multi-group cross sections for downstream deterministic calculations." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" ] }, { @@ -29,20 +119,6 @@ "%matplotlib inline" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We first construct a simple homogeneous infinite medium problem to illustrate use of the `openmc.mgxs` module to generate multi-group cross sections." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Generate Input Files" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -95,7 +171,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "With our material, we can now create a materials file object that can be exported to an actual XML file." + "With our material, we can now create a `MaterialsFile` object that can be exported to an actual XML file." ] }, { @@ -184,7 +260,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + "We now must create a geometry that is assigned a root universe, put the geometry into a `GeometryFile` object, and export it to XML." ] }, { @@ -264,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can now use the fine and coarse `EnergyGroups` objects, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", + "We can now use the `EnergyGroups` object, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", "\n", "* `TotalXS`\n", "* `TransportXS`\n", @@ -346,7 +422,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The `Absorption` object includes tracklength tallies for the 'absorption' and 'flux' scores in the 2-group structure in cell 1. Now that each multi-group cross section object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC." + "The `Absorption` object includes tracklength tallies for the 'absorption' and 'flux' scores in the 2-group structure in cell 1. Now that each `MGXS` object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC." ] }, { @@ -411,7 +487,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", - " Date/Time: 2015-11-29 17:50:29\n", + " Date/Time: 2015-11-30 20:15:33\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -497,20 +573,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.2800E-01 seconds\n", - " Reading cross sections = 8.9000E-02 seconds\n", - " Total time in simulation = 1.4506E+01 seconds\n", - " Time in transport only = 1.4496E+01 seconds\n", - " Time in inactive batches = 1.7910E+00 seconds\n", - " Time in active batches = 1.2715E+01 seconds\n", - " Time synchronizing fission bank = 1.0000E-03 seconds\n", - " Sampling source sites = 0.0000E+00 seconds\n", + " Total time for initialization = 4.1200E-01 seconds\n", + " Reading cross sections = 9.2000E-02 seconds\n", + " Total time in simulation = 1.4213E+01 seconds\n", + " Time in transport only = 1.4199E+01 seconds\n", + " Time in inactive batches = 1.7980E+00 seconds\n", + " Time in active batches = 1.2415E+01 seconds\n", + " Time synchronizing fission bank = 5.0000E-03 seconds\n", + " Sampling source sites = 3.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 = 0.0000E+00 seconds\n", - " Total time elapsed = 1.4943E+01 seconds\n", - " Calculation Rate (inactive) = 13958.7 neutrons/second\n", - " Calculation Rate (active) = 7864.73 neutrons/second\n", + " Total time elapsed = 1.4634E+01 seconds\n", + " Calculation Rate (inactive) = 13904.3 neutrons/second\n", + " Calculation Rate (active) = 8054.77 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -534,9 +610,6 @@ } ], "source": [ - "# Remove old HDF5 (summary, statepoint) files\n", - "!rm statepoint.*\n", - "\n", "# Run OpenMC\n", "executor = openmc.Executor()\n", "executor.run_simulation()" @@ -553,7 +626,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and \"reading\" the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." + "Our simulation ran successfully and created statepoint and summary output files. We begin our analysis by instantiating a `StatePoint` object. " ] }, { @@ -572,7 +645,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry. This is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a `Summary` object and link it with the statepoint." ] }, { @@ -592,7 +665,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the statepoint into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." + "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the `StatePoint` into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." ] }, { @@ -662,7 +735,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Since the `openmc.mgxs` module uses tally arithmetic under-the-hood, the cross section is stored as a \"derived\" tally. This means that it can be queried and manipulated using all of the same method supported for the `Tally` class in the OpenMC Python API. For example, we can construct a Pandas DataFrame of the multi-group cross section data." + "Since the `openmc.mgxs` module uses [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) under-the-hood, the cross section is stored as a \"derived\" `Tally` object. This means that it can be queried and manipulated using all of the same methods supported for the `Tally` class in the OpenMC Python API. For example, we can construct a [Pandas](http://pandas.pydata.org/) `DataFrame` of the multi-group cross section data." ] }, { @@ -676,7 +749,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1272: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)\n" ] }, { @@ -753,7 +827,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The following code snippet shows how to export all of three cross sections to the same HDF5 binary data store." + "The following code snippet shows how to export all three `MGXS` to the same HDF5 binary data store." ] }, { @@ -780,7 +854,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Finally, we illustrate how one can leverage OpenMC's tally arithmetic data processing feature with `MGXS` objects. The `openmc.mgxs` module uses tally arithmetic to compute multi-group cross sections with automated uncertainty propagation. Each `MGXS` object includes an `xs_tally` attribute which is a \"derived\" tally based on the tallies needed to compute the cross section type of interest. These derived tallies can be used in subsequent tally arithmetic operations. For example, we can use tally artithmetic to confirm that the `TotalXS` is equal to the sum of the `AbsorptionXS` and `ScatterXS` objects." + "Finally, we illustrate how one can leverage OpenMC's [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) data processing feature with `MGXS` objects. The `openmc.mgxs` module uses tally arithmetic to compute multi-group cross sections with automated uncertainty propagation. Each `MGXS` object includes an `xs_tally` attribute which is a \"derived\" `Tally` based on the tallies needed to compute the cross section type of interest. These derived tallies can be used in subsequent tally arithmetic operations. For example, we can use tally artithmetic to confirm that the `TotalXS` is equal to the sum of the `AbsorptionXS` and `ScatterXS` objects." ] }, { @@ -997,6 +1071,13 @@ "scattering_to_total.get_pandas_dataframe()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lastly, we sum the derived scatter-to-total and absorption-to-total ratios to confirm that they sum to unity." + ] + }, { "cell_type": "code", "execution_count": 25, diff --git a/docs/source/pythonapi/examples/MGXS-Part-II.ipynb b/docs/source/pythonapi/examples/MGXS-Part-II.ipynb index 2976df22b..99610944b 100644 --- a/docs/source/pythonapi/examples/MGXS-Part-II.ipynb +++ b/docs/source/pythonapi/examples/MGXS-Part-II.ipynb @@ -8,11 +8,19 @@ "\n", "* Creation of multi-group cross sections on a **heterogeneous geometry**\n", "* Calculation of cross sections on a **nuclide-by-nuclide basis**\n", + "* The use of **[tally precision triggers](https://mit-crpg.github.io/openmc/usersguide/input.html#trigger-element)** with multi-group cross sections\n", "* Built-in features for **energy condensation** in downstream data processing\n", - "* The use of **PyNE for plot** continuous energy vs. multi-group cross sections\n", - "* **Validation** of multi-group cross sections with **OpenMOC**\n", + "* The use of **[PyNE](http://pyne.io/) to plot** continuous energy vs. multi-group cross sections\n", + "* **Validation** of multi-group cross sections with **[OpenMOC](https://mit-crpg.github.io/OpenMOC/)**\n", "\n", - "**Note:** This Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook in its entirety, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries. In addition, this Notebook illustrates the use of Pandas DataFrames to containerize multi-group cross section data. We recommend using Pandas >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases." + "**Note:** This Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook in its entirety, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries. In addition, this Notebook illustrates the use of [Pandas](http://pandas.pydata.org/) `DataFrames` to containerize multi-group cross section data. We recommend using [Pandas](http://pandas.pydata.org/) >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases of [Pandas](http://pandas.pydata.org/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" ] }, { @@ -51,20 +59,6 @@ "%matplotlib inline" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this section we show how to compute multi-group cross sections for a fuel pin cell. In addition, we will illustrate how to use some of the more advanced features in `openmc.mgxs` such as nuclide-by-nuclide microscopic cross section tallies and downstream energy group condensation." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Generate Input Files" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -103,7 +97,7 @@ }, "outputs": [], "source": [ - "# 1.6 enriched fuel\n", + "# 1.6% enriched fuel\n", "fuel = openmc.Material(name='1.6% Fuel')\n", "fuel.set_density('g/cm3', 10.31341)\n", "fuel.add_nuclide(u235, 3.7503e-4)\n", @@ -126,7 +120,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "With our materials, we can now create a materials file object that can be exported to an actual XML file." + "With our materials, we can now create a `MaterialsFile` object that can be exported to an actual XML file." ] }, { @@ -168,7 +162,6 @@ "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n", "\n", "# Create boundary planes to surround the geometry\n", - "# Use both reflective and vacuum boundaries to make life interesting\n", "min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective')\n", "max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective')\n", "min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective')\n", @@ -243,7 +236,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + "We now must create a geometry that is assigned a root universe, put the geometry into a `GeometryFile` object, and export it to XML." ] }, { @@ -270,7 +263,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 190 active batches each with 10000 particles." + "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 190 active batches each with 10,000 particles." ] }, { @@ -307,7 +300,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define a \"fine\" 8-group and \"coarse\" 2-group structures using the built-in `EnergyGroups` class." + "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define \"coarse\" 2-group and \"fine\" 8-group structures using the built-in `EnergyGroups` class." ] }, { @@ -318,21 +311,21 @@ }, "outputs": [], "source": [ + "# Instantiate a \"coarse\" 2-group EnergyGroups object\n", + "coarse_groups = mgxs.EnergyGroups()\n", + "coarse_groups.group_edges = np.array([0., 0.625e-6, 20.])\n", + "\n", "# Instantiate a \"fine\" 8-group EnergyGroups object\n", "fine_groups = mgxs.EnergyGroups()\n", "fine_groups.group_edges = np.array([0., 0.058e-6, 0.14e-6, 0.28e-6,\n", - " 0.625e-6, 4.e-6, 5.53e-3, 821.e-3, 20.])\n", - "\n", - "# Instantiate a \"coarse\" 2-group EnergyGroups object\n", - "coarse_groups = mgxs.EnergyGroups()\n", - "coarse_groups.group_edges = np.array([0., 0.625e-6, 20.])" + " 0.625e-6, 4.e-6, 5.53e-3, 821.e-3, 20.])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Now we will instantiate a variety of `MGXS` objects needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define transport, nu-fission, nu-scatter and chi cross sections for each of the three cells in the fuel pin with the 8-group structure as our energy groups." + "Now we will instantiate a variety of `MGXS` objects needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we define transport, fission, nu-fission, nu-scatter and chi cross sections for each of the three cells in the fuel pin with the 8-group structure as our energy groups." ] }, { @@ -363,7 +356,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we showcase the use of OpenMC's tally trigger feature in conjunction with the `openmc.mgxs` module. In particular, we will assign a tally trigger of 1E-2 on the standard deviation for each of the tallies used to compute multi-group cross sections." + "Next, we showcase the use of OpenMC's [tally precision trigger](https://mit-crpg.github.io/openmc/usersguide/input.html#trigger-element) feature in conjunction with the `openmc.mgxs` module. In particular, we will assign a tally trigger of 1E-2 on the standard deviation for each of the tallies used to compute multi-group cross sections." ] }, { @@ -387,7 +380,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now, we must loop over all cells to set the cross section domains to the various cells - fuel, clad and moderator - included in the geometry. In addition, we will set each cross section to tally cross sections on a per-nuclide basis through the use of the `by_nuclide` instance attribute. " + "Now, we must loop over all cells to set the cross section domains to the various cells - fuel, clad and moderator - included in the geometry. In addition, we will set each cross section to tally cross sections on a per-nuclide basis through the use of the `MGXS` class' boolean `by_nuclide` instance attribute. " ] }, { @@ -409,7 +402,7 @@ " xs_library[cell.id][rxn_type].domain = cell\n", " xs_library[cell.id][rxn_type].domain_type = 'cell'\n", " \n", - " # Tally cross sections by nuclide (e.g., micro cross sections)\n", + " # Tally cross sections by nuclide\n", " xs_library[cell.id][rxn_type].by_nuclide = True\n", " \n", " # Add OpenMC tallies to the tallies file for XML generation\n", @@ -455,8 +448,8 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", - " Date/Time: 2015-11-29 21:22:25\n", - " MPI Processes: 1\n", + " Date/Time: 2015-11-30 20:39:59\n", + " MPI Processes: 3\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -575,20 +568,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.1800E-01 seconds\n", - " Reading cross sections = 8.7000E-02 seconds\n", - " Total time in simulation = 2.3349E+02 seconds\n", - " Time in transport only = 2.3343E+02 seconds\n", - " Time in inactive batches = 1.4263E+01 seconds\n", - " Time in active batches = 2.1923E+02 seconds\n", - " Time synchronizing fission bank = 2.5000E-02 seconds\n", - " Sampling source sites = 2.1000E-02 seconds\n", - " SEND/RECV source sites = 4.0000E-03 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 9.0000E-03 seconds\n", - " Total time elapsed = 2.3396E+02 seconds\n", - " Calculation Rate (inactive) = 7011.15 neutrons/second\n", - " Calculation Rate (active) = 1824.61 neutrons/second\n", + " Total time for initialization = 6.7400E-01 seconds\n", + " Reading cross sections = 1.4300E-01 seconds\n", + " Total time in simulation = 1.3404E+02 seconds\n", + " Time in transport only = 1.1927E+02 seconds\n", + " Time in inactive batches = 7.6750E+00 seconds\n", + " Time in active batches = 1.2636E+02 seconds\n", + " Time synchronizing fission bank = 1.4700E+01 seconds\n", + " Sampling source sites = 6.0000E-03 seconds\n", + " SEND/RECV source sites = 5.0000E-03 seconds\n", + " Time accumulating tallies = 4.0000E-03 seconds\n", + " Total time for finalization = 1.5000E-02 seconds\n", + " Total time elapsed = 1.3475E+02 seconds\n", + " Calculation Rate (inactive) = 13029.3 neutrons/second\n", + " Calculation Rate (active) = 3165.53 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -612,10 +605,7 @@ } ], "source": [ - "# Delete old HDF5 files\n", - "!rm *.h5\n", - "\n", - "# Run OpenMC with the output throttled!\n", + "# Run OpenMC\n", "executor = openmc.Executor()\n", "executor.run_simulation(output=True, mpi_procs=3)" ] @@ -631,7 +621,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and \"reading\" the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." + "Our simulation ran successfully and created statepoint and summary output files. We begin our analysis by instantiating a `StatePoint` object. " ] }, { @@ -650,7 +640,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry. This is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a `Summary` object and link it with the statepoint." ] }, { @@ -670,7 +660,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The statepoint is now ready to be analyzed by our multi-group cross sections. Next, we load the tallies from the statepoint into each object to compute the cross sections using tally arithmetic." + "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the `StatePoint` into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." ] }, { @@ -801,7 +791,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Although a printed report is nice, it is not scalable or flexible. Let's extract the cross section data for the moderator as a Pandas DataFrame." + "Although a printed report is nice, it is not scalable or flexible. Let's extract the microscopic cross section data for the moderator as a [Pandas](http://pandas.pydata.org/) `DataFrame` ." ] }, { @@ -815,7 +805,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1272: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)\n" ] }, { @@ -958,7 +949,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we illustate how one can easily take multi-group cross sections and condense them down to a coarser energy group structure using. The `get_condensed_xs(...)` class method takes in as a parameter an `EnergyGroups` object with a coarse(r) group structure and returns a new multi-group cross section condensed to the coarse groups. We illustrate this process below using the 2-group structure created earlier." + "Next, we illustate how one can easily take multi-group cross sections and condense them down to a coarser energy group structure. The `MGXS` class includes a `get_condensed_xs(...)` method which takes an `EnergyGroups` parameter with a coarse(r) group structure and returns a new `MGXS` condensed to the coarse groups. We illustrate this process below using the 2-group structure created earlier." ] }, { @@ -973,14 +964,14 @@ "fine_xs = xs_library[fuel_cell.id]['transport']\n", "\n", "# Condense to the 2-group structure\n", - "condense_xs = fine_xs.get_condensed_xs(coarse_groups)" + "condensed_xs = fine_xs.get_condensed_xs(coarse_groups)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Group condensation is as simple as that! We now have a new coarse 2-group cross section in addition to our original 16-group cross section. Let's inspect the 2-group cross section by printing it to the screen and extracting a Pandas DataFrame as we have already learned how to do." + "Group condensation is as simple as that! We now have a new coarse 2-group `TransportXS` in addition to our original 16-group `TransportXS`. Let's inspect the 2-group `TransportXS` by printing it to the screen and extracting a Pandas `DataFrame` as we have already learned how to do." ] }, { @@ -1019,7 +1010,7 @@ } ], "source": [ - "condense_xs.print_xs()" + "condensed_xs.print_xs()" ] }, { @@ -1113,7 +1104,7 @@ } ], "source": [ - "df = condense_xs.get_pandas_dataframe(xs_type='micro')\n", + "df = condensed_xs.get_pandas_dataframe(xs_type='micro')\n", "df" ] }, @@ -1162,8 +1153,6 @@ "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", "\n", "# Inject multi-group cross sections into OpenMOC Materials\n", - "# NOTE: This code will work for 1, 10, or 1,000s of cells\n", - "# as is the case for a complicated geometry like BEAVRS\n", "for cell_id, cell in openmoc_cells.items():\n", " \n", " # Ignore the root cell\n", @@ -1183,8 +1172,7 @@ " chi = xs_library[cell_id]['chi']\n", " \n", " # Inject NumPy arrays of cross section data into the Material\n", - " # NOTE: In each case we must sum across nuclides to get the\n", - " # macroscopic cross sections needed by OpenMOC\n", + " # NOTE: Sum across nuclides to get macro cross sections needed by OpenMOC\n", " openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten())\n", " openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten())\n", " openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten())\n", @@ -1381,7 +1369,7 @@ "source": [ "# Generate tracks for OpenMOC\n", "openmoc_geometry.initializeFlatSourceRegions()\n", - "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, num_azim=128, spacing=0.1)\n", "track_generator.generateTracks()\n", "\n", "# Run OpenMOC\n", @@ -1428,7 +1416,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As a sanity check, let's run a simulation with the coarse 2-group cross sections to ensure that they produce a reasonable result." + "As a sanity check, let's run a simulation with the coarse 2-group cross sections to ensure that they also produce a reasonable result." ] }, { @@ -1722,7 +1710,7 @@ "source": [ "# Generate tracks for OpenMOC\n", "openmoc_geometry.initializeFlatSourceRegions()\n", - "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, num_azim=128, spacing=0.1)\n", "track_generator.generateTracks()\n", "\n", "# Run OpenMOC\n", @@ -1762,7 +1750,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "There is a non-trivial bias in both the 2-group and 8-group cases. In the case of the pin cell, one can show that these biases do not converge to <100 pcm with more particle histories. In the case of heterogeneous geometries, additional measures must be taken to address the following three sources of bias:\n", + "There is a non-trivial bias in both the 2-group and 8-group cases. In the case of a pin cell, one can show that these biases do not converge to <100 pcm with more particle histories. For heterogeneous geometries, additional measures must be taken to address the following three sources of bias:\n", "\n", "* Appropriate transport-corrected cross sections\n", "* Spatial discretization of OpenMOC's mesh\n", @@ -1782,14 +1770,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "It is often insightful to generate visual depictions of multi-group cross sections. There are many different types of plots which may be useful for MGXS visualization, only a few of which will be shown here for inspiration.\n", + "It is often insightful to generate visual depictions of multi-group cross sections. There are many different types of plots which may be useful for multi-group cross section visualization, only a few of which will be shown here for enrichment and inspiration.\n", "\n", - "One particularly useful visualization is a comparison of the continuous energy and multi-group cross sections for a particular nuclide and reaction type. We illustrate one option for generating such plots with the use of the open source PyNE library to parse continuous energy multi-group cross sections from the cross section data library provided with OpenMC. First, we instantiate a `pyne.ace.Library` object for U-235 as follows." + "One particularly useful visualization is a comparison of the continuous energy and multi-group cross sections for a particular nuclide and reaction type. We illustrate one option for generating such plots with the use of the open source [PyNE](http://pyne.io/) library to parse continuous energy multi-group cross sections from the cross section data library provided with OpenMC. First, we instantiate a `pyne.ace.Library` object for U-235 as follows." ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 31, "metadata": { "collapsed": false }, @@ -1802,7 +1790,7 @@ "# Extract the U-235 data from the library\n", "u235 = pyne_lib.tables['92235.71c']\n", "\n", - "# Extract the continuous energy fission U-235 cross section data\n", + "# Extract the continuous energy U-235 fission cross section data\n", "fission = u235.reactions[18]" ] }, @@ -1810,12 +1798,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now, we use matplotlib to plot the multi-group and continuous energy cross sections on a single plot." + "Now, we use [`matplotlib`](http://matplotlib.org/) and [`seaborn`](http://stanford.edu/~mwaskom/software/seaborn/) to plot the continuous energy and multi-group cross sections on a single plot." ] }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 32, "metadata": { "collapsed": false }, @@ -1823,18 +1811,18 @@ { "data": { "text/plain": [ - "" + "(9.9999999999999994e-12, 20.0)" ] }, - "execution_count": 46, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEhCAYAAABoTkdHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXeYVNX5xz8z2xtKWUBKCAQPYsMCgiVKVaLRWKJiNyAi\nIJafDSuoMWgsKAQbGhMx2DtWpIixRQQVC7x2FBAGpGyfnfL7487szuzOLjM7ZWfuvp/n2Wd3ztw5\n33Pu3rnvfd9zzntAURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFUZQW4mjtBiiZhTHmt8DX\nIpLToPxc4AwRGRXhM+2Ae4EDASfwhIhMC7x3BHAbsAtQCVwiIu8E6rsHWB9S1WwRubdB3UOBN4Fv\nG8g+BTwAvCEi+7Sgn5OBLiJyQ6yfbabOs4BLgQIgF3gfuEJENiRKI8p2jAKmAx2AbOAH4CIR+aqF\n9R0EVInIqmScNyX9yG7tBihtgr8B1SLS3xhTDHxijHkHeBd4BjhSRFYaY47DuuHvFvjcsyIyNor6\nfxSR/k28F7PRABCROS35XFMYYyZiGY1jRWSNMSYbuA5YZozZS0TcIcc6RMSfSP2QunfFOsdDReTT\nQNn/Ac8Ce7aw2rHAO8CqRJ83JT1Rw6GkgmcBARCRcmPMp1g3qf8BY0VkZeC4xUAXY8wugddxecQB\n7+gbEck2xnQHHgW6Yj3tPyki1zVTPh3oLiLjjTG/AeYCvYBa4O8iMi9Q//tYhnE81hP8/4nIUw3a\n4QRuAM4SkTWB8+ABphtjVgSOORc4FmgHrASuNMZcBEzA8tLWAOeJyOaAl3YXkB84RzeIyDNNlTc4\nLbsDfmBVSNk9gXMQbO8NwOmBel4I9MlnjOkD/AvLsG8NtG0wcBZwrDGmM5bnmJDzpqQvztZugGJ/\nRGSJiKyDurDVIcCHIrJDRF4OlDuAccAyEdke+Oh+xpglxpg1xpiHAp+NleCT+yXA2yKyF7A30NMY\n07WZcn/IZx8EFovIHsAxwKzATRGgI+AVkX0Ddf01Qhv2ANqLyFsRzs1LId7GKOACEbnSGDMEuBw4\nIuBNrQVmBI67AyuktxfwB+D4JspPiNCWz4EdwFJjzGnGmN1ExCsim6EunHYyMAj4XeBnYsh5+I+I\n7A7cAjwqIvdjPQBcISIzE3zelDRFDYeSMowxucB84EUR+TCk/M9YYxmTgMmB4jVYT7t/BPbDehKf\n2UTVvzHGfNXgZ1yDYzYCRxljDgU8InKOiPzSTLkj0LZsYCTWGA0ishZYAowI1JsNPBL4eyUQvDGG\n0gFw7eT0gDV2FByrOQZ4OnhDBx4CjgzpyznGmH4i8qOInNlE+RkNBUSkCjgY62Z/I7DOGPOBMebw\nwCHHAv8UkTIR8QIPAycaY/KAocDjgXpexPI2GpLI86akKRqqUmLFR+QQUhbgBTDGLAK6AX4R2TNQ\nVgw8B6wVkQtCPxgIpzxjjBkGLDLG7Cci72OFMwh8fgbwehNtWhtpjCMQEgkyM9DGe4Fuxpg5IjK9\nmfIgHQGHiJSFlG0FSgN/ewM3YwL9z4rQvs1YITiniPia6APAryF/dyJ8YsA2oHPg77FY4yNvGWOq\ngKtF5NlmysMIDMZfDlxujOmFZaxfNcb0BHYNlJ8fODwb2IRl/JwisiOknspm+pKI86akKepxKLGy\nGfAHbjKhGOBHABEZISL9Q4xGNvA81uDpeXUfMKaHMebY4GsRWQL8DAw2xvzGGNMppP4crDh5iwiE\nY24TkQFYobIzjTEjmyqnPtyyGfAFBpWDdMJ6uo9aHuvm+6eGbxhjbmjQzyAbsW6+QToGNUVkk4hc\nJCI9sW76/zLGFDZV3kCvrzFm/5Dz8qOIXAlUA32AdcAtgf9ffxHZXUQOxTJqfmNMh9C6mulzIs6b\nkqao4VBiIvCU+W/gJmNMDkDgRnQ2MLuJj10E7BCRyxqU5wGPGmOCBqYf0BcrDj8BuN8Yk2WMyQKm\nAAta2m5jzP0BgwDwHfAL1o0wYnngtSMQrnkj0B6MMb8Dfg80Gq9oioCXcR1WjH9goJ4cY8xfsYzJ\njggfewUrRBS8UU8AFhhjsgPjPl0D5SsANxCpvBbLQwzlQODZQD+C5+aYwLFfAi8CZxtjCgLvTTDG\nnC0iNVjTnv8SKB8daCOBz7YP0UjIeVPSl7QLVQVns2C55o8FpwwqacVFwM1Y02odWE+jp4nI500c\nfz5QaIwJXSfwlIhMM8aMBx4PjH/4gcki8m3gpnov8BXWze9d4Iom6m9u6mrwvfuBB4wxs7FCbS+J\nyCJjzJYmyg8L+ewFwNzAzCc3ME5E1gVCYQ21I7ZFRP5ljKkO1FMY6NMSYLiIuI0xoYPKiMhHxphb\ngXcCs7JWAhNFxGOMeQgrpEegnikisiNC+YUiUt2gHU8GJhk8a4zJx7oHfA2MDoSOXjDG7AWsCNTz\nDdakBYDzgP8YYyYBW4DTAuXPA7cHZl3tSOR5U9KTtFsAaIyZRmDGBfA3EYlmUFFRFEVJEWnncWBN\n4duCNVf8EuDa1m2OoiiKEkrKDIcxZl8sl/au4OpSY8xMrCl9fuBiEVkO9Mdy4bdjxcAVRVGUNCIl\ng+OBmO6dWINlwbIjgL4icghWDHVW4K0CrPndd2LFpRVFUZQ0IlUeRw3WQq6pIWUjsDwQRGS1Maa9\nMaZYRF6hfraGoiiKkmakxHAEpuZ5A7M0gnQBloe8dmGNa3wdS90+n8/vcKTdGL+iKEpa44jjxplO\ng+MOWjAlz+Fw4HKV7fzAOCktLbGNjp36YjcdO/VFddJXI15aw3AEjcN6rIykQboBLdqXoLS0JN42\ntTkdO/XFbjp26ovqpK9GPKR65biD+rUjbwJ/BjDGHACsE5GKFLdHURRFiZGUDA4EUkTPxUrS5sFa\npzEUayXw4ViL/SaLyKqm6mgKv9/vt4uLmiodO/XFbjp26ovqpK8GQOfO7dJ7jENEPiDyTmxXp0Jf\nURRFSRwZPx3J7/drjhtFUZQYscusqhZjFxc1VTp26ovddOzUF9VJX414UY9DURSlDaIeh02eNFKl\nY6e+2E3HTn3JRJ2fflrLrFl3sm3bNnw+H/vssy+TJ19CTk5O1DpLly5i6NARfP21sGzZEsaNmxBT\nGzLB49CNnBRFUQCv18t1113FmWeey9y5/+bhh+cB8Mgjc2Oq57HH/g3A7rubmI1GpqChKkVRFGDZ\nsmU8//zzzJw5s66spqYGh8PB448/zmuvvQbAiBEjGD9+PFOnTqVLly58/vnnbNiwgTvuuIP33nuP\nu+++m+HDh3PmmWfy2GOPMWvWLEaNGsXIkSNZuXIlJSUlPPjgg/zjH/+gQ4cOnHHGGYgIN998M/Pm\nzePVV1/l3//+N1lZWey1115ce+21zJ49O+Kxf/3rX/n888/x+XycdtppnHDCCVH3V0NVGeQKp4OO\nnfpiNx079SXTdFatWk3Pnr0b1bN+/TqeeeZZHnpoHp06FXP88ScyaNBh1NR42L69gltvvZsXXniW\nxx9/iosuuoy5c+dy/fW3sGLFcmpqPLhcZfz8888MHXokY8dOYsKEv/D++yuorHSTk1ONy1XG1q0V\n1NZ6Wbt2E3fffTcPP/wf8vPzueqqS3njjSURj/3223UsXryEJ598AY/Hw2uvLUhZiMsWhkNRFPtx\n+OGFrF6dFcMnmk/TscceXpYtq2zyfYfDgdfrbVT+9ddr2HPPfXA6nWRlZbHvvgP45hsrF+uAAfsB\nUFramS+/bGrnZCgsLKJPn751x1ZUlEc87qeffqRXr17k5+cDsP/+B/L112siHtuuXTt69vwNV199\nGcOGjWT06GOa1E80ajgURUlLmrvJNyQRHkevXr/l2WefDCtzu918//13hOZfra2txem0ojxOZ3SG\nLTs7/Di/309opMjj8QCW8QqNvtfWesjLy4t4LMAdd8xCZDULF77B66+/wl13/SOq9sSLLQyHnZKb\npUrHTn2xm46d+pJJOkcfPZIHHpjN558vZ9iwYfh8PmbMmMX27dtZs2YNHToU4vF4EPmKSy6Zwkcf\nvccuuxRQWlrCLrsUkJ+fU9eG0tISdt21kLy8bEpLS3A4HHXv5eVls+uuhXTu3IGtW7dSWlrC66+v\nJicni/3334sff/yRwkInRUVFfPnlp0yaNInPPvus0bFu9w4WLVrE2WefzaGHDuLEE09M2bm2heHI\nlBhquujYqS9207FTXzJR5+9/v4e///0W7r57Fjk52QwaNITLL5/C888/w6mnnkZ2tpM//OE4cnJK\nqK6uZceOKlyuMnbsqKa6uhaXq4zf/c5wwgknMXHiFNxuLy5XGX5//X3KGhup4sADD+XKKy/m449X\nMmDA/ng8PsrLPVx55ZWcc85fcDqd7LvvfvTsuTs5OSWNjnU6C/ngg4946aWXycnJZfToY1M2xmGL\nWVWZdGGmg46d+mI3HTv1RXXSVwPiS3KY8es4BgyATz/N+G4oiqJkDBnvcTz+uN8/ZQpMnQqXXgpO\ntSGKoig7JZ51HBlvOPx+v3/58nIuuKCAdu38zJ5dTefOiV8TqK6w6uj/RnXsdA206VAVQK9efl56\nqZL99vMyYkQhixfHMvdbURRFiQVbGA6AnBy4+mo3991Xzf/9Xz433JBHTU1rt0pRFMV+2MZwBDns\nMC+LFlXyww8OjjmmkG+/zfhonKIoSlphO8MB0LGjn3//u5rTT6/lmGMKeeKJbDQVoqIozbFhw3p+\n//tBfPXVF2Hl48efzd/+dmPEz7z66svMmXMPAEuWvAXA118LDz/8QMTjP/zwfSZOHMfEieMYO/ZM\nHnhgDj6fL4G9SA22NBwADgeMHVvLc89VMWdOLhdckM+OHa3dKkVR0plu3bqzePFbda9/+WUDZWVN\nD1Q7HA6Cc5P+859HgabTqW/YsJ5//GMmf/3rbdx338M8+OC/+OGH73jllZcS24kUkPFxnGjSqldW\nwmWXwRtvwPz5MGRIKlqmKEomsW7dOmbOnMm3337L888/D8A///lPfvrpJ6qrq/nwww955ZVXKCgo\n4LbbbsMYA4CI0KlTJ2bOnNkonXood9xxB7169eLkk0+uK/N6vWRlWZN5jjzySIYOHcquu+7KiSee\nyDXXXBPIi+XklltuAeDiiy/m2WefBeCkk05i1qxZzJ49m+LiYr799lu2bt3KjBkz6N+//077q2nV\no5i6dtNNMHhwNscem8f559cyZYqbrBgmX+l0P9XR/03qdArunU3h7TNwNpFFtiX4ioqpvOJqqiZN\nifj+r79W4PVC7959Wbr0ffbaa28WLlzEmDFnsmTJWwQjSi5XGVVVtZSVVQNQVVXLccedwoMPPtgo\nnXooq1d/zaBBhzZ5PtzuWgYMGMQxx4zi0ksv56ijjmX48JEsXbqIO+6YybhxE/B4fHWf93h8/Ppr\nBTU1Hvz+Kv7+91m8++473HXXPfztb7cn6KxFxrahqkgcc4yHhQsrWbIki5NPLmDDhox3uBTFlhTc\nNzuhRgPAWVFOwX2zd3rc0KEjWLx4IZs2baSkpISCgoLAO/ENlDqdjrrMtuvXr2PKlAlMmnQeU6f+\nX90x/fvvBcCaNavZf/8DASu1ukjk1OpBBg06CIC99tqHtWt/jKud0dCmDAdA9+5+nnuuikMP9TJy\nZCGvv65rPhQl3aiaOAVfUXFC6/QVFVM1MbK3AdSlMx80aDAff/wRb7+9hCOOGB5yROTU5k2xYcN6\nLrzwfC666ALWrFlN796/Y/XqLwFrLGX27Ae44Yab2bx5c91ngnubW+nVLRenttYTSOMe/qAb2gav\n11fXh5YHoKLHFqGqWMnKgssuc3PYYV4mTcpn6VIP06bVUPdgoShKq1I1aUqTIaVIJDL0lp2djTH9\nWLDgRe677yHWrFkNQHFxEZs2bSIvbxe++GIVxvQL+5zPF+6R7LZbN/7xjwfrXnfs2JELLzyfQw75\nPT169ATgo48+JC8vr1Eb+vffkxUrljNy5FF88snH7LHHXhQVFfHrr1sA2LJlM+vW/Vx3/GefrWT4\n8JF88cVn9O79u4Sch+ZIS8NhjOkKrAB6iEjS5qoNHuxl8eIKLrssn9GjC3nggWr22CPzpsYpihI/\noWPFw4aNYNu2bRQWFtW9d+KJp3DBBRfQvXtP+vT5XcjnrN+7796P888/l4kTpxBp3LlTp1JuvHEG\nt956M16vB4/Hw29/24fp028J1lR37LhxF3DrrTfx8ssvkJOTw9SpN1BSUsLAgQdx3nln07fv7vTr\nt0fd8TU1bq688lJcro1cf/3NCTwrkUnLIL8x5nagB3CmiDTeyzGERKRV9/th/vwcbr45l6lT3Zxz\nTm0jdy/dBxPTTUN10ldDddJbJ1aNv/3tRoYNG8HBBx8Wk46tclUZY04HngGqU6XpcMAZZ9Ty8stV\nPPpoDn/5Sz5bt6ZKXVEUJbNImeEwxuxrjPnWGDM5pGymMeY9Y8y7xpiBgeKDgdHAfsCpqWofwO67\n+3jttUp69vQzfHgR77+vA+eKoqQ311wzLWZvI15SYjiMMYXAncAbIWVHAH1F5BBgHDALQESmiMiN\nwErgiVS0L5S8PLj55hr+/vdqzjsvn1tvzSWKCRSKoihthlR5HDXAH4GNIWUjgOcBRGQ10N4YUzf/\nTkTGJnNgfGeMGuVl8eJKli/P4k9/KuTH5E+NVhRFyQhSMqsqMMDtDS7RD9AFWB7y2gXsBnwda/2l\npSVxta/pemHJErjzThg0CObMKSEkW0DSSFZ/Uq2hOumroTrprZOqvrSUdJqO66CFSzOTPcvh3HNh\n6NASTjnFx4svevjrX2soKkqOVjrO2lCd1OnYqS+qk74a8dIahiNoHNYDXUPKuwEbWlJhap4A4LPP\nnEyenMvo0bk88QTst1+ytOzzRKM66amhOumtox5HOKHr5t8EbgQeNMYcAKwTkYqWVJqqJ43q6jLu\nvBOefjqbkSPzuPRSN+PHN17zEa+OXZ5oVCc9NVQnvXUyweNIyQJAY8wQYC7QGfAAW4ChwBXA4YAX\nmCwiq2KtO5q06sng22/htNMsT+SRR6Bz59ZohaIoSsuIJ616Wq4cj4VErByPhkhPAW433HZbLk8/\nncOsWdUMHdrsIvcW6yQaOz2d2U3HTn1RnfTVgPhWjtvCcLR2G956C845B848E26+GXJzW7tFiqIo\nzaMeRxo8aWze7ODii/PZvNnB/fdX0bt3y+yZnZ5oVCc9NVQnvXXU40gB6eBxBPH7YfZsy+u46y44\n66zWbpGiKEpk1ONIsyeNVaucXHBBPgMG+LjttmpKYphZZ6cnGtVJTw3VSW+dTPA40i47rh3YZx8f\nb75ZSX6+nxEjili5Uk+zoij2wRYeR2u3oTmeeQYmTYLLLoMrrgCn2hBFUdIADVWluYv6008OJk7M\nJz8f5syppkuXpm2dnVxh1UlPDdVJbx0NVSkA9Ozp54UXqhg0yMvw4YUsXKj7fCiKkrmo4UgR2dlw\n1VVuHn64mquuyufaa/OoTtkeh4qiKInDFqGq1m5DrPz6K4wfb6Utefxx6N+/tVukKEpbQ8c4MjC2\n6ffDo4/mMGNGLtdd5+aMM6xkiXaKoapOemqoTnrr6BiH0iQOB5xzTi0vvFDF3Lk5jB+fz/btrd0q\nRVGUnaOGo5XZYw8fb7xRSWmpn+HDi3j33dZukaIoSvPYIlTV2m1IFC+9ZI19TJ4M114LWTr5SlGU\nJKFjHDaJbQK43SWMGePB64V7762me/fE20U7xYPtpmOnvqhO+mqAjnHYiu7d4emnqxg+3MuoUYUs\nWJBO28IriqKo4UhLsrLg4ovdPPpoFdOn53H55XlUVrZ2qxRFUSzUcKQxAwf6WLy4gvJyB0cdVcgX\nX+i/S1GU1kfvRGlOu3Zw333VTJ7s5s9/LuBf/8rBPtMBFEXJRNRwZAAOB4wZ4+Hllyv517+sNR87\ndrR2qxRFaavYYlZVa7chlVRVWSna33gDnnwSBg5s7RYpipKJ6HRcm0zDi0XnxRezmTo1j0svdTN+\nvJWuJNEa8aI66amhOumto9NxlaTxpz95ePXVSp5+Oodzzsln69bWbpGiKG0FNRwZTO/efhYsqKRX\nLz8jRxbx0Uf671QUJfnonSbDycuDm2+u4ZZbqjnnnAJmz87F52vtVimKYmfUcNiE0aO9vPlmJa+9\nls0ZZxSweXPGD18pipKmpJ3hMMYcaox51BjzhDHmwNZuTybRo4efF1+sZM89vYwcWcj772uWREVR\nEk/aGQ5gOzAeuBMY2rpNyTxycuD6693cdVc148fnc9dduXi9rd0qRVHsREyGwxizqzEmqTEQEfkc\nGA7cCjyfTC07M3y4l7feqmTZsixOOaWAjRs1dKUoSmJo0nAYY/Y1xjwX8no+sB5Yb4wZHKtQoL5v\njTGTQ8pmGmPeM8a8a4wZGCgbKCKvAacAl8aqo9TTtaufZ5+t4qCDrNDVO+9o6EpRlPhpzuOYDfwb\nwBhzOHAw0AXLG/hbLCLGmEKs0NMbIWVHAH1F5BBgHDAr8FZHY8wDwD3Aglh0lMZkZcFVV7mZM6ea\nSZOs0JXOulIUJR6ajF8YY5aJyOGBv28HPCJydeD1IhEZEa2IMSYLyAamAptFZI4x5ibgBxH5Z+CY\nr4BBIlIeSwfaWsqReFi3DsaMgZISmDcPOnZs7RYpitJaxJNypLldgjwhfw8Hrgl5HVPMQ0S8gNcY\nE1rcBVge8toF7AZ8HUvdgG1SDSRbJzfXym81c2YJ++3nY+7cKg48MHnuhx3OWap17NQX1UlfjXhp\nznBUGWP+BOwC9ASWABhj9iQ5s7EcQIu8h9LSkgQ3xd46t98Ohx7q5Oyzi7j+erjwQmLKdRULdjln\nqdSxU19UJ3014qE5w3ExcB/QHjhdRNyBsYq3gVPj0Awah/VA15DybsCGllRolyeNVOmUlpZw6KFl\nLFjg4LzzCnjrLR8zZ1ZTkuBr1U7nLFU6duqL6qSvRrzE/JxpjGkvIi1KqWeMmQ64AmMcBwM3isiR\nxpgDgLuDYyqxoGMc8VFdDRddBG+/Dc88A/vs09otUhQlFSQlrboxZpKI3BuhvD3wDxE5I1oRY8wQ\nYC7QGWvsZAvW4r4rgMMBLzBZRFbF1Hrablr1RGs8+WQ206fnMW1aDWPGeJr4ZPw6ySCZOn4/bNsG\n7dvb62lTddJXJxPSqjdnOF4G8oC/iMi6QNlxWNNk54pITFNyk4V6HIlj1Sr485/h8MNh1iwoKGjt\nFrU+8+fDGWfQ7Ha9V10FCxfCihWpa5eixEtSZlWJyLHGmNOBpcaY24AjgN7AaBFZ01LBZGCXJ41U\n6TSl0bUrvP46XHppPgcd5OSRR6ro1avldtkO5+zbb3OAfFyusiZ1Fiwo5MsvsxLSBjucM9VJf414\n2anFMcYMB94EVgODRaQi6a2KAX9xsZ/ymJZ+KImmuBimT7f2tLUZ99wDl1zSvMcxYAB89lnzxyhK\nupEUjyOwaO8q4GxgJDAQ+J8xZqKILGupYMJRo9H6lJfjmzadLWefH1Zsh6fAqqqdexxebyGgHofq\nZI5GvDS3HuMDoC/Wau6lInIH1jTcmcaY2SlpXTQUF7d2CxTAWWFPA56s9S2Kksk0Nzh+vIi8EKE8\nF5guItdE+FjK0cHx5FNeDueea6Usee452G23kDdD76w2/Ffcfz9MnNh81/bbDz79NPIxr7xivd+9\ne/LaqCgtIVmD442MRqDcTXj6kVbHLi5qqnRaojFnDsycmcugQTnMm1fF3ntbqUpKQ45pWKcdzll5\n+c5DVR5P06GqP/6xhDFjapk1qzoqPTucM9VJf414SceNnJQ0xOmEyy5zM21aDaecUsCSJW0jRXs0\nz2QazlLaGmo4lJg4/ngP//xnNRdemM/jjzeXscaebN7s4Isvwr82NozQKUqzRPWsZIzZBegQeryI\nfJesRsWCjnG0DmvWwNFHw7ff2XuMY+5cOP/8+q4deywsWBDe1ebGOBwOa3zokUdS0lxFiZpkpVUH\nwBgzC/gLsLnBW71bKppo7BLbTJVOIjQ6dICXXnLA3vVlbWGMo6zMA2SH6TU3xgElVFfX4nLpGIfq\npI9GvEQTaxgGlIpIdFe+0mbo3Dn8Edvttvb8sBMNn8la8oymYyCK3YhmjONroCbZDVEyn7PPLqCy\nsrVbkVicznDjGMkIqGFQ2hrReBzrgGXGmHewstgC+EXkhuQ1S8lEOnXyc+qpBfznP1W0a9farUkM\nDY2CU6eTKEpUhmMLsIj6DZhavFNfsrDTzl+p0kmGxpNPBeJUfUN0Qg9IYk6rZJ2zoAEM1p+Xl91I\nLyen+TYUFORQWppT9/qnn2DjRhg4MLKmna4z1UlfjXjYqeEQkenGmGKgH5bBWJNuiQ7tMiiWKp1E\nanQsKo4+3UgTOa3iJZnnrKwsGyioGxx3u1syOO7G5aqP9p5wQiEff5zFpk2Nj7fTdaY66asRLzt1\nvI0xx2ONc9wPPAiIMeboZDdMyQwqr7gaX1H0+cIyLadVw1BVU1NuY6mjtja+NilKaxNNxPZKYF8R\nGSQiA4FBwPXJbZaSKVRNmsKW79fj2rSj0c8D9/vptpuXZW9nlrGIhM+382OWL4/8dXr99Wzuv78+\nVGXD5S5KGyMaw1EjIq7gCxFZD+jUXGWnTJgA06bV8Oc/Z+5WgkGD4Q1MC2luVtXRRxeFlZ97bj4A\nW7Y4ueEG6++qKqis1GlYSmYTzeB4hTHmMmAh1sD4UUB6B+CUtOHEEz0UFfnhrNZuScsIegdBwxGL\nt/DqqzmNyk48sZBvv9WpWUpmE80OgF2Am4CDsAbHPwCmhXohrYmmHMkQQh7V/T5/2JP7kiVw7bXW\nTnqzZ0N2GqXAeughGD/eSi1fVGSlWXnttXADMmgQLF9u/R1aHml8pKiIurUueuUqrUlSU46IyEZg\nQksFUoFdZlOkSqc1+hI6LdfhDL9ehwHvAZUfFrPk+2vZb97kFuskmu3brZQjGzeW0adP87OqoOG1\nGD6l0nqvmODzWqQ22+k6U5301YiX5raOfUpETjHG/EzjdRt+EflNcpum2AlfFNN2C33lHPzmLWx3\nT06b1CXuuM1bAAAgAElEQVTBMQ6Pp+ljdOW40tZoLth6UeD3YcDvQ34OAw5PcrsUmxHttN1ifzlv\nvJE+sar6wXG1DooSpEnDISK/BP50AD1F5AfgSGAakLnTZJRWoblpu65NO8KOfeyxxoPKrUXDwfFI\nxOJx6LiGYgeimd7xCOA2xuwPnAc8C8xOaquUNs3KlVn88kvrPeH/8IOjztNo+DvRNNwUSlEygWiu\nWr+IfAicCPxDRF5JcpswxhxsjHnIGPMvY8wBydZT0otjjqnl6adbz+s46KBinnrKCpc1XMcRiVCP\nY/Towpi0hg0r4ocfdm4kR40qZNq0vLrXbjesWaNGR2kdornyiowxg4CTgNeMMXlA++Q2i3JgEjAT\na1xFaUOceqqHJ5/MbtWwzvbt1s28oeHYWZtWrGh+L/aqqsZGItLA+8CBRXz2Wf3X89NPs1i6tL7u\nBx/M4fe/L2r8QUVJAdEYjjuBucCDgbUb04H5yWyUiKwC8rGMx7+TqaWkH8ceV8QayaZzl3aUdg7/\n6di7GwX3Jj9S2jBEtWFDap/u16518tFHTRuhigodrFdaj51+G0TkSWB/EbnbGJMP3Ccid7ZEzBiz\nrzHmW2PM5JCymcaY94wx7xpjBgbKdgFuA64WkW0t0VIyi2gTJToryim8fUZYmdsNixc3/6QfK8F9\nN3w+6wZ95pnJmw9yyCHFzU73VZR0I5rsuNcAFxtjCoEVwDPGmJtjFQp8/k7gjZCyI4C+InIIMA6Y\nFXjrSqAdcL0x5sRYtZTMI5Ysuw3Xg7z9NowZU5jQAeyg4QiGpqqqmj624ayqVaucYUkNg2ze3LSX\n0K1bSaP33347i+++qy/76qssTjtNJzQqrU80E+aPBQ4BzgZeFpGrjDFLWqBVA/wRmBpSNgJ4HkBE\nVhtj2htjikXk2lgqttMGLqnSSbu+TLvG+glh+HCYOBFOPjlQEHKHDq1XxPrt9ZbQpUs8ra2nXbt8\nSkvzKQjcp2trLe2cnKY3cgoyd24RTzzRuM4//SncMDY8N/n5xWHlr7+eg9udw6JF9ccsWpRNaWkJ\nhYWR64iFtLsGVCelGvEQjeGoFRF/YA+OewJlMccFRMQLeI0xocVdgOUhr13Ablj7f0SNXVINpEon\nU/pyxhnZ3HZbLkccUYnDEZ62JLTeVausL9k331SQkxOd2/Hddw5Gjiziu+8irWYvYcoUcLmqqalx\nAKGzmcJTjvh88NFH9WlEAGpqaoHGHscvv/jDjrPqqL9BbN5cTu/exWHltbUeXK6qsONcrjIqKnKB\nPG66qZqJE2Pf4CNTroG2qJPRKUdC2GaMeRXoAbxvjDmW+r3HE02LtqW105NGqnQyoS/nngu33w6f\nf17C8OFN17tqlfXb6SyitJSo+OADK3Fhc+176618jjwyvCzocfTpU8L27fDCC41nRf36a+SpxA1z\nyjXU7tixuFF5Tk52o+NKS0soCkyomjYtvy5le6xkwjXQVnXs4HGcBowC3g14HtXAOXHqBo3DeqBr\nSHk3YEOsldnlSSNVOpnUl8mTs7n22hxefLGKziHlwXr9fsuwHHiglx9/rKFfv+ieabZtywIKm9zu\nFcDt9lJW5iGSx1FeDq+/XsFJJzWeEvv225E1d4QvkGfDhnCPY8uWcvr0Cfc4Nm70smlTZdhxDgf8\n3//V1LWrJec4k66BtqaT0R6HMeZoEXkVGBMoOtYYE3xk6gn8s4WaDur99TeBG4EHAwv91rVkP3M7\nPWmkSidT+jJxIsydC++8U8JJEer98UcoLIQ99sjC5yuM2uMoKdl5+7KzsygoqI/K1tTA0qX1X5lj\njolvHUVhYbj2kCHFlJdDx4715V98kcX//te4jXfdVW/Mnn++hGuugc2bY9PPlGugLepkssexD/Aq\n1gK8SOGjmAyHMWYI1nqQzoDHGDMBGAp8bIx5Fyv8FVs+7QB2edJIlU6m9WX69CwuvTQ/zHAE6126\nNJv99y8gN9fNunU+XK7o4v1bt2YDBc16HLW1XsrLLY9j1CgP27YlNvnili3hHofPZxnBqVPrvQmA\n776rorn0cAsX1rJlS05M5zrTroG2pJPRHgfwOoCInAtgjOkkIjE+09QjIh9gGaOGXN3SOoPY6Ukj\nVTqZ1JcTT4Tnnwcea1zvd9/B/vuDz5eL3w+lpdHF+9u123n7srOzyM/PomtX6Ncv8Rl7O3WKrL18\neV7Y64svbn4Kbl6eNaYS67nOpGugrelkssdxN9YeO0GeAoY3cWyrYpcnjVTpZGJfpk8nzHAE6339\n9QKmT8/mv/+t4ZdfwOVyR1Wf5T1E53Hk5OSwY4cHhyOxm4Q0nFUV5K23YqunutqaxaUehz10MsHj\niCWPguY4UFqNoIcQyk8/OVizJovhw6GkxE95efSXaDSLBf1+a+V4Tk7zSQ5byocfJna1eyjHH1/A\nxx9rEkQlOaTPjjlxYCcXNVU6md6XWbNKWLIELr4Y8vKgW7d8vvwSSkt37hWUlRHVArqsrCzy8rIo\nKoKsrNyEJ118+unYMuk2RX5+eKgqOOv3gw+yGT266c9l+jVgZ51MDlVlDHZxUVOlk6l9CZ0wtXmz\nm1GjfEyYUAuU4PNV4XJl43JV77Sezp1L6NPHBzjZtKksLGWIZRysL63H46WszEtOThbl5T4iLeqL\nh2CIKV6qqhqGqqz2V1TU8L//1dK7d2OLl6nXQFvQyYRQVXOG4xBjzE8hr0tDXuue40qrctNNNWGv\nS0r8MWWM/e47K4zj9UJ2yLfAHTJE4vdb7+fm+jMmCeFJJ9UPpN9xRx533JHHpk3pfRNSMo/mDEe/\nlLUiTuzkoqZKJ9P70rDe3/ymkKqq2PU6dCghL2QS07aQXMxZWVnk5mZRUmIlPUz0LoDZ2YnxYFav\ntuqpqirhnXcav19aWsLtt8Pxx8Puu4eXpwLVSU+NeGjScAT2GM8I7OKipkonU/vSVK6q0tISamsr\n2Lq1AJcrmvWj9V/KX34pqxvvANi40QFYqT88Hi8VFV6cTicVFeDzJTayW11trUKPly+/tH736hX5\nfZerjCuvLOG779x1nlqmXgNtQScTQlU67UKxBdasqtg/19CLqG4wROLxOMjL87NwYTYTJrS8fdFo\nJ5v770/sdGKl7ZLxU2z9/tbcYFRJKY1HsesoL4euXYnKeIRWs3Ur7Lpr/euvvoI997T+PuAA2Gsv\n6+9581rY5mY48kh4883E19uQLVugY0fr7+Bp27HDSqESbYoWxX44GmbdjIGo/GRjzOHAIMAHfCAi\n77dUMBnYxUVNlU6m9iXsHtfgmi/G2qg+mkehUJPj7V5M+ZVXUzVpCgDr1zsBKweVFaryUVTkBxL/\ntF5Tk5hQ1c4IGg2AnBw/X31VzrhxJSxbRtIHzjP1WmtNHVuEqowxNwF/x8pi2wOYFdgVUFFSSrQ7\nBMZCVmX4VrRVVeGWx+slbPA8kbz9dupnw3s8DlwuBz//nHJpxUZEM8YxHDhERK4QkcuAg7F2BVSU\nlBLL9rKxELoVbU3ILN/gdNzmto3NVFoepFCU6AyHQ0TqhvFExEPyNnJSlCapmjSFLd+vx7VpR9gP\nfj+uTTvoZzy8s6y80fuhP5+vKsOBH0cT+4U1HBz3euHAA1M8ip0Cgobj6691fowSO9H4yiuMMS8D\nC7EiyKMI3+611bHT/O1U6dipL0Gd9u0hJ6f5XQDLmggdB9sZGpbKzs4iOzuL3/wmsSvGW5srriiu\nMxyHHlqU8FQqDbHjtWYHjXiIxnBcDJwKHIQ1rvgo8HQyGxUrdhkUS5WOnfoSqpOXV8DatW5+97t6\nh3jy5Hx69vQxdaq1JPyHH+oHv0MJtnPjRitrLliD45WVfmpq3EBi8kqlA+++G74QMJn/I7tea5mu\nES/RGI5rROSvwOPJboyixEOkDLlPP53DbrvVGw6Xy0FhoZ/KyshB/urqxoPjWclLYttquBtkn1+1\nysmVV+bz2muVrdMgJaOIxnD0N8bsLiJfJ701ihIH7dv72by5+VHfzZsd9OzpY82acGtQ2tnK235Z\n4AeAVYHfSy2X21b8GPJ3Z2sGzPLA37HiKyqm8or6Kc2K/YlmZGxf4EtjzEZjzE+Bn7XJbpiixMo+\n+/j45JPG7kHoDCKXy0HPnlZQv4zEz9Bqizgrwqc0K/YnGsNxLNAXGIy1//hhwOHJbJSitISBA707\n3bzI5XLSo4c1S2o60/EUqPFIBKFTmhX7s9PZ3MaYvYCzRGRq4PW/gDtE5PMkty0qNOWIEsTtttKH\nbNkCBYHs4g4H9OgBPwU2BDjnHCulyNSp0L49LFwIBx5oHffii/Df/8Ltt1vHDhhgbfh0++1w2GGt\n06dUM3QoLF0KZ54ZZZqVZtLAKOlNslOOzAFuCHn9cKDsiJaKJhq7zKZIlY6d+tJQp0+fQv7732r2\n2y+49qIEr9dXlzV3w4YCjjiilgMOyMXths2bq3G5fEAJ27dX8uuv2TidOfh8DjweLzU1sGNHNZFm\nYtmRpUut3zU1tVFtitVUxuK69218rWWyRrxEE6rKEpFlwRciEiHjv6KkBwcc4OWDD5qeBlVRYQ2i\nv/56JXl54XuJf/ppFg8/nEtxSPSq4UZPkcjLs9+T9scf23AqmZIwovE4dhhjJgJLgSxgNJDe5lBp\nsxx3nIfrr89j/Pjaumm0oRGUigpHIGmhtTmT11vvrT/zTHDvbj87djjw+8Hj2fl03I4d/axfb68c\nHsEdEhUlEtFcHX8BBgJPAfOxBsr/ksxGKUpLOfxwL506+bn99tw6gxF64y8vd9R5FFlZ/rA9MUpK\nrA/stVe9G+LzWQamIQ5HZC/jmmtqIpZnIl9+qcZDicxOPQ4R2QSMS0FbFCVuHA64//5qjjuukHXr\n6vcVD1JRQZ3HkZUV/t6OHQ5uvLGaLVvqvYfgAsBnn63kpJPqV4/vv7+PFSssixTq0UQyMpnK4sVZ\n7Lmn/fJ0KfHT5GVujHkq8PvnkPUbKVnHYYzZzRjzpDFGDZYSM507+1mwoJJt2xyMG+emrMxRd3MP\nDVU1NBxlZQ5KSsI9FI/HQXa2v+4zAE88Ucmhh3rqXqd6J79UcdNN+a3dBCVNac7jCC4DbY2JiF7g\nQeC3raCt2IBOnfzMm1eF3w8vvpjN+vUOunXzBzwO65jGHocVrgqdpej1Wl5Er171hmPYMC/vvRd5\n4EPTlSttgeYMRz9jTD/q13o0DOr+kJQWYYXHjDGenR+pKM3jcFjjHgsWZHPWWbXk5tbPkmpoOLxe\nB8XF/rpwk98PtbVWxtyOHf3ccw9s21aNw9H0kgWn034zrBSlIc0ZjqXAauB/NDYaAMsilDWLMWZf\n4HngLhGZEyibibUq3Q9cLCLBlO367KYkhLFj3UyeXMDxx3vCQk6W4XCEhZqKi+tDVQ6HtagwaGgu\nughcrloAfL7Il6d6HEpboDnDcRhwFlaakYXAYyLycUuFjDGFwJ3AGyFlRwB9ReQQY8wewD+BQ4wx\nw4GJwC7GmC0i8kJLdRXloIN8lJb6eeqpnLowFVjegddLA8NR73E4ndYYR25u4+emhuMab7xRwVFH\ntY1FgorSpOEQkfeA94wxOcDRwFRjTF/gGeA/IvJDjFo1wB+BqSFlI7A8EERktTGmvTGmWEQWA4tj\nrF9RmmT8eDfTp+ex667hHofPFx6uKikJNxxuN+RE2MepYagq6GmUlMCtt1YzdaoOLCv2JZrpuLXA\ni8CLxpjRwEzgUqBTLEIi4gW8xpjQ4i6E7yboAnYDYkrhbqedv1KlY6e+RKNz0kkwYQL07Fl/bGEh\nFBXl0KFD/XG//W0xJYGqcnOzqK2Fbt1K6nYGjLRToNPppEMHy9vYZZd8xo2zcmHZgVj+f00dmy7X\nQCbpZPwOgMaY3lghq1OxbujXAQuS1B4HkcdTFCUuOna0fq8NmUgeHBwPXwQYPsZRWxvZ49ixI/x1\n0EvRMQ6lLdCk4TDGjMcyGFnAY8DhIrIlQbpB47Ae6BpS3g3YEGtldkluliodO/UlFp3OnYv45Rdn\n3bEeTz5bt3rYuNEDWE9427eXUVmZA+RTU+MlO9vJli3ljXT+8IcsHnnEWhDo8/nYurUKKKK8vAqX\nq76+TGdn51WTHGamRrw053E8gOVhrAdOAU4JCTP5RWR4CzUd1M+YehO4EXjQGHMAsE5EKmKt0E4u\naqp07NSXaHWeew6qquqPLSqCwsIc2rcPr6ddu+CrLHJzw+sO/n3yyfWf8fmcdOxohap23bWA0tC7\naRPcfTdccsnOj2ttNFTVOjqZHKrqE/jtJwFTY40xQ4C5WJtTeowxE4ChwMfGmHexFv1NbknddnnS\nSJWOnfoSi07wucflsn7X1uaxbZuPTZs8ENgN0OUqo6rK8jjcbsvjcLkaexwW1pe7utrP1q2VQBGV\nlY09jjFjahk40Mvll+ez775eZsyoZv/9fVxySXrfHEA9jtbQyQSPI+MjsrqRk9JSJkyA/feHE06A\nroGAqd8Ps2dbazaMga1bYdOmyJ8Pjmfk5sLy5bDvvvDEE3DqqZH3N3I4YNQoePPN8M+nMzv9dulG\nThlLsjdySnvs8qSRKh079SUeHbc7ssexY4flcVRW+sjOpm4TqKY8Do/Hz7ZtlsdRUdHY46j/TAlu\ntweXqyrs8+mMehyp18kEj8NGuTwVJTaC6zhqGmRCr652BH5HnlHVkJyc+gfvnW36lGmsXKm3CKUx\ntrjM7TQoliodO/WlpTrFxdbe5MHV5ME1HsF1HDU1Tjp0iDw4HsqKFQ4cDquSDh0aD46HfiY3Nzvt\nBz5DOeqoIn74AXr12vmxOjieWRrxYAvDYRcXNVU6dupLPDo1NXls3+5jwwYvffoUsGhRBS4X1NRY\noarqaj9ZWT5crsomdEoC5WV8/bUTK1RVicvlpalQVW1tZoWq+vb18tRTtZx7bi3l5dZK+u+/d3Lg\ngdbiFw1VZaZGvNjCcChKS8jO9uP1OqiqsvYhD3oep55ay5YtDu65Jy/q0FNwR8DmNnI65ZRaRo3K\nrKTPN91Uw/nnF7BiRRYvvJBN794+vvoqiyOP9PDYY1U7r0CxJRkwr6N5dFaV0lKuucYKU+29Nzz0\nELz8cv1769dD9+4weDB88EHkzzsc1oys554DEejXDxYvhmHDoptslCmzqlwuOOII2LIlfIZZTQ3k\n5umsqkxFZ1XZxEVNlY6d+hKPTk1NLl4vrF7tp317Jy5X/Si52w1WKKk+tNRQZ9kyJz16+HC5YOtW\nB1BMbW0FLpePyKGqhqR/qCrY9vnzHZSXO/j97+szAC9cWMExEY4NJd2vgXTUyYRQlU6ZUNosTqeV\nq+qzz5yN9tYuDGwv3tS+GwB77OGj2JrFS0GB9bvIppnVu3f306+fj3feqU/scM89ec18QrEzGeAs\nN4+GqpSWcvPNVrhl/nx48UXYZ5/w9x0O+N3v4Jtvdl5XZaVlNNautWZn2SlU1ZAvv4T//tdaQOlH\nQ1WZioaqbOKipkrHTn2JR6e6OpeVK53U1GTRpUtFXSqSekrw+XzNLACsx++HMWPyyc6uDtRjr1BV\nKKWl1tjOihV5Vka7AO++W4HPZ3li9cem9zWQjjoaqlKUNMbphHffzebww71NPv1H+0zmcMCsWdW2\nWwDYHDffHL5y8rDDihg5srCVWqOkEjUcSpslO9vPjh0OevXyNXlMJoST0gm328HPPzv4wx8KmT5d\nx0DsSht6PlKUcIID2t27N2c4NG4fLZ06+di82cnYsQV88kkWH3+cxUknQXl5Fv37e9m40Um/fk2f\nayVzyPjnKR0cV1rKvHlw9tnw1lswYkTj9x0O6N/fGgyOlVgHx+fNg7POil0niDHWWpJEE2t23O+/\nhz59Gh925pnw2GNQUVE/Y01pXXRw3CaDYqnSsVNf4tHxeLKBAoqKynG5It0hS/D5vM2kHGmO2AbH\nR44sI57B8pNPruGWWxIfGoo1O641Pdnqx4EHeunXL4v58y2jAdbMs02bEn9NpPu1lm4a8WILw6Eo\nLaGw0DIWu+3W9GN1cylEEkmqdFLBU09V0r+/j86d/XTuXMIBB1Rz+eX5jB/vZu7cXD791MnChdkU\nFPjp0cPP7rv7Gq2jUdIbNRxKmyWYPr250ElJSWoioXYahB861Bv2+tRTa3E44Kyzapk3L4dRo+pX\nSXbp4mPs2Fr23NOd6mYqcWCj5xxFiY0BA7yMHl3b5Pv//W8FjzxSHZfGEUckJqnhk09WNvt+Ohue\nvDzLaAB8/nk5111Xw5Qp1lTejRudzJiRx9y5UWx80oZpuGdMa6OGQ2mzdO/u59FHmzYMxvgoLY3P\n43j88ZZlkD3jDDeDB9cbHbuEstq1g4sucnP99W4uv7z+bnjttflMmpTPU09ls2VLGlvBFPPJJ05O\nOKGA3r2LueCCfD75xInXu/PPJRubXI6Kkp7E4wnEMl8wPz/84G7d0n/M4PLL3Xz5ZTlnneVm0aIK\nBg/28uqr2QwZUsQFF+Tz7rtZbTqLic8Hl1ySzx/+4OHzz8vp18/HhRfms2CBjjDEjV9R0pAJE/x+\n8Pu93qaPsUyD3z94cP3ra6+1fp93nt9/6KH1xyxcWP938GfgwPq/Z80Kf69Hj/DX48Y1/nw0Pzsl\npoOj49df/f577vH799zT7zfG77/xRqv/27YlTCLtqKnx+9eu9ft9vvqyefOsayO0LJHEc9+1hemy\nyzS8VOnYqS/pqnPVVfDAAyVs3lzWjNdhTVt9+eWyRvmtqqvd1NY6CX5Ft2+vBMJH8YuLPXXv+3xV\nQEHdez6fj9CAwnHHVfLww7EvoIh1Om6j91v4vzntNBgzBj78MIvXXsvmuuucrFqVRc+ePo4+2sPY\nsbV06VJ/70vHayBaNm1ycM45BXz3nRO3G/be28HAgW6eeSabRx6pYvPm9PMebWE4FCVdaS5Udcwx\ntbzySvigcOhzoN/f+MOLFlUwYUI+33yTFVZ+6qkeLrmkaa0ePZJ/8ynt3C5yeRx1Hhv4qWNN4Gdm\nYnWaw1dUTOUVV1M1aUpS6r/hhjwOOMDLq69Wsn07/PxzCfPnwyWXuBk4MP2MBqjhUJSkEE0g4J57\nqpk2LfJ0GYcjch377OMjJ6exRlZW42ND6dkzOYMFvqJinBXlSak7XXBWlFN4+4ykGI7vv3ewbFkW\n//tfBQ4H7Lor7L477L13mk2jaoAOjitKEojGcLRrB7/9bf2Bl15awznnxFZHIsjJablQ5RVX4ysq\nTmBr0pNkGceXX87huOM8dRuCZQpp53EYYw4CzscyatNFZG0rN0lRUsLVV7spLa1PG7LLLs3f0Jsz\nLHfdVY3L5WDKlPpxjwMO8LJiRWPX5Pvvy+nRo2XpTqomTWn2STzVYw+bNztYsiSLt97KZsmSbHr0\n8DFypIeRIz0MGuSLeZZbU+G3RPHaa9lcdVV6exeRSDvDAUwALgB6AOcBN7RucxQldhLhLdx/fxWT\nJxewcGHkr2lzGsOHW5P9p4Tc07t29QGNDUdubjytTC86dfJz8skeTj7ZQ20tfPxxFq++ms2FFxZQ\nWQmnn17LmDG1dO7sx+mML+Hir7/CZ59l8dlnWXzxhROXy0H37n569vTRv7+P4cM9zW4lvHGjg2++\ncXLIIWmwMCNG0tFw5IhIrTHmF6BLazdGUVpCIjZ02nVXePDBKjZudPDTT01HlV96qflV5bFwww3V\n3HRTPsOGeTj//MxOA5KTA0OGeBkyxMv119ewYkUWL7yQzQknFLJ9uwOfz5o0MGCAdZM/4QRPs/+3\noPcRHIQvBfoBJ7ewfaXANrAekSO81xTJHqyPhpQZDmPMvsDzwF0iMidQNhMYDPiBi0VkOVBpjMnD\nOp0aplIykqIi+OGH+EM0RUXQp4+ftc18E4YMie6JNT9/58ccfLBV15NPtmzFe7qSkwODB3sZPNjL\njBlWaMjjgTVrnHzySRaPPZbDjBl5DBjgpXdvK2OAwwFX5haT506vwX9nRTkF981uVcORksFxY0wh\ncCfwRkjZEUBfETkEGAfMCrz1AHAvcB3wSCrapyjJIJ4wSMNUJwMHernssp3HwoMZfyPRXNqS887L\nbO+iJWRnw157+TjjjFpeeKGKxx6r4k9/8tCuHaxb52TdOievDrqO6pz0Grn2FRVTNbH1jAakzuOo\nAf4ITA0pG4HlgSAiq40x7Y0xxSKyEsuQKEqbZNWqcjp0CDcAxcVw1VXhN/dox1Hy8qwD+/Ztek3A\n2LHuZo2O3XE4YM89I6V3n0QZkwj6jokY7F+50sn99+cyeLCXsWMbJ9nMhP04UppNzBgzDdgsInOM\nMQ8Ar4jIS4H3lgHjROTrWOqMd+m8omQa++4Lq1bBsGGwZEm9AXE4rO1wq6rCy3JzreyqPp/1O+gJ\nzZ8Pp58eboA+/BCGDEndVGCl9bDLDoAOrLGOmMnUVAOtpWOnvthNJxoNj6cQyMLttlKO1B9fEtgj\n3VFX1qFDEUVF4HJVhNRgTb0dMaKMDz5whO1+mJ/vAIoT1k87/W9SpZMJHkdrGI7gVboe6BpS3g3Y\n0JIKS0tbvuVmW9WxU1/sprMzjeDMnzPPzKa4OPz44ENksOyrr6yxjU6dGtfZuXMJnTs31A56G4nr\np53+N6nSSVVfWkqqV447qA+PvQn8GcAYcwCwTkQqmvqgoijhXHABvP56eFnD4EPnztCpU3jZ/PnQ\nt29y26bYm5R4HMaYIcBcoDPgMcZMAIYCHxtj3gW8wOSW1m8XFzVVOnbqi910otHweq1QVePjSnA6\nw0NVkRg5Ek47zT7nzG46GqoKICIfAPtEeOvqVOgrip3o0cPPl19Gfu+ii9wMGpR5K5GVzCLj92jU\nWVVKW6Oiwpo51TAE5XDAnDkwaVLrtEvJLOwyq6rF2MVFTZWOnfpiN51YNKzNn0IpoaysGper8dqA\neHTiQXXSUyNe1ONQFJvgcMC998LEia3dEiUTUI/DJk8aqdKxU1/sphOfhnocdtDJBI9DN3JSFEVR\nYo+rGCUAAAloSURBVEJDVYpiE26/Hc4911rEpyg7I55QlS0Mh11c1FTp2KkvdtOxU19UJ301ADp3\nbtfi+7+GqhRFUZSYUMOhKIqixIQtQlWt3QZFUZRMQ6fj2iS2mSodO/XFbjp26ovqpK9GvGioSlEU\nRYkJNRyKoihKTOgYh6IoShtExzhsEttMlY6d+mI3HTv1RXXSVyNeNFSlKIqixIQaDkVRFCUm1HAo\niqIoMaGGQ1EURYkJNRyKoihKTOh0XEVRlDaITse1yTS8VOnYqS9207FTX1QnfTXiRUNViqIoSkyo\n4VAURVFiQg2HoiiKEhNpN8ZhjNkNuBt4U0Qebu32KIqiKOGko8fhBR5s7UYoiqIokUk7wyEimwBP\na7dDURRFiUzSQ1XGmH2B54G7RGROoGwmMBjwAxeLyHJjzHnAAOAibLC+RFEUxa4k1eMwxhQCdwJv\nhJQdAfQVkUOAccAsABF5SESmAMOAycCpxpjjk9k+RVEUJXaS7XHUAH8EpoaUjcDyQBCR1caY9saY\nYhEpD5QtBhYnuV2KoihKC0mq4RARL+A1xoQWdwGWh7x2AbsBX7dEI55l84qiKErspMPguANrrENR\nFEXJAFJpOILGYT3QNaS8G7Ahhe1QFEVR4iBVhsNB/UypN4E/AxhjDgDWiUhFitqhKIqixElSxweM\nMUOAuUBnrLUZW4ChwBXA4ViL/SaLyKpktkNRFEVRFEVRFEVRFEVRFEVRFEVRFEVp29hq8VzDlOzJ\nSNEeQeMg4HysGWrTRWRtInRC9EYCfwIKgZtF5IdE1h+i8wfgKKx+/ENEJEk6Y4ADgVJgtYjcmgSN\nrsA1QBZwf7ImXxhjpgPdgW3AYyLyaTJ0AlpdgRVADxHxJUnjUGACkAvcLiIfJ0HjYKxUQ9nALBFZ\nkWiNgE7St2dI9nc/RCclW03E8r9JhwWAiaRhSvZkpGhvWOcEYCJwM3BegrUAjgEuA2YCY5NQf5DR\nwAzgMeCQZImIyBMicgXW2p3ZSZIZB/wIVAK/JEkDrLVJVVhftPVJ1AHrGnib5D7sbQfGY+WXG5ok\njXJgEtb1/PskaUBqtmdI9nc/SKq2moj6f2Mrw9EwJXsyUrRHqDNHRGqxblBdEqkV4D6sC/MYrKf0\nZPEMcD/Wk/pbSdTBWDloNiVx/U5P4CmsL9vFSdIgUP/lWE+DlyRLxBhzBtb/pzpZGgAi8jkwHLiV\nQD65JGisAvKxblD/ToZGQCcV2zMk+7sPpG6riVj+N2m3A2AoCUrJ3uwTWgI0Ko0xeUAPYKeuagv0\nZgF/BfoCo3ZWfxw6nbEWZpYCFwDTk6RzEXA6MTxBtUDjF6yHogqsEF+ydJ4HlmA9qeclUceJ9f/f\nDzgVmJ8knXki8pox5n9Y//8pSdC4DrgNuFpEtkXTjxbqtHh7hmi1iPG7H4cOLe1LLDrGmF2wHhp2\n+r9JW8Oxs5Tsxpg9gH8Ch4jIQ4H3h2O5ju2MMVuAHYHXuxhjtojIC0nQeAC4F+tcXp2EPu2PtYiy\nGitckaxzdxbw90A/nkiWTuCY3iISVWinhX35DXAT1hjH35KocwzwCFYoYUaydEKO60US/zfGmKOM\nMQ8ARcC8JGncApQA1xtj3hGR55KkE/yeRvzuJ0KLGL778ei0tC8t6M+VQDui+N+kreEgcSnZm0vR\nniiNcUns00pgTJT1x6MzjyhuFvHqBMrPSXJf1gLnJrsvIvIK8EqydYKISCxjXC3pzxuE3GCSpHFt\nDPXHo9PS7Rli0VpJ9N/9eHTi2WoiFp2o/zdpO8YhIl4RqWlQ3AXYHPI6mJI9bTVaQ89OOnbqi910\n7NSXVGtluk7aGo4oSUVK9lSnfU+Vnp107NQXu+nYqS+p1kpbnUwxHKlIyZ7qtO+p0rOTjp36Yjcd\nO/Ul1VoZp5MJhiMVKdlTnfY9VXp20rFTX+ymY6e+pForI3XSduW4SUFK9lRotIaenXTs1Be76dip\nL6nWspuOoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKoiiKkhzSdgGgosSLMea3wBrg\nvQZvvSIid6S+RRbGmHOBaVgZSl/Cynx6lIgsDDnmdKzdGH8rTWxJaox5FFguIrMalAtWuvfjgGoR\nGZaMfihtl3ROq64oiWBTom+cxhiHiMSTfM4PPCIiNxljhgICnA0sDDnmDCyj1xwPYW3zWWc4jDGH\nAB4RmWGMmQ/8K452KkpE1HAobRZjzHas3RVHY6WVPkVEPjfWjml3ADmBnwtF5BNjzFJgJXBg4IYf\n3HN6A/Ah1pa17wKHici5AY0xwAkicmoD+aC37w98dogxpkhEKowxnYFdCUk8Z4yZApyM9Z1djbW9\n5ztAiTFmb7G2fQXLAD3UQENREkomJDlUlGRRAnwmIiOwdtY7L1D+H2BCwFOZTP2N2A+Uicjhgc/e\ngpX352isvD9+4HHgSGNMUeAzp2HlCmoOH/ACcFLIZ54ikJjOGHMQcLyIHC4ih/D/7d09a1RBFMbx\nv6bzBUVILxIfC/0SgigBQVtBjaCVYBFQtAl+AMFCSIigKaLBwkaMhYXgC4IWCga7A2oEtVBUsEpE\niMWZ0ZtlTTaJBlmeX7P37s7cO7vN2TMz3JOlak+UrGcMGABQljE9CIwv/acw65wzDut2vZLut7x3\nJn7Xcq6fvQX6JPUCAsYk1fYbJdV/73W9ZDvwJiK+AEiaBHaVjOEWcEjSTWBHRNxbYHz1utfJaadx\nsuLjATIIQAanvsb3WE9WdqO0fyrpLLmm8TgimkV6zP46Bw7rdp8WWeP4UV7rY6dngdl2fUog+V5O\n15KZQtWcFroMDJNPHp3oZJAR8VLSFkm7ga8R8bERuGaA2xFxqk2/D5JeAHuBw8BoJ/czWwlPVZk1\nRMQ3YFpSP4DSUKNJDRCvgG2SNkjqIes6z5VrTAE9wCC5u6lTE8AI84PNHLlu0l+nvySdLI/Lrq6S\n02w7gbtLuJ/ZsjjjsG7XbqrqdUQcZ365zLnG+VHgkqRz5OL4YEs7IuKzpAvAE2AamALWNdpdA/ZH\nxLtFxte87w1giNym+0tEPJc0DDyQNAO8J9c2qjtkpnGlZbfXapY8NjOzxUg6ImlTOR6RdLocr5E0\nKWnPH/oNSDq/CuPb2iZomq2Yp6rMlm8z8FDSI3I772gpxfmM3K210KL4MUkX/9XAJO0jMxhnHWZm\nZmZmZmZmZmZmZmZmZmZmZmZmZmb/j5/vcTG9skIRIQAAAABJRU5ErkJggg==\n", + "image/png": "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\nRETE6eQvWE4Yr8iVHuYAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1863,19 +1851,20 @@ "plt.title('U-235 Fission Cross Section')\n", "plt.xlabel('Energy [MeV]')\n", "plt.ylabel('Micro Fission XS')\n", - "plt.legend(['Continuous', 'Multi-Group'])" + "plt.legend(['Continuous', 'Multi-Group'])\n", + "plt.xlim((x.min(), x.max()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Another useful illustration are scattering matrix sparsity structures. First, we extract Pandas DataFrames for the H-1 and O-16 scattering matrices." + "Another useful type of illustration is scattering matrix sparsity structures. First, we extract Pandas `DataFrames` for the H-1 and O-16 scattering matrices." ] }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 33, "metadata": { "collapsed": false }, @@ -1907,16 +1896,16 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\nRK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1926,26 +1915,23 @@ "source": [ "# Create plot of the H-1 scattering matrix\n", "fig = plt.subplot(121)\n", - "fig.imshow(h1, interpolation='nearest')\n", + "fig.imshow(h1, interpolation='nearest', cmap='jet')\n", "plt.title('H-1 Scattering Matrix')\n", + "plt.xlabel('Group Out')\n", + "plt.ylabel('Group In')\n", + "plt.grid()\n", "\n", "# Create plot of the O-16 scattering matrix\n", "fig2 = plt.subplot(122)\n", - "fig2.imshow(o16, interpolation='nearest')\n", + "fig2.imshow(o16, interpolation='nearest', cmap='jet')\n", "plt.title('O-16 Scattering Matrix')\n", + "plt.xlabel('Group Out')\n", + "plt.ylabel('Group In')\n", + "plt.grid()\n", "\n", "# Show the plot on screen\n", "plt.show()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/docs/source/pythonapi/examples/MGXS-Part-III.ipynb b/docs/source/pythonapi/examples/MGXS-Part-III.ipynb index 4a8cfbc6b..2979c2b03 100644 --- a/docs/source/pythonapi/examples/MGXS-Part-III.ipynb +++ b/docs/source/pythonapi/examples/MGXS-Part-III.ipynb @@ -4,23 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This IPython Notebook illustrates the use of the **`openmc.mgxs.Library`** class. The `Library` class is designed to help automate the calculation of multi-group cross sections for use cases with one or more domains, cross section types, and/or nuclides. In particular, this Notebook illustrates the following features:\n", + "This IPython Notebook illustrates the use of the **`openmc.mgxs.Library`** class. The `Library` class is designed to automate the calculation of multi-group cross sections for use cases with one or more domains, cross section types, and/or nuclides. In particular, this Notebook illustrates the following features:\n", "\n", "* Calculation of multi-group cross sections for a **fuel assembly**\n", "* Automated creation, manipulation and storage of `MGXS` with **`openmc.mgxs.Library`**\n", - "* **Validation** of multi-group cross sections with **OpenMOC**\n", - "* Steady-state pin-by-pin **fission rates comparison** between OpenMC and OpenMOC\n", + "* **Validation** of multi-group cross sections with **[OpenMOC](https://mit-crpg.github.io/OpenMOC/)**\n", + "* Steady-state pin-by-pin **fission rates comparison** between OpenMC and [OpenMOC](https://mit-crpg.github.io/OpenMOC/)\n", "\n", - "**Note:** This Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook in its entirety, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries. In addition, this Notebook illustrates the use of Pandas DataFrames to containerize multi-group cross section data. We recommend using Pandas >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases." + "**Note:** This Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook in its entirety, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries. In addition, this Notebook illustrates the use of [Pandas](http://pandas.pydata.org/) `DataFrames` to containerize multi-group cross section data. We recommend using [Pandas](http://pandas.pydata.org/) >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases of [Pandas](http://pandas.pydata.org/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { - "collapsed": true + "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning: This call to matplotlib.use() has no effect\n", + "because the backend has already been chosen;\n", + "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", + "or matplotlib.backends is imported for the first time.\n", + "\n", + " warnings.warn(_use_error_msg)\n" + ] + } + ], "source": [ "import math\n", "import pickle\n", @@ -41,13 +61,6 @@ "%matplotlib inline" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Generate Input Files" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -111,7 +124,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "With our three materials, we can now create a materials file object that can be exported to an actual XML file." + "With our three materials, we can now create a `MaterialsFile` object that can be exported to an actual XML file." ] }, { @@ -216,7 +229,7 @@ "# Create a Universe to encapsulate a control rod guide tube\n", "guide_tube_universe = openmc.Universe(name='Guide Tube')\n", "\n", - "# Create fuel Cell\n", + "# Create guide tube Cell\n", "guide_tube_cell = openmc.Cell(name='Guide Tube Water')\n", "guide_tube_cell.fill = water\n", "guide_tube_cell.region = -fuel_outer_radius\n", @@ -239,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Using the pin cell universe, we can construct a 17x17 rectangular lattice with a 1.26cm pitch." + "Using the pin cell universe, we can construct a 17x17 rectangular lattice with a 1.26 cm pitch." ] }, { @@ -320,7 +333,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + "We now must create a geometry that is assigned a root universe, put the geometry into a `GeometryFile` object, and export it to XML." ] }, { @@ -389,7 +402,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Let us also create a plot file that we can use to verify that our pin cell geometry was created successfully." + "Let us also create a `PlotsFile` that we can use to verify that our fuel assembly geometry was created successfully." ] }, { @@ -454,7 +467,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAASWSURB\nVGje7Zs7buMwEEBzieRcaYaB48KVisSFj7Cn4BFU2I37LVan8BFc5ABb2ICtpSSaHP5EUqOAzsIO\nAjwEGjjiZ/hEDZ+eiJ9noHxe6fHvW4BPDmwHEMAaYBdAEb+5Amu/YNlyQLgP4xGhiG9avmwvsBF/\nt/FkY2vj69NLD1f41Z6Yiw3Gvy728ceVuhLhwY8bA0fij8EgO/6wjH2pF/lKxvf3tNG3Z+BRt4oH\nh/Znt5bu+iQd+/Z/Xp8BmiO8X0X/n7KQNbWIZ1wMJjEUPwBuuI1hfcMZxv9Pj19/AexrYH84KASF\nV41nhe8Ku/4f+nSpu3eNsdadjpBLFPF6pIE76Hx4QeiMfy/yVQi/cf6mxx900jk4ScfGlc4/q9v8\nc9sPxhpN4wn3n+qepeqeAK5x/3WZfieGx+8h6Uv8DCNHeAfjv3Q8q0VjwJCesrFbP2X+7NZPidAj\nE7hAyGTSFOvnLX8erfw9YCV+BL4p7DL1gH3SNvK3Z/0Qn3HE64dn/eLifx1Fd/62eP4NVyLsJx1C\nce2bf/7mfL+Kt6UB+ivtm+YasT88u6Yi2z+M+lrpT432J4F9pw+mZOH+rP3pLP2pEzFhaiCdzESG\ncOvBO5g/peMt6d2lYo39d0ivNUvwXyE6KhVb/ssh7r8LMRAs/1XrD0DcfxfiP8DrD54/AFV0/av6\neP/6acQH/NcTr/KH6JCYCnezMOi/8v5H/be7f9N/tdNyluC/sv3V+rnWTvuxUNj/tbax81+u0fDf\nSuttOt7B/Ckd3zVvb7rafzFq6XWxifqv0f8x/2XZ+PBfw39tFb5YyPTz//z+u9P+a+KnTvoO3sH4\nLx3fiyzXTutgbxrgx8F/bdNNR+2/Uq/YuH9dLRXW60cVk14DK2P/aJkinQ7yDfZfR3pH/Feg47/5\n32/6r196/cgVDu3/liK9DgLyX2260U5vMfr9dxvBh/+i+CzptVHE73V69WOj/ddBT/53toKdTV8j\n/5vrT9b+7/eun9P2f6P+m7T/G/GPkP/m481/6xHpHcNu/PJhKFbi18SFi2DhHcyf0vHYf09Sb4ON\n/iXR9d/J/U8Zf5dZxj91/s3ovzzqv3b+IfvvSNL1o5V/belNzP8P/5XxqdLhxdn9N6ZiQf+d6n8z\n+OeP919K+5P7nzr+Ss+f0vHU/EfNv8T8T11/frr/Uv1jFv+l+Ffp8V88ng9YwTT/pz5/EPuf+vz1\nH/pv1vM39fmfvP9A3f8oPn8Kx1P336j7f8T9x//Bf4n7z6T9b+r+O9l/qe8fSs+f0vHU91/U92+z\n+m/++8d7eX869f0v9f0z+f039f176fFfOp5xWv0Htf4E9fSU+hfsv1Pqb/D4h2n1P9T6I2r9E6n+\nilr/Ra4/o9a/lZ4/peOp9ZcbYv0nsf70pXUe2rLqX19acv0ttf7XfmjOrT+2kxbE/Dd4fmZC/TW5\n/ptaf156/pSOp55/mNF/Wx8y238vD//1+++k80fk80/U81elx3/peMZp5/+o5w8b2vlH7/7viP8m\nnJ/JPf9Zev/X9oes87fYf21MOf9LPn9MPf9cdv78A0xugrwgDfcHAAAAJXRFWHRkYXRlOmNyZWF0\nZQAyMDE1LTExLTI5VDE3OjIwOjAxLTA1OjAwddLLfAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0x\nMS0yOVQxNzoyMDowMS0wNTowMASPc8AAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAASWSURB\nVGje7Zs7buMwEEBzieRcaYaB48KVisSFj7Cn4BFU2I37LVan8BFc5ABb2ICtpSSaHP5EUqOAzsIO\nAjwEGjjiZ/hEDZ+eiJ9noHxe6fHvW4BPDmwHEMAaYBdAEb+5Amu/YNlyQLgP4xGhiG9avmwvsBF/\nt/FkY2vj69NLD1f41Z6Yiw3Gvy728ceVuhLhwY8bA0fij8EgO/6wjH2pF/lKxvf3tNG3Z+BRt4oH\nh/Znt5bu+iQd+/Z/Xp8BmiO8X0X/n7KQNbWIZ1wMJjEUPwBuuI1hfcMZxv9Pj19/AexrYH84KASF\nV41nhe8Ku/4f+nSpu3eNsdadjpBLFPF6pIE76Hx4QeiMfy/yVQi/cf6mxx900jk4ScfGlc4/q9v8\nc9sPxhpN4wn3n+qepeqeAK5x/3WZfieGx+8h6Uv8DCNHeAfjv3Q8q0VjwJCesrFbP2X+7NZPidAj\nE7hAyGTSFOvnLX8erfw9YCV+BL4p7DL1gH3SNvK3Z/0Qn3HE64dn/eLifx1Fd/62eP4NVyLsJx1C\nce2bf/7mfL+Kt6UB+ivtm+YasT88u6Yi2z+M+lrpT432J4F9pw+mZOH+rP3pLP2pEzFhaiCdzESG\ncOvBO5g/peMt6d2lYo39d0ivNUvwXyE6KhVb/ssh7r8LMRAs/1XrD0DcfxfiP8DrD54/AFV0/av6\neP/6acQH/NcTr/KH6JCYCnezMOi/8v5H/be7f9N/tdNyluC/sv3V+rnWTvuxUNj/tbax81+u0fDf\nSuttOt7B/Ckd3zVvb7rafzFq6XWxifqv0f8x/2XZ+PBfw39tFb5YyPTz//z+u9P+a+KnTvoO3sH4\nLx3fiyzXTutgbxrgx8F/bdNNR+2/Uq/YuH9dLRXW60cVk14DK2P/aJkinQ7yDfZfR3pH/Feg47/5\n32/6r196/cgVDu3/liK9DgLyX2260U5vMfr9dxvBh/+i+CzptVHE73V69WOj/ddBT/53toKdTV8j\n/5vrT9b+7/eun9P2f6P+m7T/G/GPkP/m481/6xHpHcNu/PJhKFbi18SFi2DhHcyf0vHYf09Sb4ON\n/iXR9d/J/U8Zf5dZxj91/s3ovzzqv3b+IfvvSNL1o5V/belNzP8P/5XxqdLhxdn9N6ZiQf+d6n8z\n+OeP919K+5P7nzr+Ss+f0vHU/EfNv8T8T11/frr/Uv1jFv+l+Ffp8V88ng9YwTT/pz5/EPuf+vz1\nH/pv1vM39fmfvP9A3f8oPn8Kx1P336j7f8T9x//Bf4n7z6T9b+r+O9l/qe8fSs+f0vHU91/U92+z\n+m/++8d7eX869f0v9f0z+f039f176fFfOp5xWv0Htf4E9fSU+hfsv1Pqb/D4h2n1P9T6I2r9E6n+\nilr/Ra4/o9a/lZ4/peOp9ZcbYv0nsf70pXUe2rLqX19acv0ttf7XfmjOrT+2kxbE/Dd4fmZC/TW5\n/ptaf156/pSOp55/mNF/Wx8y238vD//1+++k80fk80/U81elx3/peMZp5/+o5w8b2vlH7/7viP8m\nnJ/JPf9Zev/X9oes87fYf21MOf9LPn9MPf9cdv78A0xugrwgDfcHAAAAJXRFWHRkYXRlOmNyZWF0\nZQAyMDE1LTExLTMwVDIxOjAzOjIyLTA1OjAwMx3rxQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0x\nMS0zMFQyMTowMzoyMi0wNTowMEJAU3kAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -476,7 +489,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As we can see from the plot, we have a nice array of pin cells with fuel, cladding, and water!" + "As we can see from the plot, we have a nice array of fuel and guide tube pin cells with fuel, cladding, and water!" ] }, { @@ -490,7 +503,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define a 2-group structure using the built-in `EnergyGroups` class." + "Now we are ready to generate multi-group cross sections! First, let's define a 2-group structure using the built-in `EnergyGroups` class." ] }, { @@ -530,7 +543,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now, we must specify to the `Library` which types of cross sections to compute. In particular, the following are the multi-group cross section `MGXS` subclasses are mapped to type string codes mapped accepted by the `Library` class:\n", + "Now, we must specify to the `Library` which types of cross sections to compute. In particular, the following are the multi-group cross section `MGXS` subclasses are mapped to string codes accepted by the `Library` class:\n", "\n", "* `TotalXS` (`\"total\"`)\n", "* `TransportXS` (`\"transport\"`)\n", @@ -546,7 +559,7 @@ "\n", "In this case, let's create the multi-group cross sections needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define `\"transport\"`, `\"nu-fission\"`, `\"nu-scatter matrix\"` and `\"chi\"` cross sections for our `Library`.\n", "\n", - "**Note**: A variety of different approximate transport-corrected total multi-group cross sections (and corresponding scattering matrices) can be found in the literature. At the present time, the `openmc.mgxs` module only supports the \"P0\" transport correction. This correction can be turned on or off through the boolean `Library.correction` property which may take values of `\"P0\"` (default) or `None`." + "**Note**: A variety of different approximate transport-corrected total multi-group cross sections (and corresponding scattering matrices) can be found in the literature. At the present time, the `openmc.mgxs` module only supports the `\"P0\"` transport correction. This correction can be turned on and off through the boolean `Library.correction` property which may take values of `\"P0\"` (default) or `None`." ] }, { @@ -558,14 +571,16 @@ "outputs": [], "source": [ "# Specify multi-group cross section types to compute\n", - "mgxs_lib.mgxs_types = [\"transport\", \"nu-fission\", \"nu-scatter matrix\", \"chi\"]" + "mgxs_lib.mgxs_types = ['transport', 'nu-fission', 'nu-scatter matrix', 'chi']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Now we must specify the type of domain over which we would like the `Library` to compute multi-group cross sections. The domain type corresponds to the type of tally filter to be used in the tallies created to compute multi-group cross sections. At the present time, the `Library` supports `\"material,\"` `\"cell,\"` and `\"universe\"` domain types. We will use a `\"cell\"` domain type here to compute cross sections in each of the cells for our fuel and guide tube pin cells." + "Now we must specify the type of domain over which we would like the `Library` to compute multi-group cross sections. The domain type corresponds to the type of tally filter to be used in the tallies created to compute multi-group cross sections. At the present time, the `Library` supports `\"material,\"` `\"cell,\"` and `\"universe\"` domain types. We will use a `\"cell\"` domain type here to compute cross sections in each of the cells in the fuel assembly geometry.\n", + "\n", + "**Note:** By default, the `Library` class will instantiate `MGXS` objects for each and every domain (material, cell or universe) in the geometry of interest. However, one may specify a subset of these domains to the `Library.domains` property. In our case, we wish to compute multi-group cross sectoins in each and every cell since they will be needed in our downstream OpenMOC calculation on the identical combinatorial geometry mesh." ] }, { @@ -577,14 +592,17 @@ "outputs": [], "source": [ "# Specify a \"cell\" domain type for the cross section tally filters\n", - "mgxs_lib.domain_type = \"cell\"" + "mgxs_lib.domain_type = \"cell\"\n", + "\n", + "# Specify the cell domains over which to compute multi-group cross sections\n", + "mgxs_lib.domains = geometry.get_all_material_cells()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We can easily instruct the `Library` to compute multi-group cross sections on a nuclide-by-nuclide basis as was first illustrated in MGXS: Part II with the boolean `Library.by_nuclide` property. By default, `by_nuclide` is set to `False`, but we will set it to `True` here." + "We can easily instruct the `Library` to compute multi-group cross sections on a nuclide-by-nuclide basis with the boolean `Library.by_nuclide` property. By default, `by_nuclide` is set to `False`, but we will set it to `True` here." ] }, { @@ -603,7 +621,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Lastly, we use the `Library` to construct all of the tallies needed to compute all of the requested multi-group cross sections in each domain and nuclide." + "Lastly, we use the `Library` to construct the tallies needed to compute all of the requested multi-group cross sections in each domain and nuclide." ] }, { @@ -624,7 +642,7 @@ "source": [ "The tallies can now be export to a \"tallies.xml\" input file for OpenMC. \n", "\n", - "**NOTE**: At this point the `Library` has constructed nearly 100 distinct `Tally`. The overhead to tally in OpenMC scales as $O(N)$ for $N$ tallies, which can become a bottleneck for large tally datasets. To compensate for this, the Python API's `Tally`, `Filter` and `TalliesFile` classes allow for the smart *merging* of tallies when possible. The `Library` class supports this runtime optimization with the use of the optional `merge` paramter (`False` by default) for the `Library.add_to_tallies_file(...)` method, as shown below." + "**NOTE**: At this point the `Library` has constructed nearly 100 distinct `Tally` objects. The overhead to tally in OpenMC scales as $O(N)$ for $N$ tallies, which can become a bottleneck for large tally datasets. To compensate for this, the Python API's `Tally`, `Filter` and `TalliesFile` classes allow for the smart *merging* of tallies when possible. The `Library` class supports this runtime optimization with the use of the optional `merge` paramter (`False` by default) for the `Library.add_to_tallies_file(...)` method, as shown below." ] }, { @@ -679,7 +697,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": { "collapsed": true }, @@ -691,7 +709,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": { "collapsed": false }, @@ -717,7 +735,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", - " Date/Time: 2015-11-29 17:20:02\n", + " Date/Time: 2015-11-30 21:03:22\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -765,85 +783,11 @@ " 18/1 1.01476 1.02800 +/- 0.00664\n", " 19/1 1.01490 1.02655 +/- 0.00604\n", " 20/1 1.00926 1.02482 +/- 0.00567\n", - " 21/1 0.98504 1.02120 +/- 0.00627\n", - " 22/1 1.00397 1.01977 +/- 0.00591\n", - " 23/1 1.02556 1.02021 +/- 0.00545\n", - " 24/1 0.99808 1.01863 +/- 0.00529\n", - " 25/1 0.99638 1.01715 +/- 0.00514\n", - " 26/1 0.99615 1.01584 +/- 0.00499\n", - " 27/1 1.01843 1.01599 +/- 0.00469\n", - " 28/1 1.00315 1.01528 +/- 0.00447\n", - " 29/1 1.00633 1.01480 +/- 0.00426\n", - " 30/1 1.02159 1.01514 +/- 0.00405\n", - " 31/1 1.03395 1.01604 +/- 0.00396\n", - " 32/1 1.02672 1.01652 +/- 0.00381\n", - " 33/1 1.03778 1.01745 +/- 0.00375\n", - " 34/1 1.03807 1.01831 +/- 0.00369\n", - " 35/1 1.07854 1.02072 +/- 0.00428\n", - " 36/1 1.03524 1.02128 +/- 0.00415\n", - " 37/1 1.03100 1.02164 +/- 0.00401\n", - " 38/1 1.03853 1.02224 +/- 0.00391\n", - " 39/1 1.04089 1.02288 +/- 0.00383\n", - " 40/1 1.02150 1.02284 +/- 0.00370\n", - " 41/1 0.98470 1.02161 +/- 0.00379\n", - " 42/1 1.00658 1.02114 +/- 0.00370\n", - " 43/1 0.98652 1.02009 +/- 0.00373\n", - " 44/1 1.02787 1.02032 +/- 0.00363\n", - " 45/1 0.98800 1.01939 +/- 0.00364\n", - " 46/1 1.00286 1.01893 +/- 0.00357\n", - " 47/1 1.02559 1.01911 +/- 0.00348\n", - " 48/1 1.03729 1.01959 +/- 0.00342\n", - " 49/1 1.02538 1.01974 +/- 0.00333\n", - " 50/1 1.01478 1.01962 +/- 0.00325\n", - " Creating state point statepoint.50.h5...\n", - "\n", - " ===========================================================================\n", - " ======================> SIMULATION FINISHED <======================\n", - " ===========================================================================\n", - "\n", - "\n", - " =======================> TIMING STATISTICS <=======================\n", - "\n", - " Total time for initialization = 4.0000E-01 seconds\n", - " Reading cross sections = 8.4000E-02 seconds\n", - " Total time in simulation = 3.8366E+01 seconds\n", - " Time in transport only = 3.8351E+01 seconds\n", - " Time in inactive batches = 3.6930E+00 seconds\n", - " Time in active batches = 3.4673E+01 seconds\n", - " Time synchronizing fission bank = 1.0000E-03 seconds\n", - " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 3.8780E+01 seconds\n", - " Calculation Rate (inactive) = 6769.56 neutrons/second\n", - " Calculation Rate (active) = 2884.09 neutrons/second\n", - "\n", - " ============================> RESULTS <============================\n", - "\n", - " k-effective (Collision) = 1.01805 +/- 0.00261\n", - " k-effective (Track-length) = 1.01962 +/- 0.00325\n", - " k-effective (Absorption) = 1.01554 +/- 0.00339\n", - " Combined k-effective = 1.01711 +/- 0.00235\n", - " Leakage Fraction = 0.00000 +/- 0.00000\n", - "\n" + " 21/1 0.98504 1.02120 +/- 0.00627\n" ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ - "# Remove old HDF5 (summary, statepoint) files\n", - "!rm statepoint.*\n", - "\n", "# Run OpenMC\n", "executor.run_simulation()" ] @@ -859,12 +803,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and \"reading\" the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." + "Our simulation ran successfully and created statepoint and summary output files. We begin our analysis by instantiating a `StatePoint` object. " ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": { "collapsed": false }, @@ -878,12 +822,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry. This is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a `Summary` object and link it with the statepoint." ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": { "collapsed": false }, @@ -902,7 +846,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": { "collapsed": false }, @@ -930,12 +874,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The `Library` supports a rich API to automate a variety of tasks, including multi-group cross section data retrieval and storage. We will highlight a few of these features here. First, the `Library.get_mgxs(...)` method allows one to extract an `MGXS` object from the `Library` for a particular domain and cross section type. The following cell illustrates how one may extract the `NuFissionXS` object for the fuel cell." + "The `Library` supports a rich API to automate a variety of tasks, including multi-group cross section data retrieval and storage. We will highlight a few of these features here. First, the `Library.get_mgxs(...)` method allows one to extract an `MGXS` object from the `Library` for a particular domain and cross section type. The following cell illustrates how one may extract the `NuFissionXS` object for the fuel cell.\n", + "\n", + "**Note:** The `MGXS.get_mgxs(...)` method will accept either the domain *or* the integer domain ID of interest." ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": { "collapsed": false }, @@ -949,106 +895,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The `NuFissionXS` object supports all of the methods described previously the `openmc.mgxs` tutorials, such as Pandas DataFrames:" + "The `NuFissionXS` object supports all of the methods described previously the `openmc.mgxs` tutorials, such as [Pandas](http://pandas.pydata.org/) `DataFrames`:" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup innuclidemeanstd. dev.
3100001U-2358.063513e-034.062984e-05
4100001U-2387.335515e-034.459335e-05
5100001O-160.000000e+000.000000e+00
0100002U-2353.613274e-011.902492e-03
1100002U-2386.738424e-073.536787e-09
2100002O-160.000000e+000.000000e+00
\n", - "
" - ], - "text/plain": [ - " cell group in nuclide mean std. dev.\n", - "3 10000 1 U-235 8.063513e-03 4.062984e-05\n", - "4 10000 1 U-238 7.335515e-03 4.459335e-05\n", - "5 10000 1 O-16 0.000000e+00 0.000000e+00\n", - "0 10000 2 U-235 3.613274e-01 1.902492e-03\n", - "1 10000 2 U-238 6.738424e-07 3.536787e-09\n", - "2 10000 2 O-16 0.000000e+00 0.000000e+00" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = fuel_mgxs.get_pandas_dataframe()\n", "df" @@ -1063,39 +919,11 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\tnu-fission\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t10000\n", - "\tNuclide =\tU-235\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t8.06e-03 +/- 5.04e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t3.61e-01 +/- 5.27e-01%\n", - "\n", - "\tNuclide =\tU-238\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t7.34e-03 +/- 6.08e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t6.74e-07 +/- 5.25e-01%\n", - "\n", - "\tNuclide =\tO-16\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t0.00e+00 +/- nan%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t0.00e+00 +/- nan%\n", - "\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "fuel_mgxs.print_xs()" ] @@ -1109,7 +937,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": { "collapsed": true }, @@ -1123,32 +951,30 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The HDF5 store will contain the numerical multi-group cross section data indexed by domain, nuclide and cross section type. Some data workflows may be optimized by storing and retrieving binary representations of the `MGXS` objects in the `Library`. This feature is supported through the `Library.dump_to_file(...)` and `Library.load_from_file(...)` routines which use Python's `pickle` module. This is illustrated as follows." + "The HDF5 store will contain the numerical multi-group cross section data indexed by domain, nuclide and cross section type. Some data workflows may be optimized by storing and retrieving binary representations of the `MGXS` objects in the `Library`. This feature is supported through the `Library.dump_to_file(...)` and `Library.load_from_file(...)` routines which use Python's [`pickle`](https://docs.python.org/2/library/pickle.html) module. This is illustrated as follows." ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "# Store a complete binary representation of the Library and\n", - "# its MGXS objects in a pickled binary file \"mgxs/mgxs.pkl\"\n", + "# Store a Library and its MGXS objects in a pickled binary file \"mgxs/mgxs.pkl\"\n", "mgxs_lib.dump_to_file(filename='mgxs', directory='mgxs')" ] }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "# Instantiate a new MGXS Library from the complete binary representation\n", - "# stored in the pickled binary file \"mgxs/mgxs.pkl\"\n", + "# Instantiate a new MGXS Library from the pickled binary file \"mgxs/mgxs.pkl\"\n", "mgxs_lib = openmc.mgxs.Library.load_from_file(filename='mgxs', directory='mgxs')" ] }, @@ -1156,12 +982,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The `Library` class may be used to leverage the energy condensation features supported by the `MGXS` class and illutrated in earlier tutorials on `openmc.mgxs`. In particular, one can use the `Library.get_condensed_library(...)` with a coarse group structure which is a subset of the original \"fine\" group structure as shown below." + "The `Library` class may be used to leverage the energy condensation features supported by the `MGXS` class. In particular, one can use the `Library.get_condensed_library(...)` with a coarse group structure which is a subset of the original \"fine\" group structure as shown below." ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": { "collapsed": true }, @@ -1176,67 +1002,11 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup innuclidemeanstd. dev.
0100001U-2350.0743830.000280
1100001U-2380.0059590.000036
2100001O-160.0000000.000000
\n", - "
" - ], - "text/plain": [ - " cell group in nuclide mean std. dev.\n", - "0 10000 1 U-235 0.074383 0.000280\n", - "1 10000 1 U-238 0.005959 0.000036\n", - "2 10000 1 O-16 0.000000 0.000000" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Retrieve the NuFissionXS object for the fuel cell from the 1-group library\n", "coarse_fuel_mgxs = coarse_mgxs_lib.get_mgxs(fuel_cell, 'nu-fission')\n", @@ -1256,12 +1026,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Of course it is always a good idea to verify that one's cross sections are accurate. We can easily do so here with the deterministic transport code OpenMOC. We will extract an OpenCG geometry from the summary file and convert it into an equivalent OpenMOC geometry." + "Of course it is always a good idea to verify that one's cross sections are accurate. We can easily do so here with the deterministic transport code [OpenMOC](https://mit-crpg.github.io/OpenMOC/). We will extract an OpenCG geometry from the summary file and convert it into an equivalent OpenMOC geometry." ] }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1275,12 +1045,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now, we can inject the multi-group cross sections into the equivalent fuel assembly OpenMOC geometry. The `openmoc.materialize` module is seamlessly integrated to support the loading of `Library` objects from OpenMC." + "Now, we can inject the multi-group cross sections into the equivalent fuel assembly OpenMOC geometry. The `openmoc.materialize` module supports the loading of `Library` objects from OpenMC as illustrated below." ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1299,143 +1069,16 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ NORMAL ] Ray tracing for track segmentation...\n", - "[ NORMAL ] Dumping tracks to file...\n", - "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.854316\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.801593\tres = 1.522E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.761131\tres = 6.380E-02\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.731467\tres = 5.066E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.709897\tres = 3.910E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.695110\tres = 2.954E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.685966\tres = 2.085E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.681511\tres = 1.317E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.680926\tres = 6.520E-03\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.683509\tres = 1.046E-03\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.688659\tres = 3.848E-03\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.695860\tres = 7.565E-03\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.704674\tres = 1.048E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.714726\tres = 1.269E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.725700\tres = 1.428E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.737329\tres = 1.537E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.749388\tres = 1.604E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.761690\tres = 1.637E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.774081\tres = 1.643E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.786432\tres = 1.628E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.798638\tres = 1.597E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.810618\tres = 1.553E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.822303\tres = 1.501E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.833643\tres = 1.443E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.844598\tres = 1.380E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.855140\tres = 1.315E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.865249\tres = 1.249E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.874914\tres = 1.183E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.884128\tres = 1.118E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.892891\tres = 1.054E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.901206\tres = 9.920E-03\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.909080\tres = 9.320E-03\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.916523\tres = 8.745E-03\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.923546\tres = 8.194E-03\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.930162\tres = 7.669E-03\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.936387\tres = 7.171E-03\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.942236\tres = 6.698E-03\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.947725\tres = 6.252E-03\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.952869\tres = 5.830E-03\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.957687\tres = 5.433E-03\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.962193\tres = 5.060E-03\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.966404\tres = 4.710E-03\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.970337\tres = 4.381E-03\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.974006\tres = 4.073E-03\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.977426\tres = 3.785E-03\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.980613\tres = 3.515E-03\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.983580\tres = 3.264E-03\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.986341\tres = 3.029E-03\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.988908\tres = 2.809E-03\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.991293\tres = 2.605E-03\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.993509\tres = 2.415E-03\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.995566\tres = 2.238E-03\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.997475\tres = 2.073E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.999246\tres = 1.920E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 1.000888\tres = 1.777E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.002409\tres = 1.645E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.003818\tres = 1.522E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.005123\tres = 1.408E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.006331\tres = 1.302E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.007450\tres = 1.203E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.008484\tres = 1.112E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.009440\tres = 1.028E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.010324\tres = 9.496E-04\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.011141\tres = 8.771E-04\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.011897\tres = 8.100E-04\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.012594\tres = 7.478E-04\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.013238\tres = 6.903E-04\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.013833\tres = 6.371E-04\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.014382\tres = 5.879E-04\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.014889\tres = 5.424E-04\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.015357\tres = 5.004E-04\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.015789\tres = 4.615E-04\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.016187\tres = 4.255E-04\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.016554\tres = 3.923E-04\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.016892\tres = 3.617E-04\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.017204\tres = 3.333E-04\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.017492\tres = 3.072E-04\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.017757\tres = 2.831E-04\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.018001\tres = 2.608E-04\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.018226\tres = 2.403E-04\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.018433\tres = 2.213E-04\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.018624\tres = 2.038E-04\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.018800\tres = 1.877E-04\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.018962\tres = 1.728E-04\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.019110\tres = 1.591E-04\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.019248\tres = 1.465E-04\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.019374\tres = 1.348E-04\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.019490\tres = 1.241E-04\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.019597\tres = 1.142E-04\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.019695\tres = 1.051E-04\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.019786\tres = 9.670E-05\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.019869\tres = 8.895E-05\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.019946\tres = 8.183E-05\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.020016\tres = 7.528E-05\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.020081\tres = 6.922E-05\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.020141\tres = 6.368E-05\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.020195\tres = 5.857E-05\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.020246\tres = 5.385E-05\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.020292\tres = 4.954E-05\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.020335\tres = 4.553E-05\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.020374\tres = 4.185E-05\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.020410\tres = 3.848E-05\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.020443\tres = 3.537E-05\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.020474\tres = 3.253E-05\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.020502\tres = 2.989E-05\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.020527\tres = 2.746E-05\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.020551\tres = 2.526E-05\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.020573\tres = 2.319E-05\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.020593\tres = 2.134E-05\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.020611\tres = 1.960E-05\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.020628\tres = 1.800E-05\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.020643\tres = 1.652E-05\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.020657\tres = 1.518E-05\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.020670\tres = 1.398E-05\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.020682\tres = 1.283E-05\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.020693\tres = 1.178E-05\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.020704\tres = 1.083E-05\n" - ] - } - ], + "outputs": [], "source": [ "# Generate tracks for OpenMOC\n", "openmoc_geometry.initializeFlatSourceRegions()\n", - "track_generator = openmoc.TrackGenerator(openmoc_geometry, 32, 0.1)\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, num_azim=32, spacing=0.1)\n", "track_generator.generateTracks()\n", "\n", "# Run OpenMOC\n", @@ -1452,21 +1095,11 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "openmc keff = 1.017105\n", - "openmoc keff = 1.020704\n", - "bias [pcm]: 359.8\n" - ] - } - ], + "outputs": [], "source": [ "# Print report of keff and bias with OpenMC\n", "openmoc_keff = solver.getKeff()\n", @@ -1500,12 +1133,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We will conclude this tutorial by illustrating how to visualize the fission rates computed by OpenMOC and OpenMC. First, we extract OpenMC's volume-averaged fission rates from each fuel pin into a 2D 17x17 NumPy array." + "We will conclude this tutorial by illustrating how to visualize the fission rates computed by OpenMOC and OpenMC. First, we extract volume-integrated fission rates from OpenMC's mesh fission rate tally for each pin cell in the fuel assembly." ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1518,9 +1151,6 @@ "# Reshape array to 2D for plotting\n", "openmc_fission_rates.shape = (17,17)\n", "\n", - "# Compute volume-average rates from OpenMC's volume-integrated fission rates\n", - "openmc_fission_rates /= math.pi * fuel_outer_radius.r**2\n", - "\n", "# Normalize to the average pin power\n", "openmc_fission_rates /= np.mean(openmc_fission_rates)" ] @@ -1534,7 +1164,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1568,45 +1198,31 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Plot OpenMC's fission rates in the left subplot\n", "fig = pylab.subplot(121)\n", "pylab.imshow(openmc_fission_rates, interpolation='none', cmap='jet')\n", - "pylab.grid()\n", "pylab.title('OpenMC Fission Rates')\n", "\n", "# Plot OpenMOC's fission rates in the right subplot\n", "fig2 = pylab.subplot(122)\n", "pylab.imshow(openmoc_fission_rates, interpolation='none', cmap='jet')\n", - "pylab.grid()\n", "pylab.title('OpenMOC Fission Rates')" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/docs/source/pythonapi/examples/images/mgxs.png b/docs/source/pythonapi/examples/images/mgxs.png new file mode 100644 index 0000000000000000000000000000000000000000..3946a5b3c6d3c28579957643f8a15507de01b98e GIT binary patch literal 54562 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

%vLND}1}pwwjk{lj&T z*7!lS&)+m2GANM1m;!#LP=Oi95#Y|>j6{Wp#eod~_UXiEjkno*jbw@u&Z7clKQ9ba z3qG#Dn(%iRSihf{RIst*)z!cEdET(MKf`TV(yRepw0ECJT_;K3h<2qt00-}qN1Fn& z*`D-o4A6PI&6Wq4JPp9&2zeAQBP%d}?Non``tX;jP%vxMjx$;dP6ct(d<+5ZLW-UU zR$x^K<+}G~fD70?a&HB@dx>21ydFKuE&+@z>1tc%|3ti3Ry7w93WsDJ7FKsa_fKH!YKdtVcd0E6J2e` z{*FwX^7lhG(3p=DclguJYTI9UIx{=6Ae2Fr0kEP}IXp2Ly%r}ZNvr{NfEs@wPI(a% zdDkK?J}T<>dmiG0T`n%#&;NiZig*r z2k;EMr;)J)#g=(o)j!Z@mY|)bZbId!9Yjs0 z-Q4}+qx;fCMTu>?c3Zp!RiwH;)wldC zc5Y~C;S6Gld$x+_w~prXgWbsQuHmzW8d|=L*^A<%9$O!^UDw|@gEBg?!|lMVL5DLa zgq~2Rovxv5?rHe$g?5kf ztWz-Wd}mtP@8G-=uwlPQhd-ct+mMnQ&CK@nL5O5hhSTT!kB8UxVieckDl%|`Pu> z!OHwk$qKDM;?Q*xbCi9NksPgI7&TKRM4l3NpR_6XsceJ_b{AQ$Ibq~yos?FglEA+)j*q?t3S@mxB_z&*``@}{ z8@sfCTwPXhx#$LcEtt4!$8#lI(2&Ud*ZSXRc-$4Lu+xaqRA&Fq#(IhA_L+*{{JG#z z96XxndFe2t)OTos9wd_W2|c010-_^-1k>s(B@owVG8!n&Vj(-?s593wS-Wv^j2W|f zp~o;R@h65ue|!7=rDvL1tdS>RcCbYyfPxUGwbG%CK#s`+2nw)3eX!|x5E*S=5dc*H zEJ^u{*C{sT99=LD%dFVGeDOjI^m5@H*Qvpj++uP*q*I3Dnk>K(*IJmtu*({`e|#|6 z#!Y5DM`BB>(?!d8up>TPLMS2?h!9j<;z1|tJ)JFYpA1ERa9X$@XiCq)+xpXMgH)ET zygYHLvoyEb>hVV>Q%daKJI8+e_Lsc8_nvFUJ0a7G5JFql+|xVyb;icIi4_6X=~E(S4V z)70R5lWi{-QX|d#o+us~_O)*3qj^Ggl{WIs$1YXlye=|k@JpmvK6_%?=k{F6kI1ab zY*yBx^7RF=ibOkI6_W0=@x(b*FC;QNj!fppH6_w*tgDo6%z1u9mb4)m?vv2nE67N< zvN-*^XfD0ytyR_$9-;BR%a^MuDNt);wYvyuw28E2tsfK?cIU-x#1>nMCW6-5#nVH~ zo$K7t4_qJwN$U;mN}ddti?SE`6WT~M(=Qsj4V{;&>3{nP_MJj_FxiG`G`R!ao08m1 z0ogZxMof1EXjE$r@oWv4?j3){+189_-59v@@6a@rv@V@PAR$^qI&Ox5!GKq#(l@B7GrF70tk$B(zgjidjXGrh*74T5WG-f7Ll(_Fob=`ax7m!c z;CEz6VQ$}Bx2`r&)}XpT_Y#&(C(`d_EA*Pt8L zcxvejuhRuhss07A6~oV|BWY?gRjiTvR%7-hvd++mL6+BH{tV8!GR*0&)`$L|nufJ1 zjh=ovsuw&fIb1sLD9Ca{#<*&ErE;=?n7Q@_`Ak09zrx42NLgm^+Wh<*48IVE!YFu% zSSbP6Irp*sg=jAPqD@8yO=NIL(W(3@x(fucM#4w72LvRUnO6jdYn}&3%#hM($GsM$ z92(&`{G40Mu*VzF5xea!`|_^2+Vt!TZ3aP6SgXvP!@b~;iA6X5y`3v|JO{4NUZzD= zBjSk)4frA&FWgYv9Fo`+Fc=qZ0hTkxE%a33^+m^ta6&7)a|JpmVn(Hd!EdbyKJzv% z%=Vc_sa-RM!5TlC5BMh|z{J#@6N_P83cnC9$nsX>h!oNqb4u-!eAVxrqbePguWyD3 zTxbdcptg9t9B*|#Np<^RDY0>-y|Nx(g#+GII4T-vQZ>z56*t>lLdy1@d8C)*G8lqL zl{_xovAIg&gO_>G;NSNdAjW}i2UUI3z6!e|{Gyu+p`VRJ4QF;;Ew}pCW(RAhVQtY+xS0^2(#ZnKZv^m0#pjGl#)BZ-<0OTNi)$I_e=D*ud5aNhPU9s8{m z$Ta7<-0cW7+ufgK-9%KJo^LZ7V7!IizDgB){QKvXK5s1Vz)_#PcpD_y})4_$8A zypMp|k!R_6T-{JHr`1(8>wtHXDZiD61%f%g_>H+8fQ;|p zpgD6O2YHXVC;x@mL+Ta7bf(rv9hTWq{(_DoELj63?3)HX3Maof@^qw(jYA%>x~{}9 zIgegJ(vz4)&jW9ur`E&c0I$7G7yQXUfabfST>;K**o?g}T)0=vW$&N<#NqGH=m+bo z6yw=fS);B4rNlo9^p%>dzpma#6{`>TN$xTWDG`ON&Fm(3*I)VI#az=9y|0^J8^}WFE~5n zxfM4qcqdp!%v>>S>r9NW7=2>EQtkQxRaK(IR-F((V_ALV_3Pm`ygV1KA`4>npSKc> zNIxQQ0jP)d)=W0r1uAq_no!!dKEO9QA#mGId%^JXB-ysiMwr&2A;I;)rp%Snb_KVO z7yLp+xg$9vX6p2&qcjD%Mpc5I*}ap78Vt2T(h6s8a8z*DXV%cW}YTwFn89OJT54iuVD zrO6|cvlfH-K9Auj-DW~h^ch!W{_GKt>ipJevo^-t#-zjbDPsL#xOhFt! zEPbsyaVnu#_lq>Sr`%}0ymXDD)V{+d1NR{IZC<(G4F!66df^$DHd^q+nP<*@ZaO%q z&S29)eKa6`vK9jSs_Pi%4Q;C6t$Qg^{*`*`FLqc-oz#)trl?kw^Mcgh0k_3+hx-9A z0-=g---wVya=ih19~Qi>;q;3f3@gnLT9L6T7+xK%xI2n?*^4{6>Fpk+Gtc|X=#1a# z&RbQ>{rF@#NAkQjj5Bzr?RD9< z%5EKT5@Qcy>g~4ck54^h8U{n^C>M4nA`}ilYZq83Yiys~OkXRv@t*68FKgQbq|M&4 zg$KbyNEm?CR~wGBfNDVkI`DmJob!`5+l+i?-U{~cUKx(LRQ^vIjGYXSNpPII(ia9< z;&5yv&Au(8S8X<&@hzZEUxoU`L6i@Ag_N8Atj+k6X)#q7k&?c^eS-?UAKqyWcFgOOE|d045}hyXox!af6kWwQRzh;8fp; zUZG$BNNOA#=ek%~w|)j%j@q%>J?xAwF^e7>y|WugD5yWwC`(-(MWaYCdZDmYQa$!v zg%o#BT{dZVHJ3jV{t8JXas^0c@owAH3BOZA`Ddt{`*VlJYCS|=<+H96cqh;=4`)(L zV>AfJZt(Efk-UgBw2MNw*mBA;=lc`gA|q^XD~j!QblGVVmMue;bXzd6+((ON^x}KJ zmxd7v9R;S_1y`p50?F&K+rTLHWWo*D4RkI``2pQ5*WLrJ;O|)kMrCs{Hgi4HywGRa zr5QHs<3H8UBkoR}yB{UMXaGpt8R;0)t7sGt7M>Fzq6J4Gf_5oD1xkk9;ECitrAAhd#(_HY-T8Gr;p05KJMdz|KxS#ntrGjGJ4%>8#6BiT(-# zZ&kkx@80{k+g9X;uG1en|0!%fgH`WKX2$Cp;rj;rX~_(QK?r}^$_asO+vqd7e=nnF8pRIgx#@|z&euhtze$PQWTx;fN>F6` z%#8;;@upy(pRez)3gs%EC(%XWUG(HN5mTBfHY3n}I7 z^B?756g4z&R7X!mndDpn?0<5Iz&oAL2luA?VR?GAcp3M~H~tNT zQ#Zb_SxKOPyNi!|M$HDz8)Mu3xF~4WMOc(1ik`oQ)!IIH%9~U%h@QY<~YO6#gfYyNzP z;D96^n0|NKVg(~<&C9%iZCueMBmLmez4mX?tW&N~)tTTzZ&D*h!zbF@*crF?Q4@w* zwN%WluUqm_JF+CVJV^{`EeK^7GQ#bvJzbnOC=-*(%-ln%Hrv}9CQ23GJ2`D{6NbEIN#cnsKb5aqs(M?HLPcV5c?MA#os)o} zQ<_T|{O5~4&R78|a~&8W8$I#IJYCMXl+?nmW&hlx4cF%JZnJUm2`q$xlnq(0wh3R} z=c*y45>Uv#cX4W7{h_69g=#5taU1CT4uie8!nS#p6>iF#`&)94-sE!I`?cUcE#1`x{$(@6F*cOuAz(G8qYvs+vL;U;qM1J$ca_QvZ#$=q!!(&Q0Ce>1v zsQLC&s@a+!km=pmyscE0U!S-GWM^{LaHcRLL;EOMFRD52!Gim&>_a!RA+m&b%(Ir4 zAM)CsO6zcGKTWiflbqA;9_9bN#H?$F5?3@&Tupz!kxUL3B)Ol#Kq=XA;3{m~klT%p zNJ_d2&MY}F{sCQB;|Hm4g#G|$pXhps;6zHK!s7>({H0=-1#E#TGccS%P)t2&yL5`T zxOK@MKj(nHgr+NlqL8fK28CABXOnkX(-Ma&?Ql|zt$WP{UW~jl-f&4K#x^Gu<9ZP5 zyzGUO5$A+@E|Xb3ZdGRIBE{cxW4KgmTocmg-ZgOCgY?Pxu)5UK@Z-q;t0-p z2zi1(mCptW$iWjD9mOp`abdG3#g7+0h*y-O_x`Ovm{;AGLu>2l3(J z%PdA4ljXBoEhPHKb27r;Z-O9f7jv*ydqPk;ZhpeqYI^7Fk`Yk{(tME1I?moQN-9&y zxR#{eJ=Mj&t}Ax(&_;WZt9bcPesVf|a?oJ1?m$aRk^11Bf9G%1EN9JIGxt~+jT@@v$r1pcP0{i!}Zgg zU4M4mN#}-|j8Ms^2?P(z(%*@lDtnepl=(f5n3|gK*Y|rCembFc+s=CTa2iceHa6nS zoprv^^Dl#mvXiDKhZhzihB8edZAasDGDB-{Fx>F>Iy611pTr~Yq17e2qz@MJeqbvZ z_wV(9h#NXDgtEjrdIJx8oKVL5DHag$_rNGBfZ}*&-9#y9tC}2}sH< ztuK67+Ura@+uMI)Q(#0k@QUTKso2NCqTIn>AgbR=A}%HVNdaFL1ag&rlwt{k4vt znZNp;>Jjtv+L!ACG{v5GKg(kL%ohbR)`d^i9Cg~?P@}0VbW&T=x|y2LT*`LAV8e0W z)&gxir0K5?XUgwi^C4%5{sn$(F!K%(KJaFmL&VHeW_$X$OjKM|q;y(PFfhwF3&0U^ z)&`W!mC*)vqfr&4=7u#x$C*Yg?%43;5CaLz#vxf<0UD{H4~);oeW#bkzlW`|El{%Q zld81fdX8!j*Ax!meLc0E9&wGYC1G!eSF>7$97*bH%ap?t8h<#=f+a`2pphf-_3cW; zIsC-|0T!ookxES3cWd8>D+7qtk@K;FQscExDU0KcP|-uDyMho>LzuSC06sKxj1T>9 ze#f+LVRTDTG;>1|50urDhtlzS@|l;$M%QdGIcuX1!J$xS9KM%_DIjt<)O{h&VxJ#9 zqq%JS?E)wu_93JJzkemRR~1m2u&akH81lQ4#BT+&;EM^V*^)cecs-H4TG`VZod0^m%tlbPOG1f{vCQK^bHrY2_5mMx#n|Wo<^Qo?7y4u=JK+% z-NdQn@z8FG@mUzFIr>U4&r8P85OeP_vCOF@I9Ii~5j(DVBzWL|C`u7GSW#VS|f;np7yH ziy;=d3vu~Oah7kAD(32+$Xi~0bi0&qbiH9#MKdqYk z4RL5KtK6UT9pK>Z5kkb+KfK7I6y=Y!|9~_aHnGGZ|4AK>nZ6%>Eqi@a7tM(!P3GGdXn-1i8 z`G_XsH*l`)xnfPc=Se?b#L~n8!VX(kbC?-RtnDSJO>8~;$b_$iK%TK!Jy)yAE_)b% zvaa%c;hB1N+piKc5?lVjw{}r@keC_q@Yoy^w6p6Eo0rZFXhw`%;w%m6#l~sRAPfv( zjPHE5@8pz!PJ&Auz{XV#ZSkOyU>mfHXn#k}HURZZfd5Q0p6udb0eF7;C*8^l3Y}0o zdT$2SmXsvqn;IZq{Q8@o+w94T9os+9ZqWLEsZU~(X4}V6Na>KfQo7PyQrw9Fr!QnaoOR3N*|4Q{x=#?#g#b$ z8p{C?06^IaSO?zVi8;mTaqL=RI#>_r%qD1w1w;dVF^LKpXxjztz9=q(@}9#iMs1H* z3+k%>UY&>L37toB=!MpC5i$60-sEYCF1Yc=FRf?iD9uyv?QL&&v>F?V5Y6nO^FMOs zyYSgAT&`f};IQ785z-f6W-dYAVUM-B#RW< z7VaCgD`it5jkk&tl9IduN`q}V0B|ELGoQQ7S(@SiIxmF9$IAiH0(dg!y%!3hI;WtZ zkOz;Jc^F$ElFbXZO(O-s$nU?IuYIHbC#%0A3-Pt4rTcE=AKUMLd$2cL5vTThF>c9x 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 Date: Mon, 30 Nov 2015 21:31:34 -0500 Subject: [PATCH 21/49] Sphinx documentation updated with new MGXS ipython notebook trio --- .../pythonapi/examples/MGXS-Part-I.ipynb | 1172 ---------------- .../pythonapi/examples/mgxs-part-i.ipynb | 1202 +++++++++++++++++ .../source/pythonapi/examples/mgxs-part-i.rst | 13 + ...{MGXS-Part-II.ipynb => mgxs-part-ii.ipynb} | 0 .../pythonapi/examples/mgxs-part-ii.rst | 13 + ...GXS-Part-III.ipynb => mgxs-part-iii.ipynb} | 482 ++++++- .../pythonapi/examples/mgxs-part-iii.rst | 13 + .../examples/multi-group-cross-sections.rst | 11 - docs/source/pythonapi/index.rst | 4 +- 9 files changed, 1687 insertions(+), 1223 deletions(-) delete mode 100644 docs/source/pythonapi/examples/MGXS-Part-I.ipynb create mode 100644 docs/source/pythonapi/examples/mgxs-part-i.ipynb create mode 100644 docs/source/pythonapi/examples/mgxs-part-i.rst rename docs/source/pythonapi/examples/{MGXS-Part-II.ipynb => mgxs-part-ii.ipynb} (100%) create mode 100644 docs/source/pythonapi/examples/mgxs-part-ii.rst rename docs/source/pythonapi/examples/{MGXS-Part-III.ipynb => mgxs-part-iii.ipynb} (58%) create mode 100644 docs/source/pythonapi/examples/mgxs-part-iii.rst delete mode 100644 docs/source/pythonapi/examples/multi-group-cross-sections.rst diff --git a/docs/source/pythonapi/examples/MGXS-Part-I.ipynb b/docs/source/pythonapi/examples/MGXS-Part-I.ipynb deleted file mode 100644 index 3eca44a26..000000000 --- a/docs/source/pythonapi/examples/MGXS-Part-I.ipynb +++ /dev/null @@ -1,1172 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This IPython Notebook introduces the use of the `openmc.mgxs` module to calculate multi-group cross sections for an infinite homogeneous medium. In particular, this Notebook introduces the the following features:\n", - "\n", - "* **General equations** for scalar-flux averaged multi-group cross sections\n", - "* Creation of multi-group cross sections for an **infinite homogeneous medium**\n", - "* Use of **tally arithmetic** to manipulate multi-group cross sections\n", - "\n", - "**Note:** This Notebook illustrates the use of [Pandas](http://pandas.pydata.org/) `DataFrames` to containerize multi-group cross section data. We recommend using [Pandas](http://pandas.pydata.org/) >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases of [Pandas](http://pandas.pydata.org/)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introduction to Multi-Group Cross Sections (MGXS)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Many Monte Carlo-based neutron particle transport codes, including OpenMC, use continuous energy nuclear cross section data. However, most deterministic neutron transport codes use *multi-group cross sections* defined over discretized energy bins or *energy groups*. An example of U-235's fission continuous energy cross section along with a 16-group cross section computed for a light water reactor spectrum is displayed below:\n", - "\n", - "\n", - "\n", - "A variety of tools employing different methodologies have been developed over the years to compute multi-group cross sections for certain applications, including NJOY (LANL), MC$^2$-3 (ANL), and Serpent (VTT). The `openmc.mgxs` Python module is designed to leverage OpenMC's tally system to calculate multi-group cross sections with arbitrary energy discretizations for fine-mesh heterogeneous deterministic neutron transport applications.\n", - "\n", - "Before proceeding to illustrate how one may use the `openmc.mgxs` module, it is worthwhile to define the general equations used to calculate multi-group cross sections. This is only intended as a brief overview of the methodology used by `openmc.mgxs` - we refer the interested reader to the large body of literature on the subject for a more comprehensive understanding of this complex topic." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Introductory Notation\n", - "The continuous real-valued microscopic cross section may be denoted $\\sigma_{n,x}(\\mathbf{r}, E)$ for position vector $\\mathbf{r}$, energy $E$, nuclide $n$ and interaction type $x$. Similarly, the scalar neutron flux may be denoted by $\\Phi(\\mathbf{r},E)$ for position $\\mathbf{r}$ and energy $E$. **Note**: Although nuclear cross sections are dependent on the temperature $T$ of the interacting medium, the temperature variable is neglected here for brevity." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Spatial and Energy Discretization\n", - "The energy domain for critical systems such as thermal reactors spans more than 10 orders of magnitude of neutron energies from 10$^{-5}$ - 10$^7$ eV. The multi-group approximation discretization divides this energy range into one or more energy groups. In particular, for $G$ total groups, we denote an energy group index $g$ such that $g \\in \\{1, 2, ..., G\\}$. The energy group indices are defined such that the smaller group the higher the energy, and vice versa. The integration over neutron energies across a discrete energy group is commonly referred to as **energy condensation**.\n", - "\n", - "Multi-group cross sections are computed for discretized spatial zones in the geometry of interest. The spatial zones may be defined on a structured and regular fuel assembly or pin cell mesh, or an unstructured mesh such as the constructive solid geometry used by OpenMC. For a geometry with $K$ distinct spatial zones, we designate each spatial zone an index $k$ such that $k \\in \\{1, 2, ..., K\\}$. The volume of each spatial zone is denoted by $V_{k}$. The integration over discrete spatial zones is commonly referred to as **spatial homogenization**." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### General Scalar-Flux Weighted MGXS\n", - "The multi-group cross sections computed by `openmc.mgxs` are defined as a *scalar flux-weighted average* of the microscopic cross sections across each discrete energy group. This formulation is employed in order to preserve the reaction rates within each energy group and spatial zone. In particular, spatial homogenization and energy condensation are used to compute the general multi-group cross section $\\sigma_{n,x,k,g}$ as follows:\n", - "\n", - "$$\\sigma_{n,x,k,g} = \\frac{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\sigma_{n,x}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\Phi(\\mathbf{r},E')}$$\n", - "\n", - "This scalar flux-weighted average microscopic cross section is computed by `openmc.mgxs` for most multi-group cross sections, including total, absorption, and fission reaction types. These double integrals are stochastically computed with OpenMC's tally system - in particular, [filters](https://mit-crpg.github.io/openmc/pythonapi/filter.html) on the energy range and spatial zone (material, cell or universe) define the bounds of integration for both numerator and denominator." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multi-Group Scattering Matrices\n", - "The general multi-group cross section $\\sigma_{n,x,k,g}$ is a vector of $G$ values for each energy group $g$. The equation presented above only discretizes the energy of the incoming neutron and neglects the outgoing energy of the neutron (if any). Hence, this formulation must be extended to account for the outgoing energy of neutrons in the discretized scattering matrix cross section used by deterministic neutron transport codes. \n", - "\n", - "We denote the incoming and outgoing neutron energy groups as $g$ and $g'$ for the microscopic scattering matrix cross section $\\sigma_{n,s}(\\mathbf{r},E)$. As before, spatial homogenization and energy condensation are used to find the multi-group scattering matrix cross section $\\sigma_{n,s,k,g \\to g'}$ as follows:\n", - "\n", - "$$\\sigma_{n,s,k,g\\rightarrow g'} = \\frac{\\int_{E_{g'}}^{E_{g'-1}}\\mathrm{d}E''\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\sigma_{n,s}(\\mathbf{r},E'\\rightarrow E'')\\Phi(\\mathbf{r},E')}{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\Phi(\\mathbf{r},E')}$$\n", - "\n", - "This scalar flux-weighted multi-group microscopic scattering matrix is computed using OpenMC tallies with both energy in and energy out filters." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multi-Group Fission Spectrum\n", - "The energy spectrum of neutrons emitted from fission is denoted by $\\chi_{n}(\\mathbf{r},E' \\rightarrow E'')$ for incoming and outgoing energies $E'$ and $E''$, respectively. Unlike the multi-group cross sections $\\sigma_{n,x,k,g}$ considered up to this point, the fission spectrum is a probability distribution and must sum to unity. The outgoing energy is typically much less dependent on the incoming energy for fission than for scattering interactions. As a result, it is common practice to integrate over the incoming neutron energy when computing the multi-group fission spectrum. The fission spectrum may be simplified as $\\chi_{n}(\\mathbf{r},E)$ with outgoing energy $E$.\n", - "\n", - "Unlike the multi-group cross sections defined up to this point, the multi-group fission spectrum is weighted by the fission production rate rather than the scalar flux. This formulation is intended to preserve the total fission production rate in the multi-group deterministic calculation. In order to mathematically define the multi-group fission spectrum, we denote the microscopic fission cross section as $\\sigma_{n,f}(\\mathbf{r},E)$ and the average number of neutrons emitted from fission interactions with nuclide $n$ as $\\nu_{n}(\\mathbf{r},E)$. The multi-group fission spectrum $\\chi_{n,k,g}$ is then the probability of fission neutrons emitted into energy group $g$. \n", - "\n", - "Similar to before, spatial homogenization and energy condensation are used to find the multi-group fission spectrum $\\chi_{n,k,g}$ as follows:\n", - "\n", - "$$\\chi_{n,k,g'} = \\frac{\\int_{E_{g'}}^{E_{g'-1}}\\mathrm{d}E''\\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\chi_{n}(\\mathbf{r},E'\\rightarrow E'')\\nu_{n}(\\mathbf{r},E')\\sigma_{n,f}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}{\\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\nu_{n}(\\mathbf{r},E')\\sigma_{n,f}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}$$\n", - "\n", - "The fission production-weighted multi-group fission spectrum is computed using OpenMC tallies with both energy in and energy out filters.\n", - "\n", - "This concludes our brief overview on the methodology to compute multi-group cross sections. The following sections detail more concretely how users may employ the `openmc.mgxs` module to power simulation workflows requiring multi-group cross sections for downstream deterministic calculations." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Generate Input Files" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "import openmc\n", - "import openmc.mgxs as mgxs\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate some Nuclides\n", - "h1 = openmc.Nuclide('H-1')\n", - "o16 = openmc.Nuclide('O-16')\n", - "u235 = openmc.Nuclide('U-235')\n", - "u238 = openmc.Nuclide('U-238')\n", - "zr90 = openmc.Nuclide('Zr-90')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the nuclides we defined, we will now create a material for the homogeneous medium." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a Material and register the Nuclides\n", - "inf_medium = openmc.Material(name='moderator')\n", - "inf_medium.set_density('g/cc', 5.)\n", - "inf_medium.add_nuclide(h1, 0.028999667)\n", - "inf_medium.add_nuclide(o16, 0.01450188)\n", - "inf_medium.add_nuclide(u235, 0.000114142)\n", - "inf_medium.add_nuclide(u238, 0.006886019)\n", - "inf_medium.add_nuclide(zr90, 0.002116053)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With our material, we can now create a `MaterialsFile` object that can be exported to an actual XML file." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a MaterialsFile, register all Materials, and export to XML\n", - "materials_file = openmc.MaterialsFile()\n", - "materials_file.default_xs = '71c'\n", - "materials_file.add_material(inf_medium)\n", - "materials_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's move on to the geometry. This problem will be a simple square cell with reflective boundary conditions to simulate an infinite homogeneous medium. The first step is to create the outer bounding surfaces of the problem." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate boundary Planes\n", - "min_x = openmc.XPlane(boundary_type='reflective', x0=-0.63)\n", - "max_x = openmc.XPlane(boundary_type='reflective', x0=0.63)\n", - "min_y = openmc.YPlane(boundary_type='reflective', y0=-0.63)\n", - "max_y = openmc.YPlane(boundary_type='reflective', y0=0.63)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the surfaces defined, we can now create a cell that is defined by intersections of half-spaces created by the surfaces." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate a Cell\n", - "cell = openmc.Cell(cell_id=1, name='cell')\n", - "\n", - "# Register bounding Surfaces with the Cell\n", - "cell.region = +min_x & -max_x & +min_y & -max_y\n", - "\n", - "# Fill the Cell with the Material\n", - "cell.fill = inf_medium" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "OpenMC requires that there is a \"root\" universe. Let us create a root universe and add our square cell to it." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate Universe\n", - "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", - "root_universe.add_cell(cell)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now must create a geometry that is assigned a root universe, put the geometry into a `GeometryFile` object, and export it to XML." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create Geometry and set root Universe\n", - "openmc_geometry = openmc.Geometry()\n", - "openmc_geometry.root_universe = root_universe\n", - "\n", - "# Instantiate a GeometryFile\n", - "geometry_file = openmc.GeometryFile()\n", - "geometry_file.geometry = openmc_geometry\n", - "\n", - "# Export to \"geometry.xml\"\n", - "geometry_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# OpenMC simulation parameters\n", - "batches = 50\n", - "inactive = 10\n", - "particles = 2500\n", - "\n", - "# Instantiate a SettingsFile\n", - "settings_file = openmc.SettingsFile()\n", - "settings_file.batches = batches\n", - "settings_file.inactive = inactive\n", - "settings_file.particles = particles\n", - "settings_file.output = {'tallies': True, 'summary': True}\n", - "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", - "settings_file.set_source_space('fission', bounds)\n", - "\n", - "# Export to \"settings.xml\"\n", - "settings_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we are ready to generate multi-group cross sections! First, let's define a 2-group structure using the built-in `EnergyGroups` class." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate a 2-group EnergyGroups object\n", - "groups = mgxs.EnergyGroups()\n", - "groups.group_edges = np.array([0., 0.625e-6, 20.])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now use the `EnergyGroups` object, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", - "\n", - "* `TotalXS`\n", - "* `TransportXS`\n", - "* `AbsorptionXS`\n", - "* `CaptureXS`\n", - "* `FissionXS`\n", - "* `NuFissionXS`\n", - "* `ScatterXS`\n", - "* `NuScatterXS`\n", - "* `ScatterMatrixXS`\n", - "* `NuScatterMatrixXS`\n", - "* `Chi`\n", - "\n", - "These classes provide us with an interface to generate the tally inputs as well as perform post-processing of OpenMC's tally data to compute the respective multi-group cross sections. In this case, let's create the multi-group total, absorption and scattering cross sections with our 2-group structure." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate a few different sections\n", - "total = mgxs.TotalXS(domain=cell, domain_type='cell', groups=groups)\n", - "absorption = mgxs.AbsorptionXS(domain=cell, domain_type='cell', groups=groups)\n", - "scattering = mgxs.ScatterXS(domain=cell, domain_type='cell', groups=groups)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each multi-group cross section object stores its tallies in a Python dictionary called `tallies`. We can inspect the tallies in the dictionary for our `Absorption` object as follows. " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "OrderedDict([('flux', Tally\n", - "\tID =\t10000\n", - "\tName =\t\n", - "\tFilters =\t\n", - " \t\tcell\t[1]\n", - " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t['flux']\n", - "\tEstimator =\ttracklength\n", - "), ('absorption', Tally\n", - "\tID =\t10001\n", - "\tName =\t\n", - "\tFilters =\t\n", - " \t\tcell\t[1]\n", - " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t['absorption']\n", - "\tEstimator =\ttracklength\n", - ")])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "absorption.tallies" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `Absorption` object includes tracklength tallies for the 'absorption' and 'flux' scores in the 2-group structure in cell 1. Now that each `MGXS` object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate an empty TalliesFile\n", - "tallies_file = openmc.TalliesFile()\n", - "\n", - "# Add total tallies to the tallies file\n", - "for tally in total.tallies.values():\n", - " tallies_file.add_tally(tally)\n", - "\n", - "# Add absorption tallies to the tallies file\n", - "for tally in absorption.tallies.values():\n", - " tallies_file.add_tally(tally)\n", - "\n", - "# Add scattering tallies to the tallies file\n", - "for tally in scattering.tallies.values():\n", - " tallies_file.add_tally(tally)\n", - " \n", - "# Export to \"tallies.xml\"\n", - "tallies_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we a have a complete set of inputs, so we can go ahead and run our simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - " .d88888b. 888b d888 .d8888b.\n", - " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", - " 888 888 88888b.d88888 888 888\n", - " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", - " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", - " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", - " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", - " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", - "__________________888______________________________________________________\n", - " 888\n", - " 888\n", - "\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: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", - " Date/Time: 2015-11-30 20:15:33\n", - " MPI Processes: 1\n", - "\n", - " ===========================================================================\n", - " ========================> INITIALIZATION <=========================\n", - " ===========================================================================\n", - "\n", - " Reading settings XML file...\n", - " Reading cross sections XML file...\n", - " Reading geometry XML file...\n", - " Reading materials XML file...\n", - " Reading tallies XML file...\n", - " Building neighboring cells lists for each surface...\n", - " Loading ACE cross section table: 1001.71c\n", - " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 92235.71c\n", - " Loading ACE cross section table: 92238.71c\n", - " Loading ACE cross section table: 40090.71c\n", - " Maximum neutron transport energy: 20.0000 MeV for 1001.71c\n", - " Initializing source particles...\n", - "\n", - " ===========================================================================\n", - " ====================> K EIGENVALUE SIMULATION <====================\n", - " ===========================================================================\n", - "\n", - " Bat./Gen. k Average k \n", - " ========= ======== ==================== \n", - " 1/1 1.19804 \n", - " 2/1 1.12945 \n", - " 3/1 1.15573 \n", - " 4/1 1.13929 \n", - " 5/1 1.16300 \n", - " 6/1 1.22117 \n", - " 7/1 1.19012 \n", - " 8/1 1.11299 \n", - " 9/1 1.16066 \n", - " 10/1 1.12566 \n", - " 11/1 1.20854 \n", - " 12/1 1.14691 1.17773 +/- 0.03082\n", - " 13/1 1.17204 1.17583 +/- 0.01789\n", - " 14/1 1.14148 1.16724 +/- 0.01529\n", - " 15/1 1.17272 1.16834 +/- 0.01189\n", - " 16/1 1.18575 1.17124 +/- 0.01014\n", - " 17/1 1.20498 1.17606 +/- 0.00983\n", - " 18/1 1.14754 1.17249 +/- 0.00923\n", - " 19/1 1.18141 1.17348 +/- 0.00820\n", - " 20/1 1.15074 1.17121 +/- 0.00768\n", - " 21/1 1.15914 1.17011 +/- 0.00703\n", - " 22/1 1.14586 1.16809 +/- 0.00673\n", - " 23/1 1.18999 1.16978 +/- 0.00642\n", - " 24/1 1.15101 1.16844 +/- 0.00609\n", - " 25/1 1.13791 1.16640 +/- 0.00602\n", - " 26/1 1.19791 1.16837 +/- 0.00597\n", - " 27/1 1.19818 1.17012 +/- 0.00587\n", - " 28/1 1.14160 1.16854 +/- 0.00576\n", - " 29/1 1.11487 1.16571 +/- 0.00614\n", - " 30/1 1.17538 1.16620 +/- 0.00584\n", - " 31/1 1.20210 1.16791 +/- 0.00581\n", - " 32/1 1.20078 1.16940 +/- 0.00574\n", - " 33/1 1.14624 1.16839 +/- 0.00558\n", - " 34/1 1.14618 1.16747 +/- 0.00542\n", - " 35/1 1.16866 1.16752 +/- 0.00520\n", - " 36/1 1.18565 1.16821 +/- 0.00504\n", - " 37/1 1.16824 1.16821 +/- 0.00485\n", - " 38/1 1.18299 1.16874 +/- 0.00471\n", - " 39/1 1.21418 1.17031 +/- 0.00480\n", - " 40/1 1.11167 1.16835 +/- 0.00504\n", - " 41/1 1.11545 1.16665 +/- 0.00516\n", - " 42/1 1.11114 1.16491 +/- 0.00529\n", - " 43/1 1.14227 1.16423 +/- 0.00517\n", - " 44/1 1.14104 1.16355 +/- 0.00506\n", - " 45/1 1.16756 1.16366 +/- 0.00492\n", - " 46/1 1.13065 1.16274 +/- 0.00487\n", - " 47/1 1.11251 1.16139 +/- 0.00492\n", - " 48/1 1.14731 1.16101 +/- 0.00481\n", - " 49/1 1.16691 1.16117 +/- 0.00469\n", - " 50/1 1.19679 1.16206 +/- 0.00465\n", - " Creating state point statepoint.50.h5...\n", - "\n", - " ===========================================================================\n", - " ======================> SIMULATION FINISHED <======================\n", - " ===========================================================================\n", - "\n", - "\n", - " =======================> TIMING STATISTICS <=======================\n", - "\n", - " Total time for initialization = 4.1200E-01 seconds\n", - " Reading cross sections = 9.2000E-02 seconds\n", - " Total time in simulation = 1.4213E+01 seconds\n", - " Time in transport only = 1.4199E+01 seconds\n", - " Time in inactive batches = 1.7980E+00 seconds\n", - " Time in active batches = 1.2415E+01 seconds\n", - " Time synchronizing fission bank = 5.0000E-03 seconds\n", - " Sampling source sites = 3.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 = 0.0000E+00 seconds\n", - " Total time elapsed = 1.4634E+01 seconds\n", - " Calculation Rate (inactive) = 13904.3 neutrons/second\n", - " Calculation Rate (active) = 8054.77 neutrons/second\n", - "\n", - " ============================> RESULTS <============================\n", - "\n", - " k-effective (Collision) = 1.16131 +/- 0.00453\n", - " k-effective (Track-length) = 1.16206 +/- 0.00465\n", - " k-effective (Absorption) = 1.16096 +/- 0.00364\n", - " Combined k-effective = 1.16120 +/- 0.00325\n", - " Leakage Fraction = 0.00000 +/- 0.00000\n", - "\n" - ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Run OpenMC\n", - "executor = openmc.Executor()\n", - "executor.run_simulation()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Tally Data Processing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our simulation ran successfully and created statepoint and summary output files. We begin our analysis by instantiating a `StatePoint` object. " - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Load the last statepoint file\n", - "sp = openmc.StatePoint('statepoint.50.h5')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry. This is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a `Summary` object and link it with the statepoint." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Load the summary file and link it with the statepoint\n", - "su = openmc.Summary('summary.h5')\n", - "sp.link_with_summary(su)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the `StatePoint` into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Load the tallies from the statepoint into each MGXS object\n", - "total.load_from_statepoint(sp)\n", - "absorption.load_from_statepoint(sp)\n", - "scattering.load_from_statepoint(sp)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Voila! Our multi-group cross sections are now ready to rock 'n roll!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Extracting and Storing MGXS Data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's first inspect our total cross section by printing it to the screen." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\ttotal\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t1\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t6.81e-01 +/- 1.88e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.40e+00 +/- 5.91e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "total.print_xs()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since the `openmc.mgxs` module uses [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) under-the-hood, the cross section is stored as a \"derived\" `Tally` object. This means that it can be queried and manipulated using all of the same methods supported for the `Tally` class in the OpenMC Python API. For example, we can construct a [Pandas](http://pandas.pydata.org/) `DataFrame` of the multi-group cross section data." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1272: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)\n" - ] - }, - { - "data": { - "text/html": [ - "

\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup innuclidemeanstd. dev.
111total0.6683230.001264
012total1.2932580.007624
\n", - "
" - ], - "text/plain": [ - " cell group in nuclide mean std. dev.\n", - "1 1 1 total 0.668323 0.001264\n", - "0 1 2 total 1.293258 0.007624" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = scattering.get_pandas_dataframe()\n", - "df.head(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each multi-group cross section object can be easily exported to a variety of file formats, including CSV, Excel, and LaTeX for storage or data processing." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "absorption.export_xs_data(filename='absorption-xs', format='excel')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following code snippet shows how to export all three `MGXS` to the same HDF5 binary data store." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "total.build_hdf5_store(filename='mgxs', append=True)\n", - "absorption.build_hdf5_store(filename='mgxs', append=True)\n", - "scattering.build_hdf5_store(filename='mgxs', append=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Comparing MGXS with Tally Arithmetic" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we illustrate how one can leverage OpenMC's [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) data processing feature with `MGXS` objects. The `openmc.mgxs` module uses tally arithmetic to compute multi-group cross sections with automated uncertainty propagation. Each `MGXS` object includes an `xs_tally` attribute which is a \"derived\" `Tally` based on the tallies needed to compute the cross section type of interest. These derived tallies can be used in subsequent tally arithmetic operations. For example, we can use tally artithmetic to confirm that the `TotalXS` is equal to the sum of the `AbsorptionXS` and `ScatterXS` objects." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total(((total / flux) - (absorption / flux)) - (sca...4.884981e-150.011274
11(6.3e-07 - 2.0e+01)total(((total / flux) - (absorption / flux)) - (sca...1.221245e-150.001802
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide \\\n", - "0 1 (0.0e+00 - 6.3e-07) total \n", - "1 1 (6.3e-07 - 2.0e+01) total \n", - "\n", - " score mean std. dev. \n", - "0 (((total / flux) - (absorption / flux)) - (sca... 4.884981e-15 0.011274 \n", - "1 (((total / flux) - (absorption / flux)) - (sca... 1.221245e-15 0.001802 " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Use tally arithmetic to compute the difference between the total, absorption and scattering\n", - "difference = total.xs_tally - absorption.xs_tally - scattering.xs_tally\n", - "\n", - "# The difference is a derived tally which can generate Pandas DataFrames for inspection\n", - "difference.get_pandas_dataframe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Similarly, we can use tally arithmetic to compute the ratio of `AbsorptionXS` and `ScatterXS` to the `TotalXS`." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total((absorption / flux) / (total / flux))0.0762190.000651
11(6.3e-07 - 2.0e+01)total((absorption / flux) / (total / flux))0.0193190.000086
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide score \\\n", - "0 1 (0.0e+00 - 6.3e-07) total ((absorption / flux) / (total / flux)) \n", - "1 1 (6.3e-07 - 2.0e+01) total ((absorption / flux) / (total / flux)) \n", - "\n", - " mean std. dev. \n", - "0 0.076219 0.000651 \n", - "1 0.019319 0.000086 " - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Use tally arithmetic to compute the absorption-to-total MGXS ratio\n", - "absorption_to_total = absorption.xs_tally / total.xs_tally\n", - "\n", - "# The absorption-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", - "absorption_to_total.get_pandas_dataframe()" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total((scatter / flux) / (total / flux))0.9237810.007714
11(6.3e-07 - 2.0e+01)total((scatter / flux) / (total / flux))0.9806810.002617
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide score \\\n", - "0 1 (0.0e+00 - 6.3e-07) total ((scatter / flux) / (total / flux)) \n", - "1 1 (6.3e-07 - 2.0e+01) total ((scatter / flux) / (total / flux)) \n", - "\n", - " mean std. dev. \n", - "0 0.923781 0.007714 \n", - "1 0.980681 0.002617 " - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Use tally arithmetic to compute the scattering-to-total MGXS ratio\n", - "scattering_to_total = scattering.xs_tally / total.xs_tally\n", - "\n", - "# The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", - "scattering_to_total.get_pandas_dataframe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lastly, we sum the derived scatter-to-total and absorption-to-total ratios to confirm that they sum to unity." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total(((absorption / flux) / (total / flux)) + ((sc...10.007741
11(6.3e-07 - 2.0e+01)total(((absorption / flux) / (total / flux)) + ((sc...10.002619
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide \\\n", - "0 1 (0.0e+00 - 6.3e-07) total \n", - "1 1 (6.3e-07 - 2.0e+01) total \n", - "\n", - " score mean std. dev. \n", - "0 (((absorption / flux) / (total / flux)) + ((sc... 1 0.007741 \n", - "1 (((absorption / flux) / (total / flux)) + ((sc... 1 0.002619 " - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Use tally arithmetic to ensure that the absorption- and scattering-to-total MGXS ratios sum to unity\n", - "sum_ratio = absorption_to_total + scattering_to_total\n", - "\n", - "# The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", - "sum_ratio.get_pandas_dataframe()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/docs/source/pythonapi/examples/mgxs-part-i.ipynb b/docs/source/pythonapi/examples/mgxs-part-i.ipynb new file mode 100644 index 000000000..5207ac4f3 --- /dev/null +++ b/docs/source/pythonapi/examples/mgxs-part-i.ipynb @@ -0,0 +1,1202 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This IPython Notebook introduces the use of the `openmc.mgxs` module to calculate multi-group cross sections for an infinite homogeneous medium. In particular, this Notebook introduces the the following features:\n", + "\n", + "* **General equations** for scalar-flux averaged multi-group cross sections\n", + "* Creation of multi-group cross sections for an **infinite homogeneous medium**\n", + "* Use of **tally arithmetic** to manipulate multi-group cross sections\n", + "\n", + "**Note:** This Notebook illustrates the use of [Pandas](http://pandas.pydata.org/) `DataFrames` to containerize multi-group cross section data. We recommend using [Pandas](http://pandas.pydata.org/) >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases of [Pandas](http://pandas.pydata.org/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction to Multi-Group Cross Sections (MGXS)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Many Monte Carlo-based neutron particle transport codes, including OpenMC, use continuous energy nuclear cross section data. However, most deterministic neutron transport codes use *multi-group cross sections* defined over discretized energy bins or *energy groups*. An example of U-235's fission continuous energy cross section along with a 16-group cross section computed for a light water reactor spectrum is displayed below." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\ncdttt+F//ud/nOZ5//33YTab8cYbb+Dxxx9HTEwMWrZsiW+++QaAfReJ3r17o2XLlrj99tthtVox\nbdo0dO/eHQCglEKvXr0wevRol9e32Wxo1aoV5s6d6/PyerIMM2bMwPXr15GVleXy+PXr11fOQ0QU\nLLhlmohIg7KyMpSVlTlNM5lMLluId+7ciX/84x/4/e9/j7CwMKxcuRLjx4/Hl19+WTnIPXbsGIYO\nHYpu3brhv//7v9G+fXvs3r0bjz32GPLy8rBkyRKn51y8eDGGDh2KNWvWwGw2o127dlizZg3+7d/+\nDf/yL/+CVatWobCwEBkZGbh+/TpMJlNl37x587BgwQJ8/fXX6NmzZ+Vzbty4EcXFxT4Ppj1dhvvu\nuw9du3bFa6+95vRa5eXl2LRpE+Lj42vcfYaIyDCKiIj8Zv369cpkMtV4a9asmdO8JpNJdejQQdls\ntspply5dUk2aNFHPP/985bT7779fdenSRRUXFzs9ft68eSokJEQVFhYqpZR67733lMlkUiNGjHCa\nr7y8XLVv317Fx8c7TT937pxq3ry56t69e+W0oqIiFRERodLT053mve2229R9991X67KfPn1amUwm\n9frrr7vcV9cyXLlypXJaRkaGMplM6tChQ5XTduzYoUwmk3r11VdrfO27775bxcXF1dpHRKQDd/Mg\nItJg06ZN+Mc//uF0O3DggMt899xzD8LCwip/jo6ORnR0NM6dOwcAuHbtGv73f/8X48ePR8uWLSu3\neJeVlWHMmDG4du0aPv74Y6fn/NWvfuX085dffolLly5h4sSJTtM7d+6MhIQEp2kWiwXTpk3Dhg0b\ncPXqVQDA3//+dxw/ftznrdLeLkNaWhrMZjNee+21ymnr169HeHg4HnroIZ8aiIh04WCaiEiD2NhY\n3HHHHU63QYMGuczXpk0bl2ktWrTAjz/+CADIz89HeXk5Vq9ejebNmzvdkpKSYDKZkJeX5/T4Dh06\nOP2cn58PALjllltcXis6Otpl2rx581BUVFS53/KLL76ILl264MEHH/Rw6Z15sgyORsA+yB85ciT+\n/Oc/o7S0FHl5edixYwdSUlKcfvEgIgoG3GeaiCiIRUVFoUmTJpg6dSoeffTRGufp1q2b08+OfaAd\nHAP277//3uWxNU3r2bMnxowZg5deegmjR49GTk4Oli9f7vK8OpdhxowZ2LNnD7Kzs3HhwgWUlZVh\n+vTpPr0+EZFOHEwTEQWx0NBQ3HPPPcjNzUVcXByaNWvm9XP07dsX7du3x1/+8hcsWLCgcvq5c+ew\nf/9+dOrUyeUx8+fPx/33349//dd/RfPmzTFr1qyALsO4cePQpk0bvPbaa7h48SL69OnjsksKEVEw\n4GCaiEiDI0eO4MaNGy7Te/bsibZt29b6WFXtWlqrVq3CsGHDMHz4cMyePRtdu3ZFcXExvv76a+zY\nsQN///vfa30+k8mEjIwMPPLII0hJSUFaWhoKCwuxfPlydOzYEWaz6x5/o0aNQmxsLN5//31MmTKl\nzua6eLsMzZo1w69//WusWrUKALBixYp6vT4RkS4cTBMR+ZFjV4i0tLQa71u7dm2duytU350iNjYW\nubm5WL58OX73u9/hhx9+QGRkJHr37o2xY8fW+liHWbNmwWQyYeXKlZgwYQK6d++O3/72t8jOzsb5\n8+drfMzEiRORkZFRr3NL+7IMDjNmzMCqVavQtGlTTJ06td4NREQ68HLiRESNVGFhIXr37o0JEybg\nT3/6k8v9d955J5o1a+ZythB3HJcTX7duHaZMmYKmTfVvr1FKoby8HPfddx8KCgpw5MgR7a9JRFQV\nz+ZBRNQIXLp0CfPmzcP27dvxf//3f9i4cSPuuecelJSUYP78+ZXzFRcXY//+/XjyySdx6NAhPPnk\nk16/1owZM9C8eXNs377dn4tQo/Hjx6N58+b48MMPfT5AkoioPrhlmoioESgsLMTUqVPx6aefoqCg\nAKGhoYiPj0dGRgYGDx5cOd/777+Pe++9F23btsXcuXNdrq5Ym9LSUqctw7feeisiIyP9uhzVnTp1\nCoWFhQCAkJAQxMbGan09IqLqOJgmIiIiIvIRd/MgIiIiIvIRB9NERERERD7iYJqIiIiIyEccTBMR\nERER+YiDaSIiIiIiH3EwTURERETkIw6miYiIiIh8xME0EREREZGPOJgmIiIiIvLR/wcwWUbzha5y\njwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": { + "image/png": { + "width": 350 + } + }, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image\n", + "Image(filename='images/mgxs.png', width=350)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A variety of tools employing different methodologies have been developed over the years to compute multi-group cross sections for certain applications, including NJOY (LANL), MC$^2$-3 (ANL), and Serpent (VTT). The `openmc.mgxs` Python module is designed to leverage OpenMC's tally system to calculate multi-group cross sections with arbitrary energy discretizations for fine-mesh heterogeneous deterministic neutron transport applications.\n", + "\n", + "Before proceeding to illustrate how one may use the `openmc.mgxs` module, it is worthwhile to define the general equations used to calculate multi-group cross sections. This is only intended as a brief overview of the methodology used by `openmc.mgxs` - we refer the interested reader to the large body of literature on the subject for a more comprehensive understanding of this complex topic." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Introductory Notation\n", + "The continuous real-valued microscopic cross section may be denoted $\\sigma_{n,x}(\\mathbf{r}, E)$ for position vector $\\mathbf{r}$, energy $E$, nuclide $n$ and interaction type $x$. Similarly, the scalar neutron flux may be denoted by $\\Phi(\\mathbf{r},E)$ for position $\\mathbf{r}$ and energy $E$. **Note**: Although nuclear cross sections are dependent on the temperature $T$ of the interacting medium, the temperature variable is neglected here for brevity." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Spatial and Energy Discretization\n", + "The energy domain for critical systems such as thermal reactors spans more than 10 orders of magnitude of neutron energies from 10$^{-5}$ - 10$^7$ eV. The multi-group approximation discretization divides this energy range into one or more energy groups. In particular, for $G$ total groups, we denote an energy group index $g$ such that $g \\in \\{1, 2, ..., G\\}$. The energy group indices are defined such that the smaller group the higher the energy, and vice versa. The integration over neutron energies across a discrete energy group is commonly referred to as **energy condensation**.\n", + "\n", + "Multi-group cross sections are computed for discretized spatial zones in the geometry of interest. The spatial zones may be defined on a structured and regular fuel assembly or pin cell mesh, or an unstructured mesh such as the constructive solid geometry used by OpenMC. For a geometry with $K$ distinct spatial zones, we designate each spatial zone an index $k$ such that $k \\in \\{1, 2, ..., K\\}$. The volume of each spatial zone is denoted by $V_{k}$. The integration over discrete spatial zones is commonly referred to as **spatial homogenization**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### General Scalar-Flux Weighted MGXS\n", + "The multi-group cross sections computed by `openmc.mgxs` are defined as a *scalar flux-weighted average* of the microscopic cross sections across each discrete energy group. This formulation is employed in order to preserve the reaction rates within each energy group and spatial zone. In particular, spatial homogenization and energy condensation are used to compute the general multi-group cross section $\\sigma_{n,x,k,g}$ as follows:\n", + "\n", + "$$\\sigma_{n,x,k,g} = \\frac{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\sigma_{n,x}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\Phi(\\mathbf{r},E')}$$\n", + "\n", + "This scalar flux-weighted average microscopic cross section is computed by `openmc.mgxs` for most multi-group cross sections, including total, absorption, and fission reaction types. These double integrals are stochastically computed with OpenMC's tally system - in particular, [filters](https://mit-crpg.github.io/openmc/pythonapi/filter.html) on the energy range and spatial zone (material, cell or universe) define the bounds of integration for both numerator and denominator." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multi-Group Scattering Matrices\n", + "The general multi-group cross section $\\sigma_{n,x,k,g}$ is a vector of $G$ values for each energy group $g$. The equation presented above only discretizes the energy of the incoming neutron and neglects the outgoing energy of the neutron (if any). Hence, this formulation must be extended to account for the outgoing energy of neutrons in the discretized scattering matrix cross section used by deterministic neutron transport codes. \n", + "\n", + "We denote the incoming and outgoing neutron energy groups as $g$ and $g'$ for the microscopic scattering matrix cross section $\\sigma_{n,s}(\\mathbf{r},E)$. As before, spatial homogenization and energy condensation are used to find the multi-group scattering matrix cross section $\\sigma_{n,s,k,g \\to g'}$ as follows:\n", + "\n", + "$$\\sigma_{n,s,k,g\\rightarrow g'} = \\frac{\\int_{E_{g'}}^{E_{g'-1}}\\mathrm{d}E''\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\sigma_{n,s}(\\mathbf{r},E'\\rightarrow E'')\\Phi(\\mathbf{r},E')}{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\Phi(\\mathbf{r},E')}$$\n", + "\n", + "This scalar flux-weighted multi-group microscopic scattering matrix is computed using OpenMC tallies with both energy in and energy out filters." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multi-Group Fission Spectrum\n", + "The energy spectrum of neutrons emitted from fission is denoted by $\\chi_{n}(\\mathbf{r},E' \\rightarrow E'')$ for incoming and outgoing energies $E'$ and $E''$, respectively. Unlike the multi-group cross sections $\\sigma_{n,x,k,g}$ considered up to this point, the fission spectrum is a probability distribution and must sum to unity. The outgoing energy is typically much less dependent on the incoming energy for fission than for scattering interactions. As a result, it is common practice to integrate over the incoming neutron energy when computing the multi-group fission spectrum. The fission spectrum may be simplified as $\\chi_{n}(\\mathbf{r},E)$ with outgoing energy $E$.\n", + "\n", + "Unlike the multi-group cross sections defined up to this point, the multi-group fission spectrum is weighted by the fission production rate rather than the scalar flux. This formulation is intended to preserve the total fission production rate in the multi-group deterministic calculation. In order to mathematically define the multi-group fission spectrum, we denote the microscopic fission cross section as $\\sigma_{n,f}(\\mathbf{r},E)$ and the average number of neutrons emitted from fission interactions with nuclide $n$ as $\\nu_{n}(\\mathbf{r},E)$. The multi-group fission spectrum $\\chi_{n,k,g}$ is then the probability of fission neutrons emitted into energy group $g$. \n", + "\n", + "Similar to before, spatial homogenization and energy condensation are used to find the multi-group fission spectrum $\\chi_{n,k,g}$ as follows:\n", + "\n", + "$$\\chi_{n,k,g'} = \\frac{\\int_{E_{g'}}^{E_{g'-1}}\\mathrm{d}E''\\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\chi_{n}(\\mathbf{r},E'\\rightarrow E'')\\nu_{n}(\\mathbf{r},E')\\sigma_{n,f}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}{\\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\nu_{n}(\\mathbf{r},E')\\sigma_{n,f}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}$$\n", + "\n", + "The fission production-weighted multi-group fission spectrum is computed using OpenMC tallies with both energy in and energy out filters.\n", + "\n", + "This concludes our brief overview on the methodology to compute multi-group cross sections. The following sections detail more concretely how users may employ the `openmc.mgxs` module to power simulation workflows requiring multi-group cross sections for downstream deterministic calculations." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import openmc\n", + "import openmc.mgxs as mgxs\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate some Nuclides\n", + "h1 = openmc.Nuclide('H-1')\n", + "o16 = openmc.Nuclide('O-16')\n", + "u235 = openmc.Nuclide('U-235')\n", + "u238 = openmc.Nuclide('U-238')\n", + "zr90 = openmc.Nuclide('Zr-90')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the nuclides we defined, we will now create a material for the homogeneous medium." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a Material and register the Nuclides\n", + "inf_medium = openmc.Material(name='moderator')\n", + "inf_medium.set_density('g/cc', 5.)\n", + "inf_medium.add_nuclide(h1, 0.028999667)\n", + "inf_medium.add_nuclide(o16, 0.01450188)\n", + "inf_medium.add_nuclide(u235, 0.000114142)\n", + "inf_medium.add_nuclide(u238, 0.006886019)\n", + "inf_medium.add_nuclide(zr90, 0.002116053)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our material, we can now create a `MaterialsFile` object that can be exported to an actual XML file." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a MaterialsFile, register all Materials, and export to XML\n", + "materials_file = openmc.MaterialsFile()\n", + "materials_file.default_xs = '71c'\n", + "materials_file.add_material(inf_medium)\n", + "materials_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's move on to the geometry. This problem will be a simple square cell with reflective boundary conditions to simulate an infinite homogeneous medium. The first step is to create the outer bounding surfaces of the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate boundary Planes\n", + "min_x = openmc.XPlane(boundary_type='reflective', x0=-0.63)\n", + "max_x = openmc.XPlane(boundary_type='reflective', x0=0.63)\n", + "min_y = openmc.YPlane(boundary_type='reflective', y0=-0.63)\n", + "max_y = openmc.YPlane(boundary_type='reflective', y0=0.63)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the surfaces defined, we can now create a cell that is defined by intersections of half-spaces created by the surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a Cell\n", + "cell = openmc.Cell(cell_id=1, name='cell')\n", + "\n", + "# Register bounding Surfaces with the Cell\n", + "cell.region = +min_x & -max_x & +min_y & -max_y\n", + "\n", + "# Fill the Cell with the Material\n", + "cell.fill = inf_medium" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenMC requires that there is a \"root\" universe. Let us create a root universe and add our square cell to it." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate Universe\n", + "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", + "root_universe.add_cell(cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now must create a geometry that is assigned a root universe, put the geometry into a `GeometryFile` object, and export it to XML." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "openmc_geometry = openmc.Geometry()\n", + "openmc_geometry.root_universe = root_universe\n", + "\n", + "# Instantiate a GeometryFile\n", + "geometry_file = openmc.GeometryFile()\n", + "geometry_file.geometry = openmc_geometry\n", + "\n", + "# Export to \"geometry.xml\"\n", + "geometry_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# OpenMC simulation parameters\n", + "batches = 50\n", + "inactive = 10\n", + "particles = 2500\n", + "\n", + "# Instantiate a SettingsFile\n", + "settings_file = openmc.SettingsFile()\n", + "settings_file.batches = batches\n", + "settings_file.inactive = inactive\n", + "settings_file.particles = particles\n", + "settings_file.output = {'tallies': True, 'summary': True}\n", + "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", + "settings_file.set_source_space('fission', bounds)\n", + "\n", + "# Export to \"settings.xml\"\n", + "settings_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we are ready to generate multi-group cross sections! First, let's define a 2-group structure using the built-in `EnergyGroups` class." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a 2-group EnergyGroups object\n", + "groups = mgxs.EnergyGroups()\n", + "groups.group_edges = np.array([0., 0.625e-6, 20.])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now use the `EnergyGroups` object, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", + "\n", + "* `TotalXS`\n", + "* `TransportXS`\n", + "* `AbsorptionXS`\n", + "* `CaptureXS`\n", + "* `FissionXS`\n", + "* `NuFissionXS`\n", + "* `ScatterXS`\n", + "* `NuScatterXS`\n", + "* `ScatterMatrixXS`\n", + "* `NuScatterMatrixXS`\n", + "* `Chi`\n", + "\n", + "These classes provide us with an interface to generate the tally inputs as well as perform post-processing of OpenMC's tally data to compute the respective multi-group cross sections. In this case, let's create the multi-group total, absorption and scattering cross sections with our 2-group structure." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a few different sections\n", + "total = mgxs.TotalXS(domain=cell, domain_type='cell', groups=groups)\n", + "absorption = mgxs.AbsorptionXS(domain=cell, domain_type='cell', groups=groups)\n", + "scattering = mgxs.ScatterXS(domain=cell, domain_type='cell', groups=groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each multi-group cross section object stores its tallies in a Python dictionary called `tallies`. We can inspect the tallies in the dictionary for our `Absorption` object as follows. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "OrderedDict([('flux', Tally\n", + "\tID =\t10000\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tcell\t[1]\n", + " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t['flux']\n", + "\tEstimator =\ttracklength\n", + "), ('absorption', Tally\n", + "\tID =\t10001\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tcell\t[1]\n", + " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t['absorption']\n", + "\tEstimator =\ttracklength\n", + ")])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "absorption.tallies" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `Absorption` object includes tracklength tallies for the 'absorption' and 'flux' scores in the 2-group structure in cell 1. Now that each `MGXS` object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate an empty TalliesFile\n", + "tallies_file = openmc.TalliesFile()\n", + "\n", + "# Add total tallies to the tallies file\n", + "for tally in total.tallies.values():\n", + " tallies_file.add_tally(tally)\n", + "\n", + "# Add absorption tallies to the tallies file\n", + "for tally in absorption.tallies.values():\n", + " tallies_file.add_tally(tally)\n", + "\n", + "# Add scattering tallies to the tallies file\n", + "for tally in scattering.tallies.values():\n", + " tallies_file.add_tally(tally)\n", + " \n", + "# Export to \"tallies.xml\"\n", + "tallies_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we a have a complete set of inputs, so we can go ahead and run our simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " .d88888b. 888b d888 .d8888b.\n", + " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", + " 888 888 88888b.d88888 888 888\n", + " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", + " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", + " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", + " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", + " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", + "__________________888______________________________________________________\n", + " 888\n", + " 888\n", + "\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: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", + " Date/Time: 2015-11-30 21:26:04\n", + " MPI Processes: 1\n", + "\n", + " ===========================================================================\n", + " ========================> INITIALIZATION <=========================\n", + " ===========================================================================\n", + "\n", + " Reading settings XML file...\n", + " Reading cross sections XML file...\n", + " Reading geometry XML file...\n", + " Reading materials XML file...\n", + " Reading tallies XML file...\n", + " Building neighboring cells lists for each surface...\n", + " Loading ACE cross section table: 1001.71c\n", + " Loading ACE cross section table: 8016.71c\n", + " Loading ACE cross section table: 92235.71c\n", + " Loading ACE cross section table: 92238.71c\n", + " Loading ACE cross section table: 40090.71c\n", + " Maximum neutron transport energy: 20.0000 MeV for 1001.71c\n", + " Initializing source particles...\n", + "\n", + " ===========================================================================\n", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 1.19804 \n", + " 2/1 1.12945 \n", + " 3/1 1.15573 \n", + " 4/1 1.13929 \n", + " 5/1 1.16300 \n", + " 6/1 1.22117 \n", + " 7/1 1.19012 \n", + " 8/1 1.11299 \n", + " 9/1 1.16066 \n", + " 10/1 1.12566 \n", + " 11/1 1.20854 \n", + " 12/1 1.14691 1.17773 +/- 0.03082\n", + " 13/1 1.17204 1.17583 +/- 0.01789\n", + " 14/1 1.14148 1.16724 +/- 0.01529\n", + " 15/1 1.17272 1.16834 +/- 0.01189\n", + " 16/1 1.18575 1.17124 +/- 0.01014\n", + " 17/1 1.20498 1.17606 +/- 0.00983\n", + " 18/1 1.14754 1.17249 +/- 0.00923\n", + " 19/1 1.18141 1.17348 +/- 0.00820\n", + " 20/1 1.15074 1.17121 +/- 0.00768\n", + " 21/1 1.15914 1.17011 +/- 0.00703\n", + " 22/1 1.14586 1.16809 +/- 0.00673\n", + " 23/1 1.18999 1.16978 +/- 0.00642\n", + " 24/1 1.15101 1.16844 +/- 0.00609\n", + " 25/1 1.13791 1.16640 +/- 0.00602\n", + " 26/1 1.19791 1.16837 +/- 0.00597\n", + " 27/1 1.19818 1.17012 +/- 0.00587\n", + " 28/1 1.14160 1.16854 +/- 0.00576\n", + " 29/1 1.11487 1.16571 +/- 0.00614\n", + " 30/1 1.17538 1.16620 +/- 0.00584\n", + " 31/1 1.20210 1.16791 +/- 0.00581\n", + " 32/1 1.20078 1.16940 +/- 0.00574\n", + " 33/1 1.14624 1.16839 +/- 0.00558\n", + " 34/1 1.14618 1.16747 +/- 0.00542\n", + " 35/1 1.16866 1.16752 +/- 0.00520\n", + " 36/1 1.18565 1.16821 +/- 0.00504\n", + " 37/1 1.16824 1.16821 +/- 0.00485\n", + " 38/1 1.18299 1.16874 +/- 0.00471\n", + " 39/1 1.21418 1.17031 +/- 0.00480\n", + " 40/1 1.11167 1.16835 +/- 0.00504\n", + " 41/1 1.11545 1.16665 +/- 0.00516\n", + " 42/1 1.11114 1.16491 +/- 0.00529\n", + " 43/1 1.14227 1.16423 +/- 0.00517\n", + " 44/1 1.14104 1.16355 +/- 0.00506\n", + " 45/1 1.16756 1.16366 +/- 0.00492\n", + " 46/1 1.13065 1.16274 +/- 0.00487\n", + " 47/1 1.11251 1.16139 +/- 0.00492\n", + " 48/1 1.14731 1.16101 +/- 0.00481\n", + " 49/1 1.16691 1.16117 +/- 0.00469\n", + " 50/1 1.19679 1.16206 +/- 0.00465\n", + " Creating state point statepoint.50.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 4.1700E-01 seconds\n", + " Reading cross sections = 9.7000E-02 seconds\n", + " Total time in simulation = 1.4656E+01 seconds\n", + " Time in transport only = 1.4643E+01 seconds\n", + " Time in inactive batches = 1.7940E+00 seconds\n", + " Time in active batches = 1.2862E+01 seconds\n", + " Time synchronizing fission bank = 5.0000E-03 seconds\n", + " Sampling source sites = 4.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 = 0.0000E+00 seconds\n", + " Total time elapsed = 1.5082E+01 seconds\n", + " Calculation Rate (inactive) = 13935.3 neutrons/second\n", + " Calculation Rate (active) = 7774.84 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.16131 +/- 0.00453\n", + " k-effective (Track-length) = 1.16206 +/- 0.00465\n", + " k-effective (Absorption) = 1.16096 +/- 0.00364\n", + " Combined k-effective = 1.16120 +/- 0.00325\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run OpenMC\n", + "executor = openmc.Executor()\n", + "executor.run_simulation()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tally Data Processing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our simulation ran successfully and created statepoint and summary output files. We begin our analysis by instantiating a `StatePoint` object. " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the last statepoint file\n", + "sp = openmc.StatePoint('statepoint.50.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry. This is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a `Summary` object and link it with the statepoint." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the summary file and link it with the statepoint\n", + "su = openmc.Summary('summary.h5')\n", + "sp.link_with_summary(su)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the `StatePoint` into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the tallies from the statepoint into each MGXS object\n", + "total.load_from_statepoint(sp)\n", + "absorption.load_from_statepoint(sp)\n", + "scattering.load_from_statepoint(sp)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Voila! Our multi-group cross sections are now ready to rock 'n roll!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extracting and Storing MGXS Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's first inspect our total cross section by printing it to the screen." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\ttotal\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t1\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t6.81e-01 +/- 1.88e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.40e+00 +/- 5.91e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "total.print_xs()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since the `openmc.mgxs` module uses [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) under-the-hood, the cross section is stored as a \"derived\" `Tally` object. This means that it can be queried and manipulated using all of the same methods supported for the `Tally` class in the OpenMC Python API. For example, we can construct a [Pandas](http://pandas.pydata.org/) `DataFrame` of the multi-group cross section data." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
111total0.6683230.001264
012total1.2932580.007624
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "1 1 1 total 0.668323 0.001264\n", + "0 1 2 total 1.293258 0.007624" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = scattering.get_pandas_dataframe()\n", + "df.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each multi-group cross section object can be easily exported to a variety of file formats, including CSV, Excel, and LaTeX for storage or data processing." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "absorption.export_xs_data(filename='absorption-xs', format='excel')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following code snippet shows how to export all three `MGXS` to the same HDF5 binary data store." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "total.build_hdf5_store(filename='mgxs', append=True)\n", + "absorption.build_hdf5_store(filename='mgxs', append=True)\n", + "scattering.build_hdf5_store(filename='mgxs', append=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Comparing MGXS with Tally Arithmetic" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we illustrate how one can leverage OpenMC's [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) data processing feature with `MGXS` objects. The `openmc.mgxs` module uses tally arithmetic to compute multi-group cross sections with automated uncertainty propagation. Each `MGXS` object includes an `xs_tally` attribute which is a \"derived\" `Tally` based on the tallies needed to compute the cross section type of interest. These derived tallies can be used in subsequent tally arithmetic operations. For example, we can use tally artithmetic to confirm that the `TotalXS` is equal to the sum of the `AbsorptionXS` and `ScatterXS` objects." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total(((total / flux) - (absorption / flux)) - (sca...4.884981e-150.011274
11(6.3e-07 - 2.0e+01)total(((total / flux) - (absorption / flux)) - (sca...1.221245e-150.001802
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide \\\n", + "0 1 (0.0e+00 - 6.3e-07) total \n", + "1 1 (6.3e-07 - 2.0e+01) total \n", + "\n", + " score mean std. dev. \n", + "0 (((total / flux) - (absorption / flux)) - (sca... 4.884981e-15 0.011274 \n", + "1 (((total / flux) - (absorption / flux)) - (sca... 1.221245e-15 0.001802 " + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to compute the difference between the total, absorption and scattering\n", + "difference = total.xs_tally - absorption.xs_tally - scattering.xs_tally\n", + "\n", + "# The difference is a derived tally which can generate Pandas DataFrames for inspection\n", + "difference.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similarly, we can use tally arithmetic to compute the ratio of `AbsorptionXS` and `ScatterXS` to the `TotalXS`." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total((absorption / flux) / (total / flux))0.0762190.000651
11(6.3e-07 - 2.0e+01)total((absorption / flux) / (total / flux))0.0193190.000086
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score \\\n", + "0 1 (0.0e+00 - 6.3e-07) total ((absorption / flux) / (total / flux)) \n", + "1 1 (6.3e-07 - 2.0e+01) total ((absorption / flux) / (total / flux)) \n", + "\n", + " mean std. dev. \n", + "0 0.076219 0.000651 \n", + "1 0.019319 0.000086 " + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to compute the absorption-to-total MGXS ratio\n", + "absorption_to_total = absorption.xs_tally / total.xs_tally\n", + "\n", + "# The absorption-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", + "absorption_to_total.get_pandas_dataframe()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total((scatter / flux) / (total / flux))0.9237810.007714
11(6.3e-07 - 2.0e+01)total((scatter / flux) / (total / flux))0.9806810.002617
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score \\\n", + "0 1 (0.0e+00 - 6.3e-07) total ((scatter / flux) / (total / flux)) \n", + "1 1 (6.3e-07 - 2.0e+01) total ((scatter / flux) / (total / flux)) \n", + "\n", + " mean std. dev. \n", + "0 0.923781 0.007714 \n", + "1 0.980681 0.002617 " + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to compute the scattering-to-total MGXS ratio\n", + "scattering_to_total = scattering.xs_tally / total.xs_tally\n", + "\n", + "# The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", + "scattering_to_total.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lastly, we sum the derived scatter-to-total and absorption-to-total ratios to confirm that they sum to unity." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total(((absorption / flux) / (total / flux)) + ((sc...10.007741
11(6.3e-07 - 2.0e+01)total(((absorption / flux) / (total / flux)) + ((sc...10.002619
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide \\\n", + "0 1 (0.0e+00 - 6.3e-07) total \n", + "1 1 (6.3e-07 - 2.0e+01) total \n", + "\n", + " score mean std. dev. \n", + "0 (((absorption / flux) / (total / flux)) + ((sc... 1 0.007741 \n", + "1 (((absorption / flux) / (total / flux)) + ((sc... 1 0.002619 " + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to ensure that the absorption- and scattering-to-total MGXS ratios sum to unity\n", + "sum_ratio = absorption_to_total + scattering_to_total\n", + "\n", + "# The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", + "sum_ratio.get_pandas_dataframe()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/pythonapi/examples/mgxs-part-i.rst b/docs/source/pythonapi/examples/mgxs-part-i.rst new file mode 100644 index 000000000..8b29183f0 --- /dev/null +++ b/docs/source/pythonapi/examples/mgxs-part-i.rst @@ -0,0 +1,13 @@ +.. _notebook_mgxs_part_i: + +========================= +MGXS Part I: Introduction +========================= + +.. only:: html + + .. notebook:: mgxs-part-i.ipynb + +.. only:: latex + + IPython notebooks must be viewed in the online HTML documentation. diff --git a/docs/source/pythonapi/examples/MGXS-Part-II.ipynb b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb similarity index 100% rename from docs/source/pythonapi/examples/MGXS-Part-II.ipynb rename to docs/source/pythonapi/examples/mgxs-part-ii.ipynb diff --git a/docs/source/pythonapi/examples/mgxs-part-ii.rst b/docs/source/pythonapi/examples/mgxs-part-ii.rst new file mode 100644 index 000000000..1f6dd2214 --- /dev/null +++ b/docs/source/pythonapi/examples/mgxs-part-ii.rst @@ -0,0 +1,13 @@ +.. _notebook_mgxs_part_ii: + +=============================== +MGXS Part II: Advanced Features +=============================== + +.. only:: html + + .. notebook:: mgxs-part-ii.ipynb + +.. only:: latex + + IPython notebooks must be viewed in the online HTML documentation. diff --git a/docs/source/pythonapi/examples/MGXS-Part-III.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb similarity index 58% rename from docs/source/pythonapi/examples/MGXS-Part-III.ipynb rename to docs/source/pythonapi/examples/mgxs-part-iii.ipynb index 2979c2b03..c3f4280de 100644 --- a/docs/source/pythonapi/examples/MGXS-Part-III.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -467,7 +467,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAASWSURB\nVGje7Zs7buMwEEBzieRcaYaB48KVisSFj7Cn4BFU2I37LVan8BFc5ABb2ICtpSSaHP5EUqOAzsIO\nAjwEGjjiZ/hEDZ+eiJ9noHxe6fHvW4BPDmwHEMAaYBdAEb+5Amu/YNlyQLgP4xGhiG9avmwvsBF/\nt/FkY2vj69NLD1f41Z6Yiw3Gvy728ceVuhLhwY8bA0fij8EgO/6wjH2pF/lKxvf3tNG3Z+BRt4oH\nh/Znt5bu+iQd+/Z/Xp8BmiO8X0X/n7KQNbWIZ1wMJjEUPwBuuI1hfcMZxv9Pj19/AexrYH84KASF\nV41nhe8Ku/4f+nSpu3eNsdadjpBLFPF6pIE76Hx4QeiMfy/yVQi/cf6mxx900jk4ScfGlc4/q9v8\nc9sPxhpN4wn3n+qepeqeAK5x/3WZfieGx+8h6Uv8DCNHeAfjv3Q8q0VjwJCesrFbP2X+7NZPidAj\nE7hAyGTSFOvnLX8erfw9YCV+BL4p7DL1gH3SNvK3Z/0Qn3HE64dn/eLifx1Fd/62eP4NVyLsJx1C\nce2bf/7mfL+Kt6UB+ivtm+YasT88u6Yi2z+M+lrpT432J4F9pw+mZOH+rP3pLP2pEzFhaiCdzESG\ncOvBO5g/peMt6d2lYo39d0ivNUvwXyE6KhVb/ssh7r8LMRAs/1XrD0DcfxfiP8DrD54/AFV0/av6\neP/6acQH/NcTr/KH6JCYCnezMOi/8v5H/be7f9N/tdNyluC/sv3V+rnWTvuxUNj/tbax81+u0fDf\nSuttOt7B/Ckd3zVvb7rafzFq6XWxifqv0f8x/2XZ+PBfw39tFb5YyPTz//z+u9P+a+KnTvoO3sH4\nLx3fiyzXTutgbxrgx8F/bdNNR+2/Uq/YuH9dLRXW60cVk14DK2P/aJkinQ7yDfZfR3pH/Feg47/5\n32/6r196/cgVDu3/liK9DgLyX2260U5vMfr9dxvBh/+i+CzptVHE73V69WOj/ddBT/53toKdTV8j\n/5vrT9b+7/eun9P2f6P+m7T/G/GPkP/m481/6xHpHcNu/PJhKFbi18SFi2DhHcyf0vHYf09Sb4ON\n/iXR9d/J/U8Zf5dZxj91/s3ovzzqv3b+IfvvSNL1o5V/belNzP8P/5XxqdLhxdn9N6ZiQf+d6n8z\n+OeP919K+5P7nzr+Ss+f0vHU/EfNv8T8T11/frr/Uv1jFv+l+Ffp8V88ng9YwTT/pz5/EPuf+vz1\nH/pv1vM39fmfvP9A3f8oPn8Kx1P336j7f8T9x//Bf4n7z6T9b+r+O9l/qe8fSs+f0vHU91/U92+z\n+m/++8d7eX869f0v9f0z+f039f176fFfOp5xWv0Htf4E9fSU+hfsv1Pqb/D4h2n1P9T6I2r9E6n+\nilr/Ra4/o9a/lZ4/peOp9ZcbYv0nsf70pXUe2rLqX19acv0ttf7XfmjOrT+2kxbE/Dd4fmZC/TW5\n/ptaf156/pSOp55/mNF/Wx8y238vD//1+++k80fk80/U81elx3/peMZp5/+o5w8b2vlH7/7viP8m\nnJ/JPf9Zev/X9oes87fYf21MOf9LPn9MPf9cdv78A0xugrwgDfcHAAAAJXRFWHRkYXRlOmNyZWF0\nZQAyMDE1LTExLTMwVDIxOjAzOjIyLTA1OjAwMx3rxQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0x\nMS0zMFQyMTowMzoyMi0wNTowMEJAU3kAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAASWSURB\nVGje7Zs7buMwEEBzieRcaYaB48KVisSFj7Cn4BFU2I37LVan8BFc5ABb2ICtpSSaHP5EUqOAzsIO\nAjwEGjjiZ/hEDZ+eiJ9noHxe6fHvW4BPDmwHEMAaYBdAEb+5Amu/YNlyQLgP4xGhiG9avmwvsBF/\nt/FkY2vj69NLD1f41Z6Yiw3Gvy728ceVuhLhwY8bA0fij8EgO/6wjH2pF/lKxvf3tNG3Z+BRt4oH\nh/Znt5bu+iQd+/Z/Xp8BmiO8X0X/n7KQNbWIZ1wMJjEUPwBuuI1hfcMZxv9Pj19/AexrYH84KASF\nV41nhe8Ku/4f+nSpu3eNsdadjpBLFPF6pIE76Hx4QeiMfy/yVQi/cf6mxx900jk4ScfGlc4/q9v8\nc9sPxhpN4wn3n+qepeqeAK5x/3WZfieGx+8h6Uv8DCNHeAfjv3Q8q0VjwJCesrFbP2X+7NZPidAj\nE7hAyGTSFOvnLX8erfw9YCV+BL4p7DL1gH3SNvK3Z/0Qn3HE64dn/eLifx1Fd/62eP4NVyLsJx1C\nce2bf/7mfL+Kt6UB+ivtm+YasT88u6Yi2z+M+lrpT432J4F9pw+mZOH+rP3pLP2pEzFhaiCdzESG\ncOvBO5g/peMt6d2lYo39d0ivNUvwXyE6KhVb/ssh7r8LMRAs/1XrD0DcfxfiP8DrD54/AFV0/av6\neP/6acQH/NcTr/KH6JCYCnezMOi/8v5H/be7f9N/tdNyluC/sv3V+rnWTvuxUNj/tbax81+u0fDf\nSuttOt7B/Ckd3zVvb7rafzFq6XWxifqv0f8x/2XZ+PBfw39tFb5YyPTz//z+u9P+a+KnTvoO3sH4\nLx3fiyzXTutgbxrgx8F/bdNNR+2/Uq/YuH9dLRXW60cVk14DK2P/aJkinQ7yDfZfR3pH/Feg47/5\n32/6r196/cgVDu3/liK9DgLyX2260U5vMfr9dxvBh/+i+CzptVHE73V69WOj/ddBT/53toKdTV8j\n/5vrT9b+7/eun9P2f6P+m7T/G/GPkP/m481/6xHpHcNu/PJhKFbi18SFi2DhHcyf0vHYf09Sb4ON\n/iXR9d/J/U8Zf5dZxj91/s3ovzzqv3b+IfvvSNL1o5V/belNzP8P/5XxqdLhxdn9N6ZiQf+d6n8z\n+OeP919K+5P7nzr+Ss+f0vHU/EfNv8T8T11/frr/Uv1jFv+l+Ffp8V88ng9YwTT/pz5/EPuf+vz1\nH/pv1vM39fmfvP9A3f8oPn8Kx1P336j7f8T9x//Bf4n7z6T9b+r+O9l/qe8fSs+f0vHU91/U92+z\n+m/++8d7eX869f0v9f0z+f039f176fFfOp5xWv0Htf4E9fSU+hfsv1Pqb/D4h2n1P9T6I2r9E6n+\nilr/Ra4/o9a/lZ4/peOp9ZcbYv0nsf70pXUe2rLqX19acv0ttf7XfmjOrT+2kxbE/Dd4fmZC/TW5\n/ptaf156/pSOp55/mNF/Wx8y238vD//1+++k80fk80/U81elx3/peMZp5/+o5w8b2vlH7/7viP8m\nnJ/JPf9Zev/X9oes87fYf21MOf9LPn9MPf9cdv78A0xugrwgDfcHAAAAJXRFWHRkYXRlOmNyZWF0\nZQAyMDE1LTExLTMwVDIxOjIwOjA3LTA1OjAwkFvB3QAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0x\nMS0zMFQyMToyMDowNy0wNTowMOEGeWEAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -697,7 +697,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": { "collapsed": true }, @@ -709,7 +709,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": { "collapsed": false }, @@ -735,7 +735,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", - " Date/Time: 2015-11-30 21:03:22\n", + " Date/Time: 2015-11-30 21:20:07\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -783,8 +783,79 @@ " 18/1 1.01476 1.02800 +/- 0.00664\n", " 19/1 1.01490 1.02655 +/- 0.00604\n", " 20/1 1.00926 1.02482 +/- 0.00567\n", - " 21/1 0.98504 1.02120 +/- 0.00627\n" + " 21/1 0.98504 1.02120 +/- 0.00627\n", + " 22/1 1.00397 1.01977 +/- 0.00591\n", + " 23/1 1.02556 1.02021 +/- 0.00545\n", + " 24/1 0.99808 1.01863 +/- 0.00529\n", + " 25/1 0.99638 1.01715 +/- 0.00514\n", + " 26/1 0.99615 1.01584 +/- 0.00499\n", + " 27/1 1.01843 1.01599 +/- 0.00469\n", + " 28/1 1.00315 1.01528 +/- 0.00447\n", + " 29/1 1.00633 1.01480 +/- 0.00426\n", + " 30/1 1.02159 1.01514 +/- 0.00405\n", + " 31/1 1.03395 1.01604 +/- 0.00396\n", + " 32/1 1.02672 1.01652 +/- 0.00381\n", + " 33/1 1.03778 1.01745 +/- 0.00375\n", + " 34/1 1.03807 1.01831 +/- 0.00369\n", + " 35/1 1.07854 1.02072 +/- 0.00428\n", + " 36/1 1.03524 1.02128 +/- 0.00415\n", + " 37/1 1.03100 1.02164 +/- 0.00401\n", + " 38/1 1.03853 1.02224 +/- 0.00391\n", + " 39/1 1.04089 1.02288 +/- 0.00383\n", + " 40/1 1.02150 1.02284 +/- 0.00370\n", + " 41/1 0.98470 1.02161 +/- 0.00379\n", + " 42/1 1.00658 1.02114 +/- 0.00370\n", + " 43/1 0.98652 1.02009 +/- 0.00373\n", + " 44/1 1.02787 1.02032 +/- 0.00363\n", + " 45/1 0.98800 1.01939 +/- 0.00364\n", + " 46/1 1.00286 1.01893 +/- 0.00357\n", + " 47/1 1.02559 1.01911 +/- 0.00348\n", + " 48/1 1.03729 1.01959 +/- 0.00342\n", + " 49/1 1.02538 1.01974 +/- 0.00333\n", + " 50/1 1.01478 1.01962 +/- 0.00325\n", + " Creating state point statepoint.50.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 4.2800E-01 seconds\n", + " Reading cross sections = 9.1000E-02 seconds\n", + " Total time in simulation = 4.1240E+01 seconds\n", + " Time in transport only = 4.1215E+01 seconds\n", + " Time in inactive batches = 4.0230E+00 seconds\n", + " Time in active batches = 3.7217E+01 seconds\n", + " Time synchronizing fission bank = 8.0000E-03 seconds\n", + " Sampling source sites = 6.0000E-03 seconds\n", + " SEND/RECV source sites = 2.0000E-03 seconds\n", + " Time accumulating tallies = 2.0000E-03 seconds\n", + " Total time for finalization = 0.0000E+00 seconds\n", + " Total time elapsed = 4.1683E+01 seconds\n", + " Calculation Rate (inactive) = 6214.27 neutrons/second\n", + " Calculation Rate (active) = 2686.94 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.01805 +/- 0.00261\n", + " k-effective (Track-length) = 1.01962 +/- 0.00325\n", + " k-effective (Absorption) = 1.01554 +/- 0.00339\n", + " Combined k-effective = 1.01711 +/- 0.00235\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -808,7 +879,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": { "collapsed": false }, @@ -827,7 +898,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": { "collapsed": false }, @@ -846,11 +917,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1514: RuntimeWarning: invalid value encountered in true_divide\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1515: RuntimeWarning: invalid value encountered in true_divide\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1516: RuntimeWarning: invalid value encountered in true_divide\n" + ] + } + ], "source": [ "# Initialize MGXS Library with OpenMC statepoint data\n", "mgxs_lib.load_from_statepoint(sp)" @@ -881,7 +962,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": { "collapsed": false }, @@ -900,11 +981,101 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
3100001U-2358.063513e-034.062984e-05
4100001U-2387.335515e-034.459335e-05
5100001O-160.000000e+000.000000e+00
0100002U-2353.613274e-011.902492e-03
1100002U-2386.738424e-073.536787e-09
2100002O-160.000000e+000.000000e+00
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "3 10000 1 U-235 8.063513e-03 4.062984e-05\n", + "4 10000 1 U-238 7.335515e-03 4.459335e-05\n", + "5 10000 1 O-16 0.000000e+00 0.000000e+00\n", + "0 10000 2 U-235 3.613274e-01 1.902492e-03\n", + "1 10000 2 U-238 6.738424e-07 3.536787e-09\n", + "2 10000 2 O-16 0.000000e+00 0.000000e+00" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df = fuel_mgxs.get_pandas_dataframe()\n", "df" @@ -919,11 +1090,39 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tNuclide =\tU-235\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t8.06e-03 +/- 5.04e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t3.61e-01 +/- 5.27e-01%\n", + "\n", + "\tNuclide =\tU-238\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t7.34e-03 +/- 6.08e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t6.74e-07 +/- 5.25e-01%\n", + "\n", + "\tNuclide =\tO-16\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t0.00e+00 +/- nan%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t0.00e+00 +/- nan%\n", + "\n", + "\n", + "\n" + ] + } + ], "source": [ "fuel_mgxs.print_xs()" ] @@ -937,7 +1136,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": { "collapsed": true }, @@ -956,7 +1155,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": { "collapsed": true }, @@ -968,7 +1167,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": { "collapsed": true }, @@ -987,7 +1186,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": { "collapsed": true }, @@ -1002,11 +1201,67 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
0100001U-2350.0743830.000280
1100001U-2380.0059590.000036
2100001O-160.0000000.000000
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "0 10000 1 U-235 0.074383 0.000280\n", + "1 10000 1 U-238 0.005959 0.000036\n", + "2 10000 1 O-16 0.000000 0.000000" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Retrieve the NuFissionXS object for the fuel cell from the 1-group library\n", "coarse_fuel_mgxs = coarse_mgxs_lib.get_mgxs(fuel_cell, 'nu-fission')\n", @@ -1031,7 +1286,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": { "collapsed": false }, @@ -1050,7 +1305,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": { "collapsed": false }, @@ -1069,12 +1324,139 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": { "collapsed": false, "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Computing the eigenvalue...\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.854316\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.801593\tres = 1.522E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.761131\tres = 6.380E-02\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.731467\tres = 5.066E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.709897\tres = 3.910E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.695110\tres = 2.954E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.685966\tres = 2.085E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.681511\tres = 1.317E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.680926\tres = 6.520E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.683509\tres = 1.046E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.688659\tres = 3.848E-03\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.695860\tres = 7.565E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.704674\tres = 1.048E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.714726\tres = 1.269E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.725700\tres = 1.428E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.737329\tres = 1.537E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.749388\tres = 1.604E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.761690\tres = 1.637E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.774081\tres = 1.643E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.786432\tres = 1.628E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.798638\tres = 1.597E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.810618\tres = 1.553E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.822303\tres = 1.501E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.833643\tres = 1.443E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.844598\tres = 1.380E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.855140\tres = 1.315E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.865249\tres = 1.249E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.874914\tres = 1.183E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.884128\tres = 1.118E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.892891\tres = 1.054E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.901206\tres = 9.920E-03\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.909080\tres = 9.320E-03\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.916523\tres = 8.745E-03\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.923546\tres = 8.194E-03\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.930162\tres = 7.669E-03\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.936387\tres = 7.171E-03\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.942236\tres = 6.698E-03\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.947725\tres = 6.252E-03\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.952869\tres = 5.830E-03\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.957687\tres = 5.433E-03\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.962193\tres = 5.060E-03\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.966404\tres = 4.710E-03\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.970337\tres = 4.381E-03\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.974006\tres = 4.073E-03\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.977426\tres = 3.785E-03\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.980613\tres = 3.515E-03\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.983580\tres = 3.264E-03\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.986341\tres = 3.029E-03\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.988908\tres = 2.809E-03\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.991293\tres = 2.605E-03\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.993509\tres = 2.415E-03\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.995566\tres = 2.238E-03\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.997475\tres = 2.073E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.999246\tres = 1.920E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.000888\tres = 1.777E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.002409\tres = 1.645E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.003818\tres = 1.522E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.005123\tres = 1.408E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.006331\tres = 1.302E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.007450\tres = 1.203E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.008484\tres = 1.112E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.009440\tres = 1.028E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.010324\tres = 9.496E-04\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.011141\tres = 8.771E-04\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.011897\tres = 8.100E-04\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.012594\tres = 7.478E-04\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.013238\tres = 6.903E-04\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.013833\tres = 6.371E-04\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.014382\tres = 5.879E-04\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.014889\tres = 5.424E-04\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.015357\tres = 5.004E-04\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.015789\tres = 4.615E-04\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.016187\tres = 4.255E-04\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.016554\tres = 3.923E-04\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.016892\tres = 3.617E-04\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.017204\tres = 3.333E-04\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.017492\tres = 3.072E-04\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.017757\tres = 2.831E-04\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.018001\tres = 2.608E-04\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.018226\tres = 2.403E-04\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.018433\tres = 2.213E-04\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.018624\tres = 2.038E-04\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.018800\tres = 1.877E-04\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.018962\tres = 1.728E-04\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.019110\tres = 1.591E-04\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.019248\tres = 1.465E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.019374\tres = 1.348E-04\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.019490\tres = 1.241E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.019597\tres = 1.142E-04\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.019695\tres = 1.051E-04\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.019786\tres = 9.670E-05\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.019869\tres = 8.895E-05\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.019946\tres = 8.183E-05\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.020016\tres = 7.528E-05\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.020081\tres = 6.922E-05\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.020141\tres = 6.368E-05\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.020195\tres = 5.857E-05\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.020246\tres = 5.385E-05\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.020292\tres = 4.954E-05\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.020335\tres = 4.553E-05\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.020374\tres = 4.185E-05\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.020410\tres = 3.848E-05\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.020443\tres = 3.537E-05\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.020474\tres = 3.253E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.020502\tres = 2.989E-05\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.020527\tres = 2.746E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.020551\tres = 2.526E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.020573\tres = 2.319E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.020593\tres = 2.134E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.020611\tres = 1.960E-05\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.020628\tres = 1.800E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.020643\tres = 1.652E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.020657\tres = 1.518E-05\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.020670\tres = 1.398E-05\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.020682\tres = 1.283E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.020693\tres = 1.178E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.020704\tres = 1.083E-05\n" + ] + } + ], "source": [ "# Generate tracks for OpenMOC\n", "openmoc_geometry.initializeFlatSourceRegions()\n", @@ -1095,11 +1477,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 41, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.017105\n", + "openmoc keff = 1.020704\n", + "bias [pcm]: 359.8\n" + ] + } + ], "source": [ "# Print report of keff and bias with OpenMC\n", "openmoc_keff = solver.getKeff()\n", @@ -1138,7 +1530,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "metadata": { "collapsed": false }, @@ -1164,7 +1556,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": { "collapsed": false }, @@ -1198,11 +1590,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 44, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Plot OpenMC's fission rates in the left subplot\n", "fig = pylab.subplot(121)\n", @@ -1214,15 +1627,6 @@ "pylab.imshow(openmoc_fission_rates, interpolation='none', cmap='jet')\n", "pylab.title('OpenMOC Fission Rates')" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.rst b/docs/source/pythonapi/examples/mgxs-part-iii.rst new file mode 100644 index 000000000..f44102862 --- /dev/null +++ b/docs/source/pythonapi/examples/mgxs-part-iii.rst @@ -0,0 +1,13 @@ +.. _notebook_mgxs_part_iii: + +======================== +MGXS Part III: Libraries +======================== + +.. only:: html + + .. notebook:: mgxs-part-iii.ipynb + +.. only:: latex + + IPython notebooks must be viewed in the online HTML documentation. diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.rst b/docs/source/pythonapi/examples/multi-group-cross-sections.rst deleted file mode 100644 index b2da0e1bc..000000000 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.rst +++ /dev/null @@ -1,11 +0,0 @@ -==================================== -Multi-Group Cross Section Generation -==================================== - -.. only:: html - - .. notebook:: multi-group-cross-sections.ipynb - -.. only:: latex - - IPython notebooks must be viewed in the online HTML documentation. diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 465ea8923..6d513d5d5 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -74,7 +74,9 @@ on a given module or class. examples/post-processing examples/pandas-dataframes examples/tally-arithmetic - examples/multi-group-cross-sections + examples/mgxs-part-i + examples/mgxs-part-ii + examples/mgxs-part-iii .. _Jupyter: https://jupyter.org/ .. _NumPy: http://www.numpy.org/ From 7be1b7a609112de93182cb92aefdecb45f40ed50 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Tue, 1 Dec 2015 10:13:37 -0500 Subject: [PATCH 22/49] Now using hash(repr(self)) instead of hash(str(self)) in Python API --- openmc/cross.py | 4 ++-- openmc/element.py | 2 +- openmc/filter.py | 2 +- openmc/material.py | 2 +- openmc/mesh.py | 2 +- openmc/nuclide.py | 2 +- openmc/tallies.py | 2 +- openmc/universe.py | 8 ++++---- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 435557ede..17cdc5ea6 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -52,7 +52,7 @@ class CrossScore(object): self.binary_op = binary_op def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __eq__(self, other): return str(other) == str(self) @@ -152,7 +152,7 @@ class CrossNuclide(object): self.binary_op = binary_op def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __eq__(self, other): return str(other) == str(self) diff --git a/openmc/element.py b/openmc/element.py index cdc422ed2..9f04abfda 100644 --- a/openmc/element.py +++ b/openmc/element.py @@ -58,7 +58,7 @@ class Element(object): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'Element - {0}\n'.format(self._name) diff --git a/openmc/filter.py b/openmc/filter.py index 4c058c085..04935b8ed 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -81,7 +81,7 @@ class Filter(object): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __deepcopy__(self, memo): existing = memo.get(id(self)) diff --git a/openmc/material.py b/openmc/material.py index 9e0a6b93b..37ebc8a77 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -108,7 +108,7 @@ class Material(object): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'Material\n' diff --git a/openmc/mesh.py b/openmc/mesh.py index b963a25a8..8bad6c537 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -190,7 +190,7 @@ class Mesh(object): self._width = width def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'Mesh\n' diff --git a/openmc/nuclide.py b/openmc/nuclide.py index b95601bf7..01fb2aa45 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -61,7 +61,7 @@ class Nuclide(object): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'Nuclide - {0}\n'.format(self._name) diff --git a/openmc/tallies.py b/openmc/tallies.py index 8498fbb5b..197ae2949 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -190,7 +190,7 @@ class Tally(object): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'Tally\n' diff --git a/openmc/universe.py b/openmc/universe.py index 9a8262af3..0e405e9f1 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -95,7 +95,7 @@ class Cell(object): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'Cell\n' @@ -483,7 +483,7 @@ class Universe(object): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'Universe\n' @@ -971,7 +971,7 @@ class RectLattice(Lattice): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'RectLattice\n' @@ -1208,7 +1208,7 @@ class HexLattice(Lattice): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'HexLattice\n' From 8c8ca44e866f315e4ff666bb95fbc4c7524029fe Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 1 Dec 2015 19:57:05 -0600 Subject: [PATCH 23/49] Describe xyz_cross variable --- src/geometry.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index 519505426..9a084a77c 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -599,7 +599,7 @@ contains real(8) :: d_lat ! distance to lattice boundary real(8) :: d_surf ! distance to surface real(8) :: x0,y0,z0 ! coefficients for surface - real(8) :: xyz_cross(3) + real(8) :: xyz_cross(3) ! coordinates at projected surface crossing logical :: coincident ! is particle on surface? type(Cell), pointer :: c class(Surface), pointer :: surf From 8b91ce82b0d86a756ba7a262c427db1371bfe816 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Wed, 2 Dec 2015 09:18:19 -0500 Subject: [PATCH 24/49] Updated MGXS Notebooks per comments from @paulromano --- .../pythonapi/examples/mgxs-part-i.ipynb | 37 +- .../pythonapi/examples/mgxs-part-ii.ipynb | 789 +++++++++--------- .../pythonapi/examples/mgxs-part-iii.ipynb | 4 +- openmc/mgxs/mgxs.py | 13 +- 4 files changed, 413 insertions(+), 430 deletions(-) diff --git a/docs/source/pythonapi/examples/mgxs-part-i.ipynb b/docs/source/pythonapi/examples/mgxs-part-i.ipynb index 5207ac4f3..897af8e3f 100644 --- a/docs/source/pythonapi/examples/mgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-i.ipynb @@ -24,7 +24,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Many Monte Carlo-based neutron particle transport codes, including OpenMC, use continuous energy nuclear cross section data. However, most deterministic neutron transport codes use *multi-group cross sections* defined over discretized energy bins or *energy groups*. An example of U-235's fission continuous energy cross section along with a 16-group cross section computed for a light water reactor spectrum is displayed below." + "Many Monte Carlo particle transport codes, including OpenMC, use continuous-energy nuclear cross section data. However, most deterministic neutron transport codes use *multi-group cross sections* defined over discretized energy bins or *energy groups*. An example of U-235's continuous-energy fission cross section along with a 16-group cross section computed for a light water reactor spectrum is displayed below." ] }, { @@ -79,7 +79,7 @@ "### Spatial and Energy Discretization\n", "The energy domain for critical systems such as thermal reactors spans more than 10 orders of magnitude of neutron energies from 10$^{-5}$ - 10$^7$ eV. The multi-group approximation discretization divides this energy range into one or more energy groups. In particular, for $G$ total groups, we denote an energy group index $g$ such that $g \\in \\{1, 2, ..., G\\}$. The energy group indices are defined such that the smaller group the higher the energy, and vice versa. The integration over neutron energies across a discrete energy group is commonly referred to as **energy condensation**.\n", "\n", - "Multi-group cross sections are computed for discretized spatial zones in the geometry of interest. The spatial zones may be defined on a structured and regular fuel assembly or pin cell mesh, or an unstructured mesh such as the constructive solid geometry used by OpenMC. For a geometry with $K$ distinct spatial zones, we designate each spatial zone an index $k$ such that $k \\in \\{1, 2, ..., K\\}$. The volume of each spatial zone is denoted by $V_{k}$. The integration over discrete spatial zones is commonly referred to as **spatial homogenization**." + "Multi-group cross sections are computed for discretized spatial zones in the geometry of interest. The spatial zones may be defined on a structured and regular fuel assembly or pin cell mesh, an arbitrary unstructured mesh or the constructive solid geometry used by OpenMC. For a geometry with $K$ distinct spatial zones, we designate each spatial zone an index $k$ such that $k \\in \\{1, 2, ..., K\\}$. The volume of each spatial zone is denoted by $V_{k}$. The integration over discrete spatial zones is commonly referred to as **spatial homogenization**." ] }, { @@ -518,7 +518,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", - " Date/Time: 2015-11-30 21:26:04\n", + " Date/Time: 2015-12-02 09:11:05\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -605,19 +605,19 @@ " =======================> TIMING STATISTICS <=======================\n", "\n", " Total time for initialization = 4.1700E-01 seconds\n", - " Reading cross sections = 9.7000E-02 seconds\n", - " Total time in simulation = 1.4656E+01 seconds\n", - " Time in transport only = 1.4643E+01 seconds\n", - " Time in inactive batches = 1.7940E+00 seconds\n", - " Time in active batches = 1.2862E+01 seconds\n", + " Reading cross sections = 8.9000E-02 seconds\n", + " Total time in simulation = 1.4728E+01 seconds\n", + " Time in transport only = 1.4712E+01 seconds\n", + " Time in inactive batches = 1.7890E+00 seconds\n", + " Time in active batches = 1.2939E+01 seconds\n", " Time synchronizing fission bank = 5.0000E-03 seconds\n", - " Sampling source sites = 4.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 = 0.0000E+00 seconds\n", - " Total time elapsed = 1.5082E+01 seconds\n", - " Calculation Rate (inactive) = 13935.3 neutrons/second\n", - " Calculation Rate (active) = 7774.84 neutrons/second\n", + " Sampling source sites = 3.0000E-03 seconds\n", + " SEND/RECV source sites = 2.0000E-03 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", + " Total time for finalization = 1.0000E-03 seconds\n", + " Total time elapsed = 1.5155E+01 seconds\n", + " Calculation Rate (inactive) = 13974.3 neutrons/second\n", + " Calculation Rate (active) = 7728.57 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -776,13 +776,6 @@ "collapsed": false }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" - ] - }, { "data": { "text/html": [ diff --git a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb index 99610944b..6194b154a 100644 --- a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb @@ -10,7 +10,7 @@ "* Calculation of cross sections on a **nuclide-by-nuclide basis**\n", "* The use of **[tally precision triggers](https://mit-crpg.github.io/openmc/usersguide/input.html#trigger-element)** with multi-group cross sections\n", "* Built-in features for **energy condensation** in downstream data processing\n", - "* The use of **[PyNE](http://pyne.io/) to plot** continuous energy vs. multi-group cross sections\n", + "* The use of **[PyNE](http://pyne.io/) to plot** continuous-energy vs. multi-group cross sections\n", "* **Validation** of multi-group cross sections with **[OpenMOC](https://mit-crpg.github.io/OpenMOC/)**\n", "\n", "**Note:** This Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook in its entirety, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries. In addition, this Notebook illustrates the use of [Pandas](http://pandas.pydata.org/) `DataFrames` to containerize multi-group cross section data. We recommend using [Pandas](http://pandas.pydata.org/) >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases of [Pandas](http://pandas.pydata.org/)." @@ -448,7 +448,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", - " Date/Time: 2015-11-30 20:39:59\n", + " Date/Time: 2015-12-02 09:13:42\n", " MPI Processes: 3\n", "\n", " ===========================================================================\n", @@ -568,20 +568,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 6.7400E-01 seconds\n", - " Reading cross sections = 1.4300E-01 seconds\n", - " Total time in simulation = 1.3404E+02 seconds\n", - " Time in transport only = 1.1927E+02 seconds\n", - " Time in inactive batches = 7.6750E+00 seconds\n", - " Time in active batches = 1.2636E+02 seconds\n", - " Time synchronizing fission bank = 1.4700E+01 seconds\n", - " Sampling source sites = 6.0000E-03 seconds\n", - " SEND/RECV source sites = 5.0000E-03 seconds\n", - " Time accumulating tallies = 4.0000E-03 seconds\n", - " Total time for finalization = 1.5000E-02 seconds\n", - " Total time elapsed = 1.3475E+02 seconds\n", - " Calculation Rate (inactive) = 13029.3 neutrons/second\n", - " Calculation Rate (active) = 3165.53 neutrons/second\n", + " Total time for initialization = 7.5700E-01 seconds\n", + " Reading cross sections = 1.5800E-01 seconds\n", + " Total time in simulation = 1.4921E+02 seconds\n", + " Time in transport only = 1.4336E+02 seconds\n", + " Time in inactive batches = 8.6210E+00 seconds\n", + " Time in active batches = 1.4059E+02 seconds\n", + " Time synchronizing fission bank = 5.6060E+00 seconds\n", + " Sampling source sites = 1.4000E-02 seconds\n", + " SEND/RECV source sites = 4.0000E-03 seconds\n", + " Time accumulating tallies = 6.0000E-03 seconds\n", + " Total time for finalization = 1.3000E-02 seconds\n", + " Total time elapsed = 1.5002E+02 seconds\n", + " Calculation Rate (inactive) = 11599.6 neutrons/second\n", + " Calculation Rate (active) = 2845.11 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -801,14 +801,6 @@ "collapsed": false }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1272: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)\n" - ] - }, { "data": { "text/html": [ @@ -1197,172 +1189,170 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ NORMAL ] Ray tracing for track segmentation...\n", - "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.574633\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.574633\tres = 1.959E-316\n", "[ NORMAL ] Iteration 1:\tk_eff = 0.679931\tres = 4.254E-01\n", "[ NORMAL ] Iteration 2:\tk_eff = 0.660910\tres = 1.832E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.658975\tres = 2.798E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.642976\tres = 2.927E-03\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.658975\tres = 2.797E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.642976\tres = 2.928E-03\n", "[ NORMAL ] Iteration 5:\tk_eff = 0.625710\tres = 2.428E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.606521\tres = 2.685E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.606520\tres = 2.685E-02\n", "[ NORMAL ] Iteration 7:\tk_eff = 0.587277\tres = 3.067E-02\n", "[ NORMAL ] Iteration 8:\tk_eff = 0.568777\tres = 3.173E-02\n", "[ NORMAL ] Iteration 9:\tk_eff = 0.551415\tres = 3.150E-02\n", "[ NORMAL ] Iteration 10:\tk_eff = 0.535708\tres = 3.052E-02\n", "[ NORMAL ] Iteration 11:\tk_eff = 0.521916\tres = 2.849E-02\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.510222\tres = 2.575E-02\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.510221\tres = 2.575E-02\n", "[ NORMAL ] Iteration 13:\tk_eff = 0.500691\tres = 2.241E-02\n", "[ NORMAL ] Iteration 14:\tk_eff = 0.493392\tres = 1.868E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.488318\tres = 1.458E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.488317\tres = 1.458E-02\n", "[ NORMAL ] Iteration 16:\tk_eff = 0.485438\tres = 1.028E-02\n", "[ NORMAL ] Iteration 17:\tk_eff = 0.484705\tres = 5.896E-03\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.486046\tres = 1.510E-03\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.486045\tres = 1.510E-03\n", "[ NORMAL ] Iteration 19:\tk_eff = 0.489362\tres = 2.766E-03\n", "[ NORMAL ] Iteration 20:\tk_eff = 0.494546\tres = 6.824E-03\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.501482\tres = 1.059E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.510042\tres = 1.402E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.520095\tres = 1.707E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.531508\tres = 1.971E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.544145\tres = 2.194E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.501481\tres = 1.059E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.510041\tres = 1.402E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.520094\tres = 1.707E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.531507\tres = 1.971E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.544144\tres = 2.194E-02\n", "[ NORMAL ] Iteration 26:\tk_eff = 0.557872\tres = 2.378E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.572558\tres = 2.523E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.588073\tres = 2.632E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.572557\tres = 2.523E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.588072\tres = 2.632E-02\n", "[ NORMAL ] Iteration 29:\tk_eff = 0.604293\tres = 2.710E-02\n", "[ NORMAL ] Iteration 30:\tk_eff = 0.621101\tres = 2.758E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.638383\tres = 2.781E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.656033\tres = 2.782E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.673951\tres = 2.765E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.692044\tres = 2.731E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.710228\tres = 2.685E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.638382\tres = 2.781E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.656032\tres = 2.782E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.673950\tres = 2.765E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.692043\tres = 2.731E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.710227\tres = 2.685E-02\n", "[ NORMAL ] Iteration 36:\tk_eff = 0.728423\tres = 2.628E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.746559\tres = 2.562E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.746558\tres = 2.562E-02\n", "[ NORMAL ] Iteration 38:\tk_eff = 0.764569\tres = 2.490E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.782397\tres = 2.413E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.799990\tres = 2.332E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.817302\tres = 2.249E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.834293\tres = 2.164E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.850928\tres = 2.079E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.867178\tres = 1.994E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.883019\tres = 1.910E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.898428\tres = 1.827E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.913391\tres = 1.745E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.927893\tres = 1.665E-02\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.941926\tres = 1.588E-02\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.955484\tres = 1.512E-02\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.968564\tres = 1.439E-02\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.981163\tres = 1.369E-02\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.993284\tres = 1.301E-02\n", - "[ NORMAL ] Iteration 54:\tk_eff = 1.004930\tres = 1.235E-02\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.016106\tres = 1.172E-02\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.026818\tres = 1.112E-02\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.037075\tres = 1.054E-02\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.046885\tres = 9.989E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.056259\tres = 9.459E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.065207\tres = 8.954E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.073742\tres = 8.471E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.081873\tres = 8.012E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.089615\tres = 7.573E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.096981\tres = 7.156E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.103982\tres = 6.760E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.110632\tres = 6.382E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.116945\tres = 6.024E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.122933\tres = 5.684E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.128609\tres = 5.361E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.133986\tres = 5.055E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.139077\tres = 4.764E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.143893\tres = 4.490E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.148448\tres = 4.228E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.152754\tres = 3.982E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.156821\tres = 3.749E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.160661\tres = 3.528E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.164285\tres = 3.319E-03\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.167703\tres = 3.122E-03\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.170925\tres = 2.936E-03\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.173962\tres = 2.759E-03\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.176824\tres = 2.594E-03\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.179518\tres = 2.437E-03\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.182054\tres = 2.289E-03\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.184440\tres = 2.150E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.186684\tres = 2.018E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.188794\tres = 1.895E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.190777\tres = 1.778E-03\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.192641\tres = 1.668E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.194391\tres = 1.565E-03\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.196034\tres = 1.467E-03\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.197577\tres = 1.376E-03\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.199024\tres = 1.290E-03\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.200382\tres = 1.209E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.201656\tres = 1.133E-03\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.202850\tres = 1.061E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.203970\tres = 9.941E-04\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.205018\tres = 9.307E-04\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.206002\tres = 8.706E-04\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.206923\tres = 8.158E-04\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.207785\tres = 7.636E-04\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.208592\tres = 7.144E-04\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.209347\tres = 6.684E-04\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.210055\tres = 6.249E-04\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.210716\tres = 5.849E-04\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.211335\tres = 5.465E-04\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.211915\tres = 5.115E-04\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.212455\tres = 4.782E-04\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.212962\tres = 4.461E-04\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.213435\tres = 4.176E-04\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.213877\tres = 3.900E-04\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.214290\tres = 3.643E-04\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.214676\tres = 3.404E-04\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.215038\tres = 3.181E-04\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.215375\tres = 2.973E-04\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.215689\tres = 2.771E-04\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.215982\tres = 2.585E-04\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.216257\tres = 2.416E-04\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.216513\tres = 2.258E-04\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.216752\tres = 2.105E-04\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.216975\tres = 1.963E-04\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.217183\tres = 1.834E-04\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.217377\tres = 1.709E-04\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.217558\tres = 1.594E-04\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.217728\tres = 1.488E-04\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.217885\tres = 1.388E-04\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.218033\tres = 1.297E-04\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.218170\tres = 1.206E-04\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.218296\tres = 1.126E-04\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.218416\tres = 1.041E-04\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.218527\tres = 9.807E-05\n", - "[ NORMAL ] Iteration 131:\tk_eff = 1.218631\tres = 9.109E-05\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.218727\tres = 8.502E-05\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.218817\tres = 7.897E-05\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.218901\tres = 7.364E-05\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.218979\tres = 6.886E-05\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.219051\tres = 6.353E-05\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.219120\tres = 5.977E-05\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.219183\tres = 5.590E-05\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.219242\tres = 5.170E-05\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.219296\tres = 4.832E-05\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.219347\tres = 4.486E-05\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.219395\tres = 4.185E-05\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.219439\tres = 3.868E-05\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.219480\tres = 3.650E-05\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.219518\tres = 3.379E-05\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.219554\tres = 3.107E-05\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.219587\tres = 2.929E-05\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.219618\tres = 2.709E-05\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.219647\tres = 2.542E-05\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.219674\tres = 2.362E-05\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.219699\tres = 2.199E-05\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.219722\tres = 2.070E-05\n", - "[ NORMAL ] Iteration 153:\tk_eff = 1.219743\tres = 1.878E-05\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.219763\tres = 1.770E-05\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.219782\tres = 1.628E-05\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.219799\tres = 1.526E-05\n", - "[ NORMAL ] Iteration 157:\tk_eff = 1.219815\tres = 1.387E-05\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.219830\tres = 1.319E-05\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.219844\tres = 1.208E-05\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.219857\tres = 1.150E-05\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.219869\tres = 1.055E-05\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.219880\tres = 1.008E-05\n" + "[ NORMAL ] Iteration 39:\tk_eff = 0.782396\tres = 2.412E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.799989\tres = 2.332E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.817301\tres = 2.249E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.834292\tres = 2.164E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.850927\tres = 2.079E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.867177\tres = 1.994E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.883017\tres = 1.910E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.898427\tres = 1.827E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.913389\tres = 1.745E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.927891\tres = 1.665E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.941925\tres = 1.588E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.955483\tres = 1.512E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.968562\tres = 1.439E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.981161\tres = 1.369E-02\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.993282\tres = 1.301E-02\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.004928\tres = 1.235E-02\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.016104\tres = 1.172E-02\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.026816\tres = 1.112E-02\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.037073\tres = 1.054E-02\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.046883\tres = 9.989E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.056257\tres = 9.460E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.065205\tres = 8.954E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.073739\tres = 8.472E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.081871\tres = 8.012E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.089613\tres = 7.573E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.096979\tres = 7.156E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.103980\tres = 6.760E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.110631\tres = 6.382E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.116943\tres = 6.024E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.122931\tres = 5.684E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.128607\tres = 5.361E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.133984\tres = 5.055E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.139075\tres = 4.764E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.143892\tres = 4.489E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.148447\tres = 4.229E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.152752\tres = 3.982E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.156819\tres = 3.749E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.160659\tres = 3.528E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.164282\tres = 3.319E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.167701\tres = 3.122E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.170923\tres = 2.936E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.173961\tres = 2.760E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.176822\tres = 2.594E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.179516\tres = 2.437E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.182052\tres = 2.289E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.184438\tres = 2.150E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.186682\tres = 2.019E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.188792\tres = 1.895E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.190775\tres = 1.778E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.192639\tres = 1.668E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.194389\tres = 1.565E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.196032\tres = 1.468E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.197575\tres = 1.376E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.199023\tres = 1.290E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.200381\tres = 1.209E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.201654\tres = 1.133E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.202849\tres = 1.061E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.203968\tres = 9.939E-04\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.205017\tres = 9.307E-04\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.206000\tres = 8.714E-04\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.206921\tres = 8.157E-04\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.207783\tres = 7.634E-04\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.208590\tres = 7.144E-04\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.209346\tres = 6.684E-04\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.210053\tres = 6.252E-04\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.210715\tres = 5.848E-04\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.211334\tres = 5.468E-04\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.211913\tres = 5.113E-04\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.212454\tres = 4.779E-04\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.212960\tres = 4.467E-04\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.213434\tres = 4.175E-04\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.213876\tres = 3.901E-04\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.214289\tres = 3.644E-04\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.214675\tres = 3.404E-04\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.215036\tres = 3.180E-04\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.215373\tres = 2.969E-04\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.215687\tres = 2.773E-04\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.215981\tres = 2.589E-04\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.216255\tres = 2.416E-04\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.216511\tres = 2.256E-04\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.216750\tres = 2.105E-04\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.216973\tres = 1.964E-04\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.217181\tres = 1.833E-04\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.217376\tres = 1.710E-04\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.217557\tres = 1.595E-04\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.217726\tres = 1.488E-04\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.217883\tres = 1.388E-04\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.218030\tres = 1.294E-04\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.218167\tres = 1.207E-04\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.218295\tres = 1.125E-04\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.218414\tres = 1.049E-04\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.218525\tres = 9.777E-05\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.218629\tres = 9.113E-05\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.218725\tres = 8.494E-05\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.218815\tres = 7.916E-05\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.218899\tres = 7.376E-05\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.218977\tres = 6.873E-05\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.219050\tres = 6.404E-05\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.219117\tres = 5.966E-05\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.219180\tres = 5.557E-05\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.219239\tres = 5.177E-05\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.219294\tres = 4.822E-05\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.219345\tres = 4.491E-05\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.219392\tres = 4.182E-05\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.219437\tres = 3.894E-05\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.219478\tres = 3.626E-05\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.219516\tres = 3.376E-05\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.219552\tres = 3.144E-05\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.219585\tres = 2.927E-05\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.219616\tres = 2.724E-05\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.219645\tres = 2.536E-05\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.219672\tres = 2.361E-05\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.219696\tres = 2.197E-05\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.219720\tres = 2.045E-05\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.219741\tres = 1.903E-05\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.219761\tres = 1.771E-05\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.219780\tres = 1.648E-05\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.219797\tres = 1.534E-05\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.219814\tres = 1.427E-05\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.219829\tres = 1.328E-05\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.219843\tres = 1.235E-05\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.219856\tres = 1.149E-05\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.219868\tres = 1.069E-05\n" ] } ], @@ -1396,8 +1386,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.223729\n", - "openmoc keff = 1.219880\n", - "bias [pcm]: -384.9\n" + "openmoc keff = 1.219868\n", + "bias [pcm]: -386.1\n" ] } ], @@ -1470,240 +1460,239 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ NORMAL ] Ray tracing for track segmentation...\n", - "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.495594\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.557313\tres = 5.044E-01\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.495594\tres = 1.959E-316\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.557312\tres = 5.044E-01\n", "[ NORMAL ] Iteration 2:\tk_eff = 0.518115\tres = 1.245E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.509017\tres = 7.033E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.496280\tres = 1.756E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.488358\tres = 2.502E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.482660\tres = 1.596E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.479524\tres = 1.167E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.478569\tres = 6.497E-03\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.479591\tres = 1.992E-03\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.482389\tres = 2.136E-03\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.509016\tres = 7.033E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.496279\tres = 1.756E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.488357\tres = 2.502E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.482659\tres = 1.596E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.479523\tres = 1.167E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.478568\tres = 6.497E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.479590\tres = 1.991E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.482388\tres = 2.136E-03\n", "[ NORMAL ] Iteration 11:\tk_eff = 0.486774\tres = 5.834E-03\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.492576\tres = 9.091E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.492575\tres = 9.091E-03\n", "[ NORMAL ] Iteration 13:\tk_eff = 0.499632\tres = 1.192E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.507800\tres = 1.433E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.516944\tres = 1.635E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.526943\tres = 1.801E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.537682\tres = 1.934E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.549061\tres = 2.038E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.560985\tres = 2.116E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.507799\tres = 1.433E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.516943\tres = 1.635E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.526942\tres = 1.801E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.537681\tres = 1.934E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.549060\tres = 2.038E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.560984\tres = 2.116E-02\n", "[ NORMAL ] Iteration 20:\tk_eff = 0.573368\tres = 2.172E-02\n", "[ NORMAL ] Iteration 21:\tk_eff = 0.586133\tres = 2.207E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.599208\tres = 2.226E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.599207\tres = 2.226E-02\n", "[ NORMAL ] Iteration 23:\tk_eff = 0.612528\tres = 2.231E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.626036\tres = 2.223E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.626035\tres = 2.223E-02\n", "[ NORMAL ] Iteration 25:\tk_eff = 0.639676\tres = 2.205E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.653403\tres = 2.179E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.667171\tres = 2.146E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.653402\tres = 2.179E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.667170\tres = 2.146E-02\n", "[ NORMAL ] Iteration 28:\tk_eff = 0.680942\tres = 2.107E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.694682\tres = 2.064E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.708357\tres = 2.018E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.721941\tres = 1.969E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.735408\tres = 1.918E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.748735\tres = 1.865E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.761905\tres = 1.812E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.774898\tres = 1.759E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.787701\tres = 1.705E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.800300\tres = 1.652E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.812684\tres = 1.599E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.824845\tres = 1.548E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.836773\tres = 1.496E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.848463\tres = 1.446E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.859909\tres = 1.397E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.871106\tres = 1.349E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.694681\tres = 2.064E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.708356\tres = 2.018E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.721940\tres = 1.969E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.735406\tres = 1.918E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.748734\tres = 1.865E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.761904\tres = 1.812E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.774897\tres = 1.759E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.787700\tres = 1.705E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.800299\tres = 1.652E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.812684\tres = 1.600E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.824844\tres = 1.547E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.836772\tres = 1.496E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.848462\tres = 1.446E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.859908\tres = 1.397E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.871105\tres = 1.349E-02\n", "[ NORMAL ] Iteration 44:\tk_eff = 0.882052\tres = 1.302E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.892746\tres = 1.257E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.892745\tres = 1.257E-02\n", "[ NORMAL ] Iteration 46:\tk_eff = 0.903184\tres = 1.212E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.913368\tres = 1.169E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.913367\tres = 1.169E-02\n", "[ NORMAL ] Iteration 48:\tk_eff = 0.923297\tres = 1.128E-02\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.932973\tres = 1.087E-02\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.942395\tres = 1.048E-02\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.951568\tres = 1.010E-02\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.960491\tres = 9.733E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.969169\tres = 9.378E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 0.977605\tres = 9.035E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 0.985801\tres = 8.704E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 0.993762\tres = 8.384E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.001492\tres = 8.075E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.008993\tres = 7.778E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.016272\tres = 7.490E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.023330\tres = 7.214E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.030175\tres = 6.945E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.036810\tres = 6.689E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.043239\tres = 6.441E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.049467\tres = 6.200E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.055499\tres = 5.970E-03\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.932972\tres = 1.087E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.942394\tres = 1.048E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.951566\tres = 1.010E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.960490\tres = 9.733E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.969168\tres = 9.378E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 0.977604\tres = 9.035E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 0.985800\tres = 8.704E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 0.993761\tres = 8.384E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.001491\tres = 8.076E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.008992\tres = 7.778E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.016271\tres = 7.490E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.023330\tres = 7.213E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.030174\tres = 6.946E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.036809\tres = 6.688E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.043238\tres = 6.440E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.049466\tres = 6.201E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.055498\tres = 5.970E-03\n", "[ NORMAL ] Iteration 66:\tk_eff = 1.061339\tres = 5.748E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.066994\tres = 5.533E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.072466\tres = 5.328E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.077761\tres = 5.128E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.082883\tres = 4.937E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.066993\tres = 5.534E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.072465\tres = 5.327E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.077760\tres = 5.129E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.082882\tres = 4.937E-03\n", "[ NORMAL ] Iteration 71:\tk_eff = 1.087837\tres = 4.753E-03\n", "[ NORMAL ] Iteration 72:\tk_eff = 1.092628\tres = 4.575E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.097261\tres = 4.404E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.101738\tres = 4.240E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.106067\tres = 4.080E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.110248\tres = 3.929E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.114289\tres = 3.781E-03\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.118192\tres = 3.639E-03\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.121963\tres = 3.502E-03\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.125604\tres = 3.372E-03\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.129120\tres = 3.245E-03\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.132515\tres = 3.124E-03\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.135791\tres = 3.006E-03\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.138955\tres = 2.893E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.142009\tres = 2.786E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.144955\tres = 2.681E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.147798\tres = 2.580E-03\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.150540\tres = 2.483E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.153187\tres = 2.389E-03\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.155740\tres = 2.300E-03\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.158202\tres = 2.214E-03\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.160576\tres = 2.130E-03\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.162866\tres = 2.050E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.165075\tres = 1.973E-03\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.167203\tres = 1.899E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.169257\tres = 1.827E-03\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.171236\tres = 1.759E-03\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.173143\tres = 1.693E-03\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.174982\tres = 1.629E-03\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.176754\tres = 1.568E-03\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.178463\tres = 1.508E-03\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.180109\tres = 1.452E-03\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.181695\tres = 1.397E-03\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.183225\tres = 1.344E-03\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.184698\tres = 1.294E-03\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.186116\tres = 1.245E-03\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.187483\tres = 1.198E-03\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.188801\tres = 1.152E-03\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.190070\tres = 1.110E-03\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.191292\tres = 1.067E-03\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.192470\tres = 1.026E-03\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.193603\tres = 9.889E-04\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.194696\tres = 9.502E-04\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.195748\tres = 9.155E-04\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.196760\tres = 8.807E-04\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.197736\tres = 8.464E-04\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.198675\tres = 8.155E-04\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.199580\tres = 7.844E-04\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.200452\tres = 7.551E-04\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.201290\tres = 7.262E-04\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.202098\tres = 6.981E-04\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.202876\tres = 6.728E-04\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.203624\tres = 6.471E-04\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.204346\tres = 6.219E-04\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.205039\tres = 5.993E-04\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.205708\tres = 5.756E-04\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.206351\tres = 5.551E-04\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.206970\tres = 5.328E-04\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.207566\tres = 5.132E-04\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.208140\tres = 4.943E-04\n", - "[ NORMAL ] Iteration 131:\tk_eff = 1.208691\tres = 4.749E-04\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.209223\tres = 4.564E-04\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.209734\tres = 4.396E-04\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.210228\tres = 4.231E-04\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.210702\tres = 4.076E-04\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.211158\tres = 3.916E-04\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.211597\tres = 3.767E-04\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.212019\tres = 3.628E-04\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.212425\tres = 3.484E-04\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.212817\tres = 3.350E-04\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.213193\tres = 3.227E-04\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.213556\tres = 3.106E-04\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.213904\tres = 2.989E-04\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.214240\tres = 2.869E-04\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.214563\tres = 2.770E-04\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.214874\tres = 2.659E-04\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.215172\tres = 2.557E-04\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.215459\tres = 2.457E-04\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.215737\tres = 2.361E-04\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.216003\tres = 2.281E-04\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.216260\tres = 2.194E-04\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.216507\tres = 2.109E-04\n", - "[ NORMAL ] Iteration 153:\tk_eff = 1.216744\tres = 2.028E-04\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.216972\tres = 1.950E-04\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.217193\tres = 1.876E-04\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.217403\tres = 1.809E-04\n", - "[ NORMAL ] Iteration 157:\tk_eff = 1.217607\tres = 1.733E-04\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.217802\tres = 1.673E-04\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.217990\tres = 1.603E-04\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.218171\tres = 1.544E-04\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.218346\tres = 1.486E-04\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.218513\tres = 1.429E-04\n", - "[ NORMAL ] Iteration 163:\tk_eff = 1.218674\tres = 1.376E-04\n", - "[ NORMAL ] Iteration 164:\tk_eff = 1.218829\tres = 1.322E-04\n", - "[ NORMAL ] Iteration 165:\tk_eff = 1.218979\tres = 1.274E-04\n", - "[ NORMAL ] Iteration 166:\tk_eff = 1.219123\tres = 1.225E-04\n", - "[ NORMAL ] Iteration 167:\tk_eff = 1.219261\tres = 1.181E-04\n", - "[ NORMAL ] Iteration 168:\tk_eff = 1.219394\tres = 1.132E-04\n", - "[ NORMAL ] Iteration 169:\tk_eff = 1.219522\tres = 1.090E-04\n", - "[ NORMAL ] Iteration 170:\tk_eff = 1.219645\tres = 1.049E-04\n", - "[ NORMAL ] Iteration 171:\tk_eff = 1.219763\tres = 1.008E-04\n", - "[ NORMAL ] Iteration 172:\tk_eff = 1.219877\tres = 9.716E-05\n", - "[ NORMAL ] Iteration 173:\tk_eff = 1.219986\tres = 9.353E-05\n", - "[ NORMAL ] Iteration 174:\tk_eff = 1.220091\tres = 8.948E-05\n", - "[ NORMAL ] Iteration 175:\tk_eff = 1.220192\tres = 8.598E-05\n", - "[ NORMAL ] Iteration 176:\tk_eff = 1.220290\tres = 8.274E-05\n", - "[ NORMAL ] Iteration 177:\tk_eff = 1.220384\tres = 7.979E-05\n", - "[ NORMAL ] Iteration 178:\tk_eff = 1.220474\tres = 7.672E-05\n", - "[ NORMAL ] Iteration 179:\tk_eff = 1.220561\tres = 7.406E-05\n", - "[ NORMAL ] Iteration 180:\tk_eff = 1.220644\tres = 7.136E-05\n", - "[ NORMAL ] Iteration 181:\tk_eff = 1.220725\tres = 6.812E-05\n", - "[ NORMAL ] Iteration 182:\tk_eff = 1.220802\tres = 6.605E-05\n", - "[ NORMAL ] Iteration 183:\tk_eff = 1.220877\tres = 6.346E-05\n", - "[ NORMAL ] Iteration 184:\tk_eff = 1.220948\tres = 6.086E-05\n", - "[ NORMAL ] Iteration 185:\tk_eff = 1.221016\tres = 5.825E-05\n", - "[ NORMAL ] Iteration 186:\tk_eff = 1.221083\tres = 5.620E-05\n", - "[ NORMAL ] Iteration 187:\tk_eff = 1.221146\tres = 5.433E-05\n", - "[ NORMAL ] Iteration 188:\tk_eff = 1.221208\tres = 5.215E-05\n", - "[ NORMAL ] Iteration 189:\tk_eff = 1.221267\tres = 5.031E-05\n", - "[ NORMAL ] Iteration 190:\tk_eff = 1.221323\tres = 4.820E-05\n", - "[ NORMAL ] Iteration 191:\tk_eff = 1.221377\tres = 4.623E-05\n", - "[ NORMAL ] Iteration 192:\tk_eff = 1.221430\tres = 4.449E-05\n", - "[ NORMAL ] Iteration 193:\tk_eff = 1.221480\tres = 4.287E-05\n", - "[ NORMAL ] Iteration 194:\tk_eff = 1.221529\tres = 4.123E-05\n", - "[ NORMAL ] Iteration 195:\tk_eff = 1.221575\tres = 3.993E-05\n", - "[ NORMAL ] Iteration 196:\tk_eff = 1.221620\tres = 3.779E-05\n", - "[ NORMAL ] Iteration 197:\tk_eff = 1.221663\tres = 3.667E-05\n", - "[ NORMAL ] Iteration 198:\tk_eff = 1.221705\tres = 3.541E-05\n", - "[ NORMAL ] Iteration 199:\tk_eff = 1.221744\tres = 3.378E-05\n", - "[ NORMAL ] Iteration 200:\tk_eff = 1.221782\tres = 3.233E-05\n", - "[ NORMAL ] Iteration 201:\tk_eff = 1.221820\tres = 3.127E-05\n", - "[ NORMAL ] Iteration 202:\tk_eff = 1.221855\tres = 3.033E-05\n", - "[ NORMAL ] Iteration 203:\tk_eff = 1.221889\tres = 2.911E-05\n", - "[ NORMAL ] Iteration 204:\tk_eff = 1.221922\tres = 2.775E-05\n", - "[ NORMAL ] Iteration 205:\tk_eff = 1.221954\tres = 2.682E-05\n", - "[ NORMAL ] Iteration 206:\tk_eff = 1.221984\tres = 2.580E-05\n", - "[ NORMAL ] Iteration 207:\tk_eff = 1.222013\tres = 2.467E-05\n", - "[ NORMAL ] Iteration 208:\tk_eff = 1.222041\tres = 2.365E-05\n", - "[ NORMAL ] Iteration 209:\tk_eff = 1.222068\tres = 2.298E-05\n", - "[ NORMAL ] Iteration 210:\tk_eff = 1.222094\tres = 2.216E-05\n", - "[ NORMAL ] Iteration 211:\tk_eff = 1.222119\tres = 2.115E-05\n", - "[ NORMAL ] Iteration 212:\tk_eff = 1.222143\tres = 2.038E-05\n", - "[ NORMAL ] Iteration 213:\tk_eff = 1.222166\tres = 1.954E-05\n", - "[ NORMAL ] Iteration 214:\tk_eff = 1.222188\tres = 1.879E-05\n", - "[ NORMAL ] Iteration 215:\tk_eff = 1.222209\tres = 1.810E-05\n", - "[ NORMAL ] Iteration 216:\tk_eff = 1.222230\tres = 1.741E-05\n", - "[ NORMAL ] Iteration 217:\tk_eff = 1.222250\tres = 1.694E-05\n", - "[ NORMAL ] Iteration 218:\tk_eff = 1.222269\tres = 1.617E-05\n", - "[ NORMAL ] Iteration 219:\tk_eff = 1.222287\tres = 1.574E-05\n", - "[ NORMAL ] Iteration 220:\tk_eff = 1.222305\tres = 1.497E-05\n", - "[ NORMAL ] Iteration 221:\tk_eff = 1.222322\tres = 1.452E-05\n", - "[ NORMAL ] Iteration 222:\tk_eff = 1.222338\tres = 1.381E-05\n", - "[ NORMAL ] Iteration 223:\tk_eff = 1.222354\tres = 1.330E-05\n", - "[ NORMAL ] Iteration 224:\tk_eff = 1.222369\tres = 1.285E-05\n", - "[ NORMAL ] Iteration 225:\tk_eff = 1.222383\tres = 1.230E-05\n", - "[ NORMAL ] Iteration 226:\tk_eff = 1.222397\tres = 1.170E-05\n", - "[ NORMAL ] Iteration 227:\tk_eff = 1.222410\tres = 1.124E-05\n", - "[ NORMAL ] Iteration 228:\tk_eff = 1.222423\tres = 1.095E-05\n", - "[ NORMAL ] Iteration 229:\tk_eff = 1.222436\tres = 1.047E-05\n", - "[ NORMAL ] Iteration 230:\tk_eff = 1.222448\tres = 1.009E-05\n" + "[ NORMAL ] Iteration 73:\tk_eff = 1.097260\tres = 4.404E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.101737\tres = 4.239E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.106065\tres = 4.081E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.110247\tres = 3.928E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.114288\tres = 3.781E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.118191\tres = 3.639E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.121961\tres = 3.503E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.125603\tres = 3.372E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.129119\tres = 3.245E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.132513\tres = 3.124E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.135790\tres = 3.007E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.138954\tres = 2.894E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.142007\tres = 2.785E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.144953\tres = 2.681E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.147796\tres = 2.580E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.150539\tres = 2.483E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.153185\tres = 2.390E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.155738\tres = 2.300E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.158200\tres = 2.214E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.160575\tres = 2.130E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.162865\tres = 2.050E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.165073\tres = 1.973E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.167202\tres = 1.899E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.169255\tres = 1.828E-03\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.171234\tres = 1.759E-03\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.173142\tres = 1.693E-03\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.174980\tres = 1.629E-03\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.176753\tres = 1.567E-03\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.178461\tres = 1.508E-03\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.180107\tres = 1.452E-03\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.181694\tres = 1.397E-03\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.183222\tres = 1.344E-03\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.184695\tres = 1.294E-03\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.186115\tres = 1.245E-03\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.187482\tres = 1.198E-03\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.188799\tres = 1.153E-03\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.190068\tres = 1.109E-03\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.191290\tres = 1.067E-03\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.192468\tres = 1.027E-03\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.193602\tres = 9.883E-04\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.194694\tres = 9.510E-04\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.195746\tres = 9.151E-04\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.196759\tres = 8.805E-04\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.197735\tres = 8.473E-04\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.198674\tres = 8.152E-04\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.199579\tres = 7.844E-04\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.200450\tres = 7.548E-04\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.201289\tres = 7.262E-04\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.202097\tres = 6.988E-04\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.202874\tres = 6.723E-04\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.203623\tres = 6.469E-04\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.204344\tres = 6.224E-04\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.205038\tres = 5.989E-04\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.205706\tres = 5.762E-04\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.206349\tres = 5.544E-04\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.206968\tres = 5.334E-04\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.207564\tres = 5.132E-04\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.208138\tres = 4.938E-04\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.208690\tres = 4.751E-04\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.209221\tres = 4.570E-04\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.209733\tres = 4.397E-04\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.210225\tres = 4.231E-04\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.210699\tres = 4.070E-04\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.211155\tres = 3.916E-04\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.211594\tres = 3.767E-04\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.212017\tres = 3.624E-04\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.212423\tres = 3.487E-04\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.212815\tres = 3.355E-04\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.213191\tres = 3.227E-04\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.213554\tres = 3.105E-04\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.213902\tres = 2.987E-04\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.214238\tres = 2.874E-04\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.214561\tres = 2.764E-04\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.214872\tres = 2.659E-04\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.215171\tres = 2.558E-04\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.215458\tres = 2.461E-04\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.215735\tres = 2.368E-04\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.216002\tres = 2.278E-04\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.216258\tres = 2.191E-04\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.216504\tres = 2.108E-04\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.216742\tres = 2.028E-04\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.216970\tres = 1.951E-04\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.217190\tres = 1.876E-04\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.217401\tres = 1.805E-04\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.217604\tres = 1.736E-04\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.217800\tres = 1.670E-04\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.217988\tres = 1.607E-04\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.218169\tres = 1.546E-04\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.218344\tres = 1.487E-04\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.218511\tres = 1.430E-04\n", + "[ NORMAL ] Iteration 163:\tk_eff = 1.218673\tres = 1.376E-04\n", + "[ NORMAL ] Iteration 164:\tk_eff = 1.218828\tres = 1.324E-04\n", + "[ NORMAL ] Iteration 165:\tk_eff = 1.218977\tres = 1.273E-04\n", + "[ NORMAL ] Iteration 166:\tk_eff = 1.219121\tres = 1.225E-04\n", + "[ NORMAL ] Iteration 167:\tk_eff = 1.219259\tres = 1.178E-04\n", + "[ NORMAL ] Iteration 168:\tk_eff = 1.219392\tres = 1.133E-04\n", + "[ NORMAL ] Iteration 169:\tk_eff = 1.219520\tres = 1.090E-04\n", + "[ NORMAL ] Iteration 170:\tk_eff = 1.219643\tres = 1.049E-04\n", + "[ NORMAL ] Iteration 171:\tk_eff = 1.219761\tres = 1.009E-04\n", + "[ NORMAL ] Iteration 172:\tk_eff = 1.219875\tres = 9.702E-05\n", + "[ NORMAL ] Iteration 173:\tk_eff = 1.219984\tres = 9.332E-05\n", + "[ NORMAL ] Iteration 174:\tk_eff = 1.220090\tres = 8.976E-05\n", + "[ NORMAL ] Iteration 175:\tk_eff = 1.220191\tres = 8.634E-05\n", + "[ NORMAL ] Iteration 176:\tk_eff = 1.220288\tres = 8.305E-05\n", + "[ NORMAL ] Iteration 177:\tk_eff = 1.220382\tres = 7.989E-05\n", + "[ NORMAL ] Iteration 178:\tk_eff = 1.220472\tres = 7.684E-05\n", + "[ NORMAL ] Iteration 179:\tk_eff = 1.220559\tres = 7.392E-05\n", + "[ NORMAL ] Iteration 180:\tk_eff = 1.220643\tres = 7.110E-05\n", + "[ NORMAL ] Iteration 181:\tk_eff = 1.220723\tres = 6.839E-05\n", + "[ NORMAL ] Iteration 182:\tk_eff = 1.220800\tres = 6.578E-05\n", + "[ NORMAL ] Iteration 183:\tk_eff = 1.220874\tres = 6.327E-05\n", + "[ NORMAL ] Iteration 184:\tk_eff = 1.220946\tres = 6.086E-05\n", + "[ NORMAL ] Iteration 185:\tk_eff = 1.221015\tres = 5.854E-05\n", + "[ NORMAL ] Iteration 186:\tk_eff = 1.221081\tres = 5.631E-05\n", + "[ NORMAL ] Iteration 187:\tk_eff = 1.221144\tres = 5.416E-05\n", + "[ NORMAL ] Iteration 188:\tk_eff = 1.221206\tres = 5.209E-05\n", + "[ NORMAL ] Iteration 189:\tk_eff = 1.221264\tres = 5.011E-05\n", + "[ NORMAL ] Iteration 190:\tk_eff = 1.221321\tres = 4.820E-05\n", + "[ NORMAL ] Iteration 191:\tk_eff = 1.221375\tres = 4.636E-05\n", + "[ NORMAL ] Iteration 192:\tk_eff = 1.221428\tres = 4.459E-05\n", + "[ NORMAL ] Iteration 193:\tk_eff = 1.221478\tres = 4.289E-05\n", + "[ NORMAL ] Iteration 194:\tk_eff = 1.221527\tres = 4.125E-05\n", + "[ NORMAL ] Iteration 195:\tk_eff = 1.221573\tres = 3.968E-05\n", + "[ NORMAL ] Iteration 196:\tk_eff = 1.221618\tres = 3.816E-05\n", + "[ NORMAL ] Iteration 197:\tk_eff = 1.221661\tres = 3.671E-05\n", + "[ NORMAL ] Iteration 198:\tk_eff = 1.221703\tres = 3.531E-05\n", + "[ NORMAL ] Iteration 199:\tk_eff = 1.221743\tres = 3.396E-05\n", + "[ NORMAL ] Iteration 200:\tk_eff = 1.221781\tres = 3.266E-05\n", + "[ NORMAL ] Iteration 201:\tk_eff = 1.221818\tres = 3.142E-05\n", + "[ NORMAL ] Iteration 202:\tk_eff = 1.221853\tres = 3.022E-05\n", + "[ NORMAL ] Iteration 203:\tk_eff = 1.221888\tres = 2.906E-05\n", + "[ NORMAL ] Iteration 204:\tk_eff = 1.221920\tres = 2.795E-05\n", + "[ NORMAL ] Iteration 205:\tk_eff = 1.221952\tres = 2.689E-05\n", + "[ NORMAL ] Iteration 206:\tk_eff = 1.221982\tres = 2.586E-05\n", + "[ NORMAL ] Iteration 207:\tk_eff = 1.222012\tres = 2.487E-05\n", + "[ NORMAL ] Iteration 208:\tk_eff = 1.222040\tres = 2.392E-05\n", + "[ NORMAL ] Iteration 209:\tk_eff = 1.222067\tres = 2.301E-05\n", + "[ NORMAL ] Iteration 210:\tk_eff = 1.222093\tres = 2.213E-05\n", + "[ NORMAL ] Iteration 211:\tk_eff = 1.222118\tres = 2.129E-05\n", + "[ NORMAL ] Iteration 212:\tk_eff = 1.222142\tres = 2.047E-05\n", + "[ NORMAL ] Iteration 213:\tk_eff = 1.222165\tres = 1.969E-05\n", + "[ NORMAL ] Iteration 214:\tk_eff = 1.222187\tres = 1.894E-05\n", + "[ NORMAL ] Iteration 215:\tk_eff = 1.222209\tres = 1.822E-05\n", + "[ NORMAL ] Iteration 216:\tk_eff = 1.222229\tres = 1.752E-05\n", + "[ NORMAL ] Iteration 217:\tk_eff = 1.222249\tres = 1.685E-05\n", + "[ NORMAL ] Iteration 218:\tk_eff = 1.222268\tres = 1.621E-05\n", + "[ NORMAL ] Iteration 219:\tk_eff = 1.222287\tres = 1.559E-05\n", + "[ NORMAL ] Iteration 220:\tk_eff = 1.222304\tres = 1.499E-05\n", + "[ NORMAL ] Iteration 221:\tk_eff = 1.222321\tres = 1.442E-05\n", + "[ NORMAL ] Iteration 222:\tk_eff = 1.222337\tres = 1.387E-05\n", + "[ NORMAL ] Iteration 223:\tk_eff = 1.222353\tres = 1.334E-05\n", + "[ NORMAL ] Iteration 224:\tk_eff = 1.222368\tres = 1.283E-05\n", + "[ NORMAL ] Iteration 225:\tk_eff = 1.222383\tres = 1.234E-05\n", + "[ NORMAL ] Iteration 226:\tk_eff = 1.222397\tres = 1.187E-05\n", + "[ NORMAL ] Iteration 227:\tk_eff = 1.222410\tres = 1.142E-05\n", + "[ NORMAL ] Iteration 228:\tk_eff = 1.222423\tres = 1.098E-05\n", + "[ NORMAL ] Iteration 229:\tk_eff = 1.222435\tres = 1.056E-05\n", + "[ NORMAL ] Iteration 230:\tk_eff = 1.222447\tres = 1.016E-05\n" ] } ], @@ -1730,8 +1719,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.223729\n", - "openmoc keff = 1.222448\n", - "bias [pcm]: -128.1\n" + "openmoc keff = 1.222447\n", + "bias [pcm]: -128.2\n" ] } ], @@ -1772,7 +1761,7 @@ "source": [ "It is often insightful to generate visual depictions of multi-group cross sections. There are many different types of plots which may be useful for multi-group cross section visualization, only a few of which will be shown here for enrichment and inspiration.\n", "\n", - "One particularly useful visualization is a comparison of the continuous energy and multi-group cross sections for a particular nuclide and reaction type. We illustrate one option for generating such plots with the use of the open source [PyNE](http://pyne.io/) library to parse continuous energy multi-group cross sections from the cross section data library provided with OpenMC. First, we instantiate a `pyne.ace.Library` object for U-235 as follows." + "One particularly useful visualization is a comparison of the continuous-energy and multi-group cross sections for a particular nuclide and reaction type. We illustrate one option for generating such plots with the use of the open source [PyNE](http://pyne.io/) library to parse continuous-energy cross sections from the cross section data library provided with OpenMC. First, we instantiate a `pyne.ace.Library` object for U-235 as follows." ] }, { @@ -1783,14 +1772,14 @@ }, "outputs": [], "source": [ - "# Instantiate a PyNE ACE continuous energy cross sections library\n", + "# Instantiate a PyNE ACE continuous-energy cross sections library\n", "pyne_lib = pyne.ace.Library('../../../../data/nndc/293.6K/U_235_293.6K.ace')\n", "pyne_lib.read('92235.71c')\n", "\n", "# Extract the U-235 data from the library\n", "u235 = pyne_lib.tables['92235.71c']\n", "\n", - "# Extract the continuous energy U-235 fission cross section data\n", + "# Extract the continuous-energy U-235 fission cross section data\n", "fission = u235.reactions[18]" ] }, @@ -1798,7 +1787,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now, we use [`matplotlib`](http://matplotlib.org/) and [`seaborn`](http://stanford.edu/~mwaskom/software/seaborn/) to plot the continuous energy and multi-group cross sections on a single plot." + "Now, we use [`matplotlib`](http://matplotlib.org/) and [`seaborn`](http://stanford.edu/~mwaskom/software/seaborn/) to plot the continuous-energy and multi-group cross sections on a single plot." ] }, { @@ -1822,7 +1811,7 @@ "data": { "image/png": "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\nRETE6eQvWE4Yr8iVHuYAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1830,7 +1819,7 @@ } ], "source": [ - "# Create a loglog plot of the U-235 continuous energy fission cross section \n", + "# Create a loglog plot of the U-235 continuous-energy fission cross section \n", "plt.loglog(u235.energy, fission.sigma, color='b', linewidth=1)\n", "\n", "# Extract energy group bounds and MGXS values to plot\n", @@ -1905,7 +1894,7 @@ "data": { "image/png": "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\nRK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb index c3f4280de..930203660 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -543,7 +543,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now, we must specify to the `Library` which types of cross sections to compute. In particular, the following are the multi-group cross section `MGXS` subclasses are mapped to string codes accepted by the `Library` class:\n", + "Now, we must specify to the `Library` which types of cross sections to compute. In particular, the following are the multi-group cross section `MGXS` subclasses that are mapped to string codes accepted by the `Library` class:\n", "\n", "* `TotalXS` (`\"total\"`)\n", "* `TransportXS` (`\"transport\"`)\n", @@ -580,7 +580,7 @@ "source": [ "Now we must specify the type of domain over which we would like the `Library` to compute multi-group cross sections. The domain type corresponds to the type of tally filter to be used in the tallies created to compute multi-group cross sections. At the present time, the `Library` supports `\"material,\"` `\"cell,\"` and `\"universe\"` domain types. We will use a `\"cell\"` domain type here to compute cross sections in each of the cells in the fuel assembly geometry.\n", "\n", - "**Note:** By default, the `Library` class will instantiate `MGXS` objects for each and every domain (material, cell or universe) in the geometry of interest. However, one may specify a subset of these domains to the `Library.domains` property. In our case, we wish to compute multi-group cross sectoins in each and every cell since they will be needed in our downstream OpenMOC calculation on the identical combinatorial geometry mesh." + "**Note:** By default, the `Library` class will instantiate `MGXS` objects for each and every domain (material, cell or universe) in the geometry of interest. However, one may specify a subset of these domains to the `Library.domains` property. In our case, we wish to compute multi-group cross sections in each and every cell since they will be needed in our downstream OpenMOC calculation on the identical combinatorial geometry mesh." ] }, { diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 96fb6e07e..635c822e3 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1225,28 +1225,29 @@ class MGXS(object): df = df.drop('score', axis=1) # Override energy groups bounds with indices - groups = np.arange(self.num_groups, 0, -1, dtype=np.int) - groups = np.repeat(groups, self.num_nuclides) + all_groups = np.arange(self.num_groups, 0, -1, dtype=np.int) + all_groups = np.repeat(all_groups, self.num_nuclides) if 'energy [MeV]' in df and 'energyout [MeV]' in df: df.rename(columns={'energy [MeV]': 'group in'}, inplace=True) - in_groups = np.tile(groups, self.num_subdomains) + in_groups = np.tile(all_groups, self.num_subdomains) in_groups = np.repeat(in_groups, self.num_groups) df['group in'] = in_groups df.rename(columns={'energyout [MeV]': 'group out'}, inplace=True) - out_groups = np.tile(groups, self.num_subdomains * self.num_groups) + out_groups = \ + np.tile(all_groups, self.num_subdomains * self.num_groups) df['group out'] = out_groups columns = ['group in', 'group out'] elif 'energyout [MeV]' in df: df.rename(columns={'energyout [MeV]': 'group out'}, inplace=True) - in_groups = np.tile(groups, self.num_subdomains) + in_groups = np.tile(all_groups, self.num_subdomains) df['group out'] = in_groups columns = ['group out'] elif 'energy [MeV]' in df: df.rename(columns={'energy [MeV]': 'group in'}, inplace=True) - in_groups = np.tile(groups, self.num_subdomains) + in_groups = np.tile(all_groups, self.num_subdomains) df['group in'] = in_groups columns = ['group in'] From 8506f32c4ff4460d0aebf7b908afdeef8775f403 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 1 Dec 2015 07:22:20 -0600 Subject: [PATCH 25/49] Ability to determine bounding boxes for Regions --- openmc/region.py | 41 +++++++ openmc/surface.py | 278 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 319 insertions(+) diff --git a/openmc/region.py b/openmc/region.py index 936e6e512..7b640a07f 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -1,6 +1,8 @@ from abc import ABCMeta, abstractmethod from collections import Iterable +import numpy as np + from openmc.checkvalue import check_type @@ -218,6 +220,8 @@ class Intersection(Region): ---------- nodes : tuple of Region Regions to take the intersection of + bounding_box : tuple of numpy.array + Lower-left and upper-right coordinates of an axis-aligned bounding box """ @@ -231,6 +235,16 @@ class Intersection(Region): def nodes(self): return self._nodes + @property + def bounding_box(self): + ll = np.array([-np.inf, -np.inf, -np.inf]) + ur = np.array([np.inf, np.inf, np.inf]) + for n in self.nodes: + ll_n, ur_n = n.bounding_box + ll[:] = np.maximum(ll, ll_n) + ur[:] = np.minimum(ur, ur_n) + return ll, ur + @nodes.setter def nodes(self, nodes): check_type('nodes', nodes, Iterable, Region) @@ -257,6 +271,8 @@ class Union(Region): ---------- nodes : tuple of Region Regions to take the union of + bounding_box : tuple of numpy.array + Lower-left and upper-right coordinates of an axis-aligned bounding box """ @@ -270,6 +286,16 @@ class Union(Region): def nodes(self): return self._nodes + @property + def bounding_box(self): + ll = np.array([np.inf, np.inf, np.inf]) + ur = np.array([-np.inf, -np.inf, -np.inf]) + for n in self.nodes: + ll_n, ur_n = n.bounding_box + ll[:] = np.minimum(ll, ll_n) + ur[:] = np.maximum(ur, ur_n) + return ll, ur + @nodes.setter def nodes(self, nodes): check_type('nodes', nodes, Iterable, Region) @@ -300,6 +326,8 @@ class Complement(Region): ---------- node : Region Regions to take the complement of + bounding_box : tuple of numpy.array + Lower-left and upper-right coordinates of an axis-aligned bounding box """ @@ -317,3 +345,16 @@ class Complement(Region): def node(self, node): check_type('node', node, Region) self._node = node + + @property + def bounding_box(self): + # Use De Morgan's laws to distribute the complement operator so that it + # only applies to surface half-spaces, thus allowing us to calculate the + # bounding box in the usual recursive manner. + if isinstance(self.node, Union): + temp_region = Intersection(*[~n for n in self.node.nodes]) + elif isinstance(self.node, Intersection): + temp_region = Union(*[~n for n in self.node.nodes]) + else: + temp_region = ~n + return temp_region.bounding_box diff --git a/openmc/surface.py b/openmc/surface.py index 279246b02..83465ac6d 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -3,6 +3,8 @@ from numbers import Real, Integral from xml.etree import ElementTree as ET import sys +import numpy as np + from openmc.checkvalue import check_type, check_value, check_greater_than from openmc.region import Region @@ -136,6 +138,33 @@ class Surface(object): check_value('boundary type', boundary_type, _BC_TYPES) self._boundary_type = boundary_type + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, np.inf, np.inf])) + def create_xml_subelement(self): element = ET.Element("surface") element.set("id", str(self._id)) @@ -194,6 +223,10 @@ class Plane(Surface): self._type = 'plane' self._coeff_keys = ['A', 'B', 'C', 'D'] + self._coeffs['A'] = 1. + self._coeffs['B'] = 0. + self._coeffs['C'] = 0. + self._coeffs['D'] = 0. if A is not None: self.a = A @@ -276,6 +309,7 @@ class XPlane(Plane): self._type = 'x-plane' self._coeff_keys = ['x0'] + self._coeffs['x0'] = 0. if x0 is not None: self.x0 = x0 @@ -289,6 +323,37 @@ class XPlane(Plane): check_type('x0 coefficient', x0, Real) self._coeffs['x0'] = x0 + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + if side == '-': + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([self.x0, np.inf, np.inf])) + elif side == '+': + return (np.array([self.x0, -np.inf, -np.inf]), + np.array([np.inf, np.inf, np.inf])) + class YPlane(Plane): """A plane perpendicular to the y axis, i.e. a surface of the form :math:`y - @@ -322,6 +387,7 @@ class YPlane(Plane): self._type = 'y-plane' self._coeff_keys = ['y0'] + self._coeffs['y0'] = 0. if y0 is not None: self.y0 = y0 @@ -335,6 +401,37 @@ class YPlane(Plane): check_type('y0 coefficient', y0, Real) self._coeffs['y0'] = y0 + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + if side == '-': + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, self.y0, np.inf])) + elif side == '+': + return (np.array([-np.inf, -self.y0, -np.inf]), + np.array([np.inf, np.inf, np.inf])) + class ZPlane(Plane): """A plane perpendicular to the z axis, i.e. a surface of the form :math:`z - @@ -368,6 +465,7 @@ class ZPlane(Plane): self._type = 'z-plane' self._coeff_keys = ['z0'] + self._coeffs['z0'] = 0. if z0 is not None: self.z0 = z0 @@ -381,6 +479,37 @@ class ZPlane(Plane): check_type('z0 coefficient', z0, Real) self._coeffs['z0'] = z0 + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + if side == '-': + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, np.inf, self.z0])) + elif side == '+': + return (np.array([-np.inf, -np.inf, -self.z0]), + np.array([np.inf, np.inf, np.inf])) + class Cylinder(Surface): """A cylinder whose length is parallel to the x-, y-, or z-axis. @@ -415,6 +544,7 @@ class Cylinder(Surface): super(Cylinder, self).__init__(surface_id, boundary_type, name=name) self._coeff_keys = ['R'] + self._coeffs['R'] = 1. if R is not None: self.r = R @@ -468,6 +598,8 @@ class XCylinder(Cylinder): self._type = 'x-cylinder' self._coeff_keys = ['y0', 'z0', 'R'] + self._coeffs['y0'] = 0. + self._coeffs['z0'] = 0. if y0 is not None: self.y0 = y0 @@ -493,6 +625,37 @@ class XCylinder(Cylinder): check_type('z0 coefficient', z0, Real) self._coeffs['z0'] = z0 + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + if side == '-': + return (np.array([-np.inf, self.y0 - self.r, self.z0 - self.r]), + np.array([np.inf, self.y0 + self.r, self.y0 + self.r])) + elif side == '+': + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, np.inf, np.inf])) + class YCylinder(Cylinder): """An infinite cylinder whose length is parallel to the y-axis. This is a @@ -533,6 +696,8 @@ class YCylinder(Cylinder): self._type = 'y-cylinder' self._coeff_keys = ['x0', 'z0', 'R'] + self._coeffs['x0'] = 0. + self._coeffs['z0'] = 0. if x0 is not None: self.x0 = x0 @@ -558,6 +723,37 @@ class YCylinder(Cylinder): check_type('z0 coefficient', z0, Real) self._coeffs['z0'] = z0 + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + if side == '-': + return (np.array([self.x0 - self.r, -np.inf, self.z0 - self.r]), + np.array([self.x0 + self.r, np.inf, self.y0 + self.r])) + elif side == '+': + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, np.inf, np.inf])) + class ZCylinder(Cylinder): """An infinite cylinder whose length is parallel to the z-axis. This is a @@ -598,6 +794,8 @@ class ZCylinder(Cylinder): self._type = 'z-cylinder' self._coeff_keys = ['x0', 'y0', 'R'] + self._coeffs['x0'] = 0. + self._coeffs['y0'] = 0. if x0 is not None: self.x0 = x0 @@ -623,6 +821,37 @@ class ZCylinder(Cylinder): check_type('y0 coefficient', y0, Real) self._coeffs['y0'] = y0 + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + if side == '-': + return (np.array([self.x0 - self.r, self.y0 - self.r, -np.inf]), + np.array([self.x0 + self.r, self.y0 + self.r, np.inf])) + elif side == '+': + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, np.inf, np.inf])) + class Sphere(Surface): """A sphere of the form :math:`(x - x_0)^2 + (y - y_0)^2 + (z - z_0)^2 = R^2`. @@ -667,6 +896,10 @@ class Sphere(Surface): self._type = 'sphere' self._coeff_keys = ['x0', 'y0', 'z0', 'R'] + self._coeffs['x0'] = 0. + self._coeffs['y0'] = 0. + self._coeffs['z0'] = 0. + self._coeffs['R'] = 1. if x0 is not None: self.x0 = x0 @@ -716,6 +949,39 @@ class Sphere(Surface): check_type('R coefficient', R, Real) self._coeffs['R'] = R + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + if side == '-': + return (np.array([self.x0 - self.r, self.y0 - self.r, + self.z0 - self.r]), + np.array([self.x0 + self.r, self.y0 + self.r, + self.z0 + self.r])) + elif side == '+': + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, np.inf, np.inf])) + class Cone(Surface): """A conical surface parallel to the x-, y-, or z-axis. @@ -761,6 +1027,10 @@ class Cone(Surface): super(Cone, self).__init__(surface_id, boundary_type, name=name) self._coeff_keys = ['x0', 'y0', 'z0', 'R2'] + self._coeffs['x0'] = 0. + self._coeffs['y0'] = 0. + self._coeffs['z0'] = 0. + self._coeffs['R2'] = 1. if x0 is not None: self.x0 = x0 @@ -982,6 +1252,8 @@ class Quadric(Surface): self._type = 'quadric' self._coeff_keys = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k'] + for key in self._coeff_keys: + self._coeffs[key] = 0. if a is not None: self.a = a @@ -1127,6 +1399,8 @@ class Halfspace(Region): Surface which divides Euclidean space. side : {'+', '-'} Indicates whether the positive or negative half-space is used. + bounding_box : tuple of numpy.array + Lower-left and upper-right coordinates of an axis-aligned bounding box """ @@ -1155,6 +1429,10 @@ class Halfspace(Region): check_value('side', side, ('+', '-')) self._side = side + @property + def bounding_box(self): + return self.surface.bounding_box(self.side) + def __str__(self): return '-' + str(self.surface.id) if self.side == '-' \ else str(self.surface.id) From 48d5f2219de1f91ac70e914b3f98e749b3a83a93 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 2 Dec 2015 13:48:59 -0600 Subject: [PATCH 26/49] Fix error in bounding boxes for y- and z-planes. --- openmc/surface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/surface.py b/openmc/surface.py index 83465ac6d..6bb05baef 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -429,7 +429,7 @@ class YPlane(Plane): return (np.array([-np.inf, -np.inf, -np.inf]), np.array([np.inf, self.y0, np.inf])) elif side == '+': - return (np.array([-np.inf, -self.y0, -np.inf]), + return (np.array([-np.inf, self.y0, -np.inf]), np.array([np.inf, np.inf, np.inf])) @@ -507,7 +507,7 @@ class ZPlane(Plane): return (np.array([-np.inf, -np.inf, -np.inf]), np.array([np.inf, np.inf, self.z0])) elif side == '+': - return (np.array([-np.inf, -np.inf, -self.z0]), + return (np.array([-np.inf, -np.inf, self.z0]), np.array([np.inf, np.inf, np.inf])) From d13c95018907eaa0556689d409e76c0277a1f5e1 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 2 Dec 2015 13:52:32 -0600 Subject: [PATCH 27/49] Use bounding box feature in a few example inputs --- examples/python/boxes/build-xml.py | 4 +++- examples/python/reflective/build-xml.py | 4 +++- examples/xml/boxes/settings.xml | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/examples/python/boxes/build-xml.py b/examples/python/boxes/build-xml.py index 4bac9fff4..9c28d37bb 100644 --- a/examples/python/boxes/build-xml.py +++ b/examples/python/boxes/build-xml.py @@ -1,3 +1,5 @@ +import numpy as np + import openmc ############################################################################### @@ -115,7 +117,7 @@ settings_file = openmc.SettingsFile() settings_file.batches = batches settings_file.inactive = inactive settings_file.particles = particles -settings_file.set_source_space('point', [0., 0., 0.]) +settings_file.set_source_space('box', np.concatenate(outer_cube.bounding_box)) settings_file.export_to_xml() ############################################################################### diff --git a/examples/python/reflective/build-xml.py b/examples/python/reflective/build-xml.py index 9eab4aec3..44b544d20 100644 --- a/examples/python/reflective/build-xml.py +++ b/examples/python/reflective/build-xml.py @@ -1,3 +1,5 @@ +import numpy as np + import openmc ############################################################################### @@ -82,5 +84,5 @@ settings_file = openmc.SettingsFile() settings_file.batches = batches settings_file.inactive = inactive settings_file.particles = particles -settings_file.set_source_space('box', [-1, -1, -1, 1, 1, 1]) +settings_file.set_source_space('box', np.concatenate(cell.region.bounding_box)) settings_file.export_to_xml() diff --git a/examples/xml/boxes/settings.xml b/examples/xml/boxes/settings.xml index 0ac26ec4d..eff7c1c10 100644 --- a/examples/xml/boxes/settings.xml +++ b/examples/xml/boxes/settings.xml @@ -10,7 +10,7 @@ - + From 7afebb029b93d05f95d0dee5e31cc2a9ec24b4b0 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 3 Dec 2015 07:31:02 -0600 Subject: [PATCH 28/49] Address @wbinventor comments on #516 --- openmc/region.py | 24 +++++++++++------------ openmc/surface.py | 49 +++++++++++++++++++++++++---------------------- 2 files changed, 38 insertions(+), 35 deletions(-) diff --git a/openmc/region.py b/openmc/region.py index 7b640a07f..b7cfbca7b 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -237,13 +237,13 @@ class Intersection(Region): @property def bounding_box(self): - ll = np.array([-np.inf, -np.inf, -np.inf]) - ur = np.array([np.inf, np.inf, np.inf]) + lower_left = np.array([-np.inf, -np.inf, -np.inf]) + upper_right = np.array([np.inf, np.inf, np.inf]) for n in self.nodes: - ll_n, ur_n = n.bounding_box - ll[:] = np.maximum(ll, ll_n) - ur[:] = np.minimum(ur, ur_n) - return ll, ur + lower_left_n, upper_right_n = n.bounding_box + lower_left[:] = np.maximum(lower_left, lower_left_n) + upper_right[:] = np.minimum(upper_right, upper_right_n) + return lower_left, upper_right @nodes.setter def nodes(self, nodes): @@ -288,13 +288,13 @@ class Union(Region): @property def bounding_box(self): - ll = np.array([np.inf, np.inf, np.inf]) - ur = np.array([-np.inf, -np.inf, -np.inf]) + lower_left = np.array([np.inf, np.inf, np.inf]) + upper_right = np.array([-np.inf, -np.inf, -np.inf]) for n in self.nodes: - ll_n, ur_n = n.bounding_box - ll[:] = np.minimum(ll, ll_n) - ur[:] = np.maximum(ur, ur_n) - return ll, ur + lower_left_n, upper_right_n = n.bounding_box + lower_left[:] = np.minimum(lower_left, lower_left_n) + upper_right[:] = np.maximum(upper_right, upper_right_n) + return lower_left, upper_right @nodes.setter def nodes(self, nodes): diff --git a/openmc/surface.py b/openmc/surface.py index 6bb05baef..8dc45209b 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -327,9 +327,9 @@ class XPlane(Plane): """Determine an axis-aligned bounding box. An axis-aligned bounding box for surface half-spaces is represented by - its lower-left and upper-right coordinates. If the half-space is - unbounded in a particular direction, numpy.inf is used to represent - infinity. + its lower-left and upper-right coordinates. For the x-plane surface, the + half-spaces are unbounded in their y- and z- directions. To represent + infinity, numpy.inf is used. Parameters ---------- @@ -405,9 +405,9 @@ class YPlane(Plane): """Determine an axis-aligned bounding box. An axis-aligned bounding box for surface half-spaces is represented by - its lower-left and upper-right coordinates. If the half-space is - unbounded in a particular direction, numpy.inf is used to represent - infinity. + its lower-left and upper-right coordinates. For the y-plane surface, the + half-spaces are unbounded in their x- and z- directions. To represent + infinity, numpy.inf is used. Parameters ---------- @@ -483,9 +483,9 @@ class ZPlane(Plane): """Determine an axis-aligned bounding box. An axis-aligned bounding box for surface half-spaces is represented by - its lower-left and upper-right coordinates. If the half-space is - unbounded in a particular direction, numpy.inf is used to represent - infinity. + its lower-left and upper-right coordinates. For the z-plane surface, the + half-spaces are unbounded in their x- and y- directions. To represent + infinity, numpy.inf is used. Parameters ---------- @@ -629,9 +629,10 @@ class XCylinder(Cylinder): """Determine an axis-aligned bounding box. An axis-aligned bounding box for surface half-spaces is represented by - its lower-left and upper-right coordinates. If the half-space is - unbounded in a particular direction, numpy.inf is used to represent - infinity. + its lower-left and upper-right coordinates. For the x-cylinder surface, + the negative half-space is unbounded in the x- direction and the + positive half-space is unbounded in all directions. To represent + infinity, numpy.inf is used. Parameters ---------- @@ -651,7 +652,7 @@ class XCylinder(Cylinder): if side == '-': return (np.array([-np.inf, self.y0 - self.r, self.z0 - self.r]), - np.array([np.inf, self.y0 + self.r, self.y0 + self.r])) + np.array([np.inf, self.y0 + self.r, self.z0 + self.r])) elif side == '+': return (np.array([-np.inf, -np.inf, -np.inf]), np.array([np.inf, np.inf, np.inf])) @@ -727,9 +728,10 @@ class YCylinder(Cylinder): """Determine an axis-aligned bounding box. An axis-aligned bounding box for surface half-spaces is represented by - its lower-left and upper-right coordinates. If the half-space is - unbounded in a particular direction, numpy.inf is used to represent - infinity. + its lower-left and upper-right coordinates. For the y-cylinder surface, + the negative half-space is unbounded in the y- direction and the + positive half-space is unbounded in all directions. To represent + infinity, numpy.inf is used. Parameters ---------- @@ -749,7 +751,7 @@ class YCylinder(Cylinder): if side == '-': return (np.array([self.x0 - self.r, -np.inf, self.z0 - self.r]), - np.array([self.x0 + self.r, np.inf, self.y0 + self.r])) + np.array([self.x0 + self.r, np.inf, self.z0 + self.r])) elif side == '+': return (np.array([-np.inf, -np.inf, -np.inf]), np.array([np.inf, np.inf, np.inf])) @@ -825,9 +827,10 @@ class ZCylinder(Cylinder): """Determine an axis-aligned bounding box. An axis-aligned bounding box for surface half-spaces is represented by - its lower-left and upper-right coordinates. If the half-space is - unbounded in a particular direction, numpy.inf is used to represent - infinity. + its lower-left and upper-right coordinates. For the z-cylinder surface, + the negative half-space is unbounded in the z- direction and the + positive half-space is unbounded in all directions. To represent + infinity, numpy.inf is used. Parameters ---------- @@ -953,9 +956,9 @@ class Sphere(Surface): """Determine an axis-aligned bounding box. An axis-aligned bounding box for surface half-spaces is represented by - its lower-left and upper-right coordinates. If the half-space is - unbounded in a particular direction, numpy.inf is used to represent - infinity. + its lower-left and upper-right coordinates. The positive half-space of a + sphere is unbounded in all directions. To represent infinity, numpy.inf + is used. Parameters ---------- From 06f025dc364eeb667e77a664137ecea5ddb18305 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Dec 2015 13:29:38 -0600 Subject: [PATCH 29/49] Modify test_complex_cell to include a cell whose region specification includes both the negative and positive half-space of a surface --- tests/test_complex_cell/geometry.xml | 5 +++-- tests/test_complex_cell/results_true.dat | 18 +++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/tests/test_complex_cell/geometry.xml b/tests/test_complex_cell/geometry.xml index 18e304fe0..a695396e0 100644 --- a/tests/test_complex_cell/geometry.xml +++ b/tests/test_complex_cell/geometry.xml @@ -15,10 +15,11 @@ + - - + + diff --git a/tests/test_complex_cell/results_true.dat b/tests/test_complex_cell/results_true.dat index 56e7e409f..97f228e3e 100644 --- a/tests/test_complex_cell/results_true.dat +++ b/tests/test_complex_cell/results_true.dat @@ -1,11 +1,11 @@ k-combined: -2.651570E-01 2.116381E-03 +2.565769E-01 8.980879E-04 tally 1: -2.639097E+00 -1.394398E+00 -2.743740E+00 -1.506124E+00 -1.041248E+00 -2.177204E-01 -1.087210E-01 -2.365126E-03 +2.584080E+00 +1.335682E+00 +2.763580E+00 +1.528633E+00 +1.007148E+00 +2.031543E-01 +1.113696E-01 +2.485351E-03 From 10ad9576379a3f4acb3bedd455612961d9fcdb2c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Dec 2015 22:04:13 -0600 Subject: [PATCH 30/49] Elaborate on description of units="sum" option for --- docs/source/usersguide/input.rst | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 0b132275b..0ac71716b 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1110,13 +1110,14 @@ Each ``material`` element can have the following attributes or sub-elements: *Default*: "" - :density: - An element with attributes/sub-elements called ``value`` and ``units``. The - ``value`` attribute is the numeric value of the density while the ``units`` - can be "g/cm3", "kg/m3", "atom/b-cm", "atom/cm3", or "sum". The "sum" unit - indicates that the density should be calculated as the sum of the atom - fractions for each nuclide in the material. This should not be used in - conjunction with weight percents. + :density: An element with attributes/sub-elements called ``value`` and + ``units``. The ``value`` attribute is the numeric value of the density while + the ``units`` can be "g/cm3", "kg/m3", "atom/b-cm", "atom/cm3", or + "sum". The "sum" unit indicates that values appearing in ``ao`` attributes + for ```` and ```` sub-elements are to be interpreted as + nuclide/element densities in atom/b-cm, and the total density of the + material is taken as the sum of all nuclides/elements. The "sum" option + cannot be used in conjunction with weight percents. *Default*: None From c4305ff6962a666c6cef942c1f11500951601048 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Dec 2015 22:33:49 -0600 Subject: [PATCH 31/49] Fix minor rst issue --- docs/source/usersguide/input.rst | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 0ac71716b..fa43ca1d2 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1110,14 +1110,15 @@ Each ``material`` element can have the following attributes or sub-elements: *Default*: "" - :density: An element with attributes/sub-elements called ``value`` and - ``units``. The ``value`` attribute is the numeric value of the density while - the ``units`` can be "g/cm3", "kg/m3", "atom/b-cm", "atom/cm3", or - "sum". The "sum" unit indicates that values appearing in ``ao`` attributes - for ```` and ```` sub-elements are to be interpreted as - nuclide/element densities in atom/b-cm, and the total density of the - material is taken as the sum of all nuclides/elements. The "sum" option - cannot be used in conjunction with weight percents. + :density: + An element with attributes/sub-elements called ``value`` and ``units``. The + ``value`` attribute is the numeric value of the density while the ``units`` + can be "g/cm3", "kg/m3", "atom/b-cm", "atom/cm3", or "sum". The "sum" unit + indicates that values appearing in ``ao`` attributes for ```` and + ```` sub-elements are to be interpreted as nuclide/element + densities in atom/b-cm, and the total density of the material is taken as + the sum of all nuclides/elements. The "sum" option cannot be used in + conjunction with weight percents. *Default*: None From 9bf8964edd0522b106c3b6567b43b306fc26ad6f Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 6 Dec 2015 17:45:27 -0500 Subject: [PATCH 32/49] Made DeprecationWarning for Cell.add_surface(...) only print once --- openmc/universe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/universe.py b/openmc/universe.py index 0e405e9f1..7e93981af 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -240,7 +240,7 @@ class Cell(object): """ - warnings.simplefilter('always', DeprecationWarning) + warnings.simplefilter('once', DeprecationWarning) warnings.warn("Cell.add_surface(...) has been deprecated and may be " "removed in a future version. The region for a Cell " "should be defined using the region property directly.", From 510711e92f6045fdf6928c149db8631a4c4d7dcd Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 6 Dec 2015 19:58:19 -0500 Subject: [PATCH 33/49] Now store keff as an attribute in MGXS Library class --- openmc/mgxs/library.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 0bf973254..6845abf20 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -67,6 +67,9 @@ class Library(object): sp_filename : str The filename of the statepoint with tally data used to the compute cross sections + keff : Real or None + The combined keff from the statepoint file with tally data used to + compute cross sections name : str, optional Name of the multi-group cross section library. Used as a label to identify tallies in OpenMC 'tallies.xml' file. @@ -88,6 +91,7 @@ class Library(object): self._tally_trigger = None self._all_mgxs = OrderedDict() self._sp_filename = None + self._keff = None self.name = name self.openmc_geometry = openmc_geometry @@ -114,6 +118,7 @@ class Library(object): clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo) clone._all_mgxs = self.all_mgxs clone._sp_filename = self._sp_filename + clone._keff = self._keff clone._all_mgxs = OrderedDict() for domain in self.domains: @@ -199,6 +204,10 @@ class Library(object): def sp_filename(self): return self._sp_filename + @property + def keff(self): + return self._keff + @openmc_geometry.setter def openmc_geometry(self, openmc_geometry): cv.check_type('openmc_geometry', openmc_geometry, openmc.Geometry) @@ -363,6 +372,7 @@ class Library(object): self._sp_filename = statepoint._f.filename self._openmc_geometry = statepoint.summary.openmc_geometry + self._keff = statepoint.k_combined[0] # Load tallies for each MGXS for each domain and mgxs type for domain in self.domains: From e55f9fb3eea1a35a6acafe7929a9ddad6e263cf4 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Mon, 7 Dec 2015 08:48:41 -0500 Subject: [PATCH 34/49] Now only store keff in MGXS Library for eigenvalue calculations --- openmc/mgxs/library.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 6845abf20..ebf405077 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -69,7 +69,7 @@ class Library(object): compute cross sections keff : Real or None The combined keff from the statepoint file with tally data used to - compute cross sections + compute cross sections (for eigenvalue calculations only) name : str, optional Name of the multi-group cross section library. Used as a label to identify tallies in OpenMC 'tallies.xml' file. @@ -372,7 +372,9 @@ class Library(object): self._sp_filename = statepoint._f.filename self._openmc_geometry = statepoint.summary.openmc_geometry - self._keff = statepoint.k_combined[0] + + if statepoint.run_mode == 'k-effective': + self._keff = statepoint.k_combined[0] # Load tallies for each MGXS for each domain and mgxs type for domain in self.domains: From f822a221527986826a450885be0d089c3609bb79 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Mon, 7 Dec 2015 08:53:36 -0500 Subject: [PATCH 35/49] Moved DeprecationWarning filter to top of universe module --- openmc/universe.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openmc/universe.py b/openmc/universe.py index 7e93981af..98367c381 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -15,6 +15,10 @@ from openmc.region import Region, Intersection, Complement if sys.version_info[0] >= 3: basestring = str + +# DeprecationWarning filter for the Cell.add_surface(...) method +warnings.simplefilter('always', DeprecationWarning) + # A static variable for auto-generated Cell IDs AUTO_CELL_ID = 10000 @@ -240,7 +244,6 @@ class Cell(object): """ - warnings.simplefilter('once', DeprecationWarning) warnings.warn("Cell.add_surface(...) has been deprecated and may be " "removed in a future version. The region for a Cell " "should be defined using the region property directly.", From 71c3248f1afa8cd290ce88eef7e6a43f0d8235d9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 23 Nov 2015 08:39:32 -0600 Subject: [PATCH 36/49] Increase list depth so 'make latexpdf' works again --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 05559aab0..79a7604e3 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -200,7 +200,7 @@ latex_elements = { \usepackage{enumitem} \usepackage{amsfonts} \usepackage{amsmath} -\setlistdepth{9} +\setlistdepth{99} \usepackage{tikz} \usetikzlibrary{shapes,snakes,shadows,arrows,calc,decorations.markings,patterns,fit,matrix,spy} \usepackage{fixltx2e} From 5d65f2557e822406b6b7f1d0a89905b7acfa0804 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 23 Nov 2015 08:39:58 -0600 Subject: [PATCH 37/49] Fix warning on definition list in mgxs.Library.get_mgxs --- openmc/mgxs/library.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 0bf973254..4a17b95e4 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -382,9 +382,7 @@ class Library(object): ---------- domain : Material or Cell or Universe or Integral The material, cell, or universe object of interest (or its ID) - mgxs_type : {'total', 'transport', 'absorption', 'capture', 'fission', - 'nu-fission', 'scatter', 'nu-scatter', 'scatter matrix', - 'nu-scatter matrix', 'chi'} + mgxs_type : {'total', 'transport', 'absorption', 'capture', 'fission', 'nu-fission', 'scatter', 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', 'chi'} The type of multi-group cross section object to return Returns From 556dd2de03ad914b31731f811cb3cdbc48a1c762 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Dec 2015 10:38:27 -0600 Subject: [PATCH 38/49] Allow setup.py to be called properly for debian installations --- CMakeLists.txt | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 36501c918..57a49508b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -278,14 +278,21 @@ target_link_libraries(${program} ${ldflags} ${HDF5_LIBRARIES} fox_dom) install(TARGETS ${program} RUNTIME DESTINATION bin) install(DIRECTORY src/relaxng DESTINATION share/openmc) install(FILES man/man1/openmc.1 DESTINATION share/man/man1) -install(FILES LICENSE DESTINATION "share/doc/${program}/copyright") +install(FILES LICENSE DESTINATION "share/doc/${program}" RENAME copyright) find_package(PythonInterp) if(PYTHONINTERP_FOUND) - install(CODE "execute_process( - COMMAND ${PYTHON_EXECUTABLE} setup.py install - --prefix=${CMAKE_INSTALL_PREFIX} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})") + if(debian) + install(CODE "execute_process( + COMMAND ${PYTHON_EXECUTABLE} setup.py install + --root=debian/openmc --install-layout=deb + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})") + else() + install(CODE "execute_process( + COMMAND ${PYTHON_EXECUTABLE} setup.py install + --prefix=${CMAKE_INSTALL_PREFIX} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})") + endif() endif() #=============================================================================== From ba3a6689b90fd729236f710d03dd23c6ad009dbd Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Dec 2015 20:31:57 -0600 Subject: [PATCH 39/49] Fix integer kind on arguments to h5tget_size_f and h5tset_size_f --- src/hdf5_interface.F90 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 656039d19..fc7a462e6 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -1483,7 +1483,7 @@ contains integer(HID_T) :: dspace ! data or file space handle integer(HID_T) :: filetype integer(HID_T) :: memtype - integer(HSIZE_T) :: n + integer(SIZE_T) :: n type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -1544,8 +1544,8 @@ contains integer(HID_T) :: dspace ! data or file space handle integer(HID_T) :: filetype integer(HID_T) :: memtype - integer(HSIZE_T) :: size - integer(HSIZE_T) :: n + integer(SIZE_T) :: size + integer(SIZE_T) :: n type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -1628,7 +1628,7 @@ contains integer(HID_T) :: dspace ! data or file space handle integer(HID_T) :: filetype integer(HID_T) :: memtype - integer(HSIZE_T) :: n + integer(SIZE_T) :: n type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -1644,7 +1644,7 @@ contains ! Create datatype in memory based on Fortran character call h5tcopy_f(H5T_FORTRAN_S1, memtype, hdf5_err) - call h5tset_size_f(memtype, int(len(buffer(1)), HSIZE_T), hdf5_err) + call h5tset_size_f(memtype, int(len(buffer(1)), SIZE_T), hdf5_err) ! Create dataspace/dataset call h5screate_simple_f(1, dims, dspace, hdf5_err) @@ -1706,8 +1706,8 @@ contains integer(HID_T) :: dspace ! data or file space handle integer(HID_T) :: filetype integer(HID_T) :: memtype - integer(HSIZE_T) :: size - integer(HSIZE_T) :: n + integer(SIZE_T) :: size + integer(SIZE_T) :: n type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O From 01f2e8372ee8017826ad34be66fbc06c2442942b Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Mon, 7 Dec 2015 15:35:36 -0500 Subject: [PATCH 40/49] Changed MGXS Library keff storage based on runmode of k-eigenvalue --- openmc/mgxs/library.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index ebf405077..0b22e3871 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -373,7 +373,7 @@ class Library(object): self._sp_filename = statepoint._f.filename self._openmc_geometry = statepoint.summary.openmc_geometry - if statepoint.run_mode == 'k-effective': + if statepoint.run_mode == 'k-eigenvalue': self._keff = statepoint.k_combined[0] # Load tallies for each MGXS for each domain and mgxs type From 62ddd33b5b753305ff89daa9c5d3eb7ec6429884 Mon Sep 17 00:00:00 2001 From: Bryan Herman Date: Fri, 4 Dec 2015 21:39:00 -0500 Subject: [PATCH 41/49] add RPATH information for installed exe --- CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 57a49508b..5ad537e10 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -235,6 +235,14 @@ if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/src/xml/fox/.git) endif() add_subdirectory(src/xml/fox) +#=============================================================================== +# RPATH information +#=============================================================================== + +# add the automatically determined parts of the RPATH +# which point to directories outside the build tree to the install RPATH +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + #=============================================================================== # Build OpenMC executable #=============================================================================== From 36f633c453205f863ba2881692c3b0eb45d5fdc6 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 30 Oct 2015 08:13:20 -0500 Subject: [PATCH 42/49] Incremented version. Added release notes for 0.7.1. --- docs/source/conf.py | 2 +- docs/source/releasenotes.rst | 83 +++++++++++++++++++++++------------- setup.py | 2 +- src/constants.F90 | 2 +- 4 files changed, 56 insertions(+), 33 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 79a7604e3..118ff2c03 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -55,7 +55,7 @@ copyright = u'2011-2015, Massachusetts Institute of Technology' # The short X.Y version. version = "0.7" # The full version, including alpha/beta/rc tags. -release = "0.7.0" +release = "0.7.1" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/source/releasenotes.rst b/docs/source/releasenotes.rst index dffc17201..7320781e2 100644 --- a/docs/source/releasenotes.rst +++ b/docs/source/releasenotes.rst @@ -1,9 +1,30 @@ .. _releasenotes: ============================== -Release Notes for OpenMC 0.7.0 +Release Notes for OpenMC 0.7.1 ============================== +This release of OpenMC provides some substantial improvements over version +0.7.0. Non-simple cell regions can now be defined through the ``|`` (union) and +``~`` (complement) operators. Similar changes in the Python API also allow +complex cell regions to be defined. A true secondary particle bank now exists; +this is crucial for photon transport (to be added in the next minor release). A +rich API for multi-group cross section generation has been added via the +``openmc.mgxs`` Python module. + +Various improvements to tallies have also been made. It is now possible to +explicitly specify that a collision estimator be used in a tally. A new +``delayedgroup`` filter and ``delayed-nu-fission`` score allow a user to obtain +delayed fission neutron production rates filtered by delayed group. Finally, the +new ``inverse-velocity`` score may be useful for calculating kinetics +parameters. + +.. caution:: In previous versions, depending on how OpenMC was compiled binary + output was either given in HDF5 or a flat binary format. With this + version, all binary output is now HDF5 which means you **must** + have HDF5 in order to install OpenMC. Please consult the user's + guide for instructions on how to compile with HDF5. + ------------------- System Requirements ------------------- @@ -17,36 +38,41 @@ the problem at hand (mostly on the number of nuclides in the problem). New Features ------------ -- Complete Python API -- Python 3 compatability for all scripts -- All scripts consistently named openmc-* and installed together -- New 'distribcell' tally filter for repeated cells -- Ability to specify outer lattice universe -- XML input validation utility (openmc-validate-xml) -- Support for hexagonal lattices -- Material union energy grid method -- Tally triggers -- Remove dependence on PETSc -- Significant OpenMP performance improvements -- Support for Fortran 2008 MPI interface -- Use of Travis CI for continuous integration -- Simplifications and improvements to test suite +- Support for complex cell regions (union and complement operators) +- Generic quadric surface type +- Improved handling of secondary particles +- Binary output is now solely HDF5 +- ``openmc.mgxs`` Python module enabling multi-group cross section generation +- Collision estimator for tallies +- Delayed fission neutron production tallies with ability to filter by delayed + group +- Inverse velocity tally score +- Performance improvements for binary search +- Performance improvements for reaction rate tallies --------- Bug Fixes --------- -- b5f712_: Fix bug in spherical harmonics tallies -- e6675b_: Ensure all constants are double precision -- 04e2c1_: Fix potential bug in sample_nuclide routine -- 6121d9_: Fix bugs related to particle track files -- 2f0e89_: Fixes for nuclide specification in tallies +- 299322_: Bug with material filter when void material present +- d74840_: Fix triggers on tallies with multiple filters +- c29a81_: Correctly handle maximum transport energy +- 3edc23_: Fixes in the nu-scatter score +- 629e3b_: Assume unspecified surface coefficients are zero in Python API +- 5dbe8b_: Fix energy filters for openmc-plot-mesh-tally +- ff66f4_: Fixes in the openmc-plot-mesh-tally script +- 441fd4_: Fix bug in kappa-fission score +- 7e5974_: Allow fixed source simulations from Python API -.. _b5f712: https://github.com/mit-crpg/openmc/commit/b5f712 -.. _e6675b: https://github.com/mit-crpg/openmc/commit/e6675b -.. _04e2c1: https://github.com/mit-crpg/openmc/commit/04e2c1 -.. _6121d9: https://github.com/mit-crpg/openmc/commit/6121d9 -.. _2f0e89: https://github.com/mit-crpg/openmc/commit/2f0e89 +.. _299322: https://github.com/mit-crpg/openmc/commit/299322 +.. _d74840: https://github.com/mit-crpg/openmc/commit/d74840 +.. _c29a81: https://github.com/mit-crpg/openmc/commit/c29a81 +.. _3edc23: https://github.com/mit-crpg/openmc/commit/3edc23 +.. _629e3b: https://github.com/mit-crpg/openmc/commit/629e3b +.. _5dbe8b: https://github.com/mit-crpg/openmc/commit/5dbe8b +.. _ff66f4: https://github.com/mit-crpg/openmc/commit/ff66f4 +.. _441fd4: https://github.com/mit-crpg/openmc/commit/441fd4 +.. _7e5974: https://github.com/mit-crpg/openmc/commit/7e5974 ------------ Contributors @@ -55,13 +81,10 @@ Contributors This release contains new contributions from the following people: - `Will Boyd `_ -- `Matt Ellis `_ - `Sterling Harper `_ -- `Bryan Herman `_ -- `Nicholas Horelik `_ - `Colin Josey `_ -- `William Lyu `_ - `Adam Nelson `_ - `Paul Romano `_ -- `Anthony Scopatz `_ +- `Kelly Rowland `_ +- `Sam Shaner `_ - `Jon Walsh `_ diff --git a/setup.py b/setup.py index 0c3d5c116..907d80e31 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ except ImportError: have_setuptools = False kwargs = {'name': 'openmc', - 'version': '0.7.0', + 'version': '0.7.1', 'packages': ['openmc', 'openmc.mgxs'], 'scripts': glob.glob('scripts/openmc-*'), diff --git a/src/constants.F90 b/src/constants.F90 index 375c517e7..ba77f35ab 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -8,7 +8,7 @@ module constants ! OpenMC major, minor, and release numbers integer, parameter :: VERSION_MAJOR = 0 integer, parameter :: VERSION_MINOR = 7 - integer, parameter :: VERSION_RELEASE = 0 + integer, parameter :: VERSION_RELEASE = 1 ! Revision numbers for binary files integer, parameter :: REVISION_STATEPOINT = 14 From 6800f8ed219f63871527b8c32450e1ffe3c10e4c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Dec 2015 14:02:10 -0600 Subject: [PATCH 43/49] Update list of publications in documentation --- docs/source/publications.rst | 63 ++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 7 deletions(-) diff --git a/docs/source/publications.rst b/docs/source/publications.rst index 79d089605..369b9d977 100644 --- a/docs/source/publications.rst +++ b/docs/source/publications.rst @@ -26,6 +26,10 @@ Overviews Benchmarking ------------ +- Khurrum S. Chaudri and Sikander M. Mirza, "Burnup dependent Monte Carlo + neutron physics calculations of IAEA MTR benchmark," *Prog. Nucl. Energy*, + **81**, 43-52 (2015). ``_ + - Daniel J. Kelly, Brian N. Aviles, Paul K. Romano, Bryan R. Herman, Nicholas E. Horelik, and Benoit Forget, "Analysis of select BEAVRS PWR benchmark cycle 1 results using MC21 and OpenMC," *Proc. PHYSOR*, Kyoto, @@ -57,13 +61,8 @@ Coupling and Multi-physics - Bryan R. Herman, Benoit Forget, and Kord Smith, "Progress toward Monte Carlo-thermal hydraulic coupling using low-order nonlinear diffusion - acceleration methods." In press, *Ann. Nucl. Energy*, - (2014). ``_ - -- Adam G. Nelson and William R. Martin, "Improved Convergence of Monte Carlo - Generated Multi-Group Scattering Moments," *Proc. Int. Conf. Mathematics and - Computational Methods Applied to Nuclear Science and Engineering*, Sun Valley, - Idaho, May 5--9 (2013). + acceleration methods." *Ann. Nucl. Energy*, **84**, 63-72 + (2015). ``_ - Bryan R. Herman, Benoit Forget, and Kord Smith, "Utilizing CMFD in OpenMC to Estimate Dominance Ratio and Adjoint," *Trans. Am. Nucl. Soc.*, **109**, @@ -81,19 +80,65 @@ Geometry Miscellaneous ------------- +- William Boyd, Sterling Harper, and Paul K. Romano, "Equipping OpenMC for the + big data era," Accepted, *PHYSOR 2016*, Sun Valley, Idaho, May 1-5, 2016. + +- Qicang Shen, William Boyd, Benoit Forget, and Kord Smith, "Tally precision + triggers for the OpenMC Monte Carlo code," *Trans. Am. Nucl. Soc.*, **112**, + 637-640 (2015). + - Timothy P. Burke, Brian C. Kiedrowski, and William R. Martin, "Flux and Reaction Rate Kernel Density Estimators in OpenMC," *Trans. Am. Nucl. Soc.*, **109**, 683-686 (2013). +------------------------------------ +Multi-group Cross Section Generation +------------------------------------ + +- Adam G. Nelson and William R. Martin, "Improved Monte Carlo tallying of + multi-group scattering moments using the NDPP code," *Trans. Am. Nucl. Soc.*, + **113**, 645-648 (2015) + +- Adam G. Nelson and William R. Martin, "Improved Monte Carlo tallying of + multi-group scattering moment matrices," *Trans. Am. Nucl. Soc.*, **110**, + 217-220 (2014). + +- Adam G. Nelson and William R. Martin, "Improved Convergence of Monte Carlo + Generated Multi-Group Scattering Moments," *Proc. Int. Conf. Mathematics and + Computational Methods Applied to Nuclear Science and Engineering*, Sun Valley, + Idaho, May 5--9 (2013). + ------------ Nuclear Data ------------ +- Colin Josey, Pablo Ducru, Benoit Forget, and Kord Smith, "Windowed multipole + for cross section Doppler broadening," *J. Comput. Phys.*, In Press + (2016). ``_ + +- Colin Josey, Benoit Forget, and Kord Smith, "Windowed multipole sensitivity to + target accuracy of the optimization procedure," *J. Nucl. Sci. Technol.*, + **52**, 987-992 (2015). ``_ + +- Jonathan A. Walsh, Paul K. Romano, Benoit Forget, and Kord S. Smith, + "Optimizations of the energy grid search algorithm in continuous-energy Monte + Carlo particle transport codes", *Comput. Phys. Commun.*, **196**, 134-142 + (2015). ``_ + - Jonathan A. Walsh, Benoit Forget, Kord S. Smith, Brian C. Kiedrowski, and Forrest B. Brown, "Direct, on-the-fly calculation of unresolved resonance region cross sections in Monte Carlo simulations," *Proc. Joint Int. Conf. M&C+SNA+MC*, Nashville, Tennessee, Apr. 19--23 (2015). +- Amanda L. Lund, Andrew R. Siegel, Benoit Forget, Colin Josey, and + Paul K. Romano, "Using fractional cascading to accelerate cross section + lookups in Monte Carlo particle transport calculations," *Proc. Joint + Int. Conf. M&C+SNA+MC*, Nashville, Tennessee, Apr. 19--23 (2015). + +- Ronald O. Rahaman, Andrew R. Siegel, and Paul K. Romano, "Monte Carlo + performance analysis for varying cross section parameter regimes," + *Proc. Joint Int. Conf. M&C+SNA+MC*, Nashville, Tennessee, Apr. 19--23 (2015). + - Paul K. Romano and Timothy H. Trumbull, "Comparison of algorithms for Doppler broadening pointwise tabulated cross sections," *Ann. Nucl. Energy*, **75**, 358--364 (2015). ``_ @@ -114,6 +159,10 @@ Nuclear Data Parallelism ----------- +- Paul K. Romano, John R. Tramm, and Andrew R. Siegel, "Efficacy of hardware + threading for Monte Carlo particle transport calculations on multi- and + many-core systems," Accepted, *PHYSOR 2016*, Sun Valley, Idaho, May 1-5, 2016. + - David Ozog, Allen D. Malony, and Andrew R. Siegel, "A performance analysis of SIMD algorithms for Monte Carlo simulations of nuclear reactor cores," *Proc. IEEE Int. Parallel and Distributed Processing Symposium*, Hyderabad, From 9cde4ce12c10b6acacacbee310cd08f19623d955 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 7 Dec 2015 22:16:15 -0600 Subject: [PATCH 44/49] Clarify installation instructions for HDF5 pre-req and Ubuntu PPA --- docs/source/usersguide/install.rst | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/source/usersguide/install.rst b/docs/source/usersguide/install.rst index dcf990bda..e3f0df5e9 100644 --- a/docs/source/usersguide/install.rst +++ b/docs/source/usersguide/install.rst @@ -8,7 +8,7 @@ Installation and Configuration Installing on Ubuntu with PPA ----------------------------- -For users with Ubuntu 11.10 or later, a binary package for OpenMC is available +For users with Ubuntu 15.04 or later, a binary package for OpenMC is available through a Personal Package Archive (PPA) and can be installed through the APT package manager. First, add the following PPA to the repository sources: @@ -28,6 +28,9 @@ Now OpenMC should be recognized within the repository and can be installed: sudo apt-get install openmc +Binary packages from this PPA may exist for earlier versions of Ubuntu, but they +are no longer supported. + -------------------- Building from Source -------------------- @@ -74,6 +77,12 @@ Prerequisites You may omit ``--enable-parallel`` if you want to compile HDF5_ in serial. + .. important:: + + OpenMC uses various parts of the HDF5 Fortran 2003 API; as such you + must include ``--enable-fortran2003`` or else OpenMC will not be able + to compile. + On Debian derivatives, HDF5 and/or parallel HDF5 can be installed through the APT package manager: From f84a4ee4309d76200981c92896f28e8fa1bb8ad3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 8 Dec 2015 07:19:31 -0600 Subject: [PATCH 45/49] Avoid DeprecationWarning from xml.etree.Element.getchildren() --- openmc/clean_xml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/clean_xml.py b/openmc/clean_xml.py index aefd30ac7..564281a5c 100644 --- a/openmc/clean_xml.py +++ b/openmc/clean_xml.py @@ -1,7 +1,7 @@ def sort_xml_elements(tree): # Retrieve all children of the root XML node in the tree - elements = tree.getchildren() + elements = list(tree) # Initialize empty lists for the sorted and comment elements sorted_elements = [] From 5f08f922824283052b132aecde8ce27b1300b391 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 14 Dec 2015 07:36:22 -0600 Subject: [PATCH 46/49] Fix bug in Complement.bounding_box. Also remove a few unused variables --- openmc/region.py | 4 +++- src/state_point.F90 | 2 -- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openmc/region.py b/openmc/region.py index b7cfbca7b..7589184aa 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -355,6 +355,8 @@ class Complement(Region): temp_region = Intersection(*[~n for n in self.node.nodes]) elif isinstance(self.node, Intersection): temp_region = Union(*[~n for n in self.node.nodes]) + elif isinstance(self.node, Complement): + temp_region = self.node.node else: - temp_region = ~n + temp_region = ~self.node return temp_region.bounding_box diff --git a/src/state_point.F90 b/src/state_point.F90 index 046e7e666..f9f4b5b75 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -870,7 +870,6 @@ contains integer(HSIZE_T) :: dims(1) type(c_ptr) :: f_ptr #ifdef PHDF5 - integer :: data_xfer_mode integer(HID_T) :: plist ! property list #else integer :: i @@ -989,7 +988,6 @@ contains integer(HSIZE_T) :: offset(1) ! offset of data type(c_ptr) :: f_ptr #ifdef PHDF5 - integer :: data_xfer_mode integer(HID_T) :: plist ! property list #endif From ffd0070654bd3bad879ecbbeada9e7ddd54acdde Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Mon, 21 Dec 2015 14:25:42 -0500 Subject: [PATCH 47/49] Now using id property setters in Python Summary API --- openmc/material.py | 4 ---- openmc/summary.py | 10 +++++----- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index 37ebc8a77..3818d7154 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -194,10 +194,6 @@ class Material(object): def id(self, material_id): global AUTO_MATERIAL_ID, MATERIAL_IDS - # If the Material already has an ID, remove it from global list - if hasattr(self, '_id') and self._id is not None: - MATERIAL_IDS.remove(self._id) - if material_id is None: self._id = AUTO_MATERIAL_ID MATERIAL_IDS.append(AUTO_MATERIAL_ID) diff --git a/openmc/summary.py b/openmc/summary.py index 4b1088e82..bc6551e7c 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -567,7 +567,7 @@ class Summary(object): """ for index, material in self.materials.items(): - if material._id == material_id: + if material.id == material_id: return material return None @@ -588,7 +588,7 @@ class Summary(object): """ for index, surface in self.surfaces.items(): - if surface._id == surface_id: + if surface.id == surface_id: return surface return None @@ -609,7 +609,7 @@ class Summary(object): """ for index, cell in self.cells.items(): - if cell._id == cell_id: + if cell.id == cell_id: return cell return None @@ -630,7 +630,7 @@ class Summary(object): """ for index, universe in self.universes.items(): - if universe._id == universe_id: + if universe.id == universe_id: return universe return None @@ -651,7 +651,7 @@ class Summary(object): """ for index, lattice in self.lattices.items(): - if lattice._id == lattice_id: + if lattice.id == lattice_id: return lattice return None From 37d4d2e9ed9dfea848c4670f50cabe5596d4b189 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Mon, 21 Dec 2015 20:52:12 -0500 Subject: [PATCH 48/49] Eliminated references to MATERIAL_IDS --- openmc/material.py | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index 3818d7154..542078c7c 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -12,17 +12,13 @@ from openmc.checkvalue import check_type, check_value, check_greater_than from openmc.clean_xml import * -# A list of all IDs for all Materials created -MATERIAL_IDS = [] - # A static variable for auto-generated Material IDs AUTO_MATERIAL_ID = 10000 def reset_auto_material_id(): - global AUTO_MATERIAL_ID, MATERIAL_IDS + global AUTO_MATERIAL_ID AUTO_MATERIAL_ID = 10000 - MATERIAL_IDS = [] # Units for density supported by OpenMC @@ -192,22 +188,15 @@ class Material(object): @id.setter def id(self, material_id): - global AUTO_MATERIAL_ID, MATERIAL_IDS if material_id is None: + global AUTO_MATERIAL_ID self._id = AUTO_MATERIAL_ID - MATERIAL_IDS.append(AUTO_MATERIAL_ID) AUTO_MATERIAL_ID += 1 else: check_type('material ID', material_id, Integral) - if material_id in MATERIAL_IDS: - msg = 'Unable to set Material ID to "{0}" since a Material with ' \ - 'this ID was already initialized'.format(material_id) - raise ValueError(msg) check_greater_than('material ID', material_id, 0, equality=True) - self._id = material_id - MATERIAL_IDS.append(material_id) @name.setter def name(self, name): From 97fd5e191d62ddd5687a8e8b3e301cdc6c1f0bd2 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 23 Dec 2015 10:51:21 -0600 Subject: [PATCH 49/49] Add Bryan Herman to release notes --- docs/source/releasenotes.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/releasenotes.rst b/docs/source/releasenotes.rst index 7320781e2..65309fd70 100644 --- a/docs/source/releasenotes.rst +++ b/docs/source/releasenotes.rst @@ -82,6 +82,7 @@ This release contains new contributions from the following people: - `Will Boyd `_ - `Sterling Harper `_ +- `Bryan Herman `_ - `Colin Josey `_ - `Adam Nelson `_ - `Paul Romano `_