From 3676a4a7c7786e4e9d409a678322a1be0086e14c Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 31 May 2015 11:43:57 -0700 Subject: [PATCH 001/101] Added initial Tally arithmetic addition operation --- src/utils/openmc/tallies.py | 148 +++++++++++++++++++++++++++++++++--- 1 file changed, 138 insertions(+), 10 deletions(-) diff --git a/src/utils/openmc/tallies.py b/src/utils/openmc/tallies.py index 59dd03dde4..12ca9cf707 100644 --- a/src/utils/openmc/tallies.py +++ b/src/utils/openmc/tallies.py @@ -43,6 +43,144 @@ class Tally(object): self._std_dev = None + def _align_tally_data(self, other): + + self_mean = copy.deepcopy(self.mean) + self_std_dev = copy.deepcopy(self.std_dev) + other_mean = copy.deepcopy(other.mean) + other_std_dev = copy.deepcopy(other.std_dev) + + if self.filters != other.filters: + + # Determine the number of paired combinations of filter bins + # between the two tallies and repeat arrays along filter axes + self_num_filter_bins = self.mean.shape[0] + other_num_filter_bins = other.mean.shape[0] + num_filter_bins = self_num_filter_bins * other_num_filter_bins + self_new_bins = max(num_filter_bins - self_num_filter_bins, 1) + other_new_bins = max(num_filter_bins - other_num_filter_bins, 1) + + # Replicate the data + self_mean = np.repeat(self_mean, self_new_bins, axis=0) + other_mean = np.repeat(other_mean, other_new_bins, axis=0) + self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=0) + other_std_dev = np.repeat(other_std_dev, other_new_bins, axis=0) + + if self.nuclides != other.nuclides: + + # Determine the number of paired combinations of nuclides + # between the two tallies and repeat arrays along nuclide axes + self_num_nuclide_bins = self.mean.shape[1] + other_num_nuclide_bins = other.mean.shape[1] + num_nuclide_bins = self_num_nuclide_bins * other_num_nuclide_bins + self_new_bins = max(num_nuclide_bins - self_num_nuclide_bins, 1) + other_new_bins = max(num_nuclide_bins - other_num_nuclide_bins, 1) + + # Replicate the data + self_mean = np.repeat(self_mean, self_new_bins, axis=1) + other_mean = np.repeat(other_mean, other_new_bins, axis=1) + self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=1) + other_std_dev = np.repeat(other_std_dev, other_new_bins, axis=1) + + if self.scores != other.scores: + + # Determine the number of paired combinations of score bins + # between the two tallies and repeat arrays along score axes + self_num_score_bins = self.mean.shape[2] + other_num_score_bins = other.mean.shape[2] + num_score_bins = self_num_score_bins * other_num_score_bins + self_new_bins = max(num_score_bins - self_num_score_bins, 1) + other_new_bins = max(num_score_bins - other_num_score_bins, 1) + + # Replicate the data + self_mean = np.repeat(self_mean, self_new_bins, axis=2) + other_mean = np.repeat(other_mean, other_new_bins, axis=2) + self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=2) + other_std_dev = np.repeat(other_std_dev, other_new_bins, axis=2) + + data = {} + data['self'] = {} + data['other'] = {} + data['self']['mean'] = self_mean + data['other']['mean'] = other_mean + data['self']['std. dev.'] = self_std_dev + data['other']['std. dev.'] = other_std_dev + return data + + + def __add__(self, other): + + # FIXME: Check that results have been read + if not (self.mean and other.mean): + msg = 'Unable to add Tally ID={0} to {1} since they do not ' \ + 'contain any results.'.format(self.id, other.id) + raise ValueError(msg) + + new_tally = Tally(name='derived') + + if isinstance(other, Tally): + + # FIXME: Need new CrossFilter class + # FIXME: Need way to cross-product Nuclides + # FIXME: Need cross-product scores - just mix/match strings? + + data = self._align_tally_data(other) + + new_tally._mean = data['self']['mean'] + data['other']['mean'] + new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + \ + data['other']['std. dev.']**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 + + elif is_integer(other) or is_float(other): + + new_tally._mean = self._mean + other + new_tally._std_dev = self._std_dev + + new_tally.estimator = self.estimator + new_tally.with_summary = self.with_summary + new_tally.num_realization = self.num_realizations + new_tally.num_score_bins = self.num_score_bins + + for score in self.scores: + new_tally.add_score(score) + + else: + msg = 'Unable to add {0} to Tally ID={1}'.format(other, self.id) + raise ValueError(msg) + + return new_tally + + + def __radd__(self, other): + return other + self + + ''' + def __sub__(self, other): + + def __rsub__(self, other): + + def __mul__(self, other): + + def __rmul__(self, other): + + def __div__(self, other): + + def __rdiv__(self, other): + + def __pow__(self, power): + + def sum(self, axis=None): + ''' + + def __deepcopy__(self, memo): existing = memo.get(id(self)) @@ -136,16 +274,6 @@ class Tally(object): return hash(tuple(hashable)) - def __add__(self, other): - - # FIXME: Error checking: must check that results has been - # set and that # bins is the same - - new_tally = Tally() - new_tally._mean = self._mean + other._mean - new_tally._std_dev = np.sqrt(self.std_dev**2 + other.std_dev**2) - - @property def id(self): return self._id From a7c7fad2e6d980930337a2fe213a66cc546ffa9b Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 31 May 2015 12:13:59 -0700 Subject: [PATCH 002/101] Implemented tally arithmetic subtract, multiply and divided operations --- src/utils/openmc/tallies.py | 196 ++++++++++++++++++++++++++++++++++-- 1 file changed, 189 insertions(+), 7 deletions(-) diff --git a/src/utils/openmc/tallies.py b/src/utils/openmc/tallies.py index 12ca9cf707..e6968052cf 100644 --- a/src/utils/openmc/tallies.py +++ b/src/utils/openmc/tallies.py @@ -110,16 +110,22 @@ class Tally(object): def __add__(self, other): - # FIXME: Check that results have been read - if not (self.mean and other.mean): - msg = 'Unable to add Tally ID={0} to {1} since they do not ' \ - 'contain any results.'.format(self.id, other.id) + # Check that results have been read + if not (self.mean): + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(self.id) raise ValueError(msg) new_tally = Tally(name='derived') if isinstance(other, Tally): + # Check that results have been read + if not (other.mean): + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(other.id) + raise ValueError(msg) + # FIXME: Need new CrossFilter class # FIXME: Need way to cross-product Nuclides # FIXME: Need cross-product scores - just mix/match strings? @@ -160,21 +166,197 @@ class Tally(object): def __radd__(self, other): - return other + self + return self + other + - ''' def __sub__(self, other): + # Check that results have been read + if not (self.mean): + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + + new_tally = Tally(name='derived') + + if isinstance(other, Tally): + + # Check that results have been read + if not (self.mean): + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + + # FIXME: Need new CrossFilter class + # FIXME: Need way to cross-product Nuclides + # FIXME: Need cross-product scores - just mix/match strings? + + data = self._align_tally_data(other) + + new_tally._mean = data['self']['mean'] - data['other']['mean'] + new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + \ + data['other']['std. dev.']**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 + + elif is_integer(other) or is_float(other): + + new_tally._mean = self._mean - other + new_tally._std_dev = self._std_dev + + new_tally.estimator = self.estimator + new_tally.with_summary = self.with_summary + new_tally.num_realization = self.num_realizations + new_tally.num_score_bins = self.num_score_bins + + for score in self.scores: + new_tally.add_score(score) + + else: + msg = 'Unable to subtract {0} from Tally ID={1}'.format(other, self.id) + raise ValueError(msg) + + return new_tally + + def __rsub__(self, other): + return -1. * self + other + def __mul__(self, other): + # Check that results have been read + if not (self.mean): + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + + new_tally = Tally(name='derived') + + if isinstance(other, Tally): + + # Check that results have been read + if not (self.mean): + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + + # FIXME: Need new CrossFilter class + # FIXME: Need way to cross-product Nuclides + # FIXME: Need cross-product scores - just mix/match strings? + + data = self._align_tally_data(other) + + self_rel_err = data['self']['std. dev.'] / data['self']['mean'] + other_rel_err = data['other']['std. dev.'] / data['other']['mean'] + new_tally._mean = data['self']['mean'] * data['other']['mean'] + new_tally._std_dev = np.abs(new_tally.mean) * \ + np.sqrt(self_rel_err**2 + other_rel_err**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 + + elif is_integer(other) or is_float(other): + + new_tally._mean = self._mean * other + new_tally._std_dev = self._std_dev * np.abs(other) + + new_tally.estimator = self.estimator + new_tally.with_summary = self.with_summary + new_tally.num_realization = self.num_realizations + new_tally.num_score_bins = self.num_score_bins + + for score in self.scores: + new_tally.add_score(score) + + else: + msg = 'Unable to subtract {0} from Tally ID={1}'.format(other, self.id) + raise ValueError(msg) + + return new_tally + + def __rmul__(self, other): + return self * other + def __div__(self, other): - def __rdiv__(self, other): + # Check that results have been read + if not (self.mean): + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + new_tally = Tally(name='derived') + + if isinstance(other, Tally): + + # Check that results have been read + if not (self.mean): + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + + # FIXME: Need new CrossFilter class + # FIXME: Need way to cross-product Nuclides + # FIXME: Need cross-product scores - just mix/match strings? + + data = self._align_tally_data(other) + + self_rel_err = data['self']['std. dev.'] / data['self']['mean'] + other_rel_err = data['other']['std. dev.'] / data['other']['mean'] + new_tally._mean = data['self']['mean'] / data['other']['mean'] + new_tally._std_dev = np.abs(new_tally.mean) * \ + np.sqrt(self_rel_err**2 + other_rel_err**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 + + elif is_integer(other) or is_float(other): + + new_tally._mean = self._mean / other + new_tally._std_dev = self._std_dev * np.abs(1. / other) + + new_tally.estimator = self.estimator + new_tally.with_summary = self.with_summary + new_tally.num_realization = self.num_realizations + new_tally.num_score_bins = self.num_score_bins + + for score in self.scores: + new_tally.add_score(score) + + else: + msg = 'Unable to subtract {0} from Tally ID={1}'.format(other, self.id) + raise ValueError(msg) + + return new_tally + + + def __rdiv__(self, other): + return self * (1. / other) + + + ''' def __pow__(self, power): def sum(self, axis=None): From a430cd7fd0fd5814d6908f3b867e1c2176a7bf75 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 31 May 2015 13:15:02 -0700 Subject: [PATCH 003/101] Implemented tally arithmetic exponent operation --- src/utils/openmc/tallies.py | 84 ++++++++++++++++++++++++++++++++----- 1 file changed, 74 insertions(+), 10 deletions(-) diff --git a/src/utils/openmc/tallies.py b/src/utils/openmc/tallies.py index e6968052cf..e5473ca03e 100644 --- a/src/utils/openmc/tallies.py +++ b/src/utils/openmc/tallies.py @@ -182,9 +182,9 @@ class Tally(object): if isinstance(other, Tally): # Check that results have been read - if not (self.mean): + if not (other.mean): msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(self.id) + 'since it does not contain any results.'.format(other.id) raise ValueError(msg) # FIXME: Need new CrossFilter class @@ -220,7 +220,8 @@ class Tally(object): new_tally.add_score(score) else: - msg = 'Unable to subtract {0} from Tally ID={1}'.format(other, self.id) + msg = 'Unable to subtract {0} from Tally ' \ + 'ID={1}'.format(other, self.id) raise ValueError(msg) return new_tally @@ -243,9 +244,9 @@ class Tally(object): if isinstance(other, Tally): # Check that results have been read - if not (self.mean): + if not (other.mean): msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(self.id) + 'since it does not contain any results.'.format(other.id) raise ValueError(msg) # FIXME: Need new CrossFilter class @@ -283,7 +284,8 @@ class Tally(object): new_tally.add_score(score) else: - msg = 'Unable to subtract {0} from Tally ID={1}'.format(other, self.id) + msg = 'Unable to multiply Tally ID={1} ' \ + 'by {0}'.format(self.id, other) raise ValueError(msg) return new_tally @@ -306,9 +308,9 @@ class Tally(object): if isinstance(other, Tally): # Check that results have been read - if not (self.mean): + if not (other.mean): msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(self.id) + 'since it does not contain any results.'.format(other.id) raise ValueError(msg) # FIXME: Need new CrossFilter class @@ -346,7 +348,8 @@ class Tally(object): new_tally.add_score(score) else: - msg = 'Unable to subtract {0} from Tally ID={1}'.format(other, self.id) + msg = 'Unable to divide Tally ID={0} ' \ + 'by {1}'.format(self.id, other) raise ValueError(msg) return new_tally @@ -356,10 +359,71 @@ class Tally(object): return self * (1. / other) - ''' def __pow__(self, power): + # Check that results have been read + if not (self.mean): + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + + new_tally = Tally(name='derived') + + if isinstance(power, Tally): + + # Check that results have been read + if not (power.mean): + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(power.id) + raise ValueError(msg) + + # FIXME: Need new CrossFilter class + # FIXME: Need way to cross-product Nuclides + # FIXME: Need cross-product scores - just mix/match strings? + + data = self._align_tally_data(power) + + mean_ratio = data['other']['mean'] / data['self']['mean'] + first_term = mean_ratio * data['self']['std. dev.'] + second_term = np.log(data['self']['mean']) * data['other']['std. dev.'] + new_tally._mean = data['self']['mean'] ** data['other']['mean'] + new_tally._std_dev = np.abs(new_tally.mean) * \ + np.sqrt(first_term**2 + second_term**2) + + if self.estimator == power.estimator: + new_tally.estimator = self.estimator + + if self.with_summary and power.with_summary: + new_tally.with_summary = self.with_summary + + if self.num_realizations == power.num_realizations: + new_tally.num_realizations = self.num_realizations + + elif is_integer(power) or is_float(power): + + new_tally._mean = self._mean ** power + self_rel_err = self.std_dev / self.mean + new_tally._std_dev = np.abs(new_tally._mean * power * self_rel_err) + + new_tally.estimator = self.estimator + new_tally.with_summary = self.with_summary + new_tally.num_realization = self.num_realizations + new_tally.num_score_bins = self.num_score_bins + + for score in self.scores: + new_tally.add_score(score) + + else: + msg = 'Unable to raise Tally ID={0} to ' \ + 'power {1}'.format(self.id, power) + raise ValueError(msg) + + return new_tally + + ''' def sum(self, axis=None): + + def slice(self, filters=[], nuclides=[], scores=[]) ''' From fe7ba998169d3dba1dc3e435aff003a5e19629cf Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 31 May 2015 13:26:10 -0700 Subject: [PATCH 004/101] Added tally arithmetic cross-scores --- src/utils/openmc/tallies.py | 76 +++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/utils/openmc/tallies.py b/src/utils/openmc/tallies.py index e5473ca03e..eb3d5046c3 100644 --- a/src/utils/openmc/tallies.py +++ b/src/utils/openmc/tallies.py @@ -145,6 +145,22 @@ class Tally(object): if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations + # Generate "cross" scores + # NOTE: This only needs to cross the scores if the + if self.scores != other.scores: + + for self_score in self.scores: + for other_score in other.scores: + new_score = '({0} + {1})'.format(self_score, other_score) + new_tally.add_score(new_score) + + else: + + for score in self.scores: + new_score = '({0} + {1})'.format(score, score) + new_tally.add_score(new_score) + + elif is_integer(other) or is_float(other): new_tally._mean = self._mean + other @@ -206,6 +222,21 @@ class Tally(object): if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations + # Generate "cross" scores + # NOTE: This only needs to cross the scores if the + if self.scores != other.scores: + + for self_score in self.scores: + for other_score in other.scores: + new_score = '({0} - {1})'.format(self_score, other_score) + new_tally.add_score(new_score) + + else: + + for score in self.scores: + new_score = '({0} - {1})'.format(score, score) + new_tally.add_score(new_score) + elif is_integer(other) or is_float(other): new_tally._mean = self._mean - other @@ -270,6 +301,21 @@ class Tally(object): if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations + # Generate "cross" scores + # NOTE: This only needs to cross the scores if the + if self.scores != other.scores: + + for self_score in self.scores: + for other_score in other.scores: + new_score = '({0} * {1})'.format(self_score, other_score) + new_tally.add_score(new_score) + + else: + + for score in self.scores: + new_score = '({0} * {1})'.format(score, score) + new_tally.add_score(new_score) + elif is_integer(other) or is_float(other): new_tally._mean = self._mean * other @@ -334,6 +380,21 @@ class Tally(object): if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations + # Generate "cross" scores + # NOTE: This only needs to cross the scores if the + if self.scores != other.scores: + + for self_score in self.scores: + for other_score in other.scores: + new_score = '({0} / {1})'.format(self_score, other_score) + new_tally.add_score(new_score) + + else: + + for score in self.scores: + new_score = '({0} / {1})'.format(score, score) + new_tally.add_score(new_score) + elif is_integer(other) or is_float(other): new_tally._mean = self._mean / other @@ -399,6 +460,21 @@ class Tally(object): if self.num_realizations == power.num_realizations: new_tally.num_realizations = self.num_realizations + # Generate "cross" scores + # NOTE: This only needs to cross the scores if the + if self.scores != power.scores: + + for self_score in self.scores: + for power_score in power.scores: + new_score = '({0} ^ {1})'.format(self_score, power_score) + new_tally.add_score(new_score) + + else: + + for score in self.scores: + new_score = '({0} ^ {1})'.format(score, score) + new_tally.add_score(new_score) + elif is_integer(power) or is_float(power): new_tally._mean = self._mean ** power From 3382a1e5a3d1a63407bf6d69df78bf559a5a70ac Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 31 May 2015 13:41:13 -0700 Subject: [PATCH 005/101] Pandas DataFrames now work with tally arithmetic cross-scores --- src/utils/openmc/tallies.py | 44 ++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/src/utils/openmc/tallies.py b/src/utils/openmc/tallies.py index eb3d5046c3..9aa41be432 100644 --- a/src/utils/openmc/tallies.py +++ b/src/utils/openmc/tallies.py @@ -41,6 +41,7 @@ class Tally(object): self._sum_sq = None self._mean = None self._std_dev = None + self._with_batch_statistics = False def _align_tally_data(self, other): @@ -117,6 +118,7 @@ class Tally(object): raise ValueError(msg) new_tally = Tally(name='derived') + new_tally.with_batch_statistics = True if isinstance(other, Tally): @@ -128,7 +130,6 @@ class Tally(object): # FIXME: Need new CrossFilter class # FIXME: Need way to cross-product Nuclides - # FIXME: Need cross-product scores - just mix/match strings? data = self._align_tally_data(other) @@ -194,6 +195,7 @@ class Tally(object): raise ValueError(msg) new_tally = Tally(name='derived') + new_tally.with_batch_statistics = True if isinstance(other, Tally): @@ -205,7 +207,6 @@ class Tally(object): # FIXME: Need new CrossFilter class # FIXME: Need way to cross-product Nuclides - # FIXME: Need cross-product scores - just mix/match strings? data = self._align_tally_data(other) @@ -271,6 +272,7 @@ class Tally(object): raise ValueError(msg) new_tally = Tally(name='derived') + new_tally.with_batch_statistics = True if isinstance(other, Tally): @@ -282,7 +284,6 @@ class Tally(object): # FIXME: Need new CrossFilter class # FIXME: Need way to cross-product Nuclides - # FIXME: Need cross-product scores - just mix/match strings? data = self._align_tally_data(other) @@ -350,6 +351,7 @@ class Tally(object): raise ValueError(msg) new_tally = Tally(name='derived') + new_tally.with_batch_statistics = True if isinstance(other, Tally): @@ -361,7 +363,6 @@ class Tally(object): # FIXME: Need new CrossFilter class # FIXME: Need way to cross-product Nuclides - # FIXME: Need cross-product scores - just mix/match strings? data = self._align_tally_data(other) @@ -429,6 +430,7 @@ class Tally(object): raise ValueError(msg) new_tally = Tally(name='derived') + new_tally.with_batch_statistics = True if isinstance(power, Tally): @@ -440,7 +442,6 @@ class Tally(object): # FIXME: Need new CrossFilter class # FIXME: Need way to cross-product Nuclides - # FIXME: Need cross-product scores - just mix/match strings? data = self._align_tally_data(power) @@ -700,6 +701,11 @@ class Tally(object): return self._std_dev + @property + def with_batch_statistics(self): + return self._with_batch_statistics + + @estimator.setter def estimator(self, estimator): @@ -819,6 +825,17 @@ class Tally(object): self._with_summary = with_summary + @with_batch_statistics.setter + def with_batch_statistics(self, with_batch_statistics): + + if not isinstance(with_batch_statistics, bool): + msg = 'Unable to set with_batch_statistics to a non-boolean ' \ + 'value "{0}"'.format(with_batch_statistics) + raise ValueError(msg) + + self._with_batch_statistics = with_batch_statistics + + def set_results(self, sum, sum_sq): if not isinstance(sum, (tuple, list, np.ndarray)): @@ -874,6 +891,7 @@ class Tally(object): self._std_dev = np.sqrt((self.sum_sq / self.num_realizations - \ self.mean**2) / (self.num_realizations - 1)) self._std_dev *= t_value + self.with_batch_statistics = True def __repr__(self): @@ -1209,7 +1227,11 @@ class Tally(object): """ # Ensure that StatePoint.read_results() was called first - if self._sum is None or self._sum_sq is None: + if (value == 'mean' and self.mean is None) or \ + (value == 'std_dev' and self.std_dev is None) or \ + (value == 'rel_err' and self.mean is None) or \ + (value == 'sum' and self.sum is None) or \ + (value == 'sum_sq' and self.sum_sq is None): msg = 'The Tally ID={0} has no data to return. Call the ' \ 'StatePoint.read_results() routine before using ' \ 'Tally.get_values(...)'.format(self.id) @@ -1217,7 +1239,8 @@ class Tally(object): # Compute batch statistics if not yet computed - self.compute_std_dev() + if not self.with_batch_statistics: + self.compute_std_dev() ############################ FILTERS ######################### # Determine the score indices from any of the requested scores @@ -1358,7 +1381,7 @@ class Tally(object): """ # Ensure that StatePoint.read_results() was called first - if self._sum is None or self._sum_sq is None: + if self.mean is None or self.std_dev is None: msg = 'The Tally ID={0} has no data to return. Call the ' \ 'StatePoint.read_results() routine before using ' \ 'Tally.get_pandas_dataframe(...)'.format(self.id) @@ -1380,13 +1403,14 @@ class Tally(object): raise ImportError(msg) # Compute batch statistics if not yet computed - self.compute_std_dev() + if not self.with_batch_statistics: + self.compute_std_dev() # Initialize a pandas dataframe for the tally data df = pd.DataFrame() # Find the total length of the tally data array - data_size = self.sum.size + data_size = self.mean.size # Build DataFrame columns for filters if user requested them if filters: From b80005e1bd7539f120d6a4c17ff57548b2c5b340 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 31 May 2015 13:52:16 -0700 Subject: [PATCH 006/101] Fixed bug in tally arithmetic numpy repeat vs. tile operatoins --- src/utils/openmc/tallies.py | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/utils/openmc/tallies.py b/src/utils/openmc/tallies.py index 9aa41be432..161f8ca324 100644 --- a/src/utils/openmc/tallies.py +++ b/src/utils/openmc/tallies.py @@ -63,9 +63,9 @@ class Tally(object): # Replicate the data self_mean = np.repeat(self_mean, self_new_bins, axis=0) - other_mean = np.repeat(other_mean, other_new_bins, axis=0) + other_mean = np.tile(other_mean, other_new_bins) self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=0) - other_std_dev = np.repeat(other_std_dev, other_new_bins, axis=0) + other_std_dev = np.tile(other_std_dev, other_new_bins) if self.nuclides != other.nuclides: @@ -79,9 +79,9 @@ class Tally(object): # Replicate the data self_mean = np.repeat(self_mean, self_new_bins, axis=1) - other_mean = np.repeat(other_mean, other_new_bins, axis=1) + other_mean = np.tile(other_mean, other_new_bins) self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=1) - other_std_dev = np.repeat(other_std_dev, other_new_bins, axis=1) + other_std_dev = np.tile(other_std_dev, other_new_bins) if self.scores != other.scores: @@ -95,9 +95,9 @@ class Tally(object): # Replicate the data self_mean = np.repeat(self_mean, self_new_bins, axis=2) - other_mean = np.repeat(other_mean, other_new_bins, axis=2) + other_mean = np.tile(other_mean, other_new_bins) self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=2) - other_std_dev = np.repeat(other_std_dev, other_new_bins, axis=2) + other_std_dev = np.tile(other_std_dev, other_new_bins) data = {} data['self'] = {} @@ -112,7 +112,7 @@ class Tally(object): def __add__(self, other): # Check that results have been read - if not (self.mean): + if self.mean is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) @@ -123,7 +123,7 @@ class Tally(object): if isinstance(other, Tally): # Check that results have been read - if not (other.mean): + if other.mean is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(other.id) raise ValueError(msg) @@ -189,7 +189,7 @@ class Tally(object): def __sub__(self, other): # Check that results have been read - if not (self.mean): + if self.mean is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) @@ -200,7 +200,7 @@ class Tally(object): if isinstance(other, Tally): # Check that results have been read - if not (other.mean): + if other.mean is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(other.id) raise ValueError(msg) @@ -266,7 +266,7 @@ class Tally(object): def __mul__(self, other): # Check that results have been read - if not (self.mean): + if self.mean is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) @@ -277,7 +277,7 @@ class Tally(object): if isinstance(other, Tally): # Check that results have been read - if not (other.mean): + if other.mean is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(other.id) raise ValueError(msg) @@ -345,9 +345,10 @@ class Tally(object): def __div__(self, other): # Check that results have been read - if not (self.mean): + if self.mean is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(self.id) + print self.mean raise ValueError(msg) new_tally = Tally(name='derived') @@ -356,7 +357,7 @@ class Tally(object): if isinstance(other, Tally): # Check that results have been read - if not (other.mean): + if other.mean is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(other.id) raise ValueError(msg) @@ -424,7 +425,7 @@ class Tally(object): def __pow__(self, power): # Check that results have been read - if not (self.mean): + if self.mean is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) @@ -435,7 +436,7 @@ class Tally(object): if isinstance(power, Tally): # Check that results have been read - if not (power.mean): + if power.mean is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(power.id) raise ValueError(msg) From 0084f0081f069b971078a39e4380a859cbaf4af6 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 31 May 2015 14:22:42 -0700 Subject: [PATCH 007/101] Added tally arithmetic cross-nuclide --- src/utils/openmc/tallies.py | 241 ++++++++++++++++++++++++++++-------- 1 file changed, 191 insertions(+), 50 deletions(-) diff --git a/src/utils/openmc/tallies.py b/src/utils/openmc/tallies.py index 161f8ca324..9528c49015 100644 --- a/src/utils/openmc/tallies.py +++ b/src/utils/openmc/tallies.py @@ -63,9 +63,9 @@ class Tally(object): # Replicate the data self_mean = np.repeat(self_mean, self_new_bins, axis=0) - other_mean = np.tile(other_mean, other_new_bins) + other_mean = np.tile(other_mean, (other_new_bins, 1, 1)) self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=0) - other_std_dev = np.tile(other_std_dev, other_new_bins) + other_std_dev = np.tile(other_std_dev, (other_new_bins, 1, 1)) if self.nuclides != other.nuclides: @@ -79,9 +79,9 @@ class Tally(object): # Replicate the data self_mean = np.repeat(self_mean, self_new_bins, axis=1) - other_mean = np.tile(other_mean, other_new_bins) + other_mean = np.tile(other_mean, (1, other_new_bins, 1)) self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=1) - other_std_dev = np.tile(other_std_dev, other_new_bins) + other_std_dev = np.tile(other_std_dev, (1, other_new_bins, 1)) if self.scores != other.scores: @@ -95,9 +95,9 @@ class Tally(object): # Replicate the data self_mean = np.repeat(self_mean, self_new_bins, axis=2) - other_mean = np.tile(other_mean, other_new_bins) + other_mean = np.tile(other_mean, (1, 1, other_new_bins)) self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=2) - other_std_dev = np.tile(other_std_dev, other_new_bins) + other_std_dev = np.tile(other_std_dev, (1, 1, other_new_bins)) data = {} data['self'] = {} @@ -129,7 +129,6 @@ class Tally(object): raise ValueError(msg) # FIXME: Need new CrossFilter class - # FIXME: Need way to cross-product Nuclides data = self._align_tally_data(other) @@ -146,20 +145,46 @@ class Tally(object): if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations - # Generate "cross" scores - # NOTE: This only needs to cross the scores if the - if self.scores != other.scores: + # If the two Tallies have same scores, replicate them in new Tally + if self.scores == other.scores: + for score in self.scores: + new_score = '({0} + {1})'.format(score, score) + new_tally.add_score(new_score) + # Generate score "cross product" + else: for self_score in self.scores: for other_score in other.scores: new_score = '({0} + {1})'.format(self_score, other_score) new_tally.add_score(new_score) - else: + # If the two Tallies have same nuclides, replicate them in new Tally + if self.nuclides == other.nuclides: + for nuclide in self.nuclides: - for score in self.scores: - new_score = '({0} + {1})'.format(score, score) - new_tally.add_score(new_score) + if isinstance(nuclide, Nuclide): + name = nuclide.name + new_nuclide = '({0} + {1})'.format(name, name) + else: + new_nuclide = '({0} + {1})'.format(nuclide, nuclide) + + new_tally.add_nuclide(new_nuclide) + + # Generate nuclide "cross product" + else: + for self_nuclide in self.nuclides: + for other_nuclide in other.nuclides: + if isinstance(self_nuclide, Nuclide): + self_name = self_nuclide.name + else: + self_name = self_nuclide + if isinstance(other_nuclide, Nuclide): + other_name = other_nuclide.name + else: + other_name = other_nuclide + + new_nuclide = '({0} + {1})'.format(self_name, other_name) + new_tally.add_nuclide(new_nuclide) elif is_integer(other) or is_float(other): @@ -175,6 +200,9 @@ class Tally(object): for score in self.scores: new_tally.add_score(score) + for nuclide in self.nuclides: + new_tally.add_nuclide(nuclide) + else: msg = 'Unable to add {0} to Tally ID={1}'.format(other, self.id) raise ValueError(msg) @@ -206,7 +234,6 @@ class Tally(object): raise ValueError(msg) # FIXME: Need new CrossFilter class - # FIXME: Need way to cross-product Nuclides data = self._align_tally_data(other) @@ -223,20 +250,46 @@ class Tally(object): if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations - # Generate "cross" scores - # NOTE: This only needs to cross the scores if the - if self.scores != other.scores: + # If the two Tallies have same scores, replicate them in new Tally + if self.scores == other.scores: + for score in self.scores: + new_score = '({0} - {1})'.format(score, score) + new_tally.add_score(new_score) + # Generate score "cross product" + else: for self_score in self.scores: for other_score in other.scores: new_score = '({0} - {1})'.format(self_score, other_score) new_tally.add_score(new_score) - else: + # If the two Tallies have same nuclides, replicate them in new Tally + if self.nuclides == other.nuclides: + for nuclide in self.nuclides: - for score in self.scores: - new_score = '({0} - {1})'.format(score, score) - new_tally.add_score(new_score) + if isinstance(nuclide, Nuclide): + name = nuclide.name + new_nuclide = '({0} - {1})'.format(name, name) + else: + new_nuclide = '({0} - {1})'.format(nuclide, nuclide) + + new_tally.add_nuclide(new_nuclide) + + # Generate nuclide "cross product" + else: + for self_nuclide in self.nuclides: + for other_nuclide in other.nuclides: + if isinstance(self_nuclide, Nuclide): + self_name = self_nuclide.name + else: + self_name = self_nuclide + if isinstance(other_nuclide, Nuclide): + other_name = other_nuclide.name + else: + other_name = other_nuclide + + new_nuclide = '({0} - {1})'.format(self_name, other_name) + new_tally.add_nuclide(new_nuclide) elif is_integer(other) or is_float(other): @@ -251,6 +304,9 @@ class Tally(object): for score in self.scores: new_tally.add_score(score) + for nuclide in self.nuclides: + new_tally.add_nuclide(nuclide) + else: msg = 'Unable to subtract {0} from Tally ' \ 'ID={1}'.format(other, self.id) @@ -283,7 +339,6 @@ class Tally(object): raise ValueError(msg) # FIXME: Need new CrossFilter class - # FIXME: Need way to cross-product Nuclides data = self._align_tally_data(other) @@ -302,20 +357,46 @@ class Tally(object): if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations - # Generate "cross" scores - # NOTE: This only needs to cross the scores if the - if self.scores != other.scores: + # If the two Tallies have same scores, replicate them in new Tally + if self.scores == other.scores: + for score in self.scores: + new_score = '({0} * {1})'.format(score, score) + new_tally.add_score(new_score) + # Generate score "cross product" + else: for self_score in self.scores: for other_score in other.scores: new_score = '({0} * {1})'.format(self_score, other_score) new_tally.add_score(new_score) - else: + # If the two Tallies have same nuclides, replicate them in new Tally + if self.nuclides == other.nuclides: + for nuclide in self.nuclides: - for score in self.scores: - new_score = '({0} * {1})'.format(score, score) - new_tally.add_score(new_score) + if isinstance(nuclide, Nuclide): + name = nuclide.name + new_nuclide = '({0} * {1})'.format(name, name) + else: + new_nuclide = '({0} * {1})'.format(nuclide, nuclide) + + new_tally.add_nuclide(new_nuclide) + + # Generate nuclide "cross product" + else: + for self_nuclide in self.nuclides: + for other_nuclide in other.nuclides: + if isinstance(self_nuclide, Nuclide): + self_name = self_nuclide.name + else: + self_name = self_nuclide + if isinstance(other_nuclide, Nuclide): + other_name = other_nuclide.name + else: + other_name = other_nuclide + + new_nuclide = '({0} * {1})'.format(self_name, other_name) + new_tally.add_nuclide(new_nuclide) elif is_integer(other) or is_float(other): @@ -330,6 +411,9 @@ class Tally(object): for score in self.scores: new_tally.add_score(score) + for nuclide in self.nuclides: + new_tally.add_nuclide(nuclide) + else: msg = 'Unable to multiply Tally ID={1} ' \ 'by {0}'.format(self.id, other) @@ -363,7 +447,6 @@ class Tally(object): raise ValueError(msg) # FIXME: Need new CrossFilter class - # FIXME: Need way to cross-product Nuclides data = self._align_tally_data(other) @@ -382,20 +465,47 @@ class Tally(object): if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations - # Generate "cross" scores - # NOTE: This only needs to cross the scores if the - if self.scores != other.scores: + # If the two Tallies have same scores, replicate them in new Tally + if self.scores == other.scores: + for score in self.scores: + new_score = '({0} / {1})'.format(score, score) + new_tally.add_score(new_score) + # Generate score "cross product" + else: for self_score in self.scores: for other_score in other.scores: new_score = '({0} / {1})'.format(self_score, other_score) new_tally.add_score(new_score) - else: - for score in self.scores: - new_score = '({0} / {1})'.format(score, score) - new_tally.add_score(new_score) + # If the two Tallies have same nuclides, replicate them in new Tally + if self.nuclides == other.nuclides: + for nuclide in self.nuclides: + + if isinstance(nuclide, Nuclide): + name = nuclide.name + new_nuclide = '({0} / {1})'.format(name, name) + else: + new_nuclide = '({0} / {1})'.format(nuclide, nuclide) + + new_tally.add_nuclide(new_nuclide) + + # Generate nuclide "cross product" + else: + for self_nuclide in self.nuclides: + for other_nuclide in other.nuclides: + if isinstance(self_nuclide, Nuclide): + self_name = self_nuclide.name + else: + self_name = self_nuclide + if isinstance(other_nuclide, Nuclide): + other_name = other_nuclide.name + else: + other_name = other_nuclide + + new_nuclide = '({0} / {1})'.format(self_name, other_name) + new_tally.add_nuclide(new_nuclide) elif is_integer(other) or is_float(other): @@ -410,6 +520,9 @@ class Tally(object): for score in self.scores: new_tally.add_score(score) + for nuclide in self.nuclides: + new_tally.add_nuclide(nuclide) + else: msg = 'Unable to divide Tally ID={0} ' \ 'by {1}'.format(self.id, other) @@ -442,7 +555,6 @@ class Tally(object): raise ValueError(msg) # FIXME: Need new CrossFilter class - # FIXME: Need way to cross-product Nuclides data = self._align_tally_data(power) @@ -462,21 +574,47 @@ class Tally(object): if self.num_realizations == power.num_realizations: new_tally.num_realizations = self.num_realizations - # Generate "cross" scores - # NOTE: This only needs to cross the scores if the - if self.scores != power.scores: - - for self_score in self.scores: - for power_score in power.scores: - new_score = '({0} ^ {1})'.format(self_score, power_score) - new_tally.add_score(new_score) - - else: - + # If the two Tallies have same scores, replicate them in new Tally + if self.scores == power.scores: for score in self.scores: new_score = '({0} ^ {1})'.format(score, score) new_tally.add_score(new_score) + # Generate score "cross product" + else: + for self_score in self.scores: + for other_score in power.scores: + new_score = '({0} ^ {1})'.format(self_score, other_score) + new_tally.add_score(new_score) + + # If the two Tallies have same nuclides, replicate them in new Tally + if self.nuclides == power.nuclides: + for nuclide in self.nuclides: + + if isinstance(nuclide, Nuclide): + name = nuclide.name + new_nuclide = '({0} ^ {1})'.format(name, name) + else: + new_nuclide = '({0} ^ {1})'.format(nuclide, nuclide) + + new_tally.add_nuclide(new_nuclide) + + # Generate nuclide "cross product" + else: + for self_nuclide in self.nuclides: + for other_nuclide in power.nuclides: + if isinstance(self_nuclide, Nuclide): + self_name = self_nuclide.name + else: + self_name = self_nuclide + if isinstance(other_nuclide, Nuclide): + other_name = other_nuclide.name + else: + other_name = other_nuclide + + new_nuclide = '({0} + {1})'.format(self_name, other_name) + new_tally.add_nuclide(new_nuclide) + elif is_integer(power) or is_float(power): new_tally._mean = self._mean ** power @@ -491,6 +629,9 @@ class Tally(object): for score in self.scores: new_tally.add_score(score) + for nuclide in self.nuclides: + new_tally.add_nuclide(nuclide) + else: msg = 'Unable to raise Tally ID={0} to ' \ 'power {1}'.format(self.id, power) From 7094345647a5b94af920d0d13fac5bd837f70c7c Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 31 May 2015 15:15:29 -0700 Subject: [PATCH 008/101] Now properly replicating scores and nuclides in tally arithmetic derived tallies --- src/utils/openmc/tallies.py | 166 ++++++++++++++---------------------- 1 file changed, 62 insertions(+), 104 deletions(-) diff --git a/src/utils/openmc/tallies.py b/src/utils/openmc/tallies.py index 9528c49015..3d7f9c38f8 100644 --- a/src/utils/openmc/tallies.py +++ b/src/utils/openmc/tallies.py @@ -46,67 +46,67 @@ class Tally(object): def _align_tally_data(self, other): - self_mean = copy.deepcopy(self.mean) - self_std_dev = copy.deepcopy(self.std_dev) - other_mean = copy.deepcopy(other.mean) - other_std_dev = copy.deepcopy(other.std_dev) + self_mean = copy.deepcopy(self.mean) + self_std_dev = copy.deepcopy(self.std_dev) + other_mean = copy.deepcopy(other.mean) + other_std_dev = copy.deepcopy(other.std_dev) - if self.filters != other.filters: + if self.filters != other.filters: - # Determine the number of paired combinations of filter bins - # between the two tallies and repeat arrays along filter axes - self_num_filter_bins = self.mean.shape[0] - other_num_filter_bins = other.mean.shape[0] - num_filter_bins = self_num_filter_bins * other_num_filter_bins - self_new_bins = max(num_filter_bins - self_num_filter_bins, 1) - other_new_bins = max(num_filter_bins - other_num_filter_bins, 1) + # Determine the number of paired combinations of filter bins + # between the two tallies and repeat arrays along filter axes + self_num_filter_bins = self.mean.shape[0] + other_num_filter_bins = other.mean.shape[0] + num_filter_bins = self_num_filter_bins * other_num_filter_bins + self_new_bins = max(num_filter_bins - self_num_filter_bins, 1) + other_new_bins = max(num_filter_bins - other_num_filter_bins, 1) - # Replicate the data - self_mean = np.repeat(self_mean, self_new_bins, axis=0) - other_mean = np.tile(other_mean, (other_new_bins, 1, 1)) - self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=0) - other_std_dev = np.tile(other_std_dev, (other_new_bins, 1, 1)) + # Replicate the data + self_mean = np.repeat(self_mean, self_new_bins, axis=0) + other_mean = np.tile(other_mean, (other_new_bins, 1, 1)) + self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=0) + other_std_dev = np.tile(other_std_dev, (other_new_bins, 1, 1)) - if self.nuclides != other.nuclides: + if self.nuclides != other.nuclides: - # Determine the number of paired combinations of nuclides - # between the two tallies and repeat arrays along nuclide axes - self_num_nuclide_bins = self.mean.shape[1] - other_num_nuclide_bins = other.mean.shape[1] - num_nuclide_bins = self_num_nuclide_bins * other_num_nuclide_bins - self_new_bins = max(num_nuclide_bins - self_num_nuclide_bins, 1) - other_new_bins = max(num_nuclide_bins - other_num_nuclide_bins, 1) + # Determine the number of paired combinations of nuclides + # between the two tallies and repeat arrays along nuclide axes + self_num_nuclide_bins = self.mean.shape[1] + other_num_nuclide_bins = other.mean.shape[1] + num_nuclide_bins = self_num_nuclide_bins * other_num_nuclide_bins + self_new_bins = max(num_nuclide_bins - self_num_nuclide_bins, 1) + other_new_bins = max(num_nuclide_bins - other_num_nuclide_bins, 1) - # Replicate the data - self_mean = np.repeat(self_mean, self_new_bins, axis=1) - other_mean = np.tile(other_mean, (1, other_new_bins, 1)) - self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=1) - other_std_dev = np.tile(other_std_dev, (1, other_new_bins, 1)) + # Replicate the data + self_mean = np.repeat(self_mean, self_new_bins, axis=1) + other_mean = np.tile(other_mean, (1, other_new_bins, 1)) + self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=1) + other_std_dev = np.tile(other_std_dev, (1, other_new_bins, 1)) - if self.scores != other.scores: + if self.scores != other.scores: - # Determine the number of paired combinations of score bins - # between the two tallies and repeat arrays along score axes - self_num_score_bins = self.mean.shape[2] - other_num_score_bins = other.mean.shape[2] - num_score_bins = self_num_score_bins * other_num_score_bins - self_new_bins = max(num_score_bins - self_num_score_bins, 1) - other_new_bins = max(num_score_bins - other_num_score_bins, 1) + # Determine the number of paired combinations of score bins + # between the two tallies and repeat arrays along score axes + self_num_score_bins = self.mean.shape[2] + other_num_score_bins = other.mean.shape[2] + num_score_bins = self_num_score_bins * other_num_score_bins + self_new_bins = max(num_score_bins - self_num_score_bins, 1) + other_new_bins = max(num_score_bins - other_num_score_bins, 1) - # Replicate the data - self_mean = np.repeat(self_mean, self_new_bins, axis=2) - other_mean = np.tile(other_mean, (1, 1, other_new_bins)) - self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=2) - other_std_dev = np.tile(other_std_dev, (1, 1, other_new_bins)) + # Replicate the data + self_mean = np.repeat(self_mean, self_new_bins, axis=2) + other_mean = np.tile(other_mean, (1, 1, other_new_bins)) + self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=2) + other_std_dev = np.tile(other_std_dev, (1, 1, other_new_bins)) - data = {} - data['self'] = {} - data['other'] = {} - data['self']['mean'] = self_mean - data['other']['mean'] = other_mean - data['self']['std. dev.'] = self_std_dev - data['other']['std. dev.'] = other_std_dev - return data + data = {} + data['self'] = {} + data['other'] = {} + data['self']['mean'] = self_mean + data['other']['mean'] = other_mean + data['self']['std. dev.'] = self_std_dev + data['other']['std. dev.'] = other_std_dev + return data def __add__(self, other): @@ -148,8 +148,7 @@ class Tally(object): # If the two Tallies have same scores, replicate them in new Tally if self.scores == other.scores: for score in self.scores: - new_score = '({0} + {1})'.format(score, score) - new_tally.add_score(new_score) + new_tally.add_score(score) # Generate score "cross product" else: @@ -161,14 +160,7 @@ class Tally(object): # If the two Tallies have same nuclides, replicate them in new Tally if self.nuclides == other.nuclides: for nuclide in self.nuclides: - - if isinstance(nuclide, Nuclide): - name = nuclide.name - new_nuclide = '({0} + {1})'.format(name, name) - else: - new_nuclide = '({0} + {1})'.format(nuclide, nuclide) - - new_tally.add_nuclide(new_nuclide) + new_tally.add_nuclide(nuclide) # Generate nuclide "cross product" else: @@ -253,8 +245,7 @@ class Tally(object): # If the two Tallies have same scores, replicate them in new Tally if self.scores == other.scores: for score in self.scores: - new_score = '({0} - {1})'.format(score, score) - new_tally.add_score(new_score) + new_tally.add_score(score) # Generate score "cross product" else: @@ -266,14 +257,7 @@ class Tally(object): # If the two Tallies have same nuclides, replicate them in new Tally if self.nuclides == other.nuclides: for nuclide in self.nuclides: - - if isinstance(nuclide, Nuclide): - name = nuclide.name - new_nuclide = '({0} - {1})'.format(name, name) - else: - new_nuclide = '({0} - {1})'.format(nuclide, nuclide) - - new_tally.add_nuclide(new_nuclide) + new_tally.add_nuclide(nuclide) # Generate nuclide "cross product" else: @@ -360,8 +344,7 @@ class Tally(object): # If the two Tallies have same scores, replicate them in new Tally if self.scores == other.scores: for score in self.scores: - new_score = '({0} * {1})'.format(score, score) - new_tally.add_score(new_score) + new_tally.add_score(score) # Generate score "cross product" else: @@ -373,14 +356,7 @@ class Tally(object): # If the two Tallies have same nuclides, replicate them in new Tally if self.nuclides == other.nuclides: for nuclide in self.nuclides: - - if isinstance(nuclide, Nuclide): - name = nuclide.name - new_nuclide = '({0} * {1})'.format(name, name) - else: - new_nuclide = '({0} * {1})'.format(nuclide, nuclide) - - new_tally.add_nuclide(new_nuclide) + new_tally.add_nuclide(nuclide) # Generate nuclide "cross product" else: @@ -432,7 +408,6 @@ class Tally(object): if self.mean is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(self.id) - print self.mean raise ValueError(msg) new_tally = Tally(name='derived') @@ -468,8 +443,7 @@ class Tally(object): # If the two Tallies have same scores, replicate them in new Tally if self.scores == other.scores: for score in self.scores: - new_score = '({0} / {1})'.format(score, score) - new_tally.add_score(new_score) + new_tally.add_score(score) # Generate score "cross product" else: @@ -478,18 +452,10 @@ class Tally(object): new_score = '({0} / {1})'.format(self_score, other_score) new_tally.add_score(new_score) - # If the two Tallies have same nuclides, replicate them in new Tally - if self.nuclides == other.nuclides: + if self.nuclides == power.nuclides: for nuclide in self.nuclides: - - if isinstance(nuclide, Nuclide): - name = nuclide.name - new_nuclide = '({0} / {1})'.format(name, name) - else: - new_nuclide = '({0} / {1})'.format(nuclide, nuclide) - - new_tally.add_nuclide(new_nuclide) + new_tally.add_nuclide(nuclide) # Generate nuclide "cross product" else: @@ -577,8 +543,7 @@ class Tally(object): # If the two Tallies have same scores, replicate them in new Tally if self.scores == power.scores: for score in self.scores: - new_score = '({0} ^ {1})'.format(score, score) - new_tally.add_score(new_score) + new_tally.add_score(score) # Generate score "cross product" else: @@ -590,14 +555,7 @@ class Tally(object): # If the two Tallies have same nuclides, replicate them in new Tally if self.nuclides == power.nuclides: for nuclide in self.nuclides: - - if isinstance(nuclide, Nuclide): - name = nuclide.name - new_nuclide = '({0} ^ {1})'.format(name, name) - else: - new_nuclide = '({0} ^ {1})'.format(nuclide, nuclide) - - new_tally.add_nuclide(new_nuclide) + new_tally.add_nuclide(nuclide) # Generate nuclide "cross product" else: From c032ea8c96f80e3d7452acee8cb51bc9c97638a9 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 31 May 2015 15:39:45 -0700 Subject: [PATCH 009/101] Created _CrossScore private class for tally arithmetic --- src/utils/openmc/tallies.py | 87 +++++++++++++++++++++++++++++++++---- 1 file changed, 79 insertions(+), 8 deletions(-) diff --git a/src/utils/openmc/tallies.py b/src/utils/openmc/tallies.py index 3d7f9c38f8..0c53436d91 100644 --- a/src/utils/openmc/tallies.py +++ b/src/utils/openmc/tallies.py @@ -154,7 +154,7 @@ class Tally(object): else: for self_score in self.scores: for other_score in other.scores: - new_score = '({0} + {1})'.format(self_score, other_score) + new_score = _CrossScore(self_score, other_score, '+') new_tally.add_score(new_score) # If the two Tallies have same nuclides, replicate them in new Tally @@ -251,7 +251,7 @@ class Tally(object): else: for self_score in self.scores: for other_score in other.scores: - new_score = '({0} - {1})'.format(self_score, other_score) + new_score = _CrossScore(self_score, other_score, '-') new_tally.add_score(new_score) # If the two Tallies have same nuclides, replicate them in new Tally @@ -350,7 +350,7 @@ class Tally(object): else: for self_score in self.scores: for other_score in other.scores: - new_score = '({0} * {1})'.format(self_score, other_score) + new_score = _CrossScore(self_score, other_score, '*') new_tally.add_score(new_score) # If the two Tallies have same nuclides, replicate them in new Tally @@ -449,11 +449,11 @@ class Tally(object): else: for self_score in self.scores: for other_score in other.scores: - new_score = '({0} / {1})'.format(self_score, other_score) + new_score = _CrossScore(self_score, other_score, '/') new_tally.add_score(new_score) # If the two Tallies have same nuclides, replicate them in new Tally - if self.nuclides == power.nuclides: + if self.nuclides == other.nuclides: for nuclide in self.nuclides: new_tally.add_nuclide(nuclide) @@ -548,8 +548,8 @@ class Tally(object): # Generate score "cross product" else: for self_score in self.scores: - for other_score in power.scores: - new_score = '({0} ^ {1})'.format(self_score, other_score) + for other_score in other.scores: + new_score = _CrossScore(self_score, other_score, '^') new_tally.add_score(new_score) # If the two Tallies have same nuclides, replicate them in new Tally @@ -879,7 +879,7 @@ class Tally(object): def add_score(self, score): - if not is_string(score): + if not is_string(score) and not isinstance(score, _CrossScore): msg = 'Unable to add score "{0}" to Tally ID={1} since it is ' \ 'not a string'.format(score, self.id) raise ValueError(msg) @@ -2017,3 +2017,74 @@ class TalliesFile(object): tree = ET.ElementTree(self._tallies_file) tree.write("tallies.xml", xml_declaration=True, encoding='utf-8', method="xml") + + +class _CrossScore(object): + + def __init__(self, left_score=None, right_score=None, binary_op=None): + + self._left_score = None + self._right_score = None + self._binary_op = None + + if left_score is not None: + self.left_score = left_score + + if right_score is not None: + self.right_score = right_score + + if binary_op is not None: + self.binary_op = binary_op + + + @property + def left_score(self): + return self._left_score + + + @property + def right_score(self): + return self._right_score + + + @property + def binary_op(self): + return self._binary_op + + + @left_score.setter + def left_score(self, left_score): + + if not is_string(left_score): + msg = 'Unable to set CrossScore left score to {0} which ' \ + 'is not a string'.format(left_score) + raise ValueError(msg) + + self._left_score = left_score + + @right_score.setter + def right_score(self, right_score): + + if not is_string(right_score): + msg = 'Unable to set CrossScore right score to {0} which ' \ + 'is not a string'.format(right_score) + raise ValueError(msg) + + self._right_score = right_score + + + @binary_op.setter + def binary_op(self, binary_op): + + if not is_string(binary_op): + msg = 'Unable to set CrossScore binary op to {0} which ' \ + 'is not a string'.format(binary_op) + raise ValueError(msg) + + self._binary_op = binary_op + + + def __repr__(self): + string = '({0} {1} {2})'.format(self.left_score, + self.binary_op, self.right_score) + return string \ No newline at end of file From 8ba65c3e01444cc130a86c3877f61fcd15d78645 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 31 May 2015 15:53:45 -0700 Subject: [PATCH 010/101] Created _CrossNuclide private class for tally arithmetic --- src/utils/openmc/tallies.py | 153 +++++++++++++++++++++++------------- 1 file changed, 99 insertions(+), 54 deletions(-) diff --git a/src/utils/openmc/tallies.py b/src/utils/openmc/tallies.py index 0c53436d91..419f099592 100644 --- a/src/utils/openmc/tallies.py +++ b/src/utils/openmc/tallies.py @@ -166,19 +166,9 @@ class Tally(object): else: for self_nuclide in self.nuclides: for other_nuclide in other.nuclides: - if isinstance(self_nuclide, Nuclide): - self_name = self_nuclide.name - else: - self_name = self_nuclide - if isinstance(other_nuclide, Nuclide): - other_name = other_nuclide.name - else: - other_name = other_nuclide - - new_nuclide = '({0} + {1})'.format(self_name, other_name) + new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '+') new_tally.add_nuclide(new_nuclide) - elif is_integer(other) or is_float(other): new_tally._mean = self._mean + other @@ -263,16 +253,7 @@ class Tally(object): else: for self_nuclide in self.nuclides: for other_nuclide in other.nuclides: - if isinstance(self_nuclide, Nuclide): - self_name = self_nuclide.name - else: - self_name = self_nuclide - if isinstance(other_nuclide, Nuclide): - other_name = other_nuclide.name - else: - other_name = other_nuclide - - new_nuclide = '({0} - {1})'.format(self_name, other_name) + new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '-') new_tally.add_nuclide(new_nuclide) elif is_integer(other) or is_float(other): @@ -362,16 +343,7 @@ class Tally(object): else: for self_nuclide in self.nuclides: for other_nuclide in other.nuclides: - if isinstance(self_nuclide, Nuclide): - self_name = self_nuclide.name - else: - self_name = self_nuclide - if isinstance(other_nuclide, Nuclide): - other_name = other_nuclide.name - else: - other_name = other_nuclide - - new_nuclide = '({0} * {1})'.format(self_name, other_name) + new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '*') new_tally.add_nuclide(new_nuclide) elif is_integer(other) or is_float(other): @@ -461,18 +433,10 @@ class Tally(object): else: for self_nuclide in self.nuclides: for other_nuclide in other.nuclides: - if isinstance(self_nuclide, Nuclide): - self_name = self_nuclide.name - else: - self_name = self_nuclide - if isinstance(other_nuclide, Nuclide): - other_name = other_nuclide.name - else: - other_name = other_nuclide - - new_nuclide = '({0} / {1})'.format(self_name, other_name) + new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '/') new_tally.add_nuclide(new_nuclide) + elif is_integer(other) or is_float(other): new_tally._mean = self._mean / other @@ -548,8 +512,8 @@ class Tally(object): # Generate score "cross product" else: for self_score in self.scores: - for other_score in other.scores: - new_score = _CrossScore(self_score, other_score, '^') + for power_score in power.scores: + new_score = _CrossScore(self_score, power_score, '^') new_tally.add_score(new_score) # If the two Tallies have same nuclides, replicate them in new Tally @@ -560,17 +524,8 @@ class Tally(object): # Generate nuclide "cross product" else: for self_nuclide in self.nuclides: - for other_nuclide in power.nuclides: - if isinstance(self_nuclide, Nuclide): - self_name = self_nuclide.name - else: - self_name = self_nuclide - if isinstance(other_nuclide, Nuclide): - other_name = other_nuclide.name - else: - other_name = other_nuclide - - new_nuclide = '({0} + {1})'.format(self_name, other_name) + for power_nuclide in power.nuclides: + new_nuclide = _CrossNuclide(self_nuclide, power_nuclide, '^') new_tally.add_nuclide(new_nuclide) elif is_integer(power) or is_float(power): @@ -2062,6 +2017,7 @@ class _CrossScore(object): self._left_score = left_score + @right_score.setter def right_score(self, right_score): @@ -2087,4 +2043,93 @@ class _CrossScore(object): def __repr__(self): string = '({0} {1} {2})'.format(self.left_score, self.binary_op, self.right_score) + return string + + +class _CrossNuclide(object): + + def __init__(self, left_nuclide=None, right_nuclide=None, binary_op=None): + + self._left_nuclide = None + self._right_nuclide = None + self._binary_op = None + + if left_nuclide is not None: + self.left_nuclide = left_nuclide + + if right_nuclide is not None: + self.right_nuclide = right_nuclide + + if binary_op is not None: + self.binary_op = binary_op + + + @property + def left_nuclide(self): + return self._left_nuclide + + + @property + def right_nuclide(self): + return self._right_nuclide + + + @property + def binary_op(self): + return self._binary_op + + + @left_nuclide.setter + def left_nuclide(self, left_nuclide): + + if not isinstance(left_nuclide, Nuclide) or is_integer(left_nuclide): + msg = 'Unable to set CrossNuclide left nuclide to {0} which ' \ + 'is not an integer or Nuclide'.format(left_nuclide) + raise ValueError(msg) + + self._left_nuclide = left_nuclide + + + @right_nuclide.setter + def right_nuclide(self, right_nuclide): + + if not isinstance(right_nuclide, Nuclide) or is_integer(right_nuclide): + msg = 'Unable to set CrossNuclide right nuclide to {0} which ' \ + 'is not an integer or Nuclide'.format(right_nuclide) + raise ValueError(msg) + + self._right_nuclide = right_nuclide + + + @binary_op.setter + def binary_op(self, binary_op): + + if not is_string(binary_op): + msg = 'Unable to set CrossNuclide binary op to {0} which ' \ + 'is not a string'.format(binary_op) + raise ValueError(msg) + + self._binary_op = binary_op + + + def __repr__(self): + + string = '' + + # If the Summary was linked, the left nuclide is a Nuclide object + if isinstance(self.left_nuclide, Nuclide): + string += '(' + self.left_nuclide.name + # If the Summary was not linked, the left nuclide is the ZAID + else: + string += '(' + str(self.left_nuclide) + + string += ' ' + self.binary_op + ' ' + + # If the Summary was linked, the right nuclide is a Nuclide object + if isinstance(self.right_nuclide, Nuclide): + string += self.right_nuclide.name + ')' + # If the Summary was not linked, the right nuclide is the ZAID + else: + string += str(self.right_nuclide) + ')' + return string \ No newline at end of file From b51197773f5e63c22fa6cb722cb1cda1dd3225a7 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 31 May 2015 16:30:15 -0700 Subject: [PATCH 011/101] Created _CrossFilter private class for tally arithmetic --- src/utils/openmc/tallies.py | 288 ++++++++++++++++++++++++++++-------- 1 file changed, 229 insertions(+), 59 deletions(-) diff --git a/src/utils/openmc/tallies.py b/src/utils/openmc/tallies.py index 419f099592..59fb3910f4 100644 --- a/src/utils/openmc/tallies.py +++ b/src/utils/openmc/tallies.py @@ -145,17 +145,17 @@ class Tally(object): if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations - # If the two Tallies have same scores, replicate them in new Tally - if self.scores == other.scores: - for score in self.scores: - new_tally.add_score(score) + # If the two Tallies have same filters, replicate them in new Tally + if self.filters == other.filters: + for filter in self.filters: + new_tally.add_filter(filter) - # Generate score "cross product" + # Generate filter "cross product" else: - for self_score in self.scores: - for other_score in other.scores: - new_score = _CrossScore(self_score, other_score, '+') - new_tally.add_score(new_score) + for self_filter in self.filters: + for other_filter in other.filters: + new_filter = _CrossFilter(self_filter, other_filter, '+') + new_tally.add_filter(new_filter) # If the two Tallies have same nuclides, replicate them in new Tally if self.nuclides == other.nuclides: @@ -169,6 +169,18 @@ class Tally(object): new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '+') new_tally.add_nuclide(new_nuclide) + # If the two Tallies have same scores, replicate them in new Tally + if self.scores == other.scores: + for score in self.scores: + new_tally.add_score(score) + + # Generate score "cross product" + else: + for self_score in self.scores: + for other_score in other.scores: + new_score = _CrossScore(self_score, other_score, '+') + new_tally.add_score(new_score) + elif is_integer(other) or is_float(other): new_tally._mean = self._mean + other @@ -179,12 +191,15 @@ class Tally(object): new_tally.num_realization = self.num_realizations new_tally.num_score_bins = self.num_score_bins - for score in self.scores: - new_tally.add_score(score) + for filter in self.filters: + new_tally.add_filter(filter) for nuclide in self.nuclides: new_tally.add_nuclide(nuclide) + for score in self.scores: + new_tally.add_score(score) + else: msg = 'Unable to add {0} to Tally ID={1}'.format(other, self.id) raise ValueError(msg) @@ -232,17 +247,17 @@ class Tally(object): if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations - # If the two Tallies have same scores, replicate them in new Tally - if self.scores == other.scores: - for score in self.scores: - new_tally.add_score(score) + # If the two Tallies have same filters, replicate them in new Tally + if self.filters == other.filters: + for filter in self.filters: + new_tally.add_filter(filter) - # Generate score "cross product" + # Generate filter "cross product" else: - for self_score in self.scores: - for other_score in other.scores: - new_score = _CrossScore(self_score, other_score, '-') - new_tally.add_score(new_score) + for self_filter in self.filters: + for other_filter in other.filters: + new_filter = _CrossFilter(self_filter, other_filter, '-') + new_tally.add_filter(new_filter) # If the two Tallies have same nuclides, replicate them in new Tally if self.nuclides == other.nuclides: @@ -256,6 +271,18 @@ class Tally(object): new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '-') new_tally.add_nuclide(new_nuclide) + # If the two Tallies have same scores, replicate them in new Tally + if self.scores == other.scores: + for score in self.scores: + new_tally.add_score(score) + + # Generate score "cross product" + else: + for self_score in self.scores: + for other_score in other.scores: + new_score = _CrossScore(self_score, other_score, '-') + new_tally.add_score(new_score) + elif is_integer(other) or is_float(other): new_tally._mean = self._mean - other @@ -266,12 +293,15 @@ class Tally(object): new_tally.num_realization = self.num_realizations new_tally.num_score_bins = self.num_score_bins - for score in self.scores: - new_tally.add_score(score) + for filter in self.filters: + new_tally.add_filter(filter) for nuclide in self.nuclides: new_tally.add_nuclide(nuclide) + for score in self.scores: + new_tally.add_score(score) + else: msg = 'Unable to subtract {0} from Tally ' \ 'ID={1}'.format(other, self.id) @@ -303,8 +333,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need new CrossFilter class - data = self._align_tally_data(other) self_rel_err = data['self']['std. dev.'] / data['self']['mean'] @@ -322,17 +350,17 @@ class Tally(object): if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations - # If the two Tallies have same scores, replicate them in new Tally - if self.scores == other.scores: - for score in self.scores: - new_tally.add_score(score) + # If the two Tallies have same filters, replicate them in new Tally + if self.filters == other.filters: + for filter in self.filters: + new_tally.add_filter(filter) - # Generate score "cross product" + # Generate filter "cross product" else: - for self_score in self.scores: - for other_score in other.scores: - new_score = _CrossScore(self_score, other_score, '*') - new_tally.add_score(new_score) + for self_filter in self.filters: + for other_filter in other.filters: + new_filter = _CrossFilter(self_filter, other_filter, '*') + new_tally.add_filter(new_filter) # If the two Tallies have same nuclides, replicate them in new Tally if self.nuclides == other.nuclides: @@ -346,6 +374,18 @@ class Tally(object): new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '*') new_tally.add_nuclide(new_nuclide) + # If the two Tallies have same scores, replicate them in new Tally + if self.scores == other.scores: + for score in self.scores: + new_tally.add_score(score) + + # Generate score "cross product" + else: + for self_score in self.scores: + for other_score in other.scores: + new_score = _CrossScore(self_score, other_score, '*') + new_tally.add_score(new_score) + elif is_integer(other) or is_float(other): new_tally._mean = self._mean * other @@ -356,12 +396,15 @@ class Tally(object): new_tally.num_realization = self.num_realizations new_tally.num_score_bins = self.num_score_bins - for score in self.scores: - new_tally.add_score(score) + for filter in self.filters: + new_tally.add_filter(filter) for nuclide in self.nuclides: new_tally.add_nuclide(nuclide) + for score in self.scores: + new_tally.add_score(score) + else: msg = 'Unable to multiply Tally ID={1} ' \ 'by {0}'.format(self.id, other) @@ -412,17 +455,17 @@ class Tally(object): if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations - # If the two Tallies have same scores, replicate them in new Tally - if self.scores == other.scores: - for score in self.scores: - new_tally.add_score(score) + # If the two Tallies have same filters, replicate them in new Tally + if self.filters == other.filters: + for filter in self.filters: + new_tally.add_filter(filter) - # Generate score "cross product" + # Generate filter "cross product" else: - for self_score in self.scores: - for other_score in other.scores: - new_score = _CrossScore(self_score, other_score, '/') - new_tally.add_score(new_score) + for self_filter in self.filters: + for other_filter in other.filters: + new_filter = _CrossFilter(self_filter, other_filter, '/') + new_tally.add_filter(new_filter) # If the two Tallies have same nuclides, replicate them in new Tally if self.nuclides == other.nuclides: @@ -436,6 +479,17 @@ class Tally(object): new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '/') new_tally.add_nuclide(new_nuclide) + # If the two Tallies have same scores, replicate them in new Tally + if self.scores == other.scores: + for score in self.scores: + new_tally.add_score(score) + + # Generate score "cross product" + else: + for self_score in self.scores: + for other_score in other.scores: + new_score = _CrossScore(self_score, other_score, '/') + new_tally.add_score(new_score) elif is_integer(other) or is_float(other): @@ -447,12 +501,15 @@ class Tally(object): new_tally.num_realization = self.num_realizations new_tally.num_score_bins = self.num_score_bins - for score in self.scores: - new_tally.add_score(score) + for filter in self.filters: + new_tally.add_filter(filter) for nuclide in self.nuclides: new_tally.add_nuclide(nuclide) + for score in self.scores: + new_tally.add_score(score) + else: msg = 'Unable to divide Tally ID={0} ' \ 'by {1}'.format(self.id, other) @@ -504,17 +561,17 @@ class Tally(object): if self.num_realizations == power.num_realizations: new_tally.num_realizations = self.num_realizations - # If the two Tallies have same scores, replicate them in new Tally - if self.scores == power.scores: - for score in self.scores: - new_tally.add_score(score) + # If the two Tallies have same filters, replicate them in new Tally + if self.filters == power.filters: + for filter in self.filters: + new_tally.add_filter(filter) - # Generate score "cross product" + # Generate filter "cross product" else: - for self_score in self.scores: - for power_score in power.scores: - new_score = _CrossScore(self_score, power_score, '^') - new_tally.add_score(new_score) + for self_filter in self.filters: + for power_filter in power.filters: + new_filter = _CrossFilter(self_filter, power_filter, '^') + new_tally.add_filter(new_filter) # If the two Tallies have same nuclides, replicate them in new Tally if self.nuclides == power.nuclides: @@ -528,6 +585,18 @@ class Tally(object): new_nuclide = _CrossNuclide(self_nuclide, power_nuclide, '^') new_tally.add_nuclide(new_nuclide) + # If the two Tallies have same scores, replicate them in new Tally + if self.scores == power.scores: + for score in self.scores: + new_tally.add_score(score) + + # Generate score "cross product" + else: + for self_score in self.scores: + for power_score in power.scores: + new_score = _CrossScore(self_score, power_score, '^') + new_tally.add_score(new_score) + elif is_integer(power) or is_float(power): new_tally._mean = self._mean ** power @@ -539,12 +608,15 @@ class Tally(object): new_tally.num_realization = self.num_realizations new_tally.num_score_bins = self.num_score_bins - for score in self.scores: - new_tally.add_score(score) + for filter in self.filters: + new_tally.add_filter(filter) for nuclide in self.nuclides: new_tally.add_nuclide(nuclide) + for score in self.scores: + new_tally.add_score(score) + else: msg = 'Unable to raise Tally ID={0} to ' \ 'power {1}'.format(self.id, power) @@ -820,7 +892,7 @@ class Tally(object): global filters - if not isinstance(filter, Filter): + if not isinstance(filter, (Filter, _CrossFilter)): msg = 'Unable to add Filter "{0}" to Tally ID={1} since it is ' \ 'not a Filter object'.format(filter, self.id) raise ValueError(msg) @@ -2132,4 +2204,102 @@ class _CrossNuclide(object): else: string += str(self.right_nuclide) + ')' - return string \ No newline at end of file + return string + + +class _CrossFilter(object): + + def __init__(self, left_filter=None, right_filter=None, binary_op=None): + + self._left_filter = None + self._right_filter = None + self._binary_op = None + + if left_filter is not None: + self.left_filter = left_filter + + if right_filter is not None: + self.right_filter = right_filter + + if binary_op is not None: + self.binary_op = binary_op + + + @property + def left_filter(self): + return self._left_filter + + + @property + def right_filter(self): + return self._right_filter + + + @property + def binary_op(self): + return self._binary_op + + + @property + def type(self): + return (self.right_filter.type, self.left_filter.type) + + + @property + def bins(self): + return (self.right_filter.bins, self.left_filter.bins) + + + @property + def stride(self): + return self.left_filter.stride * self.right_filter.stride + + + @left_filter.setter + def left_filter(self, left_filter): + + if not isinstance(left_filter, Filter): + msg = 'Unable to set CrossFilter left filter to {0} which ' \ + 'is not a Filter'.format(left_filter) + raise ValueError(msg) + + self._left_filter = left_filter + + + @right_filter.setter + def right_filter(self, right_filter): + + if not isinstance(right_filter, Filter): + msg = 'Unable to set CrossFilter right filter to {0} which ' \ + 'is not a Filter'.format(right_filter) + raise ValueError(msg) + + self._right_filter = right_filter + + + @binary_op.setter + def binary_op(self, binary_op): + + if not is_string(binary_op): + msg = 'Unable to set CrossFilter binary op to {0} which ' \ + 'is not a string'.format(binary_op) + raise ValueError(msg) + + self._binary_op = binary_op + + + def __repr__(self): + + string = '_CrossFilter\n' + + filter_type = '({0} {1} {2})'.format(self.left_filter.type, + self.binary_op, + self.right_filter.type) + + filter_bins = '({0} {1} {2})'.format(self.left_filter.bins, + self.binary_op, + self.right_filter.bins) + + string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', filter_type) + string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', filter_bins) + return string From 6c23391309c46aacddd5cfcdb9dec7fc39f13649 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 31 May 2015 16:38:09 -0700 Subject: [PATCH 012/101] Added unary +/- operators for Tally arithmetic --- src/utils/openmc/tallies.py | 48 ++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/src/utils/openmc/tallies.py b/src/utils/openmc/tallies.py index 59fb3910f4..ba9185668e 100644 --- a/src/utils/openmc/tallies.py +++ b/src/utils/openmc/tallies.py @@ -128,7 +128,10 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need new CrossFilter class + # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters + # FIXME: Need to be able to use StatePoint.get_tally + # FIXME: Need to be able to use Tally.get_value + # FIXME: Modularize data = self._align_tally_data(other) @@ -230,7 +233,10 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need new CrossFilter class + # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters + # FIXME: Need to be able to use StatePoint.get_tally + # FIXME: Need to be able to use Tally.get_value + # FIXME: Modularize data = self._align_tally_data(other) @@ -333,6 +339,11 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) + # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters + # FIXME: Need to be able to use StatePoint.get_tally + # FIXME: Need to be able to use Tally.get_value + # FIXME: Modularize + data = self._align_tally_data(other) self_rel_err = data['self']['std. dev.'] / data['self']['mean'] @@ -436,7 +447,10 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need new CrossFilter class + # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters + # FIXME: Need to be able to use StatePoint.get_tally + # FIXME: Need to be able to use Tally.get_value + # FIXME: Modularize data = self._align_tally_data(other) @@ -541,7 +555,10 @@ class Tally(object): 'since it does not contain any results.'.format(power.id) raise ValueError(msg) - # FIXME: Need new CrossFilter class + # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters + # FIXME: Need to be able to use StatePoint.get_tally + # FIXME: Need to be able to use Tally.get_value + # FIXME: Modularize data = self._align_tally_data(power) @@ -624,6 +641,21 @@ class Tally(object): return new_tally + + def __pos__(self): + + new_tally = copy.deepcopy(self) + new_tally._mean = np.abs(new_tally.mean) + return new_tally + + + def __neg__(self): + + new_tally = copy.deepcopy(self) + new_tally._mean *= -1 + return new_tally + + ''' def sum(self, axis=None): @@ -649,19 +681,19 @@ class Tally(object): clone._mean = copy.deepcopy(self.mean, memo) clone._std_dev = copy.deepcopy(self.std_dev, memo) - clone.filters = [] + clone._filters = [] for filter in self.filters: clone.add_filter(copy.deepcopy(filter, memo)) - clone.nuclides = [] + clone._nuclides = [] for nuclide in self.nuclides: clone.add_nuclide(copy.deepcopy(nuclide, memo)) - clone.scores = [] + clone._scores = [] for score in self.scores: clone.add_score(score) - clone.triggers = [] + clone._triggers = [] for trigger in self.triggers: clone.add_trigger(trigger) From e5b1cae87445d3ad967651f7d7ca46e3ff8db254 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 31 May 2015 17:12:06 -0700 Subject: [PATCH 013/101] Fixed some bugs in tally arithmetic tiling / repeats of NumPy data arrays --- src/utils/openmc/filter.py | 63 ++++++++++++++++++------------------- src/utils/openmc/tallies.py | 61 ++++++++++++++++++++--------------- 2 files changed, 67 insertions(+), 57 deletions(-) diff --git a/src/utils/openmc/filter.py b/src/utils/openmc/filter.py index 089f9f18ac..742c91d370 100644 --- a/src/utils/openmc/filter.py +++ b/src/utils/openmc/filter.py @@ -21,15 +21,15 @@ class Filter(object): def __eq__(self, filter2): # Check type - if self._type != filter2._type: + if self.type != filter2.type: return False # Check number of bins - elif len(self._bins) != len(filter2._bins): + elif len(self.bins) != len(filter2.bins): return False # Check bin edges - elif not np.allclose(self._bins, filter2._bins): + elif not np.allclose(self.bins, filter2.bins): return False else: @@ -38,8 +38,8 @@ class Filter(object): def __hash__(self): hashable = [] - hashable.append(self._type) - hashable.append(self._bins) + hashable.append(self.type) + hashable.append(self.bins) return hash(tuple(hashable)) @@ -51,12 +51,12 @@ class Filter(object): if existing is None: clone = type(self).__new__(type(self)) - clone._type = self._type - clone._bins = copy.deepcopy(self._bins, memo) - clone._num_bins = self._num_bins - clone._mesh = copy.deepcopy(self._mesh, memo) - clone._offset = self._offset - clone._stride = self._stride + clone._type = self.type + clone._bins = copy.deepcopy(self.bins, memo) + clone._num_bins = self.num_bins + clone._mesh = copy.deepcopy(self.mesh, memo) + clone._offset = self.offset + clone._stride = self.stride memo[id(self)] = clone @@ -117,7 +117,7 @@ class Filter(object): if bins is None: self.num_bins = 0 - elif self._type is None: + elif self.type is None: msg = 'Unable to set bins for Filter to "{0}" since ' \ 'the Filter type has not yet been set'.format(bins) raise ValueError(msg) @@ -130,35 +130,35 @@ class Filter(object): else: bins = list(bins) - if self._type in ['cell', 'cellborn', 'surface', 'material', + if self.type in ['cell', 'cellborn', 'surface', 'material', 'universe', 'distribcell']: for edge in bins: if not is_integer(edge): msg = 'Unable to add bin "{0}" to a {1} Filter since ' \ - 'it is a non-integer'.format(edge, self._type) + 'it is a non-integer'.format(edge, self.type) raise ValueError(msg) elif edge < 0: msg = 'Unable to add bin "{0}" to a {1} Filter since ' \ - 'it is a negative integer'.format(edge, self._type) + 'it is a negative integer'.format(edge, self.type) raise ValueError(msg) - elif self._type in ['energy', 'energyout']: + elif self.type in ['energy', 'energyout']: for edge in bins: if not is_integer(edge) and not is_float(edge): msg = 'Unable to add bin edge "{0}" to a {1} Filter ' \ 'since it is a non-integer or floating point ' \ - 'value'.format(edge, self._type) + 'value'.format(edge, self.type) raise ValueError(msg) elif edge < 0.: msg = 'Unable to add bin edge "{0}" to a {1} Filter ' \ - 'since it is a negative value'.format(edge, self._type) + 'since it is a negative value'.format(edge, self.type) raise ValueError(msg) # Check that bin edges are monotonically increasing @@ -167,12 +167,12 @@ class Filter(object): if index > 0 and bins[index] < bins[index-1]: msg = 'Unable to add bin edges "{0}" to a {1} Filter ' \ 'since they are not monotonically ' \ - 'increasing'.format(bins, self._type) + 'increasing'.format(bins, self.type) raise ValueError(msg) # mesh filters - elif self._type == 'mesh': + elif self.type == 'mesh': if not len(bins) == 1: msg = 'Unable to add bins "{0}" to a mesh Filter since ' \ @@ -193,14 +193,13 @@ class Filter(object): self._bins = bins - # FIXME @num_bins.setter def num_bins(self, num_bins): if not is_integer(num_bins) or num_bins < 0: msg = 'Unable to set the number of bins "{0}" for a {1} Filter ' \ 'since it is not a positive ' \ - 'integer'.format(num_bins, self._type) + 'integer'.format(num_bins, self.type) raise ValueError(msg) self._num_bins = num_bins @@ -216,7 +215,7 @@ class Filter(object): self._mesh = mesh self.type = 'mesh' - self.bins = self._mesh._id + self.bins = self.mesh.id @offset.setter @@ -224,7 +223,7 @@ class Filter(object): if not is_integer(offset): msg = 'Unable to set offset "{0}" for a {1} Filter since it is a ' \ - 'non-integer value'.format(offset, self._type) + 'non-integer value'.format(offset, self.type) raise ValueError(msg) self._offset = offset @@ -235,12 +234,12 @@ class Filter(object): if not is_integer(stride): msg = 'Unable to set stride "{0}" for a {1} Filter since it is a ' \ - 'non-integer value'.format(stride, self._type) + 'non-integer value'.format(stride, self.type) raise ValueError(msg) if stride < 0: msg = 'Unable to set stride "{0}" for a {1} Filter since it is a ' \ - 'negative value'.format(stride, self._type) + 'negative value'.format(stride, self.type) raise ValueError(msg) self._stride = stride @@ -274,14 +273,14 @@ class Filter(object): def merge(self, filter): if not self.can_merge(filter): - msg = 'Unable to merge {0} with {1} filters'.format(self._type, filter._type) + msg = 'Unable to merge {0} with {1} filters'.format(self.type, filter.type) raise ValueError(msg) # Create deep copy of filter to return as merged filter merged_filter = copy.deepcopy(self) # Merge unique filter bins - merged_bins = list(set(self._bins + filter._bins)) + merged_bins = list(set(self.bins + filter.bins)) merged_filter.bins = merged_bins merged_filter.num_bins = len(merged_bins) @@ -335,7 +334,7 @@ class Filter(object): # Filter bins for distribcell are the "IDs" of each unique placement # of the Cell in the Geometry (integers starting at 0) - elif self._type == 'distribcell': + elif self.type == 'distribcell': filter_index = filter_bin # Use ID for all other Filters (e.g., material, cell, etc.) @@ -354,7 +353,7 @@ class Filter(object): def __repr__(self): string = 'Filter\n' - string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._type) - string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', self._bins) - string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self._offset) + string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self.type) + string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', self.bins) + string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self.offset) return string diff --git a/src/utils/openmc/tallies.py b/src/utils/openmc/tallies.py index ba9185668e..dc05650815 100644 --- a/src/utils/openmc/tallies.py +++ b/src/utils/openmc/tallies.py @@ -58,14 +58,14 @@ class Tally(object): self_num_filter_bins = self.mean.shape[0] other_num_filter_bins = other.mean.shape[0] num_filter_bins = self_num_filter_bins * other_num_filter_bins - self_new_bins = max(num_filter_bins - self_num_filter_bins, 1) - other_new_bins = max(num_filter_bins - other_num_filter_bins, 1) + self_repeat_factor = num_filter_bins / self_num_filter_bins + other_tile_factor = num_filter_bins / other_num_filter_bins # Replicate the data - self_mean = np.repeat(self_mean, self_new_bins, axis=0) - other_mean = np.tile(other_mean, (other_new_bins, 1, 1)) - self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=0) - other_std_dev = np.tile(other_std_dev, (other_new_bins, 1, 1)) + self_mean = np.repeat(self_mean, self_repeat_factor, axis=0) + other_mean = np.tile(other_mean, (other_tile_factor, 1, 1)) + self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=0) + other_std_dev = np.tile(other_std_dev, (other_tile_factor, 1, 1)) if self.nuclides != other.nuclides: @@ -74,14 +74,14 @@ class Tally(object): self_num_nuclide_bins = self.mean.shape[1] other_num_nuclide_bins = other.mean.shape[1] num_nuclide_bins = self_num_nuclide_bins * other_num_nuclide_bins - self_new_bins = max(num_nuclide_bins - self_num_nuclide_bins, 1) - other_new_bins = max(num_nuclide_bins - other_num_nuclide_bins, 1) + self_repeat_factor = num_nuclide_bins / self_num_nuclide_bins + other_tile_factor = num_nuclide_bins / other_num_nuclide_bins # Replicate the data - self_mean = np.repeat(self_mean, self_new_bins, axis=1) - other_mean = np.tile(other_mean, (1, other_new_bins, 1)) - self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=1) - other_std_dev = np.tile(other_std_dev, (1, other_new_bins, 1)) + self_mean = np.repeat(self_mean, self_repeat_factor, axis=1) + other_mean = np.tile(other_mean, (1, other_tile_factor, 1)) + self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=1) + other_std_dev = np.tile(other_std_dev, (1, other_tile_factor, 1)) if self.scores != other.scores: @@ -90,14 +90,14 @@ class Tally(object): self_num_score_bins = self.mean.shape[2] other_num_score_bins = other.mean.shape[2] num_score_bins = self_num_score_bins * other_num_score_bins - self_new_bins = max(num_score_bins - self_num_score_bins, 1) - other_new_bins = max(num_score_bins - other_num_score_bins, 1) + self_repeat_factor = num_score_bins / self_num_score_bins + other_tile_factor = num_score_bins / other_num_score_bins # Replicate the data - self_mean = np.repeat(self_mean, self_new_bins, axis=2) - other_mean = np.tile(other_mean, (1, 1, other_new_bins)) - self_std_dev = np.repeat(self_std_dev, self_new_bins, axis=2) - other_std_dev = np.tile(other_std_dev, (1, 1, other_new_bins)) + self_mean = np.repeat(self_mean, self_repeat_factor, axis=2) + other_mean = np.tile(other_mean, (1, 1, other_tile_factor)) + self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=2) + other_std_dev = np.tile(other_std_dev, (1, 1, other_tile_factor)) data = {} data['self'] = {} @@ -1571,10 +1571,21 @@ class Tally(object): # Find the total length of the tally data array data_size = self.mean.size + # Split CrossFilters into separate filters + split_filters = [] + + for filter in self.filters: + + if isinstance(filter, _CrossFilter): + split_filters.append(filter.left_filter) + split_filters.append(filter.right_filter) + else: + split_filters.append(filter) + # Build DataFrame columns for filters if user requested them if filters: - for filter in self.filters: + for filter in split_filters: # mesh filters if filter.type == 'mesh': @@ -2114,7 +2125,7 @@ class _CrossScore(object): @left_score.setter def left_score(self, left_score): - if not is_string(left_score): + if not isinstance(left_score, (_CrossScore, str)): msg = 'Unable to set CrossScore left score to {0} which ' \ 'is not a string'.format(left_score) raise ValueError(msg) @@ -2125,7 +2136,7 @@ class _CrossScore(object): @right_score.setter def right_score(self, right_score): - if not is_string(right_score): + if not isinstance(right_score, (_CrossScore, str)): msg = 'Unable to set CrossScore right score to {0} which ' \ 'is not a string'.format(right_score) raise ValueError(msg) @@ -2186,7 +2197,7 @@ class _CrossNuclide(object): @left_nuclide.setter def left_nuclide(self, left_nuclide): - if not isinstance(left_nuclide, Nuclide) or is_integer(left_nuclide): + if not isinstance(left_nuclide, (Nuclide, _CrossNuclide, int)): msg = 'Unable to set CrossNuclide left nuclide to {0} which ' \ 'is not an integer or Nuclide'.format(left_nuclide) raise ValueError(msg) @@ -2197,7 +2208,7 @@ class _CrossNuclide(object): @right_nuclide.setter def right_nuclide(self, right_nuclide): - if not isinstance(right_nuclide, Nuclide) or is_integer(right_nuclide): + if not isinstance(right_nuclide, (Nuclide, _CrossNuclide, int)): msg = 'Unable to set CrossNuclide right nuclide to {0} which ' \ 'is not an integer or Nuclide'.format(right_nuclide) raise ValueError(msg) @@ -2290,7 +2301,7 @@ class _CrossFilter(object): @left_filter.setter def left_filter(self, left_filter): - if not isinstance(left_filter, Filter): + if not isinstance(left_filter, (Filter, _CrossFilter)): msg = 'Unable to set CrossFilter left filter to {0} which ' \ 'is not a Filter'.format(left_filter) raise ValueError(msg) @@ -2301,7 +2312,7 @@ class _CrossFilter(object): @right_filter.setter def right_filter(self, right_filter): - if not isinstance(right_filter, Filter): + if not isinstance(right_filter, (Filter, _CrossFilter)): msg = 'Unable to set CrossFilter right filter to {0} which ' \ 'is not a Filter'.format(right_filter) raise ValueError(msg) From 3969ec0dcd248017f9e13a881ea94a3aa3d498fa Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 31 May 2015 21:09:14 -0700 Subject: [PATCH 014/101] Added Tally min, max and summation routines --- src/utils/openmc/tallies.py | 199 ++++++++++++++++++++++++++++++++---- 1 file changed, 177 insertions(+), 22 deletions(-) diff --git a/src/utils/openmc/tallies.py b/src/utils/openmc/tallies.py index dc05650815..5bb42f3d93 100644 --- a/src/utils/openmc/tallies.py +++ b/src/utils/openmc/tallies.py @@ -132,6 +132,7 @@ class Tally(object): # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value # FIXME: Modularize + # FIXME: Redundant filters data = self._align_tally_data(other) @@ -656,9 +657,135 @@ class Tally(object): return new_tally - ''' - def sum(self, axis=None): + def min(self, scores=[], filters=[], filter_bins=[], + nuclides=[], value='mean'): + """Returns the minimum of a slice of the Tally's data. + Parameters + ---------- + scores : list + A list of one or more score strings + (e.g., ['absorption', 'nu-fission']; default is []) + + filters : list + A list of filter type strings + (e.g., ['mesh', 'energy']; default is []) + + filter_bins : list + A list of the filter bins corresponding to the filter_types + parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin + in the list is the integer ID for 'material', 'surface', 'cell', + 'cellborn', and 'universe' Filters. Each bin is an integer for + the cell instance ID for 'distribcell Filters. Each bin is + a 2-tuple of floats for 'energy' and 'energyout' filters + corresponding to the energy boundaries of the bin of interest. + The bin is a (x,y,z) 3-tuple for 'mesh' filters corresponding + to the mesh cell of interest. The order of the bins in the list + must correspond of the filter_types parameter. + + nuclides : list + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) + + value : str + A string for the type of value to return - 'mean' (default), + 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted + + Returns + ------- + The minimum value of the requested slice of Tally data. + """ + + data = self.get_values(scores, filters, filter_bins, nuclides, value) + return np.min(data) + + + def max(self, scores=[], filters=[], filter_bins=[], + nuclides=[], value='mean'): + """Returns the maximum of a slice of the Tally's data. + + Parameters + ---------- + scores : list + A list of one or more score strings + (e.g., ['absorption', 'nu-fission']; default is []) + + filters : list + A list of filter type strings + (e.g., ['mesh', 'energy']; default is []) + + filter_bins : list + A list of the filter bins corresponding to the filter_types + parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin + in the list is the integer ID for 'material', 'surface', 'cell', + 'cellborn', and 'universe' Filters. Each bin is an integer for + the cell instance ID for 'distribcell Filters. Each bin is + a 2-tuple of floats for 'energy' and 'energyout' filters + corresponding to the energy boundaries of the bin of interest. + The bin is a (x,y,z) 3-tuple for 'mesh' filters corresponding + to the mesh cell of interest. The order of the bins in the list + must correspond of the filter_types parameter. + + nuclides : list + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) + + value : str + A string for the type of value to return - 'mean' (default), + 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted + + Returns + ------- + The maximum value of the requested slice of Tally data. + """ + + data = self.get_values(scores, filters, filter_bins, nuclides, value) + return np.max(data) + + + def summation(self, scores=[], filters=[], filter_bins=[], + nuclides=[], value='mean'): + """Returns the sum of a slice of the Tally's data. + + Parameters + ---------- + scores : list + A list of one or more score strings + (e.g., ['absorption', 'nu-fission']; default is []) + + filters : list + A list of filter type strings + (e.g., ['mesh', 'energy']; default is []) + + filter_bins : list + A list of the filter bins corresponding to the filter_types + parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin + in the list is the integer ID for 'material', 'surface', 'cell', + 'cellborn', and 'universe' Filters. Each bin is an integer for + the cell instance ID for 'distribcell Filters. Each bin is + a 2-tuple of floats for 'energy' and 'energyout' filters + corresponding to the energy boundaries of the bin of interest. + The bin is a (x,y,z) 3-tuple for 'mesh' filters corresponding + to the mesh cell of interest. The order of the bins in the list + must correspond of the filter_types parameter. + + nuclides : list + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) + + value : str + A string for the type of value to return - 'mean' (default), + 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted + + Returns + ------- + The sum of the requested slice of Tally data. + """ + + data = self.get_values(scores, filters, filter_bins, nuclides, value) + return np.sum(data) + + ''' def slice(self, filters=[], nuclides=[], scores=[]) ''' @@ -1235,12 +1362,12 @@ class Tally(object): def get_filter_index(self, filter_type, filter_bin): - """Returns the index in the Tally's results array for a Filter bin + """Returns the index in the Tally's results array for a Filter bin. Parameters ---------- filter_type : str - The type of Filter (e.g., 'cell', 'energy', etc.) + The type of Filter (e.g., 'cell', 'energy', etc.). filter_bin : int, list The bin is an integer ID for 'material', 'surface', 'cell', @@ -1265,12 +1392,12 @@ class Tally(object): def get_nuclide_index(self, nuclide): - """Returns the index in the Tally's results array for a Nuclide bin + """Returns the index in the Tally's results array for a Nuclide bin. Parameters ---------- nuclide : str - The name of the Nuclide (e.g., 'H-1', 'U-238') + The name of the Nuclide (e.g., 'H-1', 'U-238'). Returns ------- @@ -1308,12 +1435,12 @@ class Tally(object): def get_score_index(self, score): - """Returns the index in the Tally's results array for a score bin + """Returns the index in the Tally's results array for a score bin. Parameters ---------- score : str - The score string (e.g., 'absorption', 'nu-fission') + The score string (e.g., 'absorption', 'nu-fission'). Returns ------- @@ -1342,17 +1469,17 @@ class Tally(object): This routine constructs a 3D NumPy array for the requested Tally data indexed by filter bin, nuclide bin, and score index. The routine will - order the data in the array + order the data in the array as specified in the parameter lists. Parameters ---------- scores : list A list of one or more score strings - (e.g., ['absorption', 'nu-fission']; default is []) + (e.g., ['absorption', 'nu-fission']; default is []). filters : list A list of filter type strings - (e.g., ['mesh', 'energy']; default is []) + (e.g., ['mesh', 'energy']; default is []). filter_bins : list A list of the filter bins corresponding to the filter_types @@ -1368,11 +1495,11 @@ class Tally(object): nuclides : list A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) + (e.g., ['U-235', 'U-238']; default is []). value : str A string for the type of value to return - 'mean' (default), - 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted + 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted. Returns ------- @@ -1505,8 +1632,8 @@ class Tally(object): This routine constructs a Pandas DataFrame object for the Tally data with columns annotated by filter, nuclide and score bin information. - This capability has been tested for Pandas >=v0.13.1. However, if p - possible, it is recommended to use the v0.16 or newer versions of + This capability has been tested for Pandas >=v0.13.1. However, if + possible, it is recommended to use the v0.16 or newer versions of Pandas since this this routine uses the Multi-index Pandas feature. Parameters @@ -1577,8 +1704,7 @@ class Tally(object): for filter in self.filters: if isinstance(filter, _CrossFilter): - split_filters.append(filter.left_filter) - split_filters.append(filter.right_filter) + split_filters.extend(filter.split_filters()) else: split_filters.append(filter) @@ -1773,13 +1899,16 @@ class Tally(object): # energy, energyout filters elif 'energy' in filter.type: + + print filter + bins = filter.bins num_bins = filter.num_bins # Create strings for template = '{0:.1e} - {1:.1e}' filter_bins = [] - for i in range(num_bins): + for i in range(num_bins-1): filter_bins.append(template.format(bins[i], bins[i+1])) # Tile the energy bins into a DataFrame column @@ -1832,17 +1961,17 @@ class Tally(object): Parameters ---------- filename : str - The name of the file for the results (default is 'tally-results') + The name of the file for the results (default is 'tally-results'). directory : str - The name of the directory for the results (default is '.') + The name of the directory for the results (default is '.'). format : str The format for the exported file - HDF5 ('hdf5', default) and - Python pickle ('pkl') files are supported + Python pickle ('pkl') files are supported. append : bool - Whether or not to append the results to the file (default is True) + Whether or not to append the results to the file (default is True). Raises ------ @@ -2293,6 +2422,11 @@ class _CrossFilter(object): return (self.right_filter.bins, self.left_filter.bins) + @property + def num_bins(self): + return self.left_filter.num_bins * self.right_filter.num_bins + + @property def stride(self): return self.left_filter.stride * self.right_filter.stride @@ -2346,3 +2480,24 @@ class _CrossFilter(object): string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', filter_type) string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', filter_bins) return string + + + def split_filters(self): + + split_filters = [] + + # If left Filter is not a CrossFilter, simply append to list + if isinstance(self.left_filter, Filter): + split_filters.append(self.left_filter) + # Recursively descend CrossFilter tree to collect all Filters + else: + split_filters.extend(self.left_filter.split_filters()) + + # If right Filter is not a CrossFilter, simply append to list + if isinstance(self.right_filter, Filter): + split_filters.append(self.right_filter) + # Recursively descend CrossFilter tree to collect all Filters + else: + split_filters.extend(self.right_filter.split_filters()) + + return split_filters \ No newline at end of file From 0092432a8c5acda1ec7d0c928d001da3c941e47f Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 1 Jun 2015 05:58:10 -0700 Subject: [PATCH 015/101] initial implementation for tally slice operator --- src/utils/openmc/tallies.py | 113 +++++++++++++++++++++++++++++++++--- 1 file changed, 106 insertions(+), 7 deletions(-) diff --git a/src/utils/openmc/tallies.py b/src/utils/openmc/tallies.py index 5bb42f3d93..edf136b833 100644 --- a/src/utils/openmc/tallies.py +++ b/src/utils/openmc/tallies.py @@ -657,8 +657,8 @@ class Tally(object): return new_tally - def min(self, scores=[], filters=[], filter_bins=[], - nuclides=[], value='mean'): + def minimum(self, scores=[], filters=[], filter_bins=[], + nuclides=[], value='mean'): """Returns the minimum of a slice of the Tally's data. Parameters @@ -700,8 +700,8 @@ class Tally(object): return np.min(data) - def max(self, scores=[], filters=[], filter_bins=[], - nuclides=[], value='mean'): + def maximum(self, scores=[], filters=[], filter_bins=[], + nuclides=[], value='mean'): """Returns the maximum of a slice of the Tally's data. Parameters @@ -785,9 +785,106 @@ class Tally(object): data = self.get_values(scores, filters, filter_bins, nuclides, value) return np.sum(data) - ''' - def slice(self, filters=[], nuclides=[], scores=[]) - ''' + + + + def slice(self, scores=[], filters=[], filter_bins=[], nuclides=[]): + """ + """ + + # Ensure that StatePoint.read_results() was called first + if (self.mean is None) or (self.std_dev is None): + msg = 'The Tally ID={0} has no data to slice. Call the ' \ + 'StatePoint.read_results() routine before using ' \ + 'Tally.slice(...)'.format(self.id) + raise ValueError(msg) + + # Compute batch statistics if not yet computed + if not self.with_batch_statistics: + self.compute_std_dev() + + new_tally = copy.deepcopy(self) + new_sum = self.get_values(scores, filters, filter_bins, + nuclides, 'sum') + new_sum_sq = self.get_values(scores, filters, filter_bins, + nuclides, 'sum_sq') + new_tally.set_results(new_sum, new_sum_sq) + + ############################ FILTERS ######################### + # Determine the score indices from any of the requested scores + if filters: + + # Initialize list of indices to Filters to exclude from slice + filter_indices = [] + + # Loop over all of the Tally's Filters + for i, filter in enumerate(self.filters): + + # FIXME: sum over unused filter bins + # FIXME: neglect bins not selected for selected filters + # NOTE: We must store filter indices here since they are strings + + if filter.type not in filters: + filter_index = self.get_filter_index(filters[i], filter_bins[i]) + filter_indices.append(filter_index) + + # Loop over indices in reverse to remove excluded Filters + for filter_index in filter_indices[::-1]: + new_tally.remove_filter(self.filters[filter_index]) + + for i, filter_type in enumerate(filters): + + if 'energy' in filter_type: + # Create a list of the first energy edge + bins = [filter_bin[0] for filter_bin in filter_bins] + + + + ############################ NUCLIDES ######################## + # Determine the score indices from any of the requested scores + if nuclides: + + # Initialize list of indices to Nuclides to exclude from slice + nuclide_indices = [] + + for nuclide in self.nuclides: + + if isinstance(nuclide, Nuclide): + if nuclide.name not in nuclides: + nuclide_index = self.get_nuclide_index(nuclide) + nuclide_indices.append(nuclide_index) + else: + if nuclide not in nuclides: + nuclide_index = self.get_nuclide_index(nuclide) + nuclide_indices.append(nuclide_index) + + # Loop over indices in reverse to remove excluded Nuclides + for nuclide_index in nuclide_indices[::-1]: + new_tally.remove_nuclide(self.nuclides[nuclide_index]) + + ############################# SCORES ######################### + # Determine the score indices from any of the requested scores + if scores: + + # Initialize list of indices to Nuclides to exclude from slice + score_indices = [] + + for score in self.scores: + + if score not in scores: + score_index = self.get_score_index(score) + score_indices.append(score_index) + + # Loop over indices in reverse to remove excluded scores + for score_index in score_indices[::-1]: + new_tally.remove_score(self.scores[score_index]) + new_tally.num_score_bins -= 1 + + + + return new_tally + + def __deepcopy__(self, memo): @@ -807,6 +904,8 @@ class Tally(object): clone._sum_sq = copy.deepcopy(self.sum_sq, memo) clone._mean = copy.deepcopy(self.mean, memo) clone._std_dev = copy.deepcopy(self.std_dev, memo) + clone._with_summary = self.with_summary + clone._with_batch_statistics = self.with_batch_statistics clone._filters = [] for filter in self.filters: From 83a2be6ec51f793a1ac300ecf2c940f7a6327476 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Tue, 21 Jul 2015 22:10:15 -0600 Subject: [PATCH 016/101] Make source code style checking script --- tests/check_source.py | 235 ++++++++++++++++++++++++++++++++++++++++++ tests/travis.sh | 1 + 2 files changed, 236 insertions(+) create mode 100755 tests/check_source.py diff --git a/tests/check_source.py b/tests/check_source.py new file mode 100755 index 0000000000..490eb9c7c3 --- /dev/null +++ b/tests/check_source.py @@ -0,0 +1,235 @@ +#!/usr/bin/env python + +from __future__ import print_function + +import glob +from string import whitespace +from sys import exit +from textwrap import TextWrapper + + +################################################################################ +# Fortran reading/parsing backend. +################################################################################ + + +class LineOfCode(object): + """Contains and provides basic info about a line of Fortran 90 code.""" + def __init__(self, number, content, is_continuation=False, + string_terminator=None): + # Initialize member variables. + self.number = number + self.content = content + self.is_continuation = is_continuation + self.is_continued = False + assert (string_terminator == None or + string_terminator == "'" or + string_terminator == '"') + self.initial_string_terminator = string_terminator + self.final_string_terminator = None + self.is_comment_only = False + + # Parse the string. + self.parse() + + def __repr__(self): + rep = 'LineOfCode: line number = {0:d}\n'.format(self.number) + rep += '\tis_continuation = ' + str(self.is_continuation) + '\n' + rep += '\tis_continued = ' + str(self.is_continued) + '\n' + rep += ('\tinitial_string_terminator = ' + + str(self.initial_string_terminator) + '\n') + rep += ('\tfinal_string_terminator = ' + + str(self.final_string_terminator) + '\n') + rep += '\tis_comment_only = ' + str(self.is_comment_only) + '\n' + rep += '\tContent:\n' + self.content + return rep + + def __str__(self): + return repr(self) + + def parse(self): + # Initialize the string variables. + if self.initial_string_terminator == "'": + in_a_single_quote = True + in_a_double_quote = False + elif self.initial_string_terminator == '"': + in_a_single_quote = False + in_a_double_quote = True + else: + in_a_single_quote = False + in_a_double_quote = False + + # Initialize other variables. + in_a_comment = False + ends_with_ampersand = False + has_real_content = False + + # Parse through the line. + for char in self.content: + # Check for the start or end of strings. + if char == "'" and in_a_single_quote: + in_a_single_quote = False + elif char == "'" and not in_a_double_quote: + in_a_single_quote = True + elif char == '"' and in_a_double_quote: + in_a_double_quote = False + elif char == '"' and not in_a_single_quote: + in_a_double_quote = True + + # Check for the start of a comment. + if (char == "!" and not in_a_single_quote + and not in_a_double_quote): + in_a_comment = True + break # Don't care about anything in a comment. + + # Check for a continuation ampersand. + if char == "&": + ends_with_ampersand = True + elif all([char != w for w in whitespace]): + ends_with_ampersand = False + + # Check to see if there is any real content (non-whitespace, not in + # a comment) + if (not in_a_comment) and all([char != w for w in whitespace]): + has_real_content = True + + # Make sure nothing went terribly wrong. + assert not (in_a_single_quote and in_a_double_quote) + assert not (in_a_single_quote and in_a_comment) + assert not (in_a_double_quote and in_a_comment) + + # Is this line continued onto the next? + if ends_with_ampersand: + self.is_continued = True + + # Is a multiline string continued on the next line? + if in_a_single_quote: + assert self.is_continued + self.final_string_terminator = "'" + if in_a_double_quote: + assert self.is_continued + self.final_string_terminator = '"' + + # Is this line a comment-only line? + if (not has_real_content) and in_a_comment: + self.is_comment_only = True + + + def get_indent(self): + """Return the number of indentation spaces prefixing this line.""" + return len(self.content) - len(self.content.lstrip(' ')) + + + def contains_whitespace_only(self): + """Return True/False if all characters in the line are whitespace.""" + if len(self.content.strip('\n')) == 0: return False + is_ws = [ any([char == ws for ws in whitespace]) + for char in self.content.strip('\n') ] + return all(is_ws) + + + def has_trailing_whitespace(self): + """Return True/False if this line ends with a whitespace character.""" + stripped = self.content.strip('\n') + if len(stripped) == 0: return False + return any([stripped[-1] == ws for ws in whitespace]) + + def contains_tab(self): + """Return True/False if a tab character appears in the line.""" + return '\t' in self.content + + +def read_lines_of_code(fname): + line_num = 0 + cont = False + str_term = None + with open(fname) as fin: + for line in fin: + loc = LineOfCode(line_num, line, is_continuation=cont, + string_terminator=str_term) + cont = loc.is_continued + str_term = loc.final_string_terminator + line_num += 1 + yield loc + + +################################################################################ +# Error checking. +################################################################################ + + +def print_error(fname, line_number, err_msg): + header = "Error in file {0}, line {1}:".format(fname, line_number + 1) + + tw = TextWrapper(width=80, initial_indent=' '*4, subsequent_indent=' '*4) + body = '\n'.join(tw.wrap(err_msg)) + + print(header + '\n' + body + '\n') + + +def check_source(fname): + """Make sure the given Fortran source file meets OpenMC standards. + + If errors are found, messages will be printed to the screen describing the + error. The function will return True if no errors were found or False + otherwise. + """ + good_code = True + base_indent = 0 + + for loc in read_lines_of_code(fname): + # Check for extra whitespace errors. + if loc.contains_whitespace_only(): + good_code = False + print_error(fname, loc.number, "Line contains whitespace " \ + "characters but no content. Please remove whitespace.") + elif loc.has_trailing_whitespace(): + good_code = False + print_error(fname, loc.number, "Line has trailing whitespace after"\ + " the content. Please remove trailing whitespace.") + if loc.contains_tab(): + good_code = False + print_error(fname, loc.number, "Line contains a tab character. " \ + "Please replace with single whitespace characters.") + + # Check indentation. + current_indent = loc.get_indent() + if ((not loc.is_continuation) and (not loc.is_comment_only) and + (not loc.contains_whitespace_only()) and current_indent % 2 != 0): + good_code = False + print_error(fname, loc.number, "Line is indented an odd number of "\ + "spaces. All non-continuation lines should be indented an "\ + "even number of spaces.") + if loc.is_continuation and current_indent < base_indent + 5: + good_code = False + print_error(fname, loc.number, "Continuation lines must be "\ + "indented by at least 5 spaces, but this line is indented {0}"\ + " spaces.".format(current_indent - base_indent)) + + # Set base indentation for next lines. + if not loc.is_continuation: + base_indent = current_indent + + return good_code + + +################################################################################ +# Main loop. +################################################################################ + + +if __name__ == '__main__': + # Get a list of the F90 source files. + f90_files = glob.glob('../src/*.F90') + + # Make sure we found the source files. + assert len(f90_files) != 0, 'No .F90 source files found.' + + # Make sure all the F90 source files meet our standards. + good_code = [check_source(fname) for fname in f90_files] + if not all(good_code): + print("ERROR: The Fortran source code does not meet OpenMC's standards") + exit(-1) + else: + print("SUCCESS! Looks like the Fortran source meets our standards") + exit(0) diff --git a/tests/travis.sh b/tests/travis.sh index d591428686..fac8d793a6 100755 --- a/tests/travis.sh +++ b/tests/travis.sh @@ -3,6 +3,7 @@ set -ev # Run all debug tests +./check_source.py if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then ./run_tests.py -C "^basic-debug$|^hdf5-debug$|^mpi-omp-debug$|^phdf5-omp-debug$" -j 2 -s else From 0f273878108e779626a3dc57d0228c6e91c14740 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Tue, 21 Jul 2015 23:39:43 -0600 Subject: [PATCH 017/101] Make source code match style guide --- src/ace.F90 | 27 +++-- src/cmfd_data.F90 | 30 ++--- src/cmfd_execute.F90 | 2 +- src/cmfd_header.F90 | 10 +- src/cmfd_input.F90 | 18 +-- src/cmfd_loss_operator.F90 | 20 +-- src/cmfd_prod_operator.F90 | 4 +- src/cmfd_solver.F90 | 6 +- src/cross_section.F90 | 10 +- src/dict_header.F90 | 22 ++-- src/doppler.F90 | 205 +++++++++++++++---------------- src/eigenvalue.F90 | 12 +- src/endf_header.F90 | 16 +-- src/geometry_header.F90 | 69 ++++++----- src/global.F90 | 6 +- src/hdf5_interface.F90 | 2 +- src/hdf5_summary.F90 | 20 +-- src/initialize.F90 | 4 +- src/input_xml.F90 | 238 ++++++++++++++++++------------------ src/list_header.F90 | 18 +-- src/math.F90 | 241 +++++++++++++++++++------------------ src/matrix_header.F90 | 26 ++-- src/mpiio_interface.F90 | 28 ++--- src/output.F90 | 51 ++++---- src/output_interface.F90 | 28 ++--- src/physics.F90 | 34 +++--- src/plot.F90 | 2 +- src/plot_header.F90 | 4 +- src/ppmlib.F90 | 12 +- src/progress_header.F90 | 20 +-- src/random_lcg.F90 | 2 +- src/search.F90 | 6 +- src/state_point.F90 | 28 ++--- src/string.F90 | 4 +- src/tally_header.F90 | 6 +- src/timer_header.F90 | 12 +- src/trigger.F90 | 6 +- src/trigger_header.F90 | 6 +- src/vector_header.F90 | 12 +- src/xml_interface.F90 | 50 ++++---- 40 files changed, 669 insertions(+), 648 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index c1845fffb4..0dd92ea2c7 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -88,16 +88,16 @@ contains nuclides(i_nuclide) % resonant = .true. nuclides(i_nuclide) % name_0K = nuclides_0K(n) % name_0K nuclides(i_nuclide) % name_0K = trim(nuclides(i_nuclide) % & - & name_0K) + & name_0K) nuclides(i_nuclide) % scheme = nuclides_0K(n) % scheme nuclides(i_nuclide) % scheme = trim(nuclides(i_nuclide) % & - & scheme) + & scheme) nuclides(i_nuclide) % E_min = nuclides_0K(n) % E_min nuclides(i_nuclide) % E_max = nuclides_0K(n) % E_max if (.not. already_read % contains(nuclides(i_nuclide) % & - & name_0K)) then + & name_0K)) then i_listing = xs_listing_dict % get_key(nuclides(i_nuclide) % & - & name_0K) + & name_0K) call read_ace_table(i_nuclide, i_listing) end if exit @@ -446,9 +446,10 @@ contains if (nuc % elastic_0K(i) < ZERO) nuc % elastic_0K(i) = ZERO ! build xs cdf - xs_cdf_sum = xs_cdf_sum + (sqrt(nuc % energy_0K(i)) * nuc % elastic_0K(i) & - & + sqrt(nuc % energy_0K(i+1)) * nuc % elastic_0K(i+1)) / TWO & - & * (nuc % energy_0K(i+1) - nuc % energy_0K(i)) + xs_cdf_sum = xs_cdf_sum & + + (sqrt(nuc % energy_0K(i)) * nuc % elastic_0K(i) & + + sqrt(nuc % energy_0K(i+1)) * nuc % elastic_0K(i+1)) / TWO & + * (nuc % energy_0K(i+1) - nuc % energy_0K(i)) nuc % xs_cdf(i) = xs_cdf_sum end do @@ -752,31 +753,31 @@ contains ! Set flag and allocate space for Tab1 to store yield rxn % multiplicity_with_E = .true. allocate(rxn % multiplicity_E) - + XSS_index = JXS(11) + rxn % multiplicity - 101 NR = nint(XSS(XSS_index)) rxn % multiplicity_E % n_regions = NR - + ! allocate space for ENDF interpolation parameters if (NR > 0) then allocate(rxn % multiplicity_E % nbt(NR)) allocate(rxn % multiplicity_E % int(NR)) end if - + ! read ENDF interpolation parameters XSS_index = XSS_index + 1 if (NR > 0) then rxn % multiplicity_E % nbt = get_int(NR) rxn % multiplicity_E % int = get_int(NR) end if - + ! allocate space for yield data XSS_index = XSS_index + 2*NR NE = nint(XSS(XSS_index)) rxn % multiplicity_E % n_pairs = NE allocate(rxn % multiplicity_E % x(NE)) allocate(rxn % multiplicity_E % y(NE)) - + ! read yield data XSS_index = XSS_index + 1 rxn % multiplicity_E % x = get_real(NE) @@ -1480,7 +1481,7 @@ contains table % inelastic_data(i) % e_out_pdf(j) = XSS(XSS_index + 2) table % inelastic_data(i) % e_out_cdf(j) = XSS(XSS_index + 3) table % inelastic_data(i) % mu(:, j) = & - XSS(XSS_index + 4: XSS_index + 4 + NMU - 1) + XSS(XSS_index + 4: XSS_index + 4 + NMU - 1) XSS_index = XSS_index + 4 + NMU - 1 end do end do diff --git a/src/cmfd_data.F90 b/src/cmfd_data.F90 index 70a18bac78..2b17784196 100644 --- a/src/cmfd_data.F90 +++ b/src/cmfd_data.F90 @@ -104,23 +104,23 @@ contains cmfd % keff_bal = ZERO - ! Begin loop around tallies - TAL: do ital = 1, n_cmfd_tallies + ! Begin loop around tallies + TAL: do ital = 1, n_cmfd_tallies - ! Associate tallies and mesh - t => cmfd_tallies(ital) - i_mesh = t % filters(t % find_filter(FILTER_MESH)) % int_bins(1) - m => meshes(i_mesh) + ! Associate tallies and mesh + t => cmfd_tallies(ital) + i_mesh = t % filters(t % find_filter(FILTER_MESH)) % int_bins(1) + m => meshes(i_mesh) - i_filter_mesh = t % find_filter(FILTER_MESH) - i_filter_ein = t % find_filter(FILTER_ENERGYIN) - i_filter_eout = t % find_filter(FILTER_ENERGYOUT) - i_filter_surf = t % find_filter(FILTER_SURFACE) + i_filter_mesh = t % find_filter(FILTER_MESH) + i_filter_ein = t % find_filter(FILTER_ENERGYIN) + i_filter_eout = t % find_filter(FILTER_ENERGYOUT) + i_filter_surf = t % find_filter(FILTER_SURFACE) - ! Begin loop around space - ZLOOP: do k = 1,nz + ! Begin loop around space + ZLOOP: do k = 1,nz - YLOOP: do j = 1,ny + YLOOP: do j = 1,ny XLOOP: do i = 1,nx @@ -600,7 +600,7 @@ contains dtilde = (2*cell_dc*neig_dc)/(neig_hxyz(xyz_idx)*cell_dc + & cell_hxyz(xyz_idx)*neig_dc) - end if + end if end if @@ -797,7 +797,7 @@ contains ! Calculate albedo if ((shift_idx == 1 .and. current(2*l ) < 1.0e-10_8) .or. & - (shift_idx == -1 .and. current(2*l-1) < 1.0e-10_8)) then + (shift_idx == -1 .and. current(2*l-1) < 1.0e-10_8)) then albedo = ONE else albedo = (current(2*l-1)/current(2*l))**(shift_idx) diff --git a/src/cmfd_execute.F90 b/src/cmfd_execute.F90 index e620c1be38..c55d206cbc 100644 --- a/src/cmfd_execute.F90 +++ b/src/cmfd_execute.F90 @@ -121,7 +121,7 @@ contains ! Allocate cmfd source if not already allocated and allocate buffer if (.not. allocated(cmfd % cmfd_src)) & - allocate(cmfd % cmfd_src(ng,nx,ny,nz)) + allocate(cmfd % cmfd_src(ng,nx,ny,nz)) ! Reset cmfd source to 0 cmfd % cmfd_src = ZERO diff --git a/src/cmfd_header.F90 b/src/cmfd_header.F90 index c9bc0f32af..e743cc928e 100644 --- a/src/cmfd_header.F90 +++ b/src/cmfd_header.F90 @@ -1,4 +1,4 @@ -module cmfd_header +module cmfd_header use constants, only: CMFD_NOACCEL, ZERO, ONE @@ -17,7 +17,7 @@ module cmfd_header ! Core overlay map integer, allocatable :: coremap(:,:,:) integer, allocatable :: indexmap(:,:) - integer :: mat_dim = CMFD_NOACCEL + integer :: mat_dim = CMFD_NOACCEL ! Energy grid real(8), allocatable :: egrid(:) @@ -51,7 +51,7 @@ module cmfd_header ! Source sites in each mesh box real(8), allocatable :: sourcecounts(:,:,:,:) - ! Weight adjustment factors + ! Weight adjustment factors real(8), allocatable :: weightfactors(:,:,:,:) ! Eigenvector/eigenvalue from cmfd run @@ -118,7 +118,7 @@ contains if (.not. allocated(this % nfissxs)) allocate(this % nfissxs(ng,ng,nx,ny,nz)) if (.not. allocated(this % diffcof)) allocate(this % diffcof(ng,nx,ny,nz)) - ! Allocate dtilde and dhat + ! Allocate dtilde and dhat if (.not. allocated(this % dtilde)) allocate(this % dtilde(6,ng,nx,ny,nz)) if (.not. allocated(this % dhat)) allocate(this % dhat(6,ng,nx,ny,nz)) @@ -167,7 +167,7 @@ contains end subroutine allocate_cmfd !=============================================================================== -! DEALLOCATE_CMFD frees all memory of cmfd type +! DEALLOCATE_CMFD frees all memory of cmfd type !=============================================================================== subroutine deallocate_cmfd(this) diff --git a/src/cmfd_input.F90 b/src/cmfd_input.F90 index 169c763957..2d44d3e9bc 100644 --- a/src/cmfd_input.F90 +++ b/src/cmfd_input.F90 @@ -120,7 +120,7 @@ contains allocate(cmfd % coremap(cmfd % indices(1), cmfd % indices(2), & cmfd % indices(3))) if (get_arraysize_integer(node_mesh, "map") /= & - product(cmfd % indices(1:3))) then + product(cmfd % indices(1:3))) then call fatal_error('CMFD coremap not to correct dimensions') end if allocate(iarray(get_arraysize_integer(node_mesh, "map"))) @@ -156,7 +156,7 @@ contains call get_node_value(doc, "dhat_reset", temp_str) temp_str = to_lower(temp_str) if (trim(temp_str) == 'true' .or. trim(temp_str) == '1') & - dhat_reset = .true. + dhat_reset = .true. end if ! Set monitoring @@ -180,7 +180,7 @@ contains call get_node_value(doc, "run_adjoint", temp_str) temp_str = to_lower(temp_str) if (trim(temp_str) == 'true' .or. trim(temp_str) == '1') & - cmfd_run_adjoint = .true. + cmfd_run_adjoint = .true. end if ! Batch to begin cmfd @@ -289,7 +289,7 @@ contains ! Determine number of dimensions for mesh n = get_arraysize_integer(node_mesh, "dimension") if (n /= 2 .and. n /= 3) then - call fatal_error("Mesh must be two or three dimensions.") + call fatal_error("Mesh must be two or three dimensions.") end if m % n_dimension = n @@ -318,14 +318,14 @@ contains ! Make sure both upper-right or width were specified if (check_for_node(node_mesh, "upper_right") .and. & - check_for_node(node_mesh, "width")) then + check_for_node(node_mesh, "width")) then call fatal_error("Cannot specify both and on a & &tally mesh.") end if ! Make sure either upper-right or width was specified if (.not.check_for_node(node_mesh, "upper_right") .and. & - .not.check_for_node(node_mesh, "width")) then + .not.check_for_node(node_mesh, "width")) then call fatal_error("Must specify either and on a & &tally mesh.") end if @@ -333,7 +333,7 @@ contains if (check_for_node(node_mesh, "width")) then ! Check to ensure width has same dimensions if (get_arraysize_double(node_mesh, "width") /= & - get_arraysize_double(node_mesh, "lower_left")) then + get_arraysize_double(node_mesh, "lower_left")) then call fatal_error("Number of entries on must be the same as the & &number of entries on .") end if @@ -351,7 +351,7 @@ contains elseif (check_for_node(node_mesh, "upper_right")) then ! Check to ensure width has same dimensions if (get_arraysize_double(node_mesh, "upper_right") /= & - get_arraysize_double(node_mesh, "lower_left")) then + get_arraysize_double(node_mesh, "lower_left")) then call fatal_error("Number of entries on must be the same & &as the number of entries on .") end if @@ -548,7 +548,7 @@ contains ! Deallocate filter bins deallocate(filters(1) % int_bins) if (check_for_node(node_mesh, "energy")) & - deallocate(filters(2) % real_bins) + deallocate(filters(2) % real_bins) end do diff --git a/src/cmfd_loss_operator.F90 b/src/cmfd_loss_operator.F90 index b89f0f5772..7dfeed1dbd 100644 --- a/src/cmfd_loss_operator.F90 +++ b/src/cmfd_loss_operator.F90 @@ -54,7 +54,7 @@ contains n_e = 4*(nx - 2) + 4*(ny - 2) + 4*(nz - 2) ! define # of edges n_s = 2*(nx - 2)*(ny - 2) + 2*(nx - 2)*(nz - 2) & + 2*(ny - 2)*(nz - 2) ! define # of sides - n_i = nx*ny*nz - (n_c + n_e + n_s) ! define # of interiors + n_i = nx*ny*nz - (n_c + n_e + n_s) ! define # of interiors nz_c = ng*n_c*(4 + ng - 1) ! define # nonzero corners nz_e = ng*n_e*(5 + ng - 1) ! define # nonzero edges nz_s = ng*n_s*(6 + ng - 1) ! define # nonzero sides @@ -131,7 +131,7 @@ contains ! Check for global boundary if (bound(l) /= nxyz(xyz_idx,dir_idx)) then - ! Check for coremap + ! Check for coremap if (cmfd_coremap) then ! Check for neighbor that is non-acceleartred @@ -139,11 +139,11 @@ contains CMFD_NOACCEL) then ! Get neighbor matrix index - call indices_to_matrix(g,neig_idx(1), neig_idx(2), & + call indices_to_matrix(g,neig_idx(1), neig_idx(2), & neig_idx(3), neig_mat_idx, ng, nx, ny) ! Record nonzero - nnz = nnz + 1 + nnz = nnz + 1 end if @@ -218,11 +218,11 @@ contains real(8) :: jn ! direction dependent leakage coeff to neig real(8) :: jo(6) ! leakage coeff in front of cell flux real(8) :: jnet ! net leakage from jo - real(8) :: val ! temporary variable before saving to + real(8) :: val ! temporary variable before saving to ! Check for adjoint adjoint_calc = .false. - if (present(adjoint)) adjoint_calc = adjoint + if (present(adjoint)) adjoint_calc = adjoint ! Get maximum number of cells in each direction nx = cmfd%indices(1) @@ -257,11 +257,11 @@ contains dhat = ZERO end if - ! Create boundary vector + ! Create boundary vector bound = (/i,i,j,j,k,k/) ! Begin loop over leakages - ! 1=-x, 2=+x, 3=-y, 4=+y, 5=-z, 6=+z + ! 1=-x, 2=+x, 3=-y, 4=+y, 5=-z, 6=+z LEAK: do l = 1,6 ! Define (x,y,z) and (-,+) indices @@ -350,7 +350,7 @@ contains scattxshg = cmfd%scattxs(h, g, i, j, k) end if - ! Negate the scattering xs + ! Negate the scattering xs val = -scattxshg ! Record value in matrix @@ -358,7 +358,7 @@ contains end do SCATTR - end do ROWS + end do ROWS ! CSR requires n+1 row call loss_matrix % new_row() diff --git a/src/cmfd_prod_operator.F90 b/src/cmfd_prod_operator.F90 index e6d055ced8..7779c24551 100644 --- a/src/cmfd_prod_operator.F90 +++ b/src/cmfd_prod_operator.F90 @@ -97,7 +97,7 @@ contains end if - ! loop around all other groups + ! loop around all other groups NFISS: do h = 1, ng @@ -122,7 +122,7 @@ contains end do NFISS - end do ROWS + end do ROWS ! CSR requires n+1 row call prod_matrix % new_row() diff --git a/src/cmfd_solver.F90 b/src/cmfd_solver.F90 index ee5127a374..84f0016d3d 100644 --- a/src/cmfd_solver.F90 +++ b/src/cmfd_solver.F90 @@ -65,7 +65,7 @@ contains ! Check for physical adjoint if (adjoint_calc .and. trim(cmfd_adjoint_type) == 'physical') & - physical_adjoint = .true. + physical_adjoint = .true. ! Start timer for build call time_cmfdbuild % start() @@ -75,7 +75,7 @@ contains ! Check for mathematical adjoint calculation if (adjoint_calc .and. trim(cmfd_adjoint_type) == 'math') & - call compute_adjoint() + call compute_adjoint() ! Stop timer for build call time_cmfdbuild % stop() @@ -286,7 +286,7 @@ contains ROWS: do irow = 1, loss % n COLS: do icol = loss % get_row(irow), loss % get_row(irow + 1) - 1 if (loss % get_col(icol) == prod % get_col(jcol) .and. & - jcol < prod % get_row(irow + 1)) then + jcol < prod % get_row(irow + 1)) then loss % val(icol) = loss % val(icol) - ONE/k_s*prod % val(jcol) jcol = jcol + 1 end if diff --git a/src/cross_section.F90 b/src/cross_section.F90 index c8a567938e..b937b03a15 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -446,7 +446,7 @@ contains ! Calculate elastic cross section/factor elastic = ZERO if (urr % prob(i_energy, URR_ELASTIC, i_low) > ZERO .and. & - urr % prob(i_energy + 1, URR_ELASTIC, i_up) > ZERO) then + urr % prob(i_energy + 1, URR_ELASTIC, i_up) > ZERO) then elastic = exp((ONE - f) * log(urr % prob(i_energy, URR_ELASTIC, & i_low)) + f * log(urr % prob(i_energy + 1, URR_ELASTIC, & i_up))) @@ -455,7 +455,7 @@ contains ! Calculate fission cross section/factor fission = ZERO if (urr % prob(i_energy, URR_FISSION, i_low) > ZERO .and. & - urr % prob(i_energy + 1, URR_FISSION, i_up) > ZERO) then + urr % prob(i_energy + 1, URR_FISSION, i_up) > ZERO) then fission = exp((ONE - f) * log(urr % prob(i_energy, URR_FISSION, & i_low)) + f * log(urr % prob(i_energy + 1, URR_FISSION, & i_up))) @@ -464,7 +464,7 @@ contains ! Calculate capture cross section/factor capture = ZERO if (urr % prob(i_energy, URR_N_GAMMA, i_low) > ZERO .and. & - urr % prob(i_energy + 1, URR_N_GAMMA, i_up) > ZERO) then + urr % prob(i_energy + 1, URR_N_GAMMA, i_up) > ZERO) then capture = exp((ONE - f) * log(urr % prob(i_energy, URR_N_GAMMA, & i_low)) + f * log(urr % prob(i_energy + 1, URR_N_GAMMA, & i_up))) @@ -571,11 +571,11 @@ contains ! calculate interpolation factor f = (E - nuc % energy_0K(i_grid)) & - & / (nuc % energy_0K(i_grid + 1) - nuc % energy_0K(i_grid)) + & / (nuc % energy_0K(i_grid + 1) - nuc % energy_0K(i_grid)) ! Calculate microscopic nuclide elastic cross section xs_out = (ONE - f) * nuc % elastic_0K(i_grid) & - & + f * nuc % elastic_0K(i_grid + 1) + & + f * nuc % elastic_0K(i_grid + 1) end function elastic_xs_0K diff --git a/src/dict_header.F90 b/src/dict_header.F90 index 7da2015fd3..ffe488d525 100644 --- a/src/dict_header.F90 +++ b/src/dict_header.F90 @@ -56,7 +56,7 @@ module dict_header !=============================================================================== ! DICT* is a dictionary of (key,value) pairs with convenience methods as ! type-bound procedures. DictCharInt has character(*) keys and integer values, -! and DictIntInt has integer keys and values. +! and DictIntInt has integer keys and values. !=============================================================================== type, public :: DictCharInt @@ -105,7 +105,7 @@ contains if (associated(elem)) then elem % value = value else - ! Get hash + ! Get hash hash = dict_hash_key_ci(key) ! Create new element @@ -135,7 +135,7 @@ contains if (associated(elem)) then elem % value = value else - ! Get hash + ! Get hash hash = dict_hash_key_ii(key) ! Create new element @@ -156,13 +156,13 @@ contains !=============================================================================== function dict_get_elem_ci(this, key) result(elem) - + class(DictCharInt) :: this character(*), intent(in) :: key type(ElemKeyValueCI), pointer :: elem integer :: hash - + ! Check for dictionary not being allocated if (.not. associated(this % table)) then allocate(this % table(HASH_SIZE)) @@ -178,13 +178,13 @@ contains end function dict_get_elem_ci function dict_get_elem_ii(this, key) result(elem) - + class(DictIntInt) :: this integer, intent(in) :: key type(ElemKeyValueII), pointer :: elem integer :: hash - + ! Check for dictionary not being allocated if (.not. associated(this % table)) then allocate(this % table(HASH_SIZE)) @@ -279,7 +279,7 @@ contains character(*), intent(in) :: key integer :: val - + integer :: i val = 0 @@ -298,7 +298,7 @@ contains integer, intent(in) :: key integer :: val - + val = 0 ! Added the absolute val on val-1 since the sum in the do loop is @@ -420,7 +420,7 @@ contains integer :: i type(ElemKeyValueII), pointer :: current type(ElemKeyValueII), pointer :: next - + if (associated(this % table)) then do i = 1, size(this % table) current => this % table(i) % list @@ -440,5 +440,5 @@ contains end if end subroutine dict_clear_ii - + end module dict_header diff --git a/src/doppler.F90 b/src/doppler.F90 index e888eb2b18..85ab6da3c0 100644 --- a/src/doppler.F90 +++ b/src/doppler.F90 @@ -52,62 +52,115 @@ contains ! Loop over incoming neutron energies ENERGY_NEUTRON: do i = 1, n - sigma = ZERO - y = x(i) - y_sq = y*y - y_inv = ONE / y - y_inv_sq = y_inv / y + sigma = ZERO + y = x(i) + y_sq = y*y + y_inv = ONE / y + y_inv_sq = y_inv / y - ! ======================================================================= - ! EVALUATE FIRST TERM FROM x(k) - y = 0 to -4 + ! ======================================================================= + ! EVALUATE FIRST TERM FROM x(k) - y = 0 to -4 - k = i - a = ZERO - call calculate_F(F_a, a) + k = i + a = ZERO + call calculate_F(F_a, a) - do while (a >= -4.0 .and. k > 1) - ! Move to next point - F_b = F_a - k = k - 1 - a = x(k) - y + do while (a >= -4.0 .and. k > 1) + ! Move to next point + F_b = F_a + k = k - 1 + a = x(k) - y - ! Calculate F and H functions - call calculate_F(F_a, a) - H = F_a - F_b + ! Calculate F and H functions + call calculate_F(F_a, a) + H = F_a - F_b - ! Calculate A(k), B(k), and slope terms - Ak = y_inv_sq*H(2) + 2.0*y_inv*H(1) + H(0) - Bk = y_inv_sq*H(4) + 4.0*y_inv*H(3) + 6.0*H(2) + 4.0*y*H(1) + y_sq*H(0) - slope = (xs(k+1) - xs(k)) / (x(k+1)**2 - x(k)**2) + ! Calculate A(k), B(k), and slope terms + Ak = y_inv_sq*H(2) + 2.0*y_inv*H(1) + H(0) + Bk = y_inv_sq*H(4) + 4.0*y_inv*H(3) + 6.0*H(2) + 4.0*y*H(1) + y_sq*H(0) + slope = (xs(k+1) - xs(k)) / (x(k+1)**2 - x(k)**2) - ! Add contribution to broadened cross section - sigma = sigma + Ak*(xs(k) - slope*x(k)**2) + slope*Bk - end do + ! Add contribution to broadened cross section + sigma = sigma + Ak*(xs(k) - slope*x(k)**2) + slope*Bk + end do - ! ======================================================================= - ! EXTEND CROSS SECTION TO 0 ASSUMING 1/V SHAPE + ! ======================================================================= + ! EXTEND CROSS SECTION TO 0 ASSUMING 1/V SHAPE - if (k == 1 .and. a >= -4.0) then - ! Since x = 0, this implies that a = -y - F_b = F_a - a = -y + if (k == 1 .and. a >= -4.0) then + ! Since x = 0, this implies that a = -y + F_b = F_a + a = -y - ! Calculate F and H functions - call calculate_F(F_a, a) - H = F_a - F_b + ! Calculate F and H functions + call calculate_F(F_a, a) + H = F_a - F_b - ! Add contribution to broadened cross section - sigma = sigma + xs(k)*x(k)*(y_inv_sq*H(1) + y_inv*H(0)) - end if + ! Add contribution to broadened cross section + sigma = sigma + xs(k)*x(k)*(y_inv_sq*H(1) + y_inv*H(0)) + end if - ! ======================================================================= - ! EVALUATE FIRST TERM FROM x(k) - y = 0 to 4 + ! ======================================================================= + ! EVALUATE FIRST TERM FROM x(k) - y = 0 to 4 - k = i - b = ZERO - call calculate_F(F_b, b) + k = i + b = ZERO + call calculate_F(F_b, b) - do while (b <= 4.0 .and. k < n) + do while (b <= 4.0 .and. k < n) + ! Move to next point + F_a = F_b + k = k + 1 + b = x(k) - y + + ! Calculate F and H functions + call calculate_F(F_b, b) + H = F_a - F_b + + ! Calculate A(k), B(k), and slope terms + Ak = y_inv_sq*H(2) + 2.0*y_inv*H(1) + H(0) + Bk = y_inv_sq*H(4) + 4.0*y_inv*H(3) + 6.0*H(2) + 4.0*y*H(1) + y_sq*H(0) + slope = (xs(k) - xs(k-1)) / (x(k)**2 - x(k-1)**2) + + ! Add contribution to broadened cross section + sigma = sigma + Ak*(xs(k) - slope*x(k)**2) + slope*Bk + end do + + ! ======================================================================= + ! EXTEND CROSS SECTION TO INFINITY ASSUMING CONSTANT SHAPE + + if (k == n .and. b <= 4.0) then + ! Calculate F function at last energy point + a = x(k) - y + call calculate_F(F_a, a) + + ! Add contribution to broadened cross section + sigma = sigma + xs(k) * (y_inv_sq*F_a(2) + 2.0*y_inv*F_a(1) + F_a(0)) + end if + + ! ======================================================================= + ! EVALUATE SECOND TERM FROM x(k) + y = 0 to +4 + + if (y <= 4.0) then + ! Swap signs on y + y = -y + y_inv = -y_inv + k = 1 + + ! Calculate a and b based on 0 and x(1) + a = -y + b = x(k) - y + + ! Calculate F and H functions + call calculate_F(F_a, a) + call calculate_F(F_b, b) + H = F_a - F_b + + ! Add contribution to broadened cross section + sigma = sigma - xs(k) * x(k) * (y_inv_sq*H(1) + y_inv*H(0)) + + ! Now progress forward doing the remainder of the second term + do while (b <= 4.0) ! Move to next point F_a = F_b k = k + 1 @@ -119,69 +172,17 @@ contains ! Calculate A(k), B(k), and slope terms Ak = y_inv_sq*H(2) + 2.0*y_inv*H(1) + H(0) - Bk = y_inv_sq*H(4) + 4.0*y_inv*H(3) + 6.0*H(2) + 4.0*y*H(1) + y_sq*H(0) + Bk = y_inv_sq*H(4) + 4.0*y_inv*H(3) + 6.0*H(2) + 4.0*y*H(1) & + + y_sq*H(0) slope = (xs(k) - xs(k-1)) / (x(k)**2 - x(k-1)**2) ! Add contribution to broadened cross section - sigma = sigma + Ak*(xs(k) - slope*x(k)**2) + slope*Bk - end do + sigma = sigma - Ak*(xs(k) - slope*x(k)**2) - slope*Bk + end do + end if - ! ======================================================================= - ! EXTEND CROSS SECTION TO INFINITY ASSUMING CONSTANT SHAPE - - if (k == n .and. b <= 4.0) then - ! Calculate F function at last energy point - a = x(k) - y - call calculate_F(F_a, a) - - ! Add contribution to broadened cross section - sigma = sigma + xs(k) * (y_inv_sq*F_a(2) + 2.0*y_inv*F_a(1) + F_a(0)) - end if - - ! ======================================================================= - ! EVALUATE SECOND TERM FROM x(k) + y = 0 to +4 - - if (y <= 4.0) then - ! Swap signs on y - y = -y - y_inv = -y_inv - k = 1 - - ! Calculate a and b based on 0 and x(1) - a = -y - b = x(k) - y - - ! Calculate F and H functions - call calculate_F(F_a, a) - call calculate_F(F_b, b) - H = F_a - F_b - - ! Add contribution to broadened cross section - sigma = sigma - xs(k) * x(k) * (y_inv_sq*H(1) + y_inv*H(0)) - - ! Now progress forward doing the remainder of the second term - do while (b <= 4.0) - ! Move to next point - F_a = F_b - k = k + 1 - b = x(k) - y - - ! Calculate F and H functions - call calculate_F(F_b, b) - H = F_a - F_b - - ! Calculate A(k), B(k), and slope terms - Ak = y_inv_sq*H(2) + 2.0*y_inv*H(1) + H(0) - Bk = y_inv_sq*H(4) + 4.0*y_inv*H(3) + 6.0*H(2) + 4.0*y*H(1) + y_sq*H(0) - slope = (xs(k) - xs(k-1)) / (x(k)**2 - x(k-1)**2) - - ! Add contribution to broadened cross section - sigma = sigma - Ak*(xs(k) - slope*x(k)**2) - slope*Bk - end do - end if - - ! Set broadened cross section - sigmaNew(i) = sigma + ! Set broadened cross section + sigmaNew(i) = sigma end do ENERGY_NEUTRON diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index aefb597d0e..1bbcbe850e 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -259,7 +259,7 @@ contains ! Write out source point if it's been specified for this batch if ((sourcepoint_batch % contains(current_batch) .or. source_latest) .and. & - source_write) then + source_write) then call write_source_point() end if @@ -880,8 +880,8 @@ contains !$omp do ordered schedule(static) do i = 1, n_threads !$omp ordered - master_fission_bank(total+1:total+n_bank) = fission_bank(1:n_bank) - total = total + n_bank + master_fission_bank(total+1:total+n_bank) = fission_bank(1:n_bank) + total = total + n_bank !$omp end ordered end do !$omp end do @@ -891,10 +891,10 @@ contains ! Now copy the shared fission bank sites back to the master thread's copy. if (thread_id == 0) then - n_bank = total - fission_bank(1:n_bank) = master_fission_bank(1:n_bank) + n_bank = total + fission_bank(1:n_bank) = master_fission_bank(1:n_bank) else - n_bank = 0 + n_bank = 0 end if !$omp end parallel diff --git a/src/endf_header.F90 b/src/endf_header.F90 index a2e8b10de4..54af0f7383 100644 --- a/src/endf_header.F90 +++ b/src/endf_header.F90 @@ -3,7 +3,7 @@ module endf_header implicit none !=============================================================================== -! TAB1 represents a one-dimensional interpolable function +! TAB1 represents a one-dimensional interpolable function !=============================================================================== type Tab1 @@ -13,28 +13,28 @@ module endf_header integer :: n_pairs ! # of pairs of (x,y) values real(8), allocatable :: x(:) ! values of abscissa real(8), allocatable :: y(:) ! values of ordinate - + ! Type-Bound procedures contains procedure :: clear => tab1_clear ! deallocates a Tab1 Object. end type Tab1 - + contains - + !=============================================================================== ! TAB1_CLEAR deallocates the items in Tab1 !=============================================================================== subroutine tab1_clear(this) - + class(Tab1), intent(inout) :: this ! The Tab1 to clear - + if (allocated(this % nbt)) & deallocate(this % nbt, this % int) - + if (allocated(this % x)) & deallocate(this % x, this % y) - + end subroutine tab1_clear end module endf_header diff --git a/src/geometry_header.F90 b/src/geometry_header.F90 index 9a5778c173..93e5dd1fdb 100644 --- a/src/geometry_header.F90 +++ b/src/geometry_header.F90 @@ -9,13 +9,13 @@ module geometry_header !=============================================================================== type Universe - integer :: id ! Unique ID - integer :: type ! Type - integer :: n_cells ! # of cells within - integer, allocatable :: cells(:) ! List of cells within - real(8) :: x0 ! Translation in x-coordinate - real(8) :: y0 ! Translation in y-coordinate - real(8) :: z0 ! Translation in z-coordinate + integer :: id ! Unique ID + integer :: type ! Type + integer :: n_cells ! # of cells within + integer, allocatable :: cells(:) ! List of cells within + real(8) :: x0 ! Translation in x-coordinate + real(8) :: y0 ! Translation in y-coordinate + real(8) :: z0 ! Translation in z-coordinate end type Universe !=============================================================================== @@ -119,14 +119,14 @@ module geometry_header !=============================================================================== type Surface - integer :: id ! Unique ID - character(len=52) :: name = "" ! User-defined name - integer :: type ! Type of surface - real(8), allocatable :: coeffs(:) ! Definition of surface - integer, allocatable :: & - neighbor_pos(:), & ! List of cells on positive side - neighbor_neg(:) ! List of cells on negative side - integer :: bc ! Boundary condition + integer :: id ! Unique ID + character(len=52) :: name = "" ! User-defined name + integer :: type ! Type of surface + real(8), allocatable :: coeffs(:) ! Definition of surface + integer, allocatable :: & + neighbor_pos(:), & ! List of cells on positive side + neighbor_neg(:) ! List of cells on negative side + integer :: bc ! Boundary condition end type Surface !=============================================================================== @@ -134,24 +134,29 @@ module geometry_header !=============================================================================== type Cell - integer :: id ! Unique ID - character(len=52) :: name = "" ! User-defined name - integer :: type ! Type of cell (normal, universe, lattice) - integer :: universe ! universe # this cell is in - integer :: fill ! universe # filling this cell - integer :: instances ! number of instances of this cell in the geom - integer :: material ! Material within cell (0 for universe) - integer :: n_surfaces ! Number of surfaces within - integer, allocatable :: offset (:) ! Distribcell offset for tally counter - integer, allocatable :: & - & surfaces(:) ! List of surfaces bounding cell -- note that - ! parentheses, union, etc operators will be listed - ! here too + integer :: id ! Unique ID + character(len=52) :: name = "" ! User-defined name + integer :: type ! Type of cell (normal, universe, + ! lattice) + integer :: universe ! universe # this cell is in + integer :: fill ! universe # filling this cell + integer :: instances ! number of instances of this cell in + ! the geom + integer :: material ! Material within cell (0 for + ! universe) + integer :: n_surfaces ! Number of surfaces within + integer, allocatable :: offset (:) ! Distribcell offset for tally + ! counter + integer, allocatable :: & + & surfaces(:) ! List of surfaces bounding cell + ! -- note that parentheses, union, + ! etc operators will be listed here + ! too - ! Rotation matrix and translation vector - real(8), allocatable :: translation(:) - real(8), allocatable :: rotation(:) - real(8), allocatable :: rotation_matrix(:,:) + ! Rotation matrix and translation vector + real(8), allocatable :: translation(:) + real(8), allocatable :: rotation(:) + real(8), allocatable :: rotation_matrix(:,:) end type Cell ! array index of universe 0 diff --git a/src/global.F90 b/src/global.F90 index f7d9f184e1..a5ff7453ea 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -529,9 +529,9 @@ contains ! Deallocate entropy mesh if (associated(entropy_mesh)) then if (allocated(entropy_mesh % lower_left)) & - deallocate(entropy_mesh % lower_left) + deallocate(entropy_mesh % lower_left) if (allocated(entropy_mesh % upper_right)) & - deallocate(entropy_mesh % upper_right) + deallocate(entropy_mesh % upper_right) if (allocated(entropy_mesh % width)) deallocate(entropy_mesh % width) deallocate(entropy_mesh) end if @@ -541,7 +541,7 @@ contains if (associated(ufs_mesh)) then if (allocated(ufs_mesh % lower_left)) deallocate(ufs_mesh % lower_left) if (allocated(ufs_mesh % upper_right)) & - deallocate(ufs_mesh % upper_right) + deallocate(ufs_mesh % upper_right) if (allocated(ufs_mesh % width)) deallocate(ufs_mesh % width) deallocate(ufs_mesh) end if diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index c3e5b44ba8..34b72196ee 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -7,7 +7,7 @@ module hdf5_interface use, intrinsic :: ISO_C_BINDING #ifdef MPI - use message_passing, only: MPI_COMM_WORLD, MPI_INFO_NULL + use message_passing, only: MPI_COMM_WORLD, MPI_INFO_NULL #endif implicit none diff --git a/src/hdf5_summary.F90 b/src/hdf5_summary.F90 index 161246f1c9..d4953d076e 100644 --- a/src/hdf5_summary.F90 +++ b/src/hdf5_summary.F90 @@ -186,7 +186,7 @@ contains call su % write_data("lattice", "fill_type", & group="geometry/cells/cell " // trim(to_str(c % id))) call su % write_data(lattices(c % fill) % obj % id, "lattice", & - group="geometry/cells/cell " // trim(to_str(c % id))) + group="geometry/cells/cell " // trim(to_str(c % id))) end select ! Write list of bounding surfaces @@ -373,7 +373,7 @@ contains ! Write lattice universes. allocate(lattice_universes(lat % n_cells(1), lat % n_cells(2), & - &lat % n_cells(3))) + &lat % n_cells(3))) do j = 1, lat % n_cells(1) do k = 1, lat % n_cells(2) do m = 1, lat % n_cells(3) @@ -399,13 +399,13 @@ contains ! Write lattice center, pitch and outer universe. if (lat % is_3d) then - call su % write_data(lat % center, "center", length=3, & + call su % write_data(lat % center, "center", length=3, & group="geometry/lattices/lattice " // trim(to_str(lat % id))) else - call su % write_data(lat % center, "center", length=2, & + call su % write_data(lat % center, "center", length=2, & group="geometry/lattices/lattice " // trim(to_str(lat % id))) end if - + if (lat % is_3d) then call su % write_data(lat % pitch, "pitch", length=3, & group="geometry/lattices/lattice " // trim(to_str(lat % id))) @@ -429,7 +429,7 @@ contains ! Write lattice universes. allocate(lattice_universes(2*lat % n_rings - 1, 2*lat % n_rings - 1, & - &lat % n_axial)) + &lat % n_axial)) do m = 1, lat % n_axial do k = 1, 2*lat % n_rings - 1 do j = 1, 2*lat % n_rings - 1 @@ -647,12 +647,12 @@ contains // "/filter " // trim(to_str(j))) case(FILTER_ENERGYIN) call su % write_data("energy", "type_name", & - group="tallies/tally " // trim(to_str(t % id)) & - // "/filter " // trim(to_str(j))) + group="tallies/tally " // trim(to_str(t % id)) & + // "/filter " // trim(to_str(j))) case(FILTER_ENERGYOUT) call su % write_data("energyout", "type_name", & - group="tallies/tally " // trim(to_str(t % id)) & - // "/filter " // trim(to_str(j))) + group="tallies/tally " // trim(to_str(t % id)) & + // "/filter " // trim(to_str(j))) end select end do FILTER_LOOP diff --git a/src/initialize.F90 b/src/initialize.F90 index 99a66e2ce8..409d531a38 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -916,9 +916,9 @@ contains thread_id = omp_get_thread_num() if (thread_id == 0) then - allocate(fission_bank(3*work)) + allocate(fission_bank(3*work)) else - allocate(fission_bank(3*work/n_threads)) + allocate(fission_bank(3*work/n_threads)) end if !$omp end parallel allocate(master_fission_bank(3*work), STAT=alloc_err) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 9305313511..5c939a394f 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -472,7 +472,7 @@ contains ! Check for type of energy distribution type = '' if (check_for_node(node_dist, "type")) & - call get_node_value(node_dist, "type", type) + call get_node_value(node_dist, "type", type) select case (to_lower(type)) case ('monoenergetic') external_source % type_energy = SRC_ENERGY_MONO @@ -798,7 +798,7 @@ contains if (.not. source_separate) then do i = 1, n_source_points if (.not. statepoint_batch % contains(sourcepoint_batch % & - get_item(i))) then + get_item(i))) then call fatal_error('Sourcepoint batches are not a subset& & of statepoint batches.') end if @@ -811,7 +811,7 @@ contains call get_node_value(doc, "no_reduce", temp_str) temp_str = to_lower(temp_str) if (trim(temp_str) == 'true' .or. trim(temp_str) == '1') & - reduce_tallies = .false. + reduce_tallies = .false. end if ! Check if the user has specified to use confidence intervals for @@ -884,11 +884,11 @@ contains &// trim(to_str(i)) // " in settings.xml file!") end if call get_node_value(node_scatterer, "nuclide", & - nuclides_0K(i) % nuclide) + nuclides_0K(i) % nuclide) if (check_for_node(node_scatterer, "method")) then call get_node_value(node_scatterer, "method", & - nuclides_0K(i) % scheme) + nuclides_0K(i) % scheme) end if ! check to make sure xs name for which method is applied is given @@ -898,7 +898,7 @@ contains &// " given in cross_sections.xml") end if call get_node_value(node_scatterer, "xs_label", & - nuclides_0K(i) % name) + nuclides_0K(i) % name) ! check to make sure 0K xs name for which method is applied is given if (.not. check_for_node(node_scatterer, "xs_label_0K")) then @@ -906,11 +906,11 @@ contains &// trim(to_str(i)) // " given in cross_sections.xml") end if call get_node_value(node_scatterer, "xs_label_0K", & - nuclides_0K(i) % name_0K) + nuclides_0K(i) % name_0K) if (check_for_node(node_scatterer, "E_min")) then call get_node_value(node_scatterer, "E_min", & - nuclides_0K(i) % E_min) + nuclides_0K(i) % E_min) end if ! check that E_min is non-negative @@ -921,7 +921,7 @@ contains if (check_for_node(node_scatterer, "E_max")) then call get_node_value(node_scatterer, "E_max", & - nuclides_0K(i) % E_max) + nuclides_0K(i) % E_max) end if ! check that E_max is not less than E_min @@ -1081,7 +1081,7 @@ contains ! Read material word = '' if (check_for_node(node_cell, "material")) & - call get_node_value(node_cell, "material", word) + call get_node_value(node_cell, "material", word) select case(to_lower(word)) case ('void') c % material = MATERIAL_VOID @@ -1248,7 +1248,7 @@ contains ! Copy and interpret surface type word = '' if (check_for_node(node_surf, "type")) & - call get_node_value(node_surf, "type", word) + call get_node_value(node_surf, "type", word) select case(to_lower(word)) case ('x-plane') s % type = SURF_PX @@ -1306,7 +1306,7 @@ contains ! Boundary conditions word = '' if (check_for_node(node_surf, "boundary")) & - call get_node_value(node_surf, "boundary", word) + call get_node_value(node_surf, "boundary", word) select case (to_lower(word)) case ('transmission', 'transmit', '') s % bc = BC_TRANSMIT @@ -1447,7 +1447,7 @@ contains do k = 0, n_y - 1 do j = 1, n_x lat % universes(j, n_y - k, m) = & - &temp_int_array(j + n_x*k + n_x*n_y*(m-1)) + &temp_int_array(j + n_x*k + n_x*n_y*(m-1)) end do end do end do @@ -1713,7 +1713,7 @@ contains ! Copy default cross section if present if (check_for_node(doc, "default_xs")) & - call get_node_value(doc, "default_xs", default_xs) + call get_node_value(doc, "default_xs", default_xs) ! Get pointer to list of XML call get_node_list(doc, "material", node_mat_list) @@ -1844,7 +1844,7 @@ contains ! store full name call get_node_value(node_nuc, "name", temp_str) if (check_for_node(node_nuc, "xs")) & - call get_node_value(node_nuc, "xs", name) + call get_node_value(node_nuc, "xs", name) name = trim(temp_str) // "." // trim(name) ! save name and density to list @@ -1853,7 +1853,7 @@ contains ! Check if no atom/weight percents were specified or if both atom and ! weight percents were specified if (.not.check_for_node(node_nuc, "ao") .and. & - .not.check_for_node(node_nuc, "wo")) then + .not.check_for_node(node_nuc, "wo")) then call fatal_error("No atom or weight percent specified for nuclide " & &// trim(name)) elseif (check_for_node(node_nuc, "ao") .and. & @@ -1903,7 +1903,7 @@ contains ! Check if no atom/weight percents were specified or if both atom and ! weight percents were specified if (.not.check_for_node(node_ele, "ao") .and. & - .not.check_for_node(node_ele, "wo")) then + .not.check_for_node(node_ele, "wo")) then call fatal_error("No atom or weight percent specified for element " & &// trim(name)) elseif (check_for_node(node_ele, "ao") .and. & @@ -2010,7 +2010,7 @@ contains ! Determine name of S(a,b) table if (.not.check_for_node(node_sab, "name") .or. & - .not.check_for_node(node_sab, "xs")) then + .not.check_for_node(node_sab, "xs")) then call fatal_error("Need to specify and for S(a,b) & &table.") end if @@ -2157,7 +2157,7 @@ contains call get_node_value(doc, "assume_separate", temp_str) temp_str = to_lower(temp_str) if (trim(temp_str) == 'true' .or. trim(temp_str) == '1') & - assume_separate = .true. + assume_separate = .true. end if ! ========================================================================== @@ -2185,7 +2185,7 @@ contains ! Read mesh type temp_str = '' if (check_for_node(node_mesh, "type")) & - call get_node_value(node_mesh, "type", temp_str) + call get_node_value(node_mesh, "type", temp_str) select case (to_lower(temp_str)) case ('rect', 'rectangle', 'rectangular') m % type = LATTICE_RECT @@ -2227,14 +2227,14 @@ contains ! Make sure both upper-right or width were specified if (check_for_node(node_mesh, "upper_right") .and. & - check_for_node(node_mesh, "width")) then + check_for_node(node_mesh, "width")) then call fatal_error("Cannot specify both and on a & &tally mesh.") end if ! Make sure either upper-right or width was specified if (.not.check_for_node(node_mesh, "upper_right") .and. & - .not.check_for_node(node_mesh, "width")) then + .not.check_for_node(node_mesh, "width")) then call fatal_error("Must specify either and on a & &tally mesh.") end if @@ -2242,7 +2242,7 @@ contains if (check_for_node(node_mesh, "width")) then ! Check to ensure width has same dimensions if (get_arraysize_double(node_mesh, "width") /= & - get_arraysize_double(node_mesh, "lower_left")) then + get_arraysize_double(node_mesh, "lower_left")) then call fatal_error("Number of entries on must be the same as & &the number of entries on .") end if @@ -2260,7 +2260,7 @@ contains elseif (check_for_node(node_mesh, "upper_right")) then ! Check to ensure width has same dimensions if (get_arraysize_double(node_mesh, "upper_right") /= & - get_arraysize_double(node_mesh, "lower_left")) then + get_arraysize_double(node_mesh, "lower_left")) then call fatal_error("Number of entries on must be the & &same as the number of entries on .") end if @@ -2323,7 +2323,7 @@ contains ! Copy tally name if (check_for_node(node_tal, "name")) & - call get_node_value(node_tal, "name", t % name) + call get_node_value(node_tal, "name", t % name) ! ======================================================================= ! READ DATA FOR FILTERS @@ -2345,13 +2345,13 @@ contains ! Convert filter type to lower case temp_str = '' if (check_for_node(node_filt, "type")) & - call get_node_value(node_filt, "type", temp_str) + call get_node_value(node_filt, "type", temp_str) temp_str = to_lower(temp_str) ! Determine number of bins if (check_for_node(node_filt, "bins")) then if (trim(temp_str) == 'energy' .or. & - trim(temp_str) == 'energyout') then + trim(temp_str) == 'energyout') then n_words = get_arraysize_double(node_filt, "bins") else n_words = get_arraysize_integer(node_filt, "bins") @@ -2618,7 +2618,7 @@ contains if (starts_with(score_name,trim(MOMENT_STRS(imomstr)))) then n_order_pos = scan(score_name,'0123456789') n_order = int(str_to_int( & - score_name(n_order_pos:(len_trim(score_name)))),4) + score_name(n_order_pos:(len_trim(score_name)))),4) if (n_order > MAX_ANG_ORDER) then ! User requested too many orders; throw a warning and set to the ! maximum order. @@ -2661,7 +2661,7 @@ contains if (starts_with(score_name,trim(MOMENT_STRS(imomstr)))) then n_order_pos = scan(score_name,'0123456789') n_order = int(str_to_int( & - score_name(n_order_pos:(len_trim(score_name)))),4) + score_name(n_order_pos:(len_trim(score_name)))),4) if (n_order > MAX_ANG_ORDER) then ! User requested too many orders; throw a warning and set to the ! maximum order. @@ -2684,7 +2684,7 @@ contains if (starts_with(score_name,trim(MOMENT_N_STRS(imomstr)))) then n_order_pos = scan(score_name,'0123456789') n_order = int(str_to_int( & - score_name(n_order_pos:(len_trim(score_name)))),4) + score_name(n_order_pos:(len_trim(score_name)))),4) if (n_order > MAX_ANG_ORDER) then ! User requested too many orders; throw a warning and set to the ! maximum order. @@ -3006,7 +3006,7 @@ contains ! Get the trigger type - "variance", "std_dev" or "rel_err" if (check_for_node(node_trigger, "type")) then call get_node_value(node_trigger, "type", temp_str) - temp_str = to_lower(temp_str) + temp_str = to_lower(temp_str) else call fatal_error("Must specify trigger type for tally " // & trim(to_str(t % id)) // " in tally XML file.") @@ -3105,7 +3105,7 @@ contains ! Increment the overall trigger index trig_ind = trig_ind + 1 - end if + end if end do SCORE_LOOP ! Deallocate the list of tally scores used to create triggers @@ -3223,7 +3223,7 @@ contains ! Copy plot type temp_str = 'slice' if (check_for_node(node_plot, "type")) & - call get_node_value(node_plot, "type", temp_str) + call get_node_value(node_plot, "type", temp_str) temp_str = to_lower(temp_str) select case (trim(temp_str)) case ("slice") @@ -3238,7 +3238,7 @@ contains ! Set output file path filename = trim(to_str(pl % id)) // "_plot" if (check_for_node(node_plot, "filename")) & - call get_node_value(node_plot, "filename", filename) + call get_node_value(node_plot, "filename", filename) select case (pl % type) case (PLOT_TYPE_SLICE) pl % path_plot = trim(path_input) // trim(filename) // ".ppm" @@ -3283,7 +3283,7 @@ contains if (pl % type == PLOT_TYPE_SLICE) then temp_str = 'xy' if (check_for_node(node_plot, "basis")) & - call get_node_value(node_plot, "basis", temp_str) + call get_node_value(node_plot, "basis", temp_str) temp_str = to_lower(temp_str) select case (trim(temp_str)) case ("xy") @@ -3338,7 +3338,7 @@ contains ! Copy plot color type and initialize all colors randomly temp_str = "cell" if (check_for_node(node_plot, "color")) & - call get_node_value(node_plot, "color", temp_str) + call get_node_value(node_plot, "color", temp_str) temp_str = to_lower(temp_str) select case (trim(temp_str)) case ("cell") @@ -3452,7 +3452,7 @@ contains ! Ensure that there is a linewidth for this meshlines specification if (check_for_node(node_meshlines, "linewidth")) then call get_node_value(node_meshlines, "linewidth", & - pl % meshlines_width) + pl % meshlines_width) else call fatal_error("Must specify a linewidth for meshlines & &specification in plot " // trim(to_str(pl % id))) @@ -3468,7 +3468,7 @@ contains end if call get_node_array(node_meshlines, "color", & - pl % meshlines_color % rgb) + pl % meshlines_color % rgb) else pl % meshlines_color % rgb = (/ 0, 0, 0 /) @@ -3494,8 +3494,8 @@ contains end if i_mesh = cmfd_tallies(1) % & - filters(cmfd_tallies(1) % find_filter(FILTER_MESH)) % & - int_bins(1) + filters(cmfd_tallies(1) % find_filter(FILTER_MESH)) % & + int_bins(1) pl % meshlines_mesh => meshes(i_mesh) case ('entropy') @@ -3654,9 +3654,9 @@ contains ! Check if cross_sections.xml exists inquire(FILE=path_cross_sections, EXIST=file_exists) if (.not. file_exists) then - ! Could not find cross_sections.xml file - call fatal_error("Cross sections XML file '" & - &// trim(path_cross_sections) // "' does not exist!") + ! Could not find cross_sections.xml file + call fatal_error("Cross sections XML file '" & + &// trim(path_cross_sections) // "' does not exist!") end if call write_message("Reading cross sections XML file...", 5) @@ -3665,28 +3665,28 @@ contains call open_xmldoc(doc, path_cross_sections) if (check_for_node(doc, "directory")) then - ! Copy directory information if present - call get_node_value(doc, "directory", directory) + ! Copy directory information if present + call get_node_value(doc, "directory", directory) else - ! If no directory is listed in cross_sections.xml, by default select the - ! directory in which the cross_sections.xml file resides - i = index(path_cross_sections, "/", BACK=.true.) - directory = path_cross_sections(1:i) + ! If no directory is listed in cross_sections.xml, by default select the + ! directory in which the cross_sections.xml file resides + i = index(path_cross_sections, "/", BACK=.true.) + directory = path_cross_sections(1:i) end if ! determine whether binary/ascii temp_str = '' if (check_for_node(doc, "filetype")) & - call get_node_value(doc, "filetype", temp_str) + call get_node_value(doc, "filetype", temp_str) if (trim(temp_str) == 'ascii') then - filetype = ASCII + filetype = ASCII elseif (trim(temp_str) == 'binary') then - filetype = BINARY + filetype = BINARY elseif (len_trim(temp_str) == 0) then - filetype = ASCII + filetype = ASCII else - call fatal_error("Unknown filetype in cross_sections.xml: " & - &// trim(temp_str)) + call fatal_error("Unknown filetype in cross_sections.xml: " & + &// trim(temp_str)) end if ! copy default record length and entries for binary files @@ -3701,83 +3701,83 @@ contains ! Allocate xs_listings array if (n_listings == 0) then - call fatal_error("No ACE table listings present in cross_sections.xml & - &file!") + call fatal_error("No ACE table listings present in cross_sections.xml & + &file!") else - allocate(xs_listings(n_listings)) + allocate(xs_listings(n_listings)) end if do i = 1, n_listings - listing => xs_listings(i) + listing => xs_listings(i) - ! Get pointer to ace table XML node - call get_list_item(node_ace_list, i, node_ace) + ! Get pointer to ace table XML node + call get_list_item(node_ace_list, i, node_ace) - ! copy a number of attributes - call get_node_value(node_ace, "name", listing % name) - if (check_for_node(node_ace, "alias")) & - call get_node_value(node_ace, "alias", listing % alias) - call get_node_value(node_ace, "zaid", listing % zaid) - call get_node_value(node_ace, "awr", listing % awr) - if (check_for_node(node_ace, "temperature")) & - call get_node_value(node_ace, "temperature", listing % kT) - call get_node_value(node_ace, "location", listing % location) + ! copy a number of attributes + call get_node_value(node_ace, "name", listing % name) + if (check_for_node(node_ace, "alias")) & + call get_node_value(node_ace, "alias", listing % alias) + call get_node_value(node_ace, "zaid", listing % zaid) + call get_node_value(node_ace, "awr", listing % awr) + if (check_for_node(node_ace, "temperature")) & + call get_node_value(node_ace, "temperature", listing % kT) + call get_node_value(node_ace, "location", listing % location) - ! determine type of cross section - if (ends_with(listing % name, 'c')) then - listing % type = ACE_NEUTRON - elseif (ends_with(listing % name, 't')) then - listing % type = ACE_THERMAL - end if + ! determine type of cross section + if (ends_with(listing % name, 'c')) then + listing % type = ACE_NEUTRON + elseif (ends_with(listing % name, 't')) then + listing % type = ACE_THERMAL + end if - ! set filetype, record length, and number of entries - if (check_for_node(node_ace, "filetype")) then - temp_str = '' - call get_node_value(node_ace, "filetype", temp_str) - if (temp_str == 'ascii') then - listing % filetype = ASCII - else if (temp_str == 'binary') then - listing % filetype = BINARY - end if - else - listing % filetype = filetype - end if + ! set filetype, record length, and number of entries + if (check_for_node(node_ace, "filetype")) then + temp_str = '' + call get_node_value(node_ace, "filetype", temp_str) + if (temp_str == 'ascii') then + listing % filetype = ASCII + else if (temp_str == 'binary') then + listing % filetype = BINARY + end if + else + listing % filetype = filetype + end if - ! Set record length and entries for binary files - if (filetype == BINARY) then - listing % recl = recl - listing % entries = entries - end if + ! Set record length and entries for binary files + if (filetype == BINARY) then + listing % recl = recl + listing % entries = entries + end if - ! determine metastable state - if (.not.check_for_node(node_ace, "metastable")) then - listing % metastable = .false. - else - listing % metastable = .true. - end if + ! determine metastable state + if (.not.check_for_node(node_ace, "metastable")) then + listing % metastable = .false. + else + listing % metastable = .true. + end if - ! determine path of cross section table - if (check_for_node(node_ace, "path")) then - call get_node_value(node_ace, "path", temp_str) - else - call fatal_error("Path missing for isotope " // listing % name) - end if + ! determine path of cross section table + if (check_for_node(node_ace, "path")) then + call get_node_value(node_ace, "path", temp_str) + else + call fatal_error("Path missing for isotope " // listing % name) + end if - if (starts_with(temp_str, '/')) then - listing % path = trim(temp_str) - else - if (ends_with(directory,'/')) then - listing % path = trim(directory) // trim(temp_str) - else - listing % path = trim(directory) // '/' // trim(temp_str) - end if - end if + if (starts_with(temp_str, '/')) then + listing % path = trim(temp_str) + else + if (ends_with(directory,'/')) then + listing % path = trim(directory) // trim(temp_str) + else + listing % path = trim(directory) // '/' // trim(temp_str) + end if + end if - ! create dictionary entry for both name and alias - call xs_listing_dict % add_key(to_lower(listing % name), i) - if (check_for_node(node_ace, "alias")) then - call xs_listing_dict % add_key(to_lower(listing % alias), i) - end if + ! create dictionary entry for both name and alias + call xs_listing_dict % add_key(to_lower(listing % name), i) + if (check_for_node(node_ace, "alias")) then + call xs_listing_dict % add_key(to_lower(listing % alias), i) + end if end do ! Check that 0K nuclides are listed in the cross_sections.xml file diff --git a/src/list_header.F90 b/src/list_header.F90 index a9311ec64a..8020b96b17 100644 --- a/src/list_header.F90 +++ b/src/list_header.F90 @@ -45,7 +45,7 @@ module list_header private integer :: count = 0 ! Number of elements in list - ! Used in get_item for fast sequential lookups + ! Used in get_item for fast sequential lookups integer :: last_index = huge(0) type(ListElemInt), pointer :: last_elem => null() @@ -67,7 +67,7 @@ module list_header private integer :: count = 0 ! Number of elements in list - ! Used in get_item for fast sequential lookups + ! Used in get_item for fast sequential lookups integer :: last_index = huge(0) type(ListElemReal), pointer :: last_elem => null() @@ -89,7 +89,7 @@ module list_header private integer :: count = 0 ! Number of elements in list - ! Used in get_item for fast sequential lookups + ! Used in get_item for fast sequential lookups integer :: last_index = huge(0) type(ListElemChar), pointer :: last_elem => null() @@ -198,7 +198,7 @@ contains type(ListElemInt), pointer :: current => null() type(ListElemInt), pointer :: next => null() - + if (this % count > 0) then current => this % head do while (associated(current)) @@ -224,7 +224,7 @@ contains type(ListElemReal), pointer :: current => null() type(ListElemReal), pointer :: next => null() - + if (this % count > 0) then current => this % head do while (associated(current)) @@ -250,7 +250,7 @@ contains type(ListElemChar), pointer :: current => null() type(ListElemChar), pointer :: next => null() - + if (this % count > 0) then current => this % head do while (associated(current)) @@ -518,7 +518,7 @@ contains ! Allocate new element allocate(new_elem) new_elem % data = data - + ! Put it before the i-th element new_elem % prev => elem % prev new_elem % next => elem @@ -573,7 +573,7 @@ contains ! Allocate new element allocate(new_elem) new_elem % data = data - + ! Put it before the i-th element new_elem % prev => elem % prev new_elem % next => elem @@ -628,7 +628,7 @@ contains ! Allocate new element allocate(new_elem) new_elem % data = data - + ! Put it before the i-th element new_elem % prev => elem % prev new_elem % next => elem diff --git a/src/math.F90 b/src/math.F90 index 58406bda18..826172fa24 100644 --- a/src/math.F90 +++ b/src/math.F90 @@ -143,20 +143,20 @@ contains pnx = 7.875_8 * (x ** 5) - 8.75_8 * x * x * x + 1.875 * x case(6) pnx = 14.4375_8 * (x ** 6) - 19.6875_8 * (x ** 4) + & - 6.5625_8 * x * x - 0.3125_8 + 6.5625_8 * x * x - 0.3125_8 case(7) pnx = 26.8125_8 * (x ** 7) - 43.3125_8 * (x ** 5) + & - 19.6875_8 * x * x * x - 2.1875_8 * x + 19.6875_8 * x * x * x - 2.1875_8 * x case(8) pnx = 50.2734375_8 * (x ** 8) - 93.84375_8 * (x ** 6) + & - 54.140625 * (x ** 4) - 9.84375_8 * x * x + 0.2734375_8 + 54.140625 * (x ** 4) - 9.84375_8 * x * x + 0.2734375_8 case(9) pnx = 94.9609375_8 * (x ** 9) - 201.09375_8 * (x ** 7) + & - 140.765625_8 * (x ** 5) - 36.09375_8 * x * x * x + 2.4609375_8 * x + 140.765625_8 * (x ** 5) - 36.09375_8 * x * x * x + 2.4609375_8 * x case(10) pnx = 180.42578125_8 * (x ** 10) - 427.32421875_8 * (x ** 8) + & - 351.9140625_8 * (x ** 6) - 117.3046875_8 * (x ** 4) + & - 13.53515625_8 * x * x - 0.24609375_8 + 351.9140625_8 * (x ** 6) - 117.3046875_8 * (x ** 4) + & + 13.53515625_8 * x * x - 0.24609375_8 case default pnx = ONE ! correct for case(0), incorrect for the rest end select @@ -215,12 +215,12 @@ contains rn(2) = 1.93649167310371_8 * w*(w2m1) * sin(TWO*phi) ! l = 3, m = -1 rn(3) = 0.408248290463863_8*sqrt(w2m1)*((15.0_8/TWO)*w**2 - THREE/TWO) * & - sin(phi) + sin(phi) ! l = 3, m = 0 rn(4) = 2.5_8 * w**3 - 1.5_8 * w ! l = 3, m = 1 rn(5) = 0.408248290463863_8*sqrt(w2m1)*((15.0_8/TWO)*w**2 - THREE/TWO) * & - cos(phi) + cos(phi) ! l = 3, m = 2 rn(6) = 1.93649167310371_8 * w*(w2m1) * cos(TWO*phi) ! l = 3, m = 3 @@ -232,18 +232,18 @@ contains rn(2) = 2.09165006633519_8 * w*(w2m1)**(THREE/TWO) * sin(THREE* phi) ! l = 4, m = -2 rn(3) = 0.074535599249993_8 * (w2m1)*((105.0_8/TWO)*w**2 - 15.0_8/TWO) * & - sin(TWO*phi) + sin(TWO*phi) ! l = 4, m = -1 - rn(4) = 0.316227766016838_8*sqrt(w2m1)*((35.0_8/TWO)*w**3 - 15.0_8/TWO*w) * & - sin(phi) + rn(4) = 0.316227766016838_8*sqrt(w2m1)*((35.0_8/TWO)*w**3 - 15.0_8/TWO*w)& + * sin(phi) ! l = 4, m = 0 rn(5) = 4.375_8 * w**4 - 3.75_8 * w**2 + 0.375_8 ! l = 4, m = 1 - rn(6) = 0.316227766016838_8*sqrt(w2m1)*((35.0_8/TWO)*w**3 - 15.0_8/TWO*w) * & - cos(phi) + rn(6) = 0.316227766016838_8*sqrt(w2m1)*((35.0_8/TWO)*w**3 - 15.0_8/TWO*w)& + * cos(phi) ! l = 4, m = 2 rn(7) = 0.074535599249993_8 * (w2m1)*((105.0_8/TWO)*w**2 - 15.0_8/TWO) * & - cos(TWO*phi) + cos(TWO*phi) ! l = 4, m = 3 rn(8) = 2.09165006633519_8 * w*(w2m1)**(THREE/TWO) * cos(THREE* phi) ! l = 4, m = 4 @@ -255,24 +255,26 @@ contains rn(2) = 2.21852991866236_8 * w*(w2m1)**2 * sin(4.0_8*phi) ! l = 5, m = -3 rn(3) = 0.00996023841111995_8 * (w2m1)**(THREE/TWO)* & - ((945.0_8 /TWO)*w**2 - 105.0_8/TWO) * sin(THREE*phi) + ((945.0_8 /TWO)*w**2 - 105.0_8/TWO) * sin(THREE*phi) ! l = 5, m = -2 - rn(4) = 0.0487950036474267_8 * (w2m1)*((315.0_8/TWO)*w**3 - 105.0_8/TWO*w) * & - sin(TWO*phi) + rn(4) = 0.0487950036474267_8 * (w2m1) & + * ((315.0_8/TWO)*w**3 - 105.0_8/TWO*w) * sin(TWO*phi) ! l = 5, m = -1 rn(5) = 0.258198889747161_8*sqrt(w2m1)* & - ((315.0_8/8.0_8)*w**4 - 105.0_8/4.0_8 * w**2 + 15.0_8/8.0_8) * sin(phi) + ((315.0_8/8.0_8)*w**4 - 105.0_8/4.0_8 * w**2 + 15.0_8/8.0_8) & + * sin(phi) ! l = 5, m = 0 rn(6) = 7.875_8 * w**5 - 8.75_8 * w**3 + 1.875_8 * w ! l = 5, m = 1 rn(7) = 0.258198889747161_8*sqrt(w2m1)* & - ((315.0_8/8.0_8)*w**4 - 105.0_8/4.0_8 * w**2 + 15.0_8/8.0_8) * cos(phi) + ((315.0_8/8.0_8)*w**4 - 105.0_8/4.0_8 * w**2 + 15.0_8/8.0_8) & + * cos(phi) ! l = 5, m = 2 rn(8) = 0.0487950036474267_8 * (w2m1)* & - ((315.0_8/TWO)*w**3 - 105.0_8/TWO*w) * cos(TWO*phi) + ((315.0_8/TWO)*w**3 - 105.0_8/TWO*w) * cos(TWO*phi) ! l = 5, m = 3 rn(9) = 0.00996023841111995_8 * (w2m1)**(THREE/TWO)* & - ((945.0_8 /TWO)*w**2 - 105.0_8/TWO) * cos(THREE*phi) + ((945.0_8 /TWO)*w**2 - 105.0_8/TWO) * cos(THREE*phi) ! l = 5, m = 4 rn(10) = 2.21852991866236_8 * w*(w2m1)**2 * cos(4.0_8*phi) ! l = 5, m = 5 @@ -284,30 +286,34 @@ contains rn(2) = 2.32681380862329_8 * w*(w2m1)**(5.0_8/TWO) * sin(5.0_8*phi) ! l = 6, m = -4 rn(3) = 0.00104990131391452_8 * (w2m1)**2 * & - ((10395.0_8/TWO)*w**2 - 945.0_8/TWO) * sin(4.0_8*phi) + ((10395.0_8/TWO)*w**2 - 945.0_8/TWO) * sin(4.0_8*phi) ! l = 6, m = -3 rn(4) = 0.00575054632785295_8 * (w2m1)**(THREE/TWO) * & - ((3465.0_8/TWO)*w**3 - 945.0_8/TWO*w) * sin(THREE*phi) + ((3465.0_8/TWO)*w**3 - 945.0_8/TWO*w) * sin(THREE*phi) ! l = 6, m = -2 rn(5) = 0.0345032779671177_8 * (w2m1) * & - ((3465.0_8/8.0_8)*w**4 - 945.0_8/4.0_8 * w**2 + 105.0_8/8.0_8) * sin(TWO*phi) + ((3465.0_8/8.0_8)*w**4 - 945.0_8/4.0_8 * w**2 + 105.0_8/8.0_8) & + * sin(TWO*phi) ! l = 6, m = -1 rn(6) = 0.218217890235992_8*sqrt(w2m1) * & - ((693.0_8/8.0_8)*w**5- 315.0_8/4.0_8 * w**3 + (105.0_8/8.0_8)*w) * sin(phi) + ((693.0_8/8.0_8)*w**5- 315.0_8/4.0_8 * w**3 + (105.0_8/8.0_8)*w) & + * sin(phi) ! l = 6, m = 0 rn(7) = 14.4375_8 * w**6 - 19.6875_8 * w**4 + 6.5625_8 * w**2 - 0.3125_8 ! l = 6, m = 1 rn(8) = 0.218217890235992_8*sqrt(w2m1) * & - ((693.0_8/8.0_8)*w**5- 315.0_8/4.0_8 * w**3 + (105.0_8/8.0_8)*w) * cos(phi) + ((693.0_8/8.0_8)*w**5- 315.0_8/4.0_8 * w**3 + (105.0_8/8.0_8)*w) & + * cos(phi) ! l = 6, m = 2 rn(9) = 0.0345032779671177_8 * (w2m1) * & - ((3465.0_8/8.0_8)*w**4 -945.0_8/4.0_8 * w**2 + 105.0_8/8.0_8) * cos(TWO*phi) + ((3465.0_8/8.0_8)*w**4 -945.0_8/4.0_8 * w**2 + 105.0_8/8.0_8) & + * cos(TWO*phi) ! l = 6, m = 3 rn(10) = 0.00575054632785295_8 * (w2m1)**(THREE/TWO) * & - ((3465.0_8/TWO)*w**3 - 945.0_8/TWO*w) * cos(THREE*phi) + ((3465.0_8/TWO)*w**3 - 945.0_8/TWO*w) * cos(THREE*phi) ! l = 6, m = 4 rn(11) = 0.00104990131391452_8 * (w2m1)**2 * & - ((10395.0_8/TWO)*w**2 - 945.0_8/TWO) * cos(4.0_8*phi) + ((10395.0_8/TWO)*w**2 - 945.0_8/TWO) * cos(4.0_8*phi) ! l = 6, m = 5 rn(12) = 2.32681380862329_8 * w*(w2m1)**(5.0_8/TWO) * cos(5.0_8*phi) ! l = 6, m = 6 @@ -319,42 +325,43 @@ contains rn(2) = 2.42182459624969_8 * w*(w2m1)**3 * sin(6.0_8*phi) ! l = 7, m = -5 rn(3) = 9.13821798555235d-5*(w2m1)**(5.0_8/TWO)* & - ((135135.0_8/TWO)*w**2 - 10395.0_8/TWO) * sin(5.0_8*phi) + ((135135.0_8/TWO)*w**2 - 10395.0_8/TWO) * sin(5.0_8*phi) ! l = 7, m = -4 rn(4) = 0.000548293079133141_8 * (w2m1)**2* & - ((45045.0_8/TWO)*w**3 - 10395.0_8/TWO*w) * sin(4.0_8*phi) + ((45045.0_8/TWO)*w**3 - 10395.0_8/TWO*w) * sin(4.0_8*phi) ! l = 7, m = -3 rn(5) = 0.00363696483726654_8 * (w2m1)**(THREE/TWO)* & - ((45045.0_8/8.0_8)*w**4 - 10395.0_8/4.0_8 * w**2 + 945.0_8/8.0_8)* & - sin(THREE*phi) + ((45045.0_8/8.0_8)*w**4 - 10395.0_8/4.0_8 * w**2 + 945.0_8/8.0_8)* & + sin(THREE*phi) ! l = 7, m = -2 rn(6) = 0.025717224993682_8 * (w2m1)* & - ((9009.0_8/8.0_8)*w**5 -3465.0_8/4.0_8 * w**3 + (945.0_8/8.0_8)*w)* & - sin(TWO*phi) + ((9009.0_8/8.0_8)*w**5 -3465.0_8/4.0_8 * w**3 + (945.0_8/8.0_8)*w)* & + sin(TWO*phi) ! l = 7, m = -1 rn(7) = 0.188982236504614_8*sqrt(w2m1)* & - ((3003.0_8/16.0_8)*w**6 - 3465.0_8/16.0_8 * w**4 + & - (945.0_8/16.0_8)*w**2 - 35.0_8/16.0_8) * sin(phi) + ((3003.0_8/16.0_8)*w**6 - 3465.0_8/16.0_8 * w**4 + & + (945.0_8/16.0_8)*w**2 - 35.0_8/16.0_8) * sin(phi) ! l = 7, m = 0 - rn(8) = 26.8125_8 * w**7 - 43.3125_8 * w**5 + 19.6875_8 * w**3 -2.1875_8 * w + rn(8) = 26.8125_8 * w**7 - 43.3125_8 * w**5 + 19.6875_8 * w**3 -2.1875_8 & + * w ! l = 7, m = 1 rn(9) = 0.188982236504614_8*sqrt(w2m1)* & - ((3003.0_8/16.0_8)*w**6 - 3465.0_8/16.0_8 * w**4 + & - (945.0_8/16.0_8)*w**2 - 35.0_8/16.0_8) * cos(phi) + ((3003.0_8/16.0_8)*w**6 - 3465.0_8/16.0_8 * w**4 + & + (945.0_8/16.0_8)*w**2 - 35.0_8/16.0_8) * cos(phi) ! l = 7, m = 2 rn(10) = 0.025717224993682_8 * (w2m1)* & - ((9009.0_8/8.0_8)*w**5 -3465.0_8/4.0_8 * w**3 + (945.0_8/8.0_8)*w)* & - cos(TWO*phi) + ((9009.0_8/8.0_8)*w**5 -3465.0_8/4.0_8 * w**3 + (945.0_8/8.0_8)*w)* & + cos(TWO*phi) ! l = 7, m = 3 rn(11) = 0.00363696483726654_8 * (w2m1)**(THREE/TWO)* & - ((45045.0_8/8.0_8)*w**4 - 10395.0_8/4.0_8 * w**2 + 945.0_8/8.0_8)* & - cos(THREE*phi) + ((45045.0_8/8.0_8)*w**4 - 10395.0_8/4.0_8 * w**2 + 945.0_8/8.0_8)* & + cos(THREE*phi) ! l = 7, m = 4 rn(12) = 0.000548293079133141_8 * (w2m1)**2 * & - ((45045.0_8/TWO)*w**3 - 10395.0_8/TWO*w) * cos(4.0_8*phi) + ((45045.0_8/TWO)*w**3 - 10395.0_8/TWO*w) * cos(4.0_8*phi) ! l = 7, m = 5 rn(13) = 9.13821798555235d-5*(w2m1)**(5.0_8/TWO)* & - ((135135.0_8/TWO)*w**2 - 10395.0_8/TWO) * cos(5.0_8*phi) + ((135135.0_8/TWO)*w**2 - 10395.0_8/TWO) * cos(5.0_8*phi) ! l = 7, m = 6 rn(14) = 2.42182459624969_8 * w*(w2m1)**3 * cos(6.0_8*phi) ! l = 7, m = 7 @@ -366,48 +373,50 @@ contains rn(2) = 2.50682661696018_8 * w*(w2m1)**(7.0_8/TWO) * sin(7.0_8*phi) ! l = 8, m = -6 rn(3) = 6.77369783729086d-6*(w2m1)**3* & - ((2027025.0_8/TWO)*w**2 - 135135.0_8/TWO) * sin(6.0_8*phi) + ((2027025.0_8/TWO)*w**2 - 135135.0_8/TWO) * sin(6.0_8*phi) ! l = 8, m = -5 rn(4) = 4.38985792528482d-5*(w2m1)**(5.0_8/TWO)* & - ((675675.0_8/TWO)*w**3 - 135135.0_8/TWO*w) * sin(5.0_8*phi) + ((675675.0_8/TWO)*w**3 - 135135.0_8/TWO*w) * sin(5.0_8*phi) ! l = 8, m = -4 rn(5) = 0.000316557156832328_8 * (w2m1)**2* & - ((675675.0_8/8.0_8)*w**4 - 135135.0_8/4.0_8 * w**2 + 10395.0_8/8.0_8) * sin(4.0_8*phi) + ((675675.0_8/8.0_8)*w**4 - 135135.0_8/4.0_8 * w**2 & + + 10395.0_8/8.0_8) * sin(4.0_8*phi) ! l = 8, m = -3 rn(6) = 0.00245204119306875_8 * (w2m1)**(THREE/TWO)* & - ((135135.0_8/8.0_8)*w**5 - 45045.0_8/4.0_8 * w**3 + (10395.0_8/8.0_8)*w) * sin(THREE*phi) + ((135135.0_8/8.0_8)*w**5 - 45045.0_8/4.0_8 * w**3 & + + (10395.0_8/8.0_8)*w) * sin(THREE*phi) ! l = 8, m = -2 rn(7) = 0.0199204768222399_8 * (w2m1)* & - ((45045.0_8/16.0_8)*w**6- 45045.0_8/16.0_8 * w**4 + & - (10395.0_8/16.0_8)*w**2 - 315.0_8/16.0_8) * sin(TWO*phi) + ((45045.0_8/16.0_8)*w**6- 45045.0_8/16.0_8 * w**4 + & + (10395.0_8/16.0_8)*w**2 - 315.0_8/16.0_8) * sin(TWO*phi) ! l = 8, m = -1 rn(8) = 0.166666666666667_8*sqrt(w2m1)* & - ((6435.0_8/16.0_8)*w**7 - 9009.0_8/16.0_8 * w**5 + & - (3465.0_8/16.0_8)*w**3 - 315.0_8/16.0_8 * w) * sin(phi) + ((6435.0_8/16.0_8)*w**7 - 9009.0_8/16.0_8 * w**5 + & + (3465.0_8/16.0_8)*w**3 - 315.0_8/16.0_8 * w) * sin(phi) ! l = 8, m = 0 rn(9) = 50.2734375_8 * w**8 - 93.84375_8 * w**6 + 54.140625_8 * w**4 -& - 9.84375_8 * w**2 + 0.2734375_8 + 9.84375_8 * w**2 + 0.2734375_8 ! l = 8, m = 1 rn(10) = 0.166666666666667_8*sqrt(w2m1)* & - ((6435.0_8/16.0_8)*w**7 - 9009.0_8/16.0_8 * w**5 + & - (3465.0_8/16.0_8)*w**3 - 315.0_8/16.0_8 * w) * cos(phi) + ((6435.0_8/16.0_8)*w**7 - 9009.0_8/16.0_8 * w**5 + & + (3465.0_8/16.0_8)*w**3 - 315.0_8/16.0_8 * w) * cos(phi) ! l = 8, m = 2 rn(11) = 0.0199204768222399_8 * (w2m1)*((45045.0_8/16.0_8)*w**6- & - 45045.0_8/16.0_8 * w**4 + (10395.0_8/16.0_8)*w**2 - & - 315.0_8/16.0_8) * cos(TWO*phi) + 45045.0_8/16.0_8 * w**4 + (10395.0_8/16.0_8)*w**2 - & + 315.0_8/16.0_8) * cos(TWO*phi) ! l = 8, m = 3 rn(12) = 0.00245204119306875_8 * (w2m1)**(THREE/TWO)* & - ((135135.0_8/8.0_8)*w**5 - 45045.0_8/4.0_8 * w**3 + & - (10395.0_8/8.0_8)*w) * cos(THREE*phi) + ((135135.0_8/8.0_8)*w**5 - 45045.0_8/4.0_8 * w**3 + & + (10395.0_8/8.0_8)*w) * cos(THREE*phi) ! l = 8, m = 4 rn(13) = 0.000316557156832328_8 * (w2m1)**2*((675675.0_8/8.0_8)*w**4 - & - 135135.0_8/4.0_8 * w**2 + 10395.0_8/8.0_8) * cos(4.0_8*phi) + 135135.0_8/4.0_8 * w**2 + 10395.0_8/8.0_8) * cos(4.0_8*phi) ! l = 8, m = 5 - rn(14) = 4.38985792528482d-5*(w2m1)**(5.0_8/TWO)*((675675.0_8/TWO)*w**3 - & - 135135.0_8/TWO*w) * cos(5.0_8*phi) + rn(14) = 4.38985792528482d-5*(w2m1)**(5.0_8/TWO)*((675675.0_8/TWO)*w**3 -& + 135135.0_8/TWO*w) * cos(5.0_8*phi) ! l = 8, m = 6 rn(15) = 6.77369783729086d-6*(w2m1)**3*((2027025.0_8/TWO)*w**2 - & - 135135.0_8/TWO) * cos(6.0_8*phi) + 135135.0_8/TWO) * cos(6.0_8*phi) ! l = 8, m = 7 rn(16) = 2.50682661696018_8 * w*(w2m1)**(7.0_8/TWO) * cos(7.0_8*phi) ! l = 8, m = 8 @@ -419,54 +428,56 @@ contains rn(2) = 2.58397773170915_8 * w*(w2m1)**4 * sin(8.0_8*phi) ! l = 9, m = -7 rn(3) = 4.37240315267812d-7*(w2m1)**(7.0_8/TWO)* & - ((34459425.0_8/TWO)*w**2 - 2027025.0_8/TWO) * sin(7.0_8*phi) + ((34459425.0_8/TWO)*w**2 - 2027025.0_8/TWO) * sin(7.0_8*phi) ! l = 9, m = -6 rn(4) = 3.02928976464514d-6*(w2m1)**3* & - ((11486475.0_8/TWO)*w**3 - 2027025.0_8/TWO*w) * sin(6.0_8*phi) + ((11486475.0_8/TWO)*w**3 - 2027025.0_8/TWO*w) * sin(6.0_8*phi) ! l = 9, m = -5 rn(5) = 2.34647776186144d-5*(w2m1)**(5.0_8/TWO)* & - ((11486475.0_8/8.0_8)*w**4 - 2027025.0_8/4.0_8 * w**2 + & - 135135.0_8/8.0_8) * sin(5.0_8*phi) + ((11486475.0_8/8.0_8)*w**4 - 2027025.0_8/4.0_8 * w**2 + & + 135135.0_8/8.0_8) * sin(5.0_8*phi) ! l = 9, m = -4 rn(6) = 0.000196320414650061_8 * (w2m1)**2*((2297295.0_8/8.0_8)*w**5 - & - 675675.0_8/4.0_8 * w**3 + (135135.0_8/8.0_8)*w) * sin(4.0_8*phi) + 675675.0_8/4.0_8 * w**3 + (135135.0_8/8.0_8)*w) * sin(4.0_8*phi) ! l = 9, m = -3 rn(7) = 0.00173385495536766_8 * (w2m1)**(THREE/TWO)* & - ((765765.0_8/16.0_8)*w**6 - 675675.0_8/16.0_8 * w**4 + & - (135135.0_8/16.0_8)*w**2 - 3465.0_8/16.0_8) * sin(THREE*phi) + ((765765.0_8/16.0_8)*w**6 - 675675.0_8/16.0_8 * w**4 + & + (135135.0_8/16.0_8)*w**2 - 3465.0_8/16.0_8) * sin(THREE*phi) ! l = 9, m = -2 rn(8) = 0.0158910431540932_8 * (w2m1)*((109395.0_8/16.0_8)*w**7- & - 135135.0_8/16.0_8 * w**5 + (45045.0_8/16.0_8)*w**3 - 3465.0_8/16.0_8 * w)* & - sin(TWO*phi) + 135135.0_8/16.0_8 * w**5 + (45045.0_8/16.0_8)*w**3 & + - 3465.0_8/16.0_8 * w) * sin(TWO*phi) ! l = 9, m = -1 rn(9) = 0.149071198499986_8*sqrt(w2m1)*((109395.0_8/128.0_8)*w**8 - & - 45045.0_8/32.0_8 * w**6 + (45045.0_8/64.0_8)*w**4 - 3465.0_8/32.0_8 * w**2 + 315.0_8/128.0_8) * sin(phi) + 45045.0_8/32.0_8 * w**6 + (45045.0_8/64.0_8)*w**4 - 3465.0_8/32.0_8 & + * w**2 + 315.0_8/128.0_8) * sin(phi) ! l = 9, m = 0 rn(10) = 94.9609375_8 * w**9 - 201.09375_8 * w**7 + 140.765625_8 * w**5- & - 36.09375_8 * w**3 + 2.4609375_8 * w + 36.09375_8 * w**3 + 2.4609375_8 * w ! l = 9, m = 1 rn(11) = 0.149071198499986_8*sqrt(w2m1)*((109395.0_8/128.0_8)*w**8 - & - 45045.0_8/32.0_8 * w**6 + (45045.0_8/64.0_8)*w**4 -3465.0_8/32.0_8 * w**2 + 315.0_8/128.0_8) * cos(phi) + 45045.0_8/32.0_8 * w**6 + (45045.0_8/64.0_8)*w**4 -3465.0_8/32.0_8 & + * w**2 + 315.0_8/128.0_8) * cos(phi) ! l = 9, m = 2 rn(12) = 0.0158910431540932_8 * (w2m1)*((109395.0_8/16.0_8)*w**7 - & - 135135.0_8/16.0_8 * w**5 + (45045.0_8/16.0_8)*w**3 - 3465.0_8/ 16.0_8 * w) * & - cos(TWO*phi) + 135135.0_8/16.0_8 * w**5 + (45045.0_8/16.0_8)*w**3 & + - 3465.0_8/ 16.0_8 * w) * cos(TWO*phi) ! l = 9, m = 3 - rn(13) = 0.00173385495536766_8 * (w2m1)**(THREE/TWO)*((765765.0_8/16.0_8)*w**6 - & - 675675.0_8/16.0_8 * w**4 + (135135.0_8/16.0_8)*w**2 - 3465.0_8/16.0_8)* & - cos(THREE*phi) + rn(13) = 0.00173385495536766_8 * (w2m1)**(THREE/TWO)*((765765.0_8/16.0_8)& + *w**6 - 675675.0_8/16.0_8 * w**4 + (135135.0_8/16.0_8)*w**2 & + - 3465.0_8/16.0_8)* cos(THREE*phi) ! l = 9, m = 4 rn(14) = 0.000196320414650061_8 * (w2m1)**2*((2297295.0_8/8.0_8)*w**5 - & - 675675.0_8/4.0_8 * w**3 + (135135.0_8/8.0_8)*w) * cos(4.0_8*phi) + 675675.0_8/4.0_8 * w**3 + (135135.0_8/8.0_8)*w) * cos(4.0_8*phi) ! l = 9, m = 5 rn(15) = 2.34647776186144d-5*(w2m1)**(5.0_8/TWO)*((11486475.0_8/8.0_8)* & - w**4 - 2027025.0_8/4.0_8 * w**2 + 135135.0_8/8.0_8) * cos(5.0_8*phi) + w**4 - 2027025.0_8/4.0_8 * w**2 + 135135.0_8/8.0_8) * cos(5.0_8*phi) ! l = 9, m = 6 rn(16) = 3.02928976464514d-6*(w2m1)**3*((11486475.0_8/TWO)*w**3 - & - 2027025.0_8/TWO*w) * cos(6.0_8*phi) + 2027025.0_8/TWO*w) * cos(6.0_8*phi) ! l = 9, m = 7 rn(17) = 4.37240315267812d-7*(w2m1)**(7.0_8/TWO)* & - ((34459425.0_8/TWO)*w**2 - 2027025.0_8/TWO) * cos(7.0_8*phi) + ((34459425.0_8/TWO)*w**2 - 2027025.0_8/TWO) * cos(7.0_8*phi) ! l = 9, m = 8 rn(18) = 2.58397773170915_8 * w*(w2m1)**4 * cos(8.0_8*phi) ! l = 9, m = 9 @@ -478,65 +489,65 @@ contains rn(2) = 2.65478475211798_8 * w*(w2m1)**(9.0_8/TWO) * sin(9.0_8*phi) ! l = 10, m = -8 rn(3) = 2.49953651452314d-8*(w2m1)**4*((654729075.0_8/TWO)*w**2 - & - 34459425.0_8/TWO) * sin(8.0_8*phi) + 34459425.0_8/TWO) * sin(8.0_8*phi) ! l = 10, m = -7 rn(4) = 1.83677671621093d-7*(w2m1)**(7.0_8/TWO)* & - ((218243025.0_8/TWO)*w**3 - 34459425.0_8/TWO*w) * sin(7.0_8*phi) + ((218243025.0_8/TWO)*w**3 - 34459425.0_8/TWO*w) * sin(7.0_8*phi) ! l = 10, m = -6 rn(5) = 1.51464488232257d-6*(w2m1)**3*((218243025.0_8/8.0_8)*w**4 - & - 34459425.0_8/4.0_8 * w**2 + 2027025.0_8/8.0_8) * sin(6.0_8*phi) + 34459425.0_8/4.0_8 * w**2 + 2027025.0_8/8.0_8) * sin(6.0_8*phi) ! l = 10, m = -5 rn(6) = 1.35473956745817d-5*(w2m1)**(5.0_8/TWO)* & - ((43648605.0_8/8.0_8)*w**5 - 11486475.0_8/4.0_8 * w**3 + & - (2027025.0_8/8.0_8)*w) * sin(5.0_8*phi) + ((43648605.0_8/8.0_8)*w**5 - 11486475.0_8/4.0_8 * w**3 + & + (2027025.0_8/8.0_8)*w) * sin(5.0_8*phi) ! l = 10, m = -4 rn(7) = 0.000128521880085575_8 * (w2m1)**2*((14549535.0_8/16.0_8)*w**6 - & - 11486475.0_8/16.0_8 * w**4 + (2027025.0_8/16.0_8)*w**2 - & - 45045.0_8/16.0_8) * sin(4.0_8*phi) + 11486475.0_8/16.0_8 * w**4 + (2027025.0_8/16.0_8)*w**2 - & + 45045.0_8/16.0_8) * sin(4.0_8*phi) ! l = 10, m = -3 rn(8) = 0.00127230170115096_8 * (w2m1)**(THREE/TWO)* & - ((2078505.0_8/16.0_8)*w**7 - 2297295.0_8/16.0_8 * w**5 + & - (675675.0_8/16.0_8)*w**3 - 45045.0_8/16.0_8 * w) * sin(THREE*phi) + ((2078505.0_8/16.0_8)*w**7 - 2297295.0_8/16.0_8 * w**5 + & + (675675.0_8/16.0_8)*w**3 - 45045.0_8/16.0_8 * w) * sin(THREE*phi) ! l = 10, m = -2 rn(9) = 0.012974982402692_8 * (w2m1)*((2078505.0_8/128.0_8)*w**8 - & - 765765.0_8/32.0_8 * w**6 + (675675.0_8/64.0_8)*w**4 - & - 45045.0_8/32.0_8 * w**2 + 3465.0_8/128.0_8) * sin(TWO*phi) + 765765.0_8/32.0_8 * w**6 + (675675.0_8/64.0_8)*w**4 - & + 45045.0_8/32.0_8 * w**2 + 3465.0_8/128.0_8) * sin(TWO*phi) ! l = 10, m = -1 rn(10) = 0.134839972492648_8*sqrt(w2m1)*((230945.0_8/128.0_8)*w**9 - & - 109395.0_8/32.0_8 * w**7 + (135135.0_8/64.0_8)*w**5 - & - 15015.0_8/32.0_8 * w**3 + (3465.0_8/128.0_8)*w) * sin(phi) + 109395.0_8/32.0_8 * w**7 + (135135.0_8/64.0_8)*w**5 - & + 15015.0_8/32.0_8 * w**3 + (3465.0_8/128.0_8)*w) * sin(phi) ! l = 10, m = 0 - rn(11) = 180.42578125_8 * w**10 - 427.32421875_8 * w**8 +351.9140625_8 * w**6 - & - 117.3046875_8 * w**4 + 13.53515625_8 * w**2 -0.24609375_8 + rn(11) = 180.42578125_8 * w**10 - 427.32421875_8 * w**8 +351.9140625_8 & + * w**6 - 117.3046875_8 * w**4 + 13.53515625_8 * w**2 -0.24609375_8 ! l = 10, m = 1 rn(12) = 0.134839972492648_8*sqrt(w2m1)*((230945.0_8/128.0_8)*w**9 - & - 109395.0_8/32.0_8 * w**7 + (135135.0_8/64.0_8)*w**5 -15015.0_8/ & - 32.0_8 * w**3 + (3465.0_8/128.0_8)*w) * cos(phi) + 109395.0_8/32.0_8 * w**7 + (135135.0_8/64.0_8)*w**5 -15015.0_8/ & + 32.0_8 * w**3 + (3465.0_8/128.0_8)*w) * cos(phi) ! l = 10, m = 2 rn(13) = 0.012974982402692_8 * (w2m1)*((2078505.0_8/128.0_8)*w**8 - & - 765765.0_8/32.0_8 * w**6 + (675675.0_8/64.0_8)*w**4 -& - 45045.0_8/32.0_8 * w**2 + 3465.0_8/128.0_8) * cos(TWO*phi) + 765765.0_8/32.0_8 * w**6 + (675675.0_8/64.0_8)*w**4 -& + 45045.0_8/32.0_8 * w**2 + 3465.0_8/128.0_8) * cos(TWO*phi) ! l = 10, m = 3 rn(14) = 0.00127230170115096_8 * (w2m1)**(THREE/TWO)* & - ((2078505.0_8/16.0_8)*w**7 - 2297295.0_8/16.0_8 * w**5 + & - (675675.0_8/16.0_8)*w**3 - 45045.0_8/16.0_8 * w) * cos(THREE*phi) + ((2078505.0_8/16.0_8)*w**7 - 2297295.0_8/16.0_8 * w**5 + & + (675675.0_8/16.0_8)*w**3 - 45045.0_8/16.0_8 * w) * cos(THREE*phi) ! l = 10, m = 4 - rn(15) = 0.000128521880085575_8 * (w2m1)**2*((14549535.0_8/16.0_8)*w**6 - & - 11486475.0_8/16.0_8 * w**4 + (2027025.0_8/16.0_8)*w**2 - & - 45045.0_8/16.0_8) * cos(4.0_8*phi) + rn(15) = 0.000128521880085575_8 * (w2m1)**2*((14549535.0_8/16.0_8)*w**6 -& + 11486475.0_8/16.0_8 * w**4 + (2027025.0_8/16.0_8)*w**2 - & + 45045.0_8/16.0_8) * cos(4.0_8*phi) ! l = 10, m = 5 rn(16) = 1.35473956745817d-5*(w2m1)**(5.0_8/TWO)* & - ((43648605.0_8/8.0_8)*w**5 - 11486475.0_8/4.0_8 * w**3 + & - (2027025.0_8/8.0_8)*w) * cos(5.0_8*phi) + ((43648605.0_8/8.0_8)*w**5 - 11486475.0_8/4.0_8 * w**3 + & + (2027025.0_8/8.0_8)*w) * cos(5.0_8*phi) ! l = 10, m = 6 rn(17) = 1.51464488232257d-6*(w2m1)**3*((218243025.0_8/8.0_8)*w**4 - & - 34459425.0_8/4.0_8 * w**2 + 2027025.0_8/8.0_8) * cos(6.0_8*phi) + 34459425.0_8/4.0_8 * w**2 + 2027025.0_8/8.0_8) * cos(6.0_8*phi) ! l = 10, m = 7 rn(18) = 1.83677671621093d-7*(w2m1)**(7.0_8/TWO)* & - ((218243025.0_8/TWO)*w**3 - 34459425.0_8/TWO*w) * cos(7.0_8*phi) + ((218243025.0_8/TWO)*w**3 - 34459425.0_8/TWO*w) * cos(7.0_8*phi) ! l = 10, m = 8 rn(19) = 2.49953651452314d-8*(w2m1)**4* & - ((654729075.0_8/TWO)*w**2 - 34459425.0_8/TWO) * cos(8.0_8*phi) + ((654729075.0_8/TWO)*w**2 - 34459425.0_8/TWO) * cos(8.0_8*phi) ! l = 10, m = 9 rn(20) = 2.65478475211798_8 * w*(w2m1)**(9.0_8/TWO) * cos(9.0_8*phi) ! l = 10, m = 10 diff --git a/src/matrix_header.F90 b/src/matrix_header.F90 index 116b6a962e..b2cd3b1291 100644 --- a/src/matrix_header.F90 +++ b/src/matrix_header.F90 @@ -11,19 +11,19 @@ module matrix_header integer, allocatable :: row(:) ! csr row vector integer, allocatable :: col(:) ! column vector real(8), allocatable :: val(:) ! matrix value vector - contains - procedure :: create => matrix_create - procedure :: destroy => matrix_destroy - procedure :: add_value => matrix_add_value - procedure :: new_row => matrix_new_row - procedure :: assemble => matrix_assemble - procedure :: get_row => matrix_get_row - procedure :: get_col => matrix_get_col - procedure :: vector_multiply => matrix_vector_multiply - procedure :: search_indices => matrix_search_indices - procedure :: write => matrix_write - procedure :: copy => matrix_copy - procedure :: transpose => matrix_transpose + contains + procedure :: create => matrix_create + procedure :: destroy => matrix_destroy + procedure :: add_value => matrix_add_value + procedure :: new_row => matrix_new_row + procedure :: assemble => matrix_assemble + procedure :: get_row => matrix_get_row + procedure :: get_col => matrix_get_col + procedure :: vector_multiply => matrix_vector_multiply + procedure :: search_indices => matrix_search_indices + procedure :: write => matrix_write + procedure :: copy => matrix_copy + procedure :: transpose => matrix_transpose end type matrix contains diff --git a/src/mpiio_interface.F90 b/src/mpiio_interface.F90 index cae01a68e9..b9652c8ae4 100644 --- a/src/mpiio_interface.F90 +++ b/src/mpiio_interface.F90 @@ -129,13 +129,13 @@ contains integer, intent(inout) :: buffer ! read data to here logical, intent(in) :: collect ! collective I/O - if (collect) then - call MPI_FILE_READ_ALL(fh, buffer, 1, MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_READ(fh, buffer, 1, MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - end if + if (collect) then + call MPI_FILE_READ_ALL(fh, buffer, 1, MPI_INTEGER, & + MPI_STATUS_IGNORE, mpiio_err) + else + call MPI_FILE_READ(fh, buffer, 1, MPI_INTEGER, & + MPI_STATUS_IGNORE, mpiio_err) + end if end subroutine mpi_read_integer @@ -341,13 +341,13 @@ contains real(8), intent(inout) :: buffer ! read data to here logical, intent(in) :: collect ! collective I/O - if (collect) then - call MPI_FILE_READ_ALL(fh, buffer, 1, MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_READ(fh, buffer, 1, MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - end if + if (collect) then + call MPI_FILE_READ_ALL(fh, buffer, 1, MPI_REAL8, & + MPI_STATUS_IGNORE, mpiio_err) + else + call MPI_FILE_READ(fh, buffer, 1, MPI_REAL8, & + MPI_STATUS_IGNORE, mpiio_err) + end if end subroutine mpi_read_double diff --git a/src/output.F90 b/src/output.F90 index 49908fed6c..cd08e46110 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1372,7 +1372,7 @@ contains if (cmfd_run) then write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" if (cmfd_display /= '') & - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" end if write(UNIT=ou, FMT=*) @@ -1432,20 +1432,20 @@ contains ! write out cmfd keff if it is active and other display info if (cmfd_on) then write(UNIT=OUTPUT_UNIT, FMT='(3X, F8.5)', ADVANCE='NO') & - cmfd % k_cmfd(current_batch) + cmfd % k_cmfd(current_batch) select case(trim(cmfd_display)) case('entropy') write(UNIT=OUTPUT_UNIT, FMT='(3X, F8.5)', ADVANCE='NO') & - cmfd % entropy(current_batch) + cmfd % entropy(current_batch) case('balance') write(UNIT=OUTPUT_UNIT, FMT='(3X, F8.5)', ADVANCE='NO') & - cmfd % balance(current_batch) + cmfd % balance(current_batch) case('source') write(UNIT=OUTPUT_UNIT, FMT='(3X, F8.5)', ADVANCE='NO') & - cmfd % src_cmp(current_batch) + cmfd % src_cmp(current_batch) case('dominance') write(UNIT=OUTPUT_UNIT, FMT='(3X, F8.5)', ADVANCE='NO') & - cmfd % dom(current_batch) + cmfd % dom(current_batch) end select end if @@ -1567,7 +1567,7 @@ contains speed_inactive = real(n_particles * (n_inactive - restart_batch) * & gen_per_batch) / time_inactive % elapsed speed_active = real(n_particles * n_active * gen_per_batch) / & - time_active % elapsed + time_active % elapsed else speed_inactive = ZERO speed_active = real(n_particles * (n_batches - restart_batch) * & @@ -1884,21 +1884,22 @@ contains select case(t % score_bins(k)) case (SCORE_SCATTER_N, SCORE_NU_SCATTER_N) score_name = 'P' // trim(to_str(t % moment_order(k))) // " " // & - score_names(abs(t % score_bins(k))) + score_names(abs(t % score_bins(k))) write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A,"+/- ",A)') & - repeat(" ", indent), score_name, & - to_str(t % results(score_index,filter_index) % sum), & - trim(to_str(t % results(score_index,filter_index) % sum_sq)) + repeat(" ", indent), score_name, & + to_str(t % results(score_index,filter_index) % sum), & + trim(to_str(t % results(score_index,filter_index) % sum_sq)) case (SCORE_SCATTER_PN, SCORE_NU_SCATTER_PN) score_index = score_index - 1 do n_order = 0, t % moment_order(k) score_index = score_index + 1 score_name = 'P' // trim(to_str(n_order)) // " " //& - score_names(abs(t % score_bins(k))) + score_names(abs(t % score_bins(k))) write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A,"+/- ",A)') & - repeat(" ", indent), score_name, & - to_str(t % results(score_index,filter_index) % sum), & - trim(to_str(t % results(score_index,filter_index) % sum_sq)) + repeat(" ", indent), score_name, & + to_str(t % results(score_index,filter_index) % sum), & + trim(to_str(t % results(score_index,filter_index) & + % sum_sq)) end do k = k + t % moment_order(k) case (SCORE_SCATTER_YN, SCORE_NU_SCATTER_YN, SCORE_FLUX_YN, & @@ -1908,11 +1909,13 @@ contains do nm_order = -n_order, n_order score_index = score_index + 1 score_name = 'Y' // trim(to_str(n_order)) // ',' // & - trim(to_str(nm_order)) // " " // score_names(abs(t % score_bins(k))) + trim(to_str(nm_order)) // " " & + // score_names(abs(t % score_bins(k))) write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A,"+/- ",A)') & - repeat(" ", indent), score_name, & - to_str(t % results(score_index,filter_index) % sum), & - trim(to_str(t % results(score_index,filter_index) % sum_sq)) + repeat(" ", indent), score_name, & + to_str(t % results(score_index,filter_index) % sum), & + trim(to_str(t % results(score_index,filter_index)& + % sum_sq)) end do end do k = k + (t % moment_order(k) + 1)**2 - 1 @@ -1923,9 +1926,9 @@ contains score_name = score_names(abs(t % score_bins(k))) end if write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A,"+/- ",A)') & - repeat(" ", indent), score_name, & - to_str(t % results(score_index,filter_index) % sum), & - trim(to_str(t % results(score_index,filter_index) % sum_sq)) + repeat(" ", indent), score_name, & + to_str(t % results(score_index,filter_index) % sum), & + trim(to_str(t % results(score_index,filter_index) % sum_sq)) end select end do indent = indent - 2 @@ -2334,8 +2337,8 @@ contains ! Loop over lattice coordinates do k = 1, n_x - do l = 1, n_y - do m = 1, n_z + do l = 1, n_y + do m = 1, n_z if (final >= lat % offset(map, k, l, m) + offset) then if (k == n_x .and. l == n_y .and. m == n_z) then diff --git a/src/output_interface.F90 b/src/output_interface.F90 index 9a4341135b..05fcd0010b 100644 --- a/src/output_interface.F90 +++ b/src/output_interface.F90 @@ -31,7 +31,7 @@ module output_interface #endif #endif logical :: serial ! Serial I/O when using MPI/PHDF5 - contains + contains generic, public :: write_data => write_double, & write_double_1Darray, & write_double_2Darray, & @@ -111,7 +111,7 @@ contains self % serial = serial else self % serial = .true. - end if + end if #ifdef HDF5 # ifdef MPI @@ -153,7 +153,7 @@ contains self % serial = serial else self % serial = .true. - end if + end if #ifdef HDF5 # ifdef MPI @@ -201,18 +201,18 @@ contains #ifdef HDF5 # ifdef MPI - call hdf5_file_close(self % hdf5_fh) + call hdf5_file_close(self % hdf5_fh) # else - call hdf5_file_close(self % hdf5_fh) + call hdf5_file_close(self % hdf5_fh) # endif #elif MPI - if (self % serial) then - close(UNIT=self % unit_fh) - else - call mpi_close_file(self % mpi_fh) - end if + if (self % serial) then + close(UNIT=self % unit_fh) + else + call mpi_close_file(self % mpi_fh) + end if #else - close(UNIT=self % unit_fh) + close(UNIT=self % unit_fh) #endif end subroutine file_close @@ -475,7 +475,7 @@ contains call hdf5_read_double_1Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_read_double_1Darray_parallel(self % hdf5_grp, name_, buffer, & - length, collect_) + length, collect_) end if # else call hdf5_read_double_1Darray(self % hdf5_grp, name_, buffer, length) @@ -663,8 +663,8 @@ contains if (self % serial) then call hdf5_write_double_3Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_write_double_3Darray_parallel(self % hdf5_grp, name_, buffer, length, & - collect_) + call hdf5_write_double_3Darray_parallel(self % hdf5_grp, name_, buffer, & + length, collect_) end if # else call hdf5_write_double_3Darray(self % hdf5_grp, name_, buffer, length) diff --git a/src/physics.F90 b/src/physics.F90 index 6f9457ff68..9ca59a9872 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -428,7 +428,7 @@ contains ! Sample velocity of target nucleus if (.not. micro_xs(i_nuclide) % use_ptable) then call sample_target_velocity(nuc, v_t, E, uvw, v_n, wgt, & - & micro_xs(i_nuclide) % elastic) + & micro_xs(i_nuclide) % elastic) else v_t = ZERO end if @@ -582,7 +582,7 @@ contains ! accompanying PDF and CDF is utilized) if ((sab % secondary_mode == SAB_SECONDARY_EQUAL) .or. & - (sab % secondary_mode == SAB_SECONDARY_SKEWED)) then + (sab % secondary_mode == SAB_SECONDARY_SKEWED)) then if (sab % secondary_mode == SAB_SECONDARY_EQUAL) then ! All bins equally likely @@ -843,16 +843,16 @@ contains ! interpolate xs since we're not exactly at the energy indices xs_low = nuc % elastic_0K(i_E_low) m = (nuc % elastic_0K(i_E_low + 1) - xs_low) & - & / (nuc % energy_0K(i_E_low + 1) - nuc % energy_0K(i_E_low)) + & / (nuc % energy_0K(i_E_low + 1) - nuc % energy_0K(i_E_low)) xs_low = xs_low + m * (E_low - nuc % energy_0K(i_E_low)) xs_up = nuc % elastic_0K(i_E_up) m = (nuc % elastic_0K(i_E_up + 1) - xs_up) & - & / (nuc % energy_0K(i_E_up + 1) - nuc % energy_0K(i_E_up)) + & / (nuc % energy_0K(i_E_up + 1) - nuc % energy_0K(i_E_up)) xs_up = xs_up + m * (E_up - nuc % energy_0K(i_E_up)) ! get max 0K xs value over range of practical relative energies xs_max = max(xs_low, & - & maxval(nuc % elastic_0K(i_E_low + 1 : i_E_up - 1)), xs_up) + & maxval(nuc % elastic_0K(i_E_low + 1 : i_E_up - 1)), xs_up) reject = .true. @@ -898,26 +898,26 @@ contains ! cdf value at lower bound attainable energy if (i_E_low > 1) then m = (nuc % xs_cdf(i_E_low) - nuc % xs_cdf(i_E_low - 1)) & - & / (nuc % energy_0K(i_E_low + 1) - nuc % energy_0K(i_E_low)) + & / (nuc % energy_0K(i_E_low + 1) - nuc % energy_0K(i_E_low)) cdf_low = nuc % xs_cdf(i_E_low - 1) & - & + m * (E_low - nuc % energy_0K(i_E_low)) + & + m * (E_low - nuc % energy_0K(i_E_low)) else m = nuc % xs_cdf(i_E_low) & - & / (nuc % energy_0K(i_E_low + 1) - nuc % energy_0K(i_E_low)) + & / (nuc % energy_0K(i_E_low + 1) - nuc % energy_0K(i_E_low)) cdf_low = m * (E_low - nuc % energy_0K(i_E_low)) if (E_low <= nuc % energy_0K(1)) cdf_low = ZERO end if ! cdf value at upper bound attainable energy m = (nuc % xs_cdf(i_E_up) - nuc % xs_cdf(i_E_up - 1)) & - & / (nuc % energy_0K(i_E_up + 1) - nuc % energy_0K(i_E_up)) + & / (nuc % energy_0K(i_E_up + 1) - nuc % energy_0K(i_E_up)) cdf_up = nuc % xs_cdf(i_E_up - 1) & - & + m * (E_up - nuc % energy_0K(i_E_up)) + & + m * (E_up - nuc % energy_0K(i_E_up)) ! values used to sample the Maxwellian E_mode = kT p_mode = TWO * sqrt(E_mode / pi) * sqrt((ONE / kT)**3) & - & * exp(-E_mode / kT) + & * exp(-E_mode / kT) E_t_max = 16.0_8 * E_mode reject = .true. @@ -927,7 +927,7 @@ contains ! perform Maxwellian rejection sampling E_t = E_t_max * prn()**2 p_t = TWO * sqrt(E_t / pi) * sqrt((ONE / kT)**3) & - & * exp(-E_t / kT) + & * exp(-E_t / kT) R_speed = p_t / p_mode if (prn() < R_speed) then @@ -935,12 +935,12 @@ contains ! sample a relative energy using the xs cdf cdf_rel = cdf_low + prn() * (cdf_up - cdf_low) i_E_rel = binary_search(nuc % xs_cdf(i_E_low-1:i_E_up), & - & i_E_up - i_E_low + 2, cdf_rel) + & i_E_up - i_E_low + 2, cdf_rel) E_rel = nuc % energy_0K(i_E_low + i_E_rel - 1) m = (nuc % xs_cdf(i_E_low + i_E_rel - 1) & - & - nuc % xs_cdf(i_E_low + i_E_rel - 2)) & - & / (nuc % energy_0K(i_E_low + i_E_rel) & - & - nuc % energy_0K(i_E_low + i_E_rel - 1)) + & - nuc % xs_cdf(i_E_low + i_E_rel - 2)) & + & / (nuc % energy_0K(i_E_low + i_E_rel) & + & - nuc % energy_0K(i_E_low + i_E_rel - 1)) E_rel = E_rel + (cdf_rel - nuc % xs_cdf(i_E_low + i_E_rel - 2)) / m ! perform rejection sampling on cosine between @@ -1026,7 +1026,7 @@ contains ! Determine rejection probability accept_prob = sqrt(beta_vn*beta_vn + beta_vt_sq - 2*beta_vn*beta_vt*mu) & - /(beta_vn + beta_vt) + /(beta_vn + beta_vt) ! Perform rejection sampling on vt and mu if (prn() < accept_prob) exit diff --git a/src/plot.F90 b/src/plot.F90 index c6341e3a9b..e507b6093b 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -250,7 +250,7 @@ contains do j = ijk_ll(inner), ijk_ur(inner) ! check if we're in the mesh for this ijk if (i > 0 .and. i <= m % dimension(outer) .and. & - j > 0 .and. j <= m % dimension(inner)) then + j > 0 .and. j <= m % dimension(inner)) then ! get xyz's of lower left and upper right of this mesh cell xyz_ll(outer) = m % lower_left(outer) + m % width(outer) * (i - 1) diff --git a/src/plot_header.F90 b/src/plot_header.F90 index 7ce0aa4500..8dc725d9d4 100644 --- a/src/plot_header.F90 +++ b/src/plot_header.F90 @@ -24,7 +24,7 @@ module plot_header integer :: color_by ! quantity to color regions by real(8) :: origin(3) ! xyz center of plot location real(8) :: width(3) ! xyz widths of plot - integer :: basis ! direction of plot slice + integer :: basis ! direction of plot slice integer :: pixels(3) ! pixel width/height of plot slice integer :: meshlines_width ! pixel width of meshlines integer :: level ! universe depth to plot the cells of @@ -37,7 +37,7 @@ module plot_header ! Plot type integer, parameter :: PLOT_TYPE_SLICE = 1 integer, parameter :: PLOT_TYPE_VOXEL = 2 - + ! Plot level integer, parameter :: PLOT_LEVEL_LOWEST = -1 diff --git a/src/ppmlib.F90 b/src/ppmlib.F90 index b9df00e1ca..ebd8105bef 100644 --- a/src/ppmlib.F90 +++ b/src/ppmlib.F90 @@ -1,7 +1,7 @@ module ppmlib implicit none - + !=============================================================================== ! Image holds RGB information for output PPM image !=============================================================================== @@ -12,7 +12,7 @@ module ppmlib end type Image contains - + !=============================================================================== ! INIT_IMAGE initializes the Image derived type !=============================================================================== @@ -55,7 +55,7 @@ contains !=============================================================================== ! DEALLOCATE_IMAGE !=============================================================================== - + subroutine deallocate_image(img) type(Image) :: img @@ -70,7 +70,7 @@ contains ! INSIDE_IMAGE determines whether a point (x,y) is inside the image !=============================================================================== - + function inside_image(img, x, y) result(inside) type(Image), intent(in) :: img @@ -83,7 +83,7 @@ contains (x >= 0) .and. (y >= 0)) inside = .true. end function inside_image - + !=============================================================================== ! VALID_IMAGE checks whether the image has a width and height and if its color ! arrays are allocated @@ -123,5 +123,5 @@ contains end if end subroutine set_pixel - + end module ppmlib diff --git a/src/progress_header.F90 b/src/progress_header.F90 index d0ee7563a5..5f462e0fac 100644 --- a/src/progress_header.F90 +++ b/src/progress_header.F90 @@ -22,12 +22,12 @@ module progress_header private character(len=72) :: bar="???% | " // & " |" - contains - procedure :: set_value => bar_set_value + contains + procedure :: set_value => bar_set_value end type ProgressBar contains - + !=============================================================================== ! IS_TERMINAL checks if output is currently being output to a terminal. Relies ! on a POSIX implementation of isatty, and defaults to false if that is not @@ -46,7 +46,7 @@ contains #endif end function is_terminal - + !=============================================================================== ! BAR_SET_VALUE prints the progress bar without advancing. The value is ! specified as percent completion, from 0 to 100. If the value is ever set to @@ -57,7 +57,7 @@ contains class(ProgressBar), intent(inout) :: self real(8), intent(in) :: val - + integer :: i if (.not. is_terminal()) return @@ -84,19 +84,19 @@ contains write(OUTPUT_UNIT, '(A1,A1,A72)', ADVANCE='no') '+', char(13), self % bar flush(OUTPUT_UNIT) - + if (val >= 100.) then - + ! make new line write(OUTPUT_UNIT, "(A)") "" flush(OUTPUT_UNIT) - + ! reset the bar in case we want to use this instance again self % bar = "???% | " // & " |" - + end if - + end subroutine bar_set_value end module progress_header diff --git a/src/random_lcg.F90 b/src/random_lcg.F90 index e6a28587df..1ebe651d3c 100644 --- a/src/random_lcg.F90 +++ b/src/random_lcg.F90 @@ -93,7 +93,7 @@ contains end do end subroutine set_particle_seed - + !=============================================================================== ! PRN_SKIP advances the random number seed 'n' times from the current seed !=============================================================================== diff --git a/src/search.F90 b/src/search.F90 index 8de05a955b..dab7fa67ca 100644 --- a/src/search.F90 +++ b/src/search.F90 @@ -62,7 +62,7 @@ contains n_iteration = n_iteration + 1 if (n_iteration == MAX_ITERATION) then call fatal_error("Reached maximum number of iterations on binary & - &search.") + &search.") end if end do @@ -114,7 +114,7 @@ contains n_iteration = n_iteration + 1 if (n_iteration == MAX_ITERATION) then call fatal_error("Reached maximum number of iterations on binary & - &search.") + &search.") end if end do @@ -166,7 +166,7 @@ contains n_iteration = n_iteration + 1 if (n_iteration == MAX_ITERATION) then call fatal_error("Reached maximum number of iterations on binary & - &search.") + &search.") end if end do diff --git a/src/state_point.F90 b/src/state_point.F90 index 0ba0931767..6b983231f6 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -52,7 +52,7 @@ contains ! Set filename for state point filename = trim(path_output) // 'statepoint.' // & - & zero_padded(current_batch, count_digits(n_max_batches)) + & zero_padded(current_batch, count_digits(n_max_batches)) ! Append appropriate extension #ifdef HDF5 @@ -256,7 +256,7 @@ contains group="tallies/tally " // trim(to_str(tally % id)) // & "/filter " // to_str(j)) if (tally % filters(j) % type == FILTER_ENERGYIN .or. & - tally % filters(j) % type == FILTER_ENERGYOUT) then + tally % filters(j) % type == FILTER_ENERGYOUT) then call sp % write_data(tally % filters(j) % real_bins, "bins", & group="tallies/tally " // trim(to_str(tally % id)) // & "/filter " // to_str(j), & @@ -309,8 +309,8 @@ contains do n_order = 0, tally % moment_order(k) moment_name = 'P' // trim(to_str(n_order)) call sp % write_data(moment_name, "order" // trim(to_str(k)), & - group="tallies/tally " // trim(to_str(tally % id)) // & - "/moments") + group="tallies/tally " // trim(to_str(tally % id)) // & + "/moments") k = k + 1 end do case (SCORE_SCATTER_YN, SCORE_NU_SCATTER_YN, SCORE_FLUX_YN, & @@ -318,7 +318,7 @@ contains do n_order = 0, tally % moment_order(k) do nm_order = -n_order, n_order moment_name = 'Y' // trim(to_str(n_order)) // ',' // & - trim(to_str(nm_order)) + trim(to_str(nm_order)) call sp % write_data(moment_name, "order" // & trim(to_str(k)), & group="tallies/tally " // trim(to_str(tally % id)) // & @@ -412,7 +412,7 @@ contains ! Set filename filename = trim(path_output) // 'source.' // & - & zero_padded(current_batch, count_digits(n_max_batches)) + & zero_padded(current_batch, count_digits(n_max_batches)) #ifdef HDF5 filename = trim(filename) // '.h5' @@ -434,7 +434,7 @@ contains ! Set filename for state point filename = trim(path_output) // 'statepoint.' // & - & zero_padded(current_batch, count_digits(n_max_batches)) + & zero_padded(current_batch, count_digits(n_max_batches)) #ifdef HDF5 filename = trim(filename) // '.h5' #else @@ -607,12 +607,12 @@ contains tally % results(:,:) % sum_sq = tally_temp(2,:,:) end if - ! Put in temporary tally result - allocate(tallyresult_temp(m,n)) - tallyresult_temp(:,:) % sum = tally_temp(1,:,:) - tallyresult_temp(:,:) % sum_sq = tally_temp(2,:,:) + ! Put in temporary tally result + allocate(tallyresult_temp(m,n)) + tallyresult_temp(:,:) % sum = tally_temp(1,:,:) + tallyresult_temp(:,:) % sum_sq = tally_temp(2,:,:) - ! Write reduced tally results to file + ! Write reduced tally results to file call sp % write_tally_result(tally % results, "results", & group="tallies/tally " // trim(to_str(tally % id)), n1=m, n2=n) @@ -687,7 +687,7 @@ contains call sp % read_data(int_array(2), "version_minor") call sp % read_data(int_array(3), "version_release") if (int_array(1) /= VERSION_MAJOR .or. int_array(2) /= VERSION_MINOR & - .or. int_array(3) /= VERSION_RELEASE) then + .or. int_array(3) /= VERSION_RELEASE) then if (master) call warning("State point file was created with a different & &version of OpenMC.") end if @@ -843,7 +843,7 @@ contains group="tallies/tally " // trim(to_str(curr_key)) // & "/filter " // to_str(j)) if (tally % filters(j) % type == FILTER_ENERGYIN .or. & - tally % filters(j) % type == FILTER_ENERGYOUT) then + tally % filters(j) % type == FILTER_ENERGYOUT) then call sp % read_data(tally % filters(j) % real_bins, "bins", & group="tallies/tally " // trim(to_str(curr_key)) // & "/filter " // to_str(j), & diff --git a/src/string.F90 b/src/string.F90 index ebe2310f24..5f57bb3855 100644 --- a/src/string.F90 +++ b/src/string.F90 @@ -7,7 +7,7 @@ module string implicit none interface to_str - module procedure int4_to_str, int8_to_str, real_to_str + module procedure int4_to_str, int8_to_str, real_to_str end interface contains @@ -50,7 +50,7 @@ contains n = n + 1 if (i_end - i_start + 1 > len(words(n))) then if (master) call warning("The word '" // string(i_start:i_end) & - &// "' is longer than the space allocated for it.") + &// "' is longer than the space allocated for it.") end if words(n) = string(i_start:i_end) ! reset indices diff --git a/src/tally_header.F90 b/src/tally_header.F90 index 43ec868c54..d20c3fea20 100644 --- a/src/tally_header.F90 +++ b/src/tally_header.F90 @@ -124,7 +124,7 @@ module tally_header ! Number of realizations of tally random variables integer :: n_realizations = 0 - + ! Tally precision triggers integer :: n_triggers = 0 ! # of triggers type(TriggerObject), allocatable :: triggers(:) ! Array of triggers @@ -197,10 +197,10 @@ module tally_header this % reset = .false. this % n_realizations = 0 - + if (allocated(this % triggers)) & deallocate (this % triggers) - + this % n_triggers = 0 end subroutine tallyobject_clear diff --git a/src/timer_header.F90 b/src/timer_header.F90 index 0dde85d0c2..0bf1b7aef5 100644 --- a/src/timer_header.F90 +++ b/src/timer_header.F90 @@ -15,11 +15,11 @@ module timer_header logical :: running = .false. ! is timer running? integer :: start_counts = 0 ! counts when started real(8), public :: elapsed = ZERO ! total time elapsed in seconds - contains - procedure :: start => timer_start - procedure :: get_value => timer_get_value - procedure :: stop => timer_stop - procedure :: reset => timer_reset + contains + procedure :: start => timer_start + procedure :: get_value => timer_get_value + procedure :: stop => timer_stop + procedure :: reset => timer_reset end type Timer contains @@ -83,7 +83,7 @@ contains !=============================================================================== subroutine timer_reset(self) - + class(Timer), intent(inout) :: self self % running = .false. diff --git a/src/trigger.F90 b/src/trigger.F90 index 6909598db2..4a16cd5cab 100644 --- a/src/trigger.F90 +++ b/src/trigger.F90 @@ -43,7 +43,7 @@ contains ! When trigger threshold is reached, write information if (satisfy_triggers) then call write_message("Triggers satisfied for batch " // & - trim(to_str(current_batch))) + trim(to_str(current_batch))) ! When trigger is not reached write convergence info for user elseif (name == "eigenvalue") then @@ -83,7 +83,7 @@ contains ! and finds the maximum uncertainty/threshold ratio for all triggers !=============================================================================== - subroutine check_tally_triggers(max_ratio, tally_id, name) + subroutine check_tally_triggers(max_ratio, tally_id, name) ! Variables to reflect distance to trigger convergence criteria real(8), intent(inout) :: max_ratio ! max uncertainty/thresh ratio @@ -299,7 +299,7 @@ contains ! precision trigger(s). !=============================================================================== - subroutine compute_tally_current(t, trigger) + subroutine compute_tally_current(t, trigger) integer :: i ! mesh index for x integer :: j ! mesh index for y diff --git a/src/trigger_header.F90 b/src/trigger_header.F90 index 8289ca6154..e137829bd0 100644 --- a/src/trigger_header.F90 +++ b/src/trigger_header.F90 @@ -14,16 +14,16 @@ module trigger_header character(len=52) :: score_name ! the name of the score integer :: score_index ! the index of the score real(8) :: variance=0.0 ! temp variance container - real(8) :: std_dev =0.0 ! temp std. dev. container + real(8) :: std_dev =0.0 ! temp std. dev. container real(8) :: rel_err =0.0 ! temp rel. err. container end type TriggerObject - + !=============================================================================== ! KTRIGGER describes a user-specified precision trigger for k-effective !=============================================================================== type KTrigger integer :: trigger_type = 0 - real(8) :: threshold = 0 + real(8) :: threshold = 0 end type KTrigger end module trigger_header diff --git a/src/vector_header.F90 b/src/vector_header.F90 index 424aedd686..1ada0fba74 100644 --- a/src/vector_header.F90 +++ b/src/vector_header.F90 @@ -9,12 +9,12 @@ module vector_header integer :: n ! number of rows/cols in matrix real(8), allocatable :: data(:) ! where vector data is stored real(8), pointer :: val(:) ! pointer to vector data - contains - procedure :: create => vector_create - procedure :: destroy => vector_destroy - procedure :: add_value => vector_add_value - procedure :: copy => vector_copy - ! TODO: procedure :: write => vector_write + contains + procedure :: create => vector_create + procedure :: destroy => vector_destroy + procedure :: add_value => vector_add_value + procedure :: copy => vector_copy + ! TODO: procedure :: write => vector_write end type Vector contains diff --git a/src/xml_interface.F90 b/src/xml_interface.F90 index 1a24bc14b3..4ae05ee281 100644 --- a/src/xml_interface.F90 +++ b/src/xml_interface.F90 @@ -92,7 +92,7 @@ contains ! Check if node exists if (associated(temp_ptr)) return - ! Check for a sub-element + ! Check for a sub-element elem_list => getChildrenByTagName(ptr, trim(node_name)) ! Get the length of the list @@ -122,7 +122,7 @@ contains ! Set found to false found_ = .false. - ! Check for a sub-element + ! Check for a sub-element elem_list => getChildrenByTagName(in_ptr, trim(node_name)) ! Get the length of the list @@ -147,7 +147,7 @@ contains type(Node), pointer, intent(in) :: in_ptr type(NodeList), pointer, intent(out) :: out_ptr - ! Check for a sub-element + ! Check for a sub-element out_ptr => getChildrenByTagName(in_ptr, trim(node_name)) end subroutine get_node_list @@ -176,7 +176,7 @@ contains type(NodeList), pointer, intent(in) :: in_ptr type(Node), pointer, intent(out) :: out_ptr - ! Check for a sub-element + ! Check for a sub-element out_ptr => item(in_ptr, idx - 1) end subroutine get_list_item @@ -199,7 +199,7 @@ contains call get_node(ptr, node_name, temp_ptr, node_type, found) ! Leave if it was not found - if (.not. found) then + if (.not. found) then call fatal_error("Node " // node_name // " not part of Node " & &// getNodeName(ptr) // ".") end if @@ -210,7 +210,7 @@ contains else call extractDataContent(temp_ptr, result_int) end if - + end subroutine get_node_value_integer !=============================================================================== @@ -231,18 +231,18 @@ contains call get_node(ptr, node_name, temp_ptr, node_type, found) ! Leave if it was not found - if (.not. found) then + if (.not. found) then call fatal_error("Node " // node_name // " not part of Node " & &// getNodeName(ptr) // ".") end if - + ! Extract value if (node_type == ATTR_NODE) then call extractDataAttribute(ptr, node_name, result_long) else call extractDataContent(temp_ptr, result_long) end if - + end subroutine get_node_value_long !=============================================================================== @@ -263,18 +263,18 @@ contains call get_node(ptr, node_name, temp_ptr, node_type, found) ! Leave if it was not found - if (.not. found) then + if (.not. found) then call fatal_error("Node " // node_name // " not part of Node " & &// getNodeName(ptr) // ".") end if - + ! Extract value if (node_type == ATTR_NODE) then call extractDataAttribute(ptr, node_name, result_double) else call extractDataContent(temp_ptr, result_double) end if - + end subroutine get_node_value_double !=============================================================================== @@ -295,18 +295,18 @@ contains call get_node(ptr, node_name, temp_ptr, node_type, found) ! Leave if it was not found - if (.not. found) then + if (.not. found) then call fatal_error("Node " // node_name // " not part of Node " & &// getNodeName(ptr) // ".") end if - + ! Extract value if (node_type == ATTR_NODE) then call extractDataAttribute(ptr, node_name, result_int) else call extractDataContent(temp_ptr, result_int) end if - + end subroutine get_node_array_integer !=============================================================================== @@ -327,18 +327,18 @@ contains call get_node(ptr, node_name, temp_ptr, node_type, found) ! Leave if it was not found - if (.not. found) then + if (.not. found) then call fatal_error("Node " // node_name // " not part of Node " & &// getNodeName(ptr) // ".") end if - + ! Extract value if (node_type == ATTR_NODE) then call extractDataAttribute(ptr, node_name, result_double) else call extractDataContent(temp_ptr, result_double) end if - + end subroutine get_node_array_double !=============================================================================== @@ -359,18 +359,18 @@ contains call get_node(ptr, node_name, temp_ptr, node_type, found) ! Leave if it was not found - if (.not. found) then + if (.not. found) then call fatal_error("Node " // node_name // " not part of Node " & &// getNodeName(ptr) // ".") end if - + ! Extract value if (node_type == ATTR_NODE) then call extractDataAttribute(ptr, node_name, result_string) else call extractDataContent(temp_ptr, result_string) end if - + end subroutine get_node_array_string !=============================================================================== @@ -391,18 +391,18 @@ contains call get_node(ptr, node_name, temp_ptr, node_type, found) ! Leave if it was not found - if (.not. found) then + if (.not. found) then call fatal_error("Node " // node_name // " not part of Node " // & getNodeName(ptr) // ".") end if - + ! Extract value if (node_type == ATTR_NODE) then call extractDataAttribute(ptr, node_name, result_str) else call extractDataContent(temp_ptr, result_str) end if - + end subroutine get_node_value_string !=============================================================================== @@ -513,7 +513,7 @@ contains ! Check if node exists if (associated(out_ptr)) return - ! Check for a sub-element + ! Check for a sub-element elem_list => getChildrenByTagName(in_ptr, trim(node_name)) ! Get the length of the list From a8b3a0b2cd5da23633d7ee6c69879bfaf6c99378 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Sun, 26 Jul 2015 12:23:21 -0600 Subject: [PATCH 018/101] Fix some PEP-8 for #423 --- tests/check_source.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/tests/check_source.py b/tests/check_source.py index 490eb9c7c3..3a79d44c28 100755 --- a/tests/check_source.py +++ b/tests/check_source.py @@ -22,7 +22,7 @@ class LineOfCode(object): self.content = content self.is_continuation = is_continuation self.is_continued = False - assert (string_terminator == None or + assert (string_terminator is None or string_terminator == "'" or string_terminator == '"') self.initial_string_terminator = string_terminator @@ -114,12 +114,10 @@ class LineOfCode(object): if (not has_real_content) and in_a_comment: self.is_comment_only = True - def get_indent(self): """Return the number of indentation spaces prefixing this line.""" return len(self.content) - len(self.content.lstrip(' ')) - def contains_whitespace_only(self): """Return True/False if all characters in the line are whitespace.""" if len(self.content.strip('\n')) == 0: return False @@ -127,7 +125,6 @@ class LineOfCode(object): for char in self.content.strip('\n') ] return all(is_ws) - def has_trailing_whitespace(self): """Return True/False if this line ends with a whitespace character.""" stripped = self.content.strip('\n') @@ -181,15 +178,15 @@ def check_source(fname): # Check for extra whitespace errors. if loc.contains_whitespace_only(): good_code = False - print_error(fname, loc.number, "Line contains whitespace " \ + print_error(fname, loc.number, "Line contains whitespace " "characters but no content. Please remove whitespace.") elif loc.has_trailing_whitespace(): good_code = False - print_error(fname, loc.number, "Line has trailing whitespace after"\ + print_error(fname, loc.number, "Line has trailing whitespace after" " the content. Please remove trailing whitespace.") if loc.contains_tab(): good_code = False - print_error(fname, loc.number, "Line contains a tab character. " \ + print_error(fname, loc.number, "Line contains a tab character. " "Please replace with single whitespace characters.") # Check indentation. @@ -197,13 +194,13 @@ def check_source(fname): if ((not loc.is_continuation) and (not loc.is_comment_only) and (not loc.contains_whitespace_only()) and current_indent % 2 != 0): good_code = False - print_error(fname, loc.number, "Line is indented an odd number of "\ - "spaces. All non-continuation lines should be indented an "\ + print_error(fname, loc.number, "Line is indented an odd number of " + "spaces. All non-continuation lines should be indented an " "even number of spaces.") if loc.is_continuation and current_indent < base_indent + 5: good_code = False - print_error(fname, loc.number, "Continuation lines must be "\ - "indented by at least 5 spaces, but this line is indented {0}"\ + print_error(fname, loc.number, "Continuation lines must be " + "indented by at least 5 spaces, but this line is indented {0}" " spaces.".format(current_indent - base_indent)) # Set base indentation for next lines. From da4f6a797cd825151d5dee73a18f01a789519422 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 26 Jul 2015 20:06:22 -0700 Subject: [PATCH 019/101] Cleaned up tallies.py to use new checkvalue API --- openmc/tallies.py | 303 ++++++++++++++-------------------------------- 1 file changed, 88 insertions(+), 215 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 06c5fd4398..2b58a1c2a2 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -3,7 +3,7 @@ import copy import os import pickle import itertools -from numbers import Integral +from numbers import Integral, Rational from xml.etree import ElementTree as ET import sys @@ -200,10 +200,8 @@ class Tally(object): 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 @@ -243,11 +241,10 @@ class Tally(object): new_score = _CrossScore(self_score, other_score, '+') new_tally.add_score(new_score) - elif is_integer(other) or is_float(other): + elif isinstance(other, Integral) or isinstance(other): new_tally._mean = self._mean + other new_tally._std_dev = self._std_dev - new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations @@ -255,10 +252,8 @@ class Tally(object): for filter in self.filters: new_tally.add_filter(filter) - for nuclide in self.nuclides: new_tally.add_nuclide(nuclide) - for score in self.scores: new_tally.add_score(score) @@ -305,10 +300,8 @@ class Tally(object): 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 @@ -348,11 +341,10 @@ class Tally(object): new_score = _CrossScore(self_score, other_score, '-') new_tally.add_score(new_score) - elif is_integer(other) or is_float(other): + elif isinstance(other, (Integral, Rational)): new_tally._mean = self._mean - other new_tally._std_dev = self._std_dev - new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations @@ -360,10 +352,8 @@ class Tally(object): for filter in self.filters: new_tally.add_filter(filter) - for nuclide in self.nuclides: new_tally.add_nuclide(nuclide) - for score in self.scores: new_tally.add_score(score) @@ -413,10 +403,8 @@ class Tally(object): 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 @@ -456,11 +444,10 @@ class Tally(object): new_score = _CrossScore(self_score, other_score, '*') new_tally.add_score(new_score) - elif is_integer(other) or is_float(other): + elif isinstance(other, (Integral, Rational)): new_tally._mean = self._mean * other new_tally._std_dev = self._std_dev * np.abs(other) - new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations @@ -468,10 +455,8 @@ class Tally(object): for filter in self.filters: new_tally.add_filter(filter) - for nuclide in self.nuclides: new_tally.add_nuclide(nuclide) - for score in self.scores: new_tally.add_score(score) @@ -521,10 +506,8 @@ class Tally(object): 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 @@ -564,11 +547,10 @@ class Tally(object): new_score = _CrossScore(self_score, other_score, '/') new_tally.add_score(new_score) - elif is_integer(other) or is_float(other): + elif isinstance(other, (Integral, Rational)): new_tally._mean = self._mean / other new_tally._std_dev = self._std_dev * np.abs(1. / other) - new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations @@ -576,10 +558,8 @@ class Tally(object): for filter in self.filters: new_tally.add_filter(filter) - for nuclide in self.nuclides: new_tally.add_nuclide(nuclide) - for score in self.scores: new_tally.add_score(score) @@ -630,10 +610,8 @@ class Tally(object): if self.estimator == power.estimator: new_tally.estimator = self.estimator - if self.with_summary and power.with_summary: new_tally.with_summary = self.with_summary - if self.num_realizations == power.num_realizations: new_tally.num_realizations = self.num_realizations @@ -673,12 +651,11 @@ class Tally(object): new_score = _CrossScore(self_score, power_score, '^') new_tally.add_score(new_score) - elif is_integer(power) or is_float(power): + elif isinstance(power, (Integral, Rational)): new_tally._mean = self._mean ** power self_rel_err = self.std_dev / self.mean new_tally._std_dev = np.abs(new_tally._mean * power * self_rel_err) - new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations @@ -686,10 +663,8 @@ class Tally(object): for filter in self.filters: new_tally.add_filter(filter) - for nuclide in self.nuclides: new_tally.add_nuclide(nuclide) - for score in self.scores: new_tally.add_score(score) @@ -702,19 +677,14 @@ class Tally(object): def __pos__(self): - new_tally = copy.deepcopy(self) new_tally._mean = np.abs(new_tally.mean) return new_tally - def __neg__(self): - - new_tally = copy.deepcopy(self) - new_tally._mean *= -1 + new_tally = self * -1 return new_tally - def minimum(self, scores=[], filters=[], filter_bins=[], nuclides=[], value='mean'): """Returns the minimum of a slice of the Tally's data. @@ -722,42 +692,43 @@ class Tally(object): Parameters ---------- scores : list - A list of one or more score strings - (e.g., ['absorption', 'nu-fission']; default is []) + A list of one or more score strings + (e.g., ['absorption', 'nu-fission']; default is []) filters : list - A list of filter type strings - (e.g., ['mesh', 'energy']; default is []) + A list of filter type strings + (e.g., ['mesh', 'energy']; default is []) filter_bins : list - A list of the filter bins corresponding to the filter_types - parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin - in the list is the integer ID for 'material', 'surface', 'cell', - 'cellborn', and 'universe' Filters. Each bin is an integer for - the cell instance ID for 'distribcell Filters. Each bin is - a 2-tuple of floats for 'energy' and 'energyout' filters - corresponding to the energy boundaries of the bin of interest. - The bin is a (x,y,z) 3-tuple for 'mesh' filters corresponding - to the mesh cell of interest. The order of the bins in the list - must correspond of the filter_types parameter. + A list of the filter bins corresponding to the filter_types + parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in + the list is the integer ID for 'material', 'surface', 'cell', + 'cellborn', and 'universe' Filters. Each bin is an integer for the + cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of + floats for 'energy' and 'energyout' filters corresponding to the + energy boundaries of the bin of interest. The bin is a (x,y,z) + 3-tuple for 'mesh' filters corresponding to the mesh cell of + interest. The order of the bins in the list must correspond of the + filter_types parameter. nuclides : list - A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) value : str - A string for the type of value to return - 'mean' (default), - 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted + A string for the type of value to return - 'mean' (default), + 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted Returns ------- - The minimum value of the requested slice of Tally data. + float + A scalar float of the minimum value in the Tally data indexed by + each filter, nuclide and score as listed in the parameters. """ data = self.get_values(scores, filters, filter_bins, nuclides, value) return np.min(data) - def maximum(self, scores=[], filters=[], filter_bins=[], nuclides=[], value='mean'): """Returns the maximum of a slice of the Tally's data. @@ -765,42 +736,43 @@ class Tally(object): Parameters ---------- scores : list - A list of one or more score strings - (e.g., ['absorption', 'nu-fission']; default is []) + A list of one or more score strings + (e.g., ['absorption', 'nu-fission']; default is []) filters : list - A list of filter type strings - (e.g., ['mesh', 'energy']; default is []) + A list of filter type strings + (e.g., ['mesh', 'energy']; default is []) filter_bins : list - A list of the filter bins corresponding to the filter_types - parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin - in the list is the integer ID for 'material', 'surface', 'cell', - 'cellborn', and 'universe' Filters. Each bin is an integer for - the cell instance ID for 'distribcell Filters. Each bin is - a 2-tuple of floats for 'energy' and 'energyout' filters - corresponding to the energy boundaries of the bin of interest. - The bin is a (x,y,z) 3-tuple for 'mesh' filters corresponding - to the mesh cell of interest. The order of the bins in the list - must correspond of the filter_types parameter. + A list of the filter bins corresponding to the filter_types + parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in + the list is the integer ID for 'material', 'surface', 'cell', + 'cellborn', and 'universe' Filters. Each bin is an integer for the + cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of + floats for 'energy' and 'energyout' filters corresponding to the + energy boundaries of the bin of interest. The bin is a (x,y,z) + 3-tuple for 'mesh' filters corresponding to the mesh cell of + interest. The order of the bins in the list must correspond of the + filter_types parameter. nuclides : list - A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) value : str - A string for the type of value to return - 'mean' (default), - 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted + A string for the type of value to return - 'mean' (default), + 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted Returns ------- - The maximum value of the requested slice of Tally data. + float + A scalar float of the maximum value in the Tally data indexed by + each filter, nuclide and score as listed in the parameters. """ data = self.get_values(scores, filters, filter_bins, nuclides, value) return np.max(data) - def summation(self, scores=[], filters=[], filter_bins=[], nuclides=[], value='mean'): """Returns the sum of a slice of the Tally's data. @@ -808,44 +780,43 @@ class Tally(object): Parameters ---------- scores : list - A list of one or more score strings - (e.g., ['absorption', 'nu-fission']; default is []) + A list of one or more score strings + (e.g., ['absorption', 'nu-fission']; default is []) filters : list - A list of filter type strings - (e.g., ['mesh', 'energy']; default is []) + A list of filter type strings + (e.g., ['mesh', 'energy']; default is []) filter_bins : list - A list of the filter bins corresponding to the filter_types - parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin - in the list is the integer ID for 'material', 'surface', 'cell', - 'cellborn', and 'universe' Filters. Each bin is an integer for - the cell instance ID for 'distribcell Filters. Each bin is - a 2-tuple of floats for 'energy' and 'energyout' filters - corresponding to the energy boundaries of the bin of interest. - The bin is a (x,y,z) 3-tuple for 'mesh' filters corresponding - to the mesh cell of interest. The order of the bins in the list - must correspond of the filter_types parameter. + A list of the filter bins corresponding to the filter_types + parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in + the list is the integer ID for 'material', 'surface', 'cell', + 'cellborn', and 'universe' Filters. Each bin is an integer for the + cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of + floats for 'energy' and 'energyout' filters corresponding to the + energy boundaries of the bin of interest. The bin is a (x,y,z) + 3-tuple for 'mesh' filters corresponding to the mesh cell of + interest. The order of the bins in the list must correspond of the + filter_types parameter. nuclides : list - A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) value : str - A string for the type of value to return - 'mean' (default), - 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted + A string for the type of value to return - 'mean' (default), + 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted Returns ------- - The sum of the requested slice of Tally data. + float + A scalar float of the sum of the Tally data indexed by + each filter, nuclide and score as listed in the parameters. """ data = self.get_values(scores, filters, filter_bins, nuclides, value) return np.sum(data) - - - def slice(self, scores=[], filters=[], filter_bins=[], nuclides=[]): """ """ @@ -866,7 +837,8 @@ class Tally(object): nuclides, 'sum') new_sum_sq = self.get_values(scores, filters, filter_bins, nuclides, 'sum_sq') - new_tally.set_results(new_sum, new_sum_sq) + new_tally.sum = new_sum + new_tally.sum_sq = new_sum_sq ############################ FILTERS ######################### # Determine the score indices from any of the requested scores @@ -1236,29 +1208,9 @@ class Tally(object): @with_batch_statistics.setter def with_batch_statistics(self, with_batch_statistics): - - if not isinstance(with_batch_statistics, bool): - msg = 'Unable to set with_batch_statistics to a non-boolean ' \ - 'value "{0}"'.format(with_batch_statistics) - raise ValueError(msg) - + check_type('with_batch_statistics', with_batch_statistics, bool) self._with_batch_statistics = with_batch_statistics - - def set_results(self, sum, sum_sq): - - if not isinstance(sum, (tuple, list, np.ndarray)): - msg = 'Unable to set the sum to "{0}" for Tally ID={1} since ' \ - 'it is not a Python tuple/list or NumPy ' \ - 'array'.format(sum, self.id) - raise ValueError(msg) - - if not isinstance(sum_sq, (tuple, list, np.ndarray)): - msg = 'Unable to set the sum to "{0}" for Tally ID={1} since ' \ - 'it is not a Python tuple/list or NumPy ' \ - 'array'.format(sum_sq, self.id) - raise ValueError(msg) - @sum.setter def sum(self, sum): check_type('sum', sum, Iterable) @@ -1564,7 +1516,7 @@ class Tally(object): return filter def get_filter_index(self, filter_type, filter_bin): - """Returns the index in the Tally's results array for a Filter bin. + """Returns the index in the Tally's results array for a Filter bin Parameters ---------- @@ -1582,7 +1534,7 @@ class Tally(object): Returns ------- - The index in the Tally data array for this filter bin. + The index in the Tally data array for this filter bin """ @@ -1594,7 +1546,7 @@ class Tally(object): return filter_index def get_nuclide_index(self, nuclide): - """Returns the index in the Tally's results array for a Nuclide bin. + """Returns the index in the Tally's results array for a Nuclide bin Parameters ---------- @@ -1639,7 +1591,7 @@ class Tally(object): return nuclide_index def get_score_index(self, score): - """Returns the index in the Tally's results array for a score bin. + """Returns the index in the Tally's results array for a score bin Parameters ---------- @@ -1675,7 +1627,7 @@ class Tally(object): This routine constructs a 3D NumPy array for the requested Tally data indexed by filter bin, nuclide bin, and score index. The routine will - order the data in the array as specified in the parameter lists. + order the data in the array as specified in the parameter lists Parameters ---------- @@ -2461,62 +2413,38 @@ class _CrossScore(object): if left_score is not None: self.left_score = left_score - if right_score is not None: self.right_score = right_score - if binary_op is not None: self.binary_op = binary_op - @property def left_score(self): return self._left_score - @property def right_score(self): return self._right_score - @property def binary_op(self): return self._binary_op - @left_score.setter def left_score(self, left_score): - - if not isinstance(left_score, (_CrossScore, str)): - msg = 'Unable to set CrossScore left score to {0} which ' \ - 'is not a string'.format(left_score) - raise ValueError(msg) - + check_type('left score', left_score, (str, _CrossScore)) self._left_score = left_score - @right_score.setter def right_score(self, right_score): - - if not isinstance(right_score, (_CrossScore, str)): - msg = 'Unable to set CrossScore right score to {0} which ' \ - 'is not a string'.format(right_score) - raise ValueError(msg) - + check_type('right score', right_score, (str, _CrossScore)) self._right_score = right_score - @binary_op.setter def binary_op(self, binary_op): - - if not is_string(binary_op): - msg = 'Unable to set CrossScore binary op to {0} which ' \ - 'is not a string'.format(binary_op) - raise ValueError(msg) - + check_type('binary op', binary_op, str) self._binary_op = binary_op - def __repr__(self): string = '({0} {1} {2})'.format(self.left_score, self.binary_op, self.right_score) @@ -2533,62 +2461,38 @@ class _CrossNuclide(object): if left_nuclide is not None: self.left_nuclide = left_nuclide - if right_nuclide is not None: self.right_nuclide = right_nuclide - if binary_op is not None: self.binary_op = binary_op - @property def left_nuclide(self): return self._left_nuclide - @property def right_nuclide(self): return self._right_nuclide - @property def binary_op(self): return self._binary_op - @left_nuclide.setter def left_nuclide(self, left_nuclide): - - if not isinstance(left_nuclide, (Nuclide, _CrossNuclide, int)): - msg = 'Unable to set CrossNuclide left nuclide to {0} which ' \ - 'is not an integer or Nuclide'.format(left_nuclide) - raise ValueError(msg) - + check_type('left nuclide', left_nuclide, (Nuclide, _CrossNuclide)) self._left_nuclide = left_nuclide - @right_nuclide.setter def right_nuclide(self, right_nuclide): - - if not isinstance(right_nuclide, (Nuclide, _CrossNuclide, int)): - msg = 'Unable to set CrossNuclide right nuclide to {0} which ' \ - 'is not an integer or Nuclide'.format(right_nuclide) - raise ValueError(msg) - + check_type('right nuclide', right_nuclide, (Nuclide, _CrossNuclide)) self._right_nuclide = right_nuclide - @binary_op.setter def binary_op(self, binary_op): - - if not is_string(binary_op): - msg = 'Unable to set CrossNuclide binary op to {0} which ' \ - 'is not a string'.format(binary_op) - raise ValueError(msg) - + check_type('binary op', binary_op, str) self._binary_op = binary_op - def __repr__(self): string = '' @@ -2622,94 +2526,63 @@ class _CrossFilter(object): if left_filter is not None: self.left_filter = left_filter - if right_filter is not None: self.right_filter = right_filter - if binary_op is not None: self.binary_op = binary_op - @property def left_filter(self): return self._left_filter - @property def right_filter(self): return self._right_filter - @property def binary_op(self): return self._binary_op - @property def type(self): return (self.right_filter.type, self.left_filter.type) - @property def bins(self): return (self.right_filter.bins, self.left_filter.bins) - @property def num_bins(self): return self.left_filter.num_bins * self.right_filter.num_bins - @property def stride(self): return self.left_filter.stride * self.right_filter.stride - @left_filter.setter def left_filter(self, left_filter): - - if not isinstance(left_filter, (Filter, _CrossFilter)): - msg = 'Unable to set CrossFilter left filter to {0} which ' \ - 'is not a Filter'.format(left_filter) - raise ValueError(msg) - + check_type('left filter', left_filter, (Filter, _CrossFilter)) self._left_filter = left_filter - @right_filter.setter def right_filter(self, right_filter): - - if not isinstance(right_filter, (Filter, _CrossFilter)): - msg = 'Unable to set CrossFilter right filter to {0} which ' \ - 'is not a Filter'.format(right_filter) - raise ValueError(msg) - + check_type('right filter', right_filter, (Filter, _CrossFilter)) self._right_filter = right_filter - @binary_op.setter def binary_op(self, binary_op): - - if not is_string(binary_op): - msg = 'Unable to set CrossFilter binary op to {0} which ' \ - 'is not a string'.format(binary_op) - raise ValueError(msg) - + check_type('binary op', binary_op, str) self._binary_op = binary_op - def __repr__(self): string = '_CrossFilter\n' - filter_type = '({0} {1} {2})'.format(self.left_filter.type, self.binary_op, self.right_filter.type) - filter_bins = '({0} {1} {2})'.format(self.left_filter.bins, self.binary_op, self.right_filter.bins) - string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', filter_type) string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', filter_bins) return string @@ -2733,4 +2606,4 @@ class _CrossFilter(object): else: split_filters.extend(self.right_filter.split_filters()) - return split_filters + return split_filters \ No newline at end of file From c36ea824ace917d90e8d8fdbe9b33c32654cf8de Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 26 Jul 2015 23:14:17 -0700 Subject: [PATCH 020/101] Fixed Tally.add_score to accept _CrossScore types --- openmc/tallies.py | 76 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 2b58a1c2a2..b1a391c0c7 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1180,8 +1180,8 @@ class Tally(object): """ - if not isinstance(score, basestring): - msg = 'Unable to add score "{0}" to Tally ID={1} since it is ' \ + if not isinstance(score, (basestring, _CrossScore)): + msg = 'Unable to add score "{0}" to Tally ID={1} since it is ' \ 'not a string'.format(score, self.id) raise ValueError(msg) @@ -2404,6 +2404,30 @@ class TalliesFile(object): class _CrossScore(object): + """A special-purpose tally score used to encapsulate all combinations of two + tally's scores as a cross product for tally arithmetic. + + Parameters + ---------- + left_score : str or _CrossScore + The left score in the cross product. + right_score : str or _CrossScore + The right score in the cross product. + binary_op : str + The tally arithmetic binary operator (e.g., '+', '-', etc.) used to + combine two tally's scores with this _CrossNuclide. + + Attributes + ---------- + left_score : str or _CrossScore + The left score in the cross product. + right_score : str or _CrossScore + The right score in the cross product. + binary_op : str + The tally arithmetic binary operator (e.g., '+', '-', etc.) used to + combine two tally's scores with this _CrossNuclide. + + """ def __init__(self, left_score=None, right_score=None, binary_op=None): @@ -2452,6 +2476,30 @@ class _CrossScore(object): class _CrossNuclide(object): + """A special-purpose nuclide used to encapsulate all combinations of two + tally's nuclides as a cross product for tally arithmetic. + + Parameters + ---------- + left_nuclide : Nuclide or _CrossNuclide + The left nuclide in the cross product. + right_nuclide : Nuclide or _CrossNuclide + The right nuclide in the cross product. + binary_op : str + The tally arithmetic binary operator (e.g., '+', '-', etc.) used to + combine two tally's nuclides with this _CrossNuclide. + + Attributes + ---------- + left_nuclide : Nuclide or _CrossNuclide + The left nuclide in the cross product. + right_nuclide : Nuclide or _CrossNuclide + The right nuclide in the cross product. + binary_op : str + The tally arithmetic binary operator (e.g., '+', '-', etc.) used to + combine two tally's nuclides with this _CrossNuclide. + + """ def __init__(self, left_nuclide=None, right_nuclide=None, binary_op=None): @@ -2517,6 +2565,30 @@ class _CrossNuclide(object): class _CrossFilter(object): + """A special-purpose filter used to encapsulate all combinations of two + tally's filter bins as a cross product for tally arithmetic. + + Parameters + ---------- + left_filter : Filter or _CrossFilter + The left filter in the cross product. + right_filter : Filter or _CrossFilter + The right filter in the cross product. + binary_op : str + The tally arithmetic binary operator (e.g., '+', '-', etc.) used to + combine two tally's filter bins with this _CrossFilter. + + Attributes + ---------- + left_filter : Filter or _CrossFilter + The left filter in the cross product. + right_filter : Filter or _CrossFilter + The right filter in the cross product. + binary_op : str + The tally arithmetic binary operator (e.g., '+', '-', etc.) used to + combine two tally's filter bins with this _CrossFilter. + + """ def __init__(self, left_filter=None, right_filter=None, binary_op=None): From 65383dbce45dc6f34814e5b4d26efdcb6c13e47a Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 26 Jul 2015 23:17:59 -0700 Subject: [PATCH 021/101] Abstracted cross product datatypes into new cross.py --- openmc/cross.py | 280 +++++++++++++++++++++++++++++++++++++++++++++ openmc/tallies.py | 283 +--------------------------------------------- 2 files changed, 283 insertions(+), 280 deletions(-) create mode 100644 openmc/cross.py diff --git a/openmc/cross.py b/openmc/cross.py new file mode 100644 index 0000000000..60a524b512 --- /dev/null +++ b/openmc/cross.py @@ -0,0 +1,280 @@ +from openmc import Filter, Nuclide +from openmc.checkvalue import check_type + + +class _CrossScore(object): + """A special-purpose tally score used to encapsulate all combinations of two + tally's scores as a cross product for tally arithmetic. + + Parameters + ---------- + left_score : str or _CrossScore + The left score in the cross product. + right_score : str or _CrossScore + The right score in the cross product. + binary_op : str + The tally arithmetic binary operator (e.g., '+', '-', etc.) used to + combine two tally's scores with this _CrossNuclide. + + Attributes + ---------- + left_score : str or _CrossScore + The left score in the cross product. + right_score : str or _CrossScore + The right score in the cross product. + binary_op : str + The tally arithmetic binary operator (e.g., '+', '-', etc.) used to + combine two tally's scores with this _CrossNuclide. + + """ + + def __init__(self, left_score=None, right_score=None, binary_op=None): + + self._left_score = None + self._right_score = None + self._binary_op = None + + if left_score is not None: + self.left_score = left_score + if right_score is not None: + self.right_score = right_score + if binary_op is not None: + self.binary_op = binary_op + + @property + def left_score(self): + return self._left_score + + @property + def right_score(self): + return self._right_score + + @property + def binary_op(self): + return self._binary_op + + @left_score.setter + def left_score(self, left_score): + check_type('left score', left_score, (str, _CrossScore)) + self._left_score = left_score + + @right_score.setter + def right_score(self, right_score): + check_type('right score', right_score, (str, _CrossScore)) + self._right_score = right_score + + @binary_op.setter + def binary_op(self, binary_op): + check_type('binary op', binary_op, str) + self._binary_op = binary_op + + def __repr__(self): + string = '({0} {1} {2})'.format(self.left_score, + self.binary_op, self.right_score) + return string + + +class _CrossNuclide(object): + """A special-purpose nuclide used to encapsulate all combinations of two + tally's nuclides as a cross product for tally arithmetic. + + Parameters + ---------- + left_nuclide : Nuclide or _CrossNuclide + The left nuclide in the cross product. + right_nuclide : Nuclide or _CrossNuclide + The right nuclide in the cross product. + binary_op : str + The tally arithmetic binary operator (e.g., '+', '-', etc.) used to + combine two tally's nuclides with this _CrossNuclide. + + Attributes + ---------- + left_nuclide : Nuclide or _CrossNuclide + The left nuclide in the cross product. + right_nuclide : Nuclide or _CrossNuclide + The right nuclide in the cross product. + binary_op : str + The tally arithmetic binary operator (e.g., '+', '-', etc.) used to + combine two tally's nuclides with this _CrossNuclide. + + """ + + def __init__(self, left_nuclide=None, right_nuclide=None, binary_op=None): + + self._left_nuclide = None + self._right_nuclide = None + self._binary_op = None + + if left_nuclide is not None: + self.left_nuclide = left_nuclide + if right_nuclide is not None: + self.right_nuclide = right_nuclide + if binary_op is not None: + self.binary_op = binary_op + + @property + def left_nuclide(self): + return self._left_nuclide + + @property + def right_nuclide(self): + return self._right_nuclide + + @property + def binary_op(self): + return self._binary_op + + @left_nuclide.setter + def left_nuclide(self, left_nuclide): + check_type('left nuclide', left_nuclide, (Nuclide, _CrossNuclide)) + self._left_nuclide = left_nuclide + + @right_nuclide.setter + def right_nuclide(self, right_nuclide): + check_type('right nuclide', right_nuclide, (Nuclide, _CrossNuclide)) + self._right_nuclide = right_nuclide + + @binary_op.setter + def binary_op(self, binary_op): + check_type('binary op', binary_op, str) + self._binary_op = binary_op + + def __repr__(self): + + string = '' + + # If the Summary was linked, the left nuclide is a Nuclide object + if isinstance(self.left_nuclide, Nuclide): + string += '(' + self.left_nuclide.name + # If the Summary was not linked, the left nuclide is the ZAID + else: + string += '(' + str(self.left_nuclide) + + string += ' ' + self.binary_op + ' ' + + # If the Summary was linked, the right nuclide is a Nuclide object + if isinstance(self.right_nuclide, Nuclide): + string += self.right_nuclide.name + ')' + # If the Summary was not linked, the right nuclide is the ZAID + else: + string += str(self.right_nuclide) + ')' + + return string + + +class _CrossFilter(object): + """A special-purpose filter used to encapsulate all combinations of two + tally's filter bins as a cross product for tally arithmetic. + + Parameters + ---------- + left_filter : Filter or _CrossFilter + The left filter in the cross product. + right_filter : Filter or _CrossFilter + The right filter in the cross product. + binary_op : str + The tally arithmetic binary operator (e.g., '+', '-', etc.) used to + combine two tally's filter bins with this _CrossFilter. + + Attributes + ---------- + left_filter : Filter or _CrossFilter + The left filter in the cross product. + right_filter : Filter or _CrossFilter + The right filter in the cross product. + binary_op : str + The tally arithmetic binary operator (e.g., '+', '-', etc.) used to + combine two tally's filter bins with this _CrossFilter. + + """ + + def __init__(self, left_filter=None, right_filter=None, binary_op=None): + + self._left_filter = None + self._right_filter = None + self._binary_op = None + + if left_filter is not None: + self.left_filter = left_filter + if right_filter is not None: + self.right_filter = right_filter + if binary_op is not None: + self.binary_op = binary_op + + @property + def left_filter(self): + return self._left_filter + + @property + def right_filter(self): + return self._right_filter + + @property + def binary_op(self): + return self._binary_op + + @property + def type(self): + return (self.right_filter.type, self.left_filter.type) + + @property + def bins(self): + return (self.right_filter.bins, self.left_filter.bins) + + @property + def num_bins(self): + return self.left_filter.num_bins * self.right_filter.num_bins + + @property + def stride(self): + return self.left_filter.stride * self.right_filter.stride + + @left_filter.setter + def left_filter(self, left_filter): + check_type('left filter', left_filter, (Filter, _CrossFilter)) + self._left_filter = left_filter + + @right_filter.setter + def right_filter(self, right_filter): + check_type('right filter', right_filter, (Filter, _CrossFilter)) + self._right_filter = right_filter + + @binary_op.setter + def binary_op(self, binary_op): + check_type('binary op', binary_op, str) + self._binary_op = binary_op + + def __repr__(self): + + string = '_CrossFilter\n' + filter_type = '({0} {1} {2})'.format(self.left_filter.type, + self.binary_op, + self.right_filter.type) + filter_bins = '({0} {1} {2})'.format(self.left_filter.bins, + self.binary_op, + self.right_filter.bins) + string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', filter_type) + string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', filter_bins) + return string + + + def split_filters(self): + + split_filters = [] + + # If left Filter is not a CrossFilter, simply append to list + if isinstance(self.left_filter, Filter): + split_filters.append(self.left_filter) + # Recursively descend CrossFilter tree to collect all Filters + else: + split_filters.extend(self.left_filter.split_filters()) + + # If right Filter is not a CrossFilter, simply append to list + if isinstance(self.right_filter, Filter): + split_filters.append(self.right_filter) + # Recursively descend CrossFilter tree to collect all Filters + else: + split_filters.extend(self.right_filter.split_filters()) + + return split_filters \ No newline at end of file diff --git a/openmc/tallies.py b/openmc/tallies.py index b1a391c0c7..0faa9d59e2 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -10,6 +10,7 @@ import sys import numpy as np from openmc import Mesh, Filter, Trigger, Nuclide +from openmc.cross import _CrossScore, _CrossNuclide, _CrossFilter from openmc.summary import Summary from openmc.checkvalue import check_type, check_value, check_greater_than from openmc.clean_xml import * @@ -1181,7 +1182,7 @@ class Tally(object): """ if not isinstance(score, (basestring, _CrossScore)): - msg = 'Unable to add score "{0}" to Tally ID={1} since it is ' \ + msg = 'Unable to add score "{0}" to Tally ID={1} since it is ' \ 'not a string'.format(score, self.id) raise ValueError(msg) @@ -2400,282 +2401,4 @@ class TalliesFile(object): # Write the XML Tree to the tallies.xml file tree = ET.ElementTree(self._tallies_file) tree.write("tallies.xml", xml_declaration=True, - encoding='utf-8', method="xml") - - -class _CrossScore(object): - """A special-purpose tally score used to encapsulate all combinations of two - tally's scores as a cross product for tally arithmetic. - - Parameters - ---------- - left_score : str or _CrossScore - The left score in the cross product. - right_score : str or _CrossScore - The right score in the cross product. - binary_op : str - The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's scores with this _CrossNuclide. - - Attributes - ---------- - left_score : str or _CrossScore - The left score in the cross product. - right_score : str or _CrossScore - The right score in the cross product. - binary_op : str - The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's scores with this _CrossNuclide. - - """ - - def __init__(self, left_score=None, right_score=None, binary_op=None): - - self._left_score = None - self._right_score = None - self._binary_op = None - - if left_score is not None: - self.left_score = left_score - if right_score is not None: - self.right_score = right_score - if binary_op is not None: - self.binary_op = binary_op - - @property - def left_score(self): - return self._left_score - - @property - def right_score(self): - return self._right_score - - @property - def binary_op(self): - return self._binary_op - - @left_score.setter - def left_score(self, left_score): - check_type('left score', left_score, (str, _CrossScore)) - self._left_score = left_score - - @right_score.setter - def right_score(self, right_score): - check_type('right score', right_score, (str, _CrossScore)) - self._right_score = right_score - - @binary_op.setter - def binary_op(self, binary_op): - check_type('binary op', binary_op, str) - self._binary_op = binary_op - - def __repr__(self): - string = '({0} {1} {2})'.format(self.left_score, - self.binary_op, self.right_score) - return string - - -class _CrossNuclide(object): - """A special-purpose nuclide used to encapsulate all combinations of two - tally's nuclides as a cross product for tally arithmetic. - - Parameters - ---------- - left_nuclide : Nuclide or _CrossNuclide - The left nuclide in the cross product. - right_nuclide : Nuclide or _CrossNuclide - The right nuclide in the cross product. - binary_op : str - The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's nuclides with this _CrossNuclide. - - Attributes - ---------- - left_nuclide : Nuclide or _CrossNuclide - The left nuclide in the cross product. - right_nuclide : Nuclide or _CrossNuclide - The right nuclide in the cross product. - binary_op : str - The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's nuclides with this _CrossNuclide. - - """ - - def __init__(self, left_nuclide=None, right_nuclide=None, binary_op=None): - - self._left_nuclide = None - self._right_nuclide = None - self._binary_op = None - - if left_nuclide is not None: - self.left_nuclide = left_nuclide - if right_nuclide is not None: - self.right_nuclide = right_nuclide - if binary_op is not None: - self.binary_op = binary_op - - @property - def left_nuclide(self): - return self._left_nuclide - - @property - def right_nuclide(self): - return self._right_nuclide - - @property - def binary_op(self): - return self._binary_op - - @left_nuclide.setter - def left_nuclide(self, left_nuclide): - check_type('left nuclide', left_nuclide, (Nuclide, _CrossNuclide)) - self._left_nuclide = left_nuclide - - @right_nuclide.setter - def right_nuclide(self, right_nuclide): - check_type('right nuclide', right_nuclide, (Nuclide, _CrossNuclide)) - self._right_nuclide = right_nuclide - - @binary_op.setter - def binary_op(self, binary_op): - check_type('binary op', binary_op, str) - self._binary_op = binary_op - - def __repr__(self): - - string = '' - - # If the Summary was linked, the left nuclide is a Nuclide object - if isinstance(self.left_nuclide, Nuclide): - string += '(' + self.left_nuclide.name - # If the Summary was not linked, the left nuclide is the ZAID - else: - string += '(' + str(self.left_nuclide) - - string += ' ' + self.binary_op + ' ' - - # If the Summary was linked, the right nuclide is a Nuclide object - if isinstance(self.right_nuclide, Nuclide): - string += self.right_nuclide.name + ')' - # If the Summary was not linked, the right nuclide is the ZAID - else: - string += str(self.right_nuclide) + ')' - - return string - - -class _CrossFilter(object): - """A special-purpose filter used to encapsulate all combinations of two - tally's filter bins as a cross product for tally arithmetic. - - Parameters - ---------- - left_filter : Filter or _CrossFilter - The left filter in the cross product. - right_filter : Filter or _CrossFilter - The right filter in the cross product. - binary_op : str - The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's filter bins with this _CrossFilter. - - Attributes - ---------- - left_filter : Filter or _CrossFilter - The left filter in the cross product. - right_filter : Filter or _CrossFilter - The right filter in the cross product. - binary_op : str - The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's filter bins with this _CrossFilter. - - """ - - def __init__(self, left_filter=None, right_filter=None, binary_op=None): - - self._left_filter = None - self._right_filter = None - self._binary_op = None - - if left_filter is not None: - self.left_filter = left_filter - if right_filter is not None: - self.right_filter = right_filter - if binary_op is not None: - self.binary_op = binary_op - - @property - def left_filter(self): - return self._left_filter - - @property - def right_filter(self): - return self._right_filter - - @property - def binary_op(self): - return self._binary_op - - @property - def type(self): - return (self.right_filter.type, self.left_filter.type) - - @property - def bins(self): - return (self.right_filter.bins, self.left_filter.bins) - - @property - def num_bins(self): - return self.left_filter.num_bins * self.right_filter.num_bins - - @property - def stride(self): - return self.left_filter.stride * self.right_filter.stride - - @left_filter.setter - def left_filter(self, left_filter): - check_type('left filter', left_filter, (Filter, _CrossFilter)) - self._left_filter = left_filter - - @right_filter.setter - def right_filter(self, right_filter): - check_type('right filter', right_filter, (Filter, _CrossFilter)) - self._right_filter = right_filter - - @binary_op.setter - def binary_op(self, binary_op): - check_type('binary op', binary_op, str) - self._binary_op = binary_op - - def __repr__(self): - - string = '_CrossFilter\n' - filter_type = '({0} {1} {2})'.format(self.left_filter.type, - self.binary_op, - self.right_filter.type) - filter_bins = '({0} {1} {2})'.format(self.left_filter.bins, - self.binary_op, - self.right_filter.bins) - string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', filter_type) - string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', filter_bins) - return string - - - def split_filters(self): - - split_filters = [] - - # If left Filter is not a CrossFilter, simply append to list - if isinstance(self.left_filter, Filter): - split_filters.append(self.left_filter) - # Recursively descend CrossFilter tree to collect all Filters - else: - split_filters.extend(self.left_filter.split_filters()) - - # If right Filter is not a CrossFilter, simply append to list - if isinstance(self.right_filter, Filter): - split_filters.append(self.right_filter) - # Recursively descend CrossFilter tree to collect all Filters - else: - split_filters.extend(self.right_filter.split_filters()) - - return split_filters \ No newline at end of file + encoding='utf-8', method="xml") \ No newline at end of file From 315236ea58b3fe1d7f016f66a6799ffdad8017a9 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 27 Jul 2015 20:24:10 -0600 Subject: [PATCH 022/101] Fix PyAPI HexLattice.get_unique_universes() closes #413 --- openmc/checkvalue.py | 78 ++++++++++++++++++++++++++++++++++++++++++++ openmc/universe.py | 37 ++++++++++++++------- 2 files changed, 104 insertions(+), 11 deletions(-) diff --git a/openmc/checkvalue.py b/openmc/checkvalue.py index 01613908ba..f9e05e3f8c 100644 --- a/openmc/checkvalue.py +++ b/openmc/checkvalue.py @@ -1,3 +1,5 @@ +from collections import Iterable + def check_type(name, value, expected_type, expected_iter_type=None): """Ensure that an object is of an expected type. Optionally, if the object is iterable, check that each element is of a particular type. @@ -30,6 +32,82 @@ def check_type(name, value, expected_type, expected_iter_type=None): raise ValueError(msg) +def check_iterable_type(name, value, expected_type, min_depth=1, max_depth=1): + """Ensure that an object is an iterable containing an expected type. + + Parameters + ---------- + name : str + Description of value being checked + value : Iterable + Iterable, possibly of other iterables, that should ultimately contain + the expected type + expected_type : type + type that the iterable should contain + min_depth : int + The minimum number of layers of nested iterables there should be before + reaching the ultimately contained items + max_depth : int + The maximum number of layers of nested iterables ... + """ + # Initialize the tree at the very first item. + tree = [value] + index = [0] + + # Traverse the tree. + while index[0] != len(tree[0]): + # If we are done with this level of the tree, go to the next branch on + # the level above this one. + if index[-1] == len(tree[-1]): + del index[-1] + del tree[-1] + index[-1] += 1 + continue + + # Get a string representation of the current index in case we raise an + # exception. + form = '[' + '{:d}, '*(len(index)-1) + '{:d}]' + ind_str = form.format(*index) + + # What is the current item we are looking at? + current_item = tree[-1][index[-1]] + + # If this item is of the expected type, then we've reached the bottom + # level of this branch. + if isinstance(current_item, expected_type): + # Is this deep enough? + if len(tree) < min_depth: + msg = 'Error setting {0}: The item at {1} does not meet the ' \ + 'minimum depth of {2}'.format(name, ind_str, min_depth) + raise ValueError(msg) + + # This item is okay. Move on to the next item. + index[-1] += 1 + + # If this item is not of the expected type, then it's either an error or + # another level of the tree that we need to pursue deeper. + else: + if isinstance(current_item, Iterable): + # The tree goes deeper here, let's explore it. + tree.append(current_item) + index.append(0) + + # But first, have we exceeded the max depth? + if len(tree) > max_depth: + msg = 'Error setting {0}: Found an iterable at {1}, items '\ + 'in that iterable excceed the maximum depth of {2}' \ + .format(name, ind_str, max_depth) + raise ValueError(msg) + + else: + # This item is completely unexected. + msg = "Error setting {0}: Items must be of type '{1}', but " \ + "item at {2} is of type '{3}'"\ + .format(name, expected_type.__name__, ind_str, + type(current_item).__name__) + raise ValueError(msg) + + def check_length(name, value, length_min, length_max=None): """Ensure that a sized object has length within a given range. diff --git a/openmc/universe.py b/openmc/universe.py index 84ce3696ee..f424b1a944 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -7,7 +7,8 @@ import sys import numpy as np import openmc -from openmc.checkvalue import check_type, check_length, check_greater_than +from openmc.checkvalue import check_type, check_iterable_type, check_length, \ + check_greater_than if sys.version_info[0] >= 3: basestring = str @@ -687,8 +688,11 @@ class Lattice(object): @universes.setter def universes(self, universes): - check_type('lattice universes', universes, Iterable) - self._universes = np.asarray(universes, dtype=Universe) + #check_type('lattice universes', universes, Iterable) + check_iterable_type('lattice universes', universes, Universe, + min_depth=2, max_depth=3) + self._universes = universes + #self._universes = np.asarray(universes, dtype=Universe) def get_unique_universes(self): """Determine all unique universes in the lattice @@ -701,13 +705,24 @@ class Lattice(object): """ - unique_universes = np.unique(self._universes.ravel()) - universes = {} + univs = dict() + for k in range(len(self._universes)): + for j in range(len(self._universes[k])): + if isinstance(self._universes[k][j], Universe): + u = self._universes[k][j] + if u._id not in univs: + univs[u._id] = u + else: + for i in range(len(self._universes[k][j])): + u = self._universes[k][j][i] + assert isinstance(u, Universe) + if u._id not in univs: + univs[u._id] = u - for universe in unique_universes: - universes[universe._id] = universe + if self._outer._id not in univs: + univs[self._outer._id] = self._outer - return universes + return univs def get_all_nuclides(self): """Return all nuclides contained in the lattice @@ -1091,14 +1106,14 @@ class HexLattice(Lattice): # Set the number of axial positions. if n_dims == 3: - self.num_axial = self._universes.shape[0] + self.num_axial = len(self._universes) else: self._num_axial = None # Set the number of rings and make sure this number is consistent for # all axial positions. if n_dims == 3: - self.num_rings = len(self._universes[0]) + self.num_rings = len(self._universes) for rings in self._universes: if len(rings) != self._num_rings: msg = 'HexLattice ID={0:d} has an inconsistent number of ' \ @@ -1106,7 +1121,7 @@ class HexLattice(Lattice): raise ValueError(msg) else: - self.num_rings = self._universes.shape[0] + self.num_rings = len(self._universes) # Make sure there are the correct number of elements in each ring. if n_dims == 3: From 8ecc3c115c0a71b9cfd7eb783dc18e367e6b0bea Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 29 Jul 2015 00:06:07 -0700 Subject: [PATCH 023/101] Continued cleanup and modularization of tally arithmetic routines --- openmc/tallies.py | 1608 ++++++++++++++++++++++----------------------- 1 file changed, 785 insertions(+), 823 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 0faa9d59e2..66361a3e9d 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -102,821 +102,6 @@ class Tally(object): self._std_dev = None self._with_batch_statistics = False - - def _align_tally_data(self, other): - - self_mean = copy.deepcopy(self.mean) - self_std_dev = copy.deepcopy(self.std_dev) - other_mean = copy.deepcopy(other.mean) - other_std_dev = copy.deepcopy(other.std_dev) - - if self.filters != other.filters: - - # Determine the number of paired combinations of filter bins - # between the two tallies and repeat arrays along filter axes - self_num_filter_bins = self.mean.shape[0] - other_num_filter_bins = other.mean.shape[0] - num_filter_bins = self_num_filter_bins * other_num_filter_bins - self_repeat_factor = num_filter_bins / self_num_filter_bins - other_tile_factor = num_filter_bins / other_num_filter_bins - - # Replicate the data - self_mean = np.repeat(self_mean, self_repeat_factor, axis=0) - other_mean = np.tile(other_mean, (other_tile_factor, 1, 1)) - self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=0) - other_std_dev = np.tile(other_std_dev, (other_tile_factor, 1, 1)) - - if self.nuclides != other.nuclides: - - # Determine the number of paired combinations of nuclides - # between the two tallies and repeat arrays along nuclide axes - self_num_nuclide_bins = self.mean.shape[1] - other_num_nuclide_bins = other.mean.shape[1] - num_nuclide_bins = self_num_nuclide_bins * other_num_nuclide_bins - self_repeat_factor = num_nuclide_bins / self_num_nuclide_bins - other_tile_factor = num_nuclide_bins / other_num_nuclide_bins - - # Replicate the data - self_mean = np.repeat(self_mean, self_repeat_factor, axis=1) - other_mean = np.tile(other_mean, (1, other_tile_factor, 1)) - self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=1) - other_std_dev = np.tile(other_std_dev, (1, other_tile_factor, 1)) - - if self.scores != other.scores: - - # Determine the number of paired combinations of score bins - # between the two tallies and repeat arrays along score axes - self_num_score_bins = self.mean.shape[2] - other_num_score_bins = other.mean.shape[2] - num_score_bins = self_num_score_bins * other_num_score_bins - self_repeat_factor = num_score_bins / self_num_score_bins - other_tile_factor = num_score_bins / other_num_score_bins - - # Replicate the data - self_mean = np.repeat(self_mean, self_repeat_factor, axis=2) - other_mean = np.tile(other_mean, (1, 1, other_tile_factor)) - self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=2) - other_std_dev = np.tile(other_std_dev, (1, 1, other_tile_factor)) - - data = {} - data['self'] = {} - data['other'] = {} - data['self']['mean'] = self_mean - data['other']['mean'] = other_mean - data['self']['std. dev.'] = self_std_dev - data['other']['std. dev.'] = other_std_dev - return data - - - def __add__(self, other): - - # Check that results have been read - if self.mean is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(self.id) - raise ValueError(msg) - - new_tally = Tally(name='derived') - new_tally.with_batch_statistics = True - - if isinstance(other, Tally): - - # Check that results have been read - if other.mean is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(other.id) - raise ValueError(msg) - - # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters - # FIXME: Need to be able to use StatePoint.get_tally - # FIXME: Need to be able to use Tally.get_value - # FIXME: Modularize - # FIXME: Redundant filters - - data = self._align_tally_data(other) - - new_tally._mean = data['self']['mean'] + data['other']['mean'] - new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + \ - data['other']['std. dev.']**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 the two Tallies have same filters, replicate them in new Tally - if self.filters == other.filters: - for filter in self.filters: - new_tally.add_filter(filter) - - # Generate filter "cross product" - else: - for self_filter in self.filters: - for other_filter in other.filters: - new_filter = _CrossFilter(self_filter, other_filter, '+') - new_tally.add_filter(new_filter) - - # If the two Tallies have same nuclides, replicate them in new Tally - if self.nuclides == other.nuclides: - for nuclide in self.nuclides: - new_tally.add_nuclide(nuclide) - - # Generate nuclide "cross product" - else: - for self_nuclide in self.nuclides: - for other_nuclide in other.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '+') - new_tally.add_nuclide(new_nuclide) - - # If the two Tallies have same scores, replicate them in new Tally - if self.scores == other.scores: - for score in self.scores: - new_tally.add_score(score) - - # Generate score "cross product" - else: - for self_score in self.scores: - for other_score in other.scores: - new_score = _CrossScore(self_score, other_score, '+') - new_tally.add_score(new_score) - - elif isinstance(other, Integral) or isinstance(other): - - new_tally._mean = self._mean + other - new_tally._std_dev = self._std_dev - new_tally.estimator = self.estimator - new_tally.with_summary = self.with_summary - new_tally.num_realization = self.num_realizations - new_tally.num_score_bins = self.num_score_bins - - for filter in self.filters: - new_tally.add_filter(filter) - for nuclide in self.nuclides: - new_tally.add_nuclide(nuclide) - for score in self.scores: - new_tally.add_score(score) - - else: - msg = 'Unable to add {0} to Tally ID={1}'.format(other, self.id) - raise ValueError(msg) - - return new_tally - - - def __radd__(self, other): - return self + other - - - def __sub__(self, other): - - # Check that results have been read - if self.mean is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(self.id) - raise ValueError(msg) - - new_tally = Tally(name='derived') - new_tally.with_batch_statistics = True - - if isinstance(other, Tally): - - # Check that results have been read - if other.mean is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(other.id) - raise ValueError(msg) - - # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters - # FIXME: Need to be able to use StatePoint.get_tally - # FIXME: Need to be able to use Tally.get_value - # FIXME: Modularize - - data = self._align_tally_data(other) - - new_tally._mean = data['self']['mean'] - data['other']['mean'] - new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + \ - data['other']['std. dev.']**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 the two Tallies have same filters, replicate them in new Tally - if self.filters == other.filters: - for filter in self.filters: - new_tally.add_filter(filter) - - # Generate filter "cross product" - else: - for self_filter in self.filters: - for other_filter in other.filters: - new_filter = _CrossFilter(self_filter, other_filter, '-') - new_tally.add_filter(new_filter) - - # If the two Tallies have same nuclides, replicate them in new Tally - if self.nuclides == other.nuclides: - for nuclide in self.nuclides: - new_tally.add_nuclide(nuclide) - - # Generate nuclide "cross product" - else: - for self_nuclide in self.nuclides: - for other_nuclide in other.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '-') - new_tally.add_nuclide(new_nuclide) - - # If the two Tallies have same scores, replicate them in new Tally - if self.scores == other.scores: - for score in self.scores: - new_tally.add_score(score) - - # Generate score "cross product" - else: - for self_score in self.scores: - for other_score in other.scores: - new_score = _CrossScore(self_score, other_score, '-') - new_tally.add_score(new_score) - - elif isinstance(other, (Integral, Rational)): - - new_tally._mean = self._mean - other - new_tally._std_dev = self._std_dev - new_tally.estimator = self.estimator - new_tally.with_summary = self.with_summary - new_tally.num_realization = self.num_realizations - new_tally.num_score_bins = self.num_score_bins - - for filter in self.filters: - new_tally.add_filter(filter) - for nuclide in self.nuclides: - new_tally.add_nuclide(nuclide) - for score in self.scores: - new_tally.add_score(score) - - else: - msg = 'Unable to subtract {0} from Tally ' \ - 'ID={1}'.format(other, self.id) - raise ValueError(msg) - - return new_tally - - - def __rsub__(self, other): - return -1. * self + other - - - def __mul__(self, other): - - # Check that results have been read - if self.mean is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(self.id) - raise ValueError(msg) - - new_tally = Tally(name='derived') - new_tally.with_batch_statistics = True - - if isinstance(other, Tally): - - # Check that results have been read - if other.mean is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(other.id) - raise ValueError(msg) - - # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters - # FIXME: Need to be able to use StatePoint.get_tally - # FIXME: Need to be able to use Tally.get_value - # FIXME: Modularize - - data = self._align_tally_data(other) - - self_rel_err = data['self']['std. dev.'] / data['self']['mean'] - other_rel_err = data['other']['std. dev.'] / data['other']['mean'] - new_tally._mean = data['self']['mean'] * data['other']['mean'] - new_tally._std_dev = np.abs(new_tally.mean) * \ - np.sqrt(self_rel_err**2 + other_rel_err**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 the two Tallies have same filters, replicate them in new Tally - if self.filters == other.filters: - for filter in self.filters: - new_tally.add_filter(filter) - - # Generate filter "cross product" - else: - for self_filter in self.filters: - for other_filter in other.filters: - new_filter = _CrossFilter(self_filter, other_filter, '*') - new_tally.add_filter(new_filter) - - # If the two Tallies have same nuclides, replicate them in new Tally - if self.nuclides == other.nuclides: - for nuclide in self.nuclides: - new_tally.add_nuclide(nuclide) - - # Generate nuclide "cross product" - else: - for self_nuclide in self.nuclides: - for other_nuclide in other.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '*') - new_tally.add_nuclide(new_nuclide) - - # If the two Tallies have same scores, replicate them in new Tally - if self.scores == other.scores: - for score in self.scores: - new_tally.add_score(score) - - # Generate score "cross product" - else: - for self_score in self.scores: - for other_score in other.scores: - new_score = _CrossScore(self_score, other_score, '*') - new_tally.add_score(new_score) - - elif isinstance(other, (Integral, Rational)): - - new_tally._mean = self._mean * other - new_tally._std_dev = self._std_dev * np.abs(other) - new_tally.estimator = self.estimator - new_tally.with_summary = self.with_summary - new_tally.num_realization = self.num_realizations - new_tally.num_score_bins = self.num_score_bins - - for filter in self.filters: - new_tally.add_filter(filter) - for nuclide in self.nuclides: - new_tally.add_nuclide(nuclide) - for score in self.scores: - new_tally.add_score(score) - - else: - msg = 'Unable to multiply Tally ID={1} ' \ - 'by {0}'.format(self.id, other) - raise ValueError(msg) - - return new_tally - - - def __rmul__(self, other): - return self * other - - - def __div__(self, other): - - # Check that results have been read - if self.mean is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(self.id) - raise ValueError(msg) - - new_tally = Tally(name='derived') - new_tally.with_batch_statistics = True - - if isinstance(other, Tally): - - # Check that results have been read - if other.mean is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(other.id) - raise ValueError(msg) - - # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters - # FIXME: Need to be able to use StatePoint.get_tally - # FIXME: Need to be able to use Tally.get_value - # FIXME: Modularize - - data = self._align_tally_data(other) - - self_rel_err = data['self']['std. dev.'] / data['self']['mean'] - other_rel_err = data['other']['std. dev.'] / data['other']['mean'] - new_tally._mean = data['self']['mean'] / data['other']['mean'] - new_tally._std_dev = np.abs(new_tally.mean) * \ - np.sqrt(self_rel_err**2 + other_rel_err**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 the two Tallies have same filters, replicate them in new Tally - if self.filters == other.filters: - for filter in self.filters: - new_tally.add_filter(filter) - - # Generate filter "cross product" - else: - for self_filter in self.filters: - for other_filter in other.filters: - new_filter = _CrossFilter(self_filter, other_filter, '/') - new_tally.add_filter(new_filter) - - # If the two Tallies have same nuclides, replicate them in new Tally - if self.nuclides == other.nuclides: - for nuclide in self.nuclides: - new_tally.add_nuclide(nuclide) - - # Generate nuclide "cross product" - else: - for self_nuclide in self.nuclides: - for other_nuclide in other.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '/') - new_tally.add_nuclide(new_nuclide) - - # If the two Tallies have same scores, replicate them in new Tally - if self.scores == other.scores: - for score in self.scores: - new_tally.add_score(score) - - # Generate score "cross product" - else: - for self_score in self.scores: - for other_score in other.scores: - new_score = _CrossScore(self_score, other_score, '/') - new_tally.add_score(new_score) - - elif isinstance(other, (Integral, Rational)): - - new_tally._mean = self._mean / other - new_tally._std_dev = self._std_dev * np.abs(1. / other) - new_tally.estimator = self.estimator - new_tally.with_summary = self.with_summary - new_tally.num_realization = self.num_realizations - new_tally.num_score_bins = self.num_score_bins - - for filter in self.filters: - new_tally.add_filter(filter) - for nuclide in self.nuclides: - new_tally.add_nuclide(nuclide) - for score in self.scores: - new_tally.add_score(score) - - else: - msg = 'Unable to divide Tally ID={0} ' \ - 'by {1}'.format(self.id, other) - raise ValueError(msg) - - return new_tally - - - def __rdiv__(self, other): - return self * (1. / other) - - - def __pow__(self, power): - - # Check that results have been read - if self.mean is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(self.id) - raise ValueError(msg) - - new_tally = Tally(name='derived') - new_tally.with_batch_statistics = True - - if isinstance(power, Tally): - - # Check that results have been read - if power.mean is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(power.id) - raise ValueError(msg) - - # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters - # FIXME: Need to be able to use StatePoint.get_tally - # FIXME: Need to be able to use Tally.get_value - # FIXME: Modularize - - data = self._align_tally_data(power) - - mean_ratio = data['other']['mean'] / data['self']['mean'] - first_term = mean_ratio * data['self']['std. dev.'] - second_term = np.log(data['self']['mean']) * data['other']['std. dev.'] - new_tally._mean = data['self']['mean'] ** data['other']['mean'] - new_tally._std_dev = np.abs(new_tally.mean) * \ - np.sqrt(first_term**2 + second_term**2) - - if self.estimator == power.estimator: - new_tally.estimator = self.estimator - if self.with_summary and power.with_summary: - new_tally.with_summary = self.with_summary - if self.num_realizations == power.num_realizations: - new_tally.num_realizations = self.num_realizations - - # If the two Tallies have same filters, replicate them in new Tally - if self.filters == power.filters: - for filter in self.filters: - new_tally.add_filter(filter) - - # Generate filter "cross product" - else: - for self_filter in self.filters: - for power_filter in power.filters: - new_filter = _CrossFilter(self_filter, power_filter, '^') - new_tally.add_filter(new_filter) - - # If the two Tallies have same nuclides, replicate them in new Tally - if self.nuclides == power.nuclides: - for nuclide in self.nuclides: - new_tally.add_nuclide(nuclide) - - # Generate nuclide "cross product" - else: - for self_nuclide in self.nuclides: - for power_nuclide in power.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, power_nuclide, '^') - new_tally.add_nuclide(new_nuclide) - - # If the two Tallies have same scores, replicate them in new Tally - if self.scores == power.scores: - for score in self.scores: - new_tally.add_score(score) - - # Generate score "cross product" - else: - for self_score in self.scores: - for power_score in power.scores: - new_score = _CrossScore(self_score, power_score, '^') - new_tally.add_score(new_score) - - elif isinstance(power, (Integral, Rational)): - - new_tally._mean = self._mean ** power - self_rel_err = self.std_dev / self.mean - new_tally._std_dev = np.abs(new_tally._mean * power * self_rel_err) - new_tally.estimator = self.estimator - new_tally.with_summary = self.with_summary - new_tally.num_realization = self.num_realizations - new_tally.num_score_bins = self.num_score_bins - - for filter in self.filters: - new_tally.add_filter(filter) - for nuclide in self.nuclides: - new_tally.add_nuclide(nuclide) - for score in self.scores: - new_tally.add_score(score) - - else: - msg = 'Unable to raise Tally ID={0} to ' \ - 'power {1}'.format(self.id, power) - raise ValueError(msg) - - return new_tally - - - def __pos__(self): - new_tally = copy.deepcopy(self) - new_tally._mean = np.abs(new_tally.mean) - return new_tally - - def __neg__(self): - new_tally = self * -1 - return new_tally - - def minimum(self, scores=[], filters=[], filter_bins=[], - nuclides=[], value='mean'): - """Returns the minimum of a slice of the Tally's data. - - Parameters - ---------- - scores : list - A list of one or more score strings - (e.g., ['absorption', 'nu-fission']; default is []) - - filters : list - A list of filter type strings - (e.g., ['mesh', 'energy']; default is []) - - filter_bins : list - A list of the filter bins corresponding to the filter_types - parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in - the list is the integer ID for 'material', 'surface', 'cell', - 'cellborn', and 'universe' Filters. Each bin is an integer for the - cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of - floats for 'energy' and 'energyout' filters corresponding to the - energy boundaries of the bin of interest. The bin is a (x,y,z) - 3-tuple for 'mesh' filters corresponding to the mesh cell of - interest. The order of the bins in the list must correspond of the - filter_types parameter. - - nuclides : list - A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) - - value : str - A string for the type of value to return - 'mean' (default), - 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted - - Returns - ------- - float - A scalar float of the minimum value in the Tally data indexed by - each filter, nuclide and score as listed in the parameters. - """ - - data = self.get_values(scores, filters, filter_bins, nuclides, value) - return np.min(data) - - def maximum(self, scores=[], filters=[], filter_bins=[], - nuclides=[], value='mean'): - """Returns the maximum of a slice of the Tally's data. - - Parameters - ---------- - scores : list - A list of one or more score strings - (e.g., ['absorption', 'nu-fission']; default is []) - - filters : list - A list of filter type strings - (e.g., ['mesh', 'energy']; default is []) - - filter_bins : list - A list of the filter bins corresponding to the filter_types - parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in - the list is the integer ID for 'material', 'surface', 'cell', - 'cellborn', and 'universe' Filters. Each bin is an integer for the - cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of - floats for 'energy' and 'energyout' filters corresponding to the - energy boundaries of the bin of interest. The bin is a (x,y,z) - 3-tuple for 'mesh' filters corresponding to the mesh cell of - interest. The order of the bins in the list must correspond of the - filter_types parameter. - - nuclides : list - A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) - - value : str - A string for the type of value to return - 'mean' (default), - 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted - - Returns - ------- - float - A scalar float of the maximum value in the Tally data indexed by - each filter, nuclide and score as listed in the parameters. - """ - - data = self.get_values(scores, filters, filter_bins, nuclides, value) - return np.max(data) - - def summation(self, scores=[], filters=[], filter_bins=[], - nuclides=[], value='mean'): - """Returns the sum of a slice of the Tally's data. - - Parameters - ---------- - scores : list - A list of one or more score strings - (e.g., ['absorption', 'nu-fission']; default is []) - - filters : list - A list of filter type strings - (e.g., ['mesh', 'energy']; default is []) - - filter_bins : list - A list of the filter bins corresponding to the filter_types - parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in - the list is the integer ID for 'material', 'surface', 'cell', - 'cellborn', and 'universe' Filters. Each bin is an integer for the - cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of - floats for 'energy' and 'energyout' filters corresponding to the - energy boundaries of the bin of interest. The bin is a (x,y,z) - 3-tuple for 'mesh' filters corresponding to the mesh cell of - interest. The order of the bins in the list must correspond of the - filter_types parameter. - - nuclides : list - A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) - - value : str - A string for the type of value to return - 'mean' (default), - 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted - - Returns - ------- - float - A scalar float of the sum of the Tally data indexed by - each filter, nuclide and score as listed in the parameters. - """ - - data = self.get_values(scores, filters, filter_bins, nuclides, value) - return np.sum(data) - - def slice(self, scores=[], filters=[], filter_bins=[], nuclides=[]): - """ - """ - - # Ensure that StatePoint.read_results() was called first - if (self.mean is None) or (self.std_dev is None): - msg = 'The Tally ID={0} has no data to slice. Call the ' \ - 'StatePoint.read_results() routine before using ' \ - 'Tally.slice(...)'.format(self.id) - raise ValueError(msg) - - # Compute batch statistics if not yet computed - if not self.with_batch_statistics: - self.compute_std_dev() - - new_tally = copy.deepcopy(self) - new_sum = self.get_values(scores, filters, filter_bins, - nuclides, 'sum') - new_sum_sq = self.get_values(scores, filters, filter_bins, - nuclides, 'sum_sq') - new_tally.sum = new_sum - new_tally.sum_sq = new_sum_sq - - ############################ FILTERS ######################### - # Determine the score indices from any of the requested scores - if filters: - - # Initialize list of indices to Filters to exclude from slice - filter_indices = [] - - # Loop over all of the Tally's Filters - for i, filter in enumerate(self.filters): - - # FIXME: sum over unused filter bins - # FIXME: neglect bins not selected for selected filters - # NOTE: We must store filter indices here since they are strings - - if filter.type not in filters: - filter_index = self.get_filter_index(filters[i], filter_bins[i]) - filter_indices.append(filter_index) - - # Loop over indices in reverse to remove excluded Filters - for filter_index in filter_indices[::-1]: - new_tally.remove_filter(self.filters[filter_index]) - - for i, filter_type in enumerate(filters): - - if 'energy' in filter_type: - # Create a list of the first energy edge - bins = [filter_bin[0] for filter_bin in filter_bins] - - - - ############################ NUCLIDES ######################## - # Determine the score indices from any of the requested scores - if nuclides: - - # Initialize list of indices to Nuclides to exclude from slice - nuclide_indices = [] - - for nuclide in self.nuclides: - - if isinstance(nuclide, Nuclide): - if nuclide.name not in nuclides: - nuclide_index = self.get_nuclide_index(nuclide) - nuclide_indices.append(nuclide_index) - else: - if nuclide not in nuclides: - nuclide_index = self.get_nuclide_index(nuclide) - nuclide_indices.append(nuclide_index) - - # Loop over indices in reverse to remove excluded Nuclides - for nuclide_index in nuclide_indices[::-1]: - new_tally.remove_nuclide(self.nuclides[nuclide_index]) - - ############################# SCORES ######################### - # Determine the score indices from any of the requested scores - if scores: - - # Initialize list of indices to Nuclides to exclude from slice - score_indices = [] - - for score in self.scores: - - if score not in scores: - score_index = self.get_score_index(score) - score_indices.append(score_index) - - # Loop over indices in reverse to remove excluded scores - for score_index in score_indices[::-1]: - new_tally.remove_score(self.scores[score_index]) - new_tally.num_score_bins -= 1 - - - - return new_tally - - - def __deepcopy__(self, memo): existing = memo.get(id(self)) @@ -1006,14 +191,6 @@ class Tally(object): return hash(tuple(hashable)) - def __add__(self, other): - # FIXME: Error checking: must check that results has been - # set and that # bins is the same - - new_tally = Tally() - new_tally._mean = self._mean + other._mean - new_tally._std_dev = np.sqrt(self.std_dev**2 + other.std_dev**2) - @property def id(self): return self._id @@ -2259,6 +1436,791 @@ class Tally(object): # Pickle the Tally results to a file pickle.dump(tally_results, open(filename, 'wb')) + def _align_tally_data(self, other): + + self_mean = copy.deepcopy(self.mean) + self_std_dev = copy.deepcopy(self.std_dev) + other_mean = copy.deepcopy(other.mean) + other_std_dev = copy.deepcopy(other.std_dev) + + if self.filters != other.filters: + + # Determine the number of paired combinations of filter bins + # between the two tallies and repeat arrays along filter axes + self_num_filter_bins = self.mean.shape[0] + other_num_filter_bins = other.mean.shape[0] + num_filter_bins = self_num_filter_bins * other_num_filter_bins + self_repeat_factor = num_filter_bins / self_num_filter_bins + other_tile_factor = num_filter_bins / other_num_filter_bins + + # Replicate the data + self_mean = np.repeat(self_mean, self_repeat_factor, axis=0) + other_mean = np.tile(other_mean, (other_tile_factor, 1, 1)) + self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=0) + other_std_dev = np.tile(other_std_dev, (other_tile_factor, 1, 1)) + + if self.nuclides != other.nuclides: + + # Determine the number of paired combinations of nuclides + # between the two tallies and repeat arrays along nuclide axes + self_num_nuclide_bins = self.mean.shape[1] + other_num_nuclide_bins = other.mean.shape[1] + num_nuclide_bins = self_num_nuclide_bins * other_num_nuclide_bins + self_repeat_factor = num_nuclide_bins / self_num_nuclide_bins + other_tile_factor = num_nuclide_bins / other_num_nuclide_bins + + # Replicate the data + self_mean = np.repeat(self_mean, self_repeat_factor, axis=1) + other_mean = np.tile(other_mean, (1, other_tile_factor, 1)) + self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=1) + other_std_dev = np.tile(other_std_dev, (1, other_tile_factor, 1)) + + if self.scores != other.scores: + + # Determine the number of paired combinations of score bins + # between the two tallies and repeat arrays along score axes + self_num_score_bins = self.mean.shape[2] + other_num_score_bins = other.mean.shape[2] + num_score_bins = self_num_score_bins * other_num_score_bins + self_repeat_factor = num_score_bins / self_num_score_bins + other_tile_factor = num_score_bins / other_num_score_bins + + # Replicate the data + self_mean = np.repeat(self_mean, self_repeat_factor, axis=2) + other_mean = np.tile(other_mean, (1, 1, other_tile_factor)) + self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=2) + other_std_dev = np.tile(other_std_dev, (1, 1, other_tile_factor)) + + data = {} + data['self'] = {} + data['other'] = {} + data['self']['mean'] = self_mean + data['other']['mean'] = other_mean + data['self']['std. dev.'] = self_std_dev + data['other']['std. dev.'] = other_std_dev + return data + + def __add__(self, other): + + # Check that results have been read + if self.mean is None: + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + + new_tally = Tally(name='derived') + new_tally.with_batch_statistics = True + + if isinstance(other, Tally): + + # Check that results have been read + if other.mean is None: + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(other.id) + raise ValueError(msg) + + # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters + # FIXME: Need to be able to use StatePoint.get_tally + # FIXME: Need to be able to use Tally.get_value + # FIXME: Modularize + # FIXME: Redundant filters + + data = self._align_tally_data(other) + + new_tally._mean = data['self']['mean'] + data['other']['mean'] + new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + \ + data['other']['std. dev.']**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 + + # Generate filter "cross products" + if self.filters == other.filters: + for self_filter in self.filters: + new_filter = _CrossFilter(self_filter, self_filter, '+') + new_tally.add_filter(new_filter) + else: + for self_filter in self.filters: + for other_filter in other.filters: + new_filter = _CrossFilter(self_filter, other_filter, '+') + new_tally.add_filter(new_filter) + + # Generate nuclide "cross products" + if self.nuclides == other.nuclides: + for self_nuclide in self.nuclides: + new_nuclide = _CrossNuclide(self_nuclide, self_nuclide, '+') + new_tally.add_nuclide(new_nuclide) + else: + for self_nuclide in self.nuclides: + for other_nuclide in other.nuclides: + new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '+') + new_tally.add_nuclide(new_nuclide) + + # Generate score "cross products" + if self.scores == other.scores: + for self_score in self.scores: + new_score = _CrossScore(self_score, self_score, '+') + new_tally.add_score(new_score) + else: + for self_score in self.scores: + for other_score in other.scores: + new_score = _CrossScore(self_score, other_score, '+') + new_tally.add_score(new_score) + + elif isinstance(other, Integral) or isinstance(other): + + new_tally._mean = self._mean + other + new_tally._std_dev = self._std_dev + new_tally.estimator = self.estimator + new_tally.with_summary = self.with_summary + new_tally.num_realization = self.num_realizations + new_tally.num_score_bins = self.num_score_bins + + for filter in self.filters: + new_tally.add_filter(filter) + for nuclide in self.nuclides: + new_tally.add_nuclide(nuclide) + for score in self.scores: + new_tally.add_score(score) + + else: + msg = 'Unable to add {0} to Tally ID={1}'.format(other, self.id) + raise ValueError(msg) + + return new_tally + + def __sub__(self, other): + + # Check that results have been read + if self.mean is None: + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + + new_tally = Tally(name='derived') + new_tally.with_batch_statistics = True + + if isinstance(other, Tally): + + # Check that results have been read + if other.mean is None: + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(other.id) + raise ValueError(msg) + + # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters + # FIXME: Need to be able to use StatePoint.get_tally + # FIXME: Need to be able to use Tally.get_value + # FIXME: Modularize + + data = self._align_tally_data(other) + + new_tally._mean = data['self']['mean'] - data['other']['mean'] + new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + \ + data['other']['std. dev.']**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 + + # Generate filter "cross products" + if self.filters == other.filters: + for self_filter in self.filters: + new_filter = _CrossFilter(self_filter, self_filter, '-') + new_tally.add_filter(new_filter) + else: + for self_filter in self.filters: + for other_filter in other.filters: + new_filter = _CrossFilter(self_filter, other_filter, '-') + new_tally.add_filter(new_filter) + + # Generate nuclide "cross products" + if self.nuclides == other.nuclides: + for self_nuclide in self.nuclides: + new_nuclide = _CrossNuclide(self_nuclide, self_nuclide, '-') + new_tally.add_nuclide(new_nuclide) + else: + for self_nuclide in self.nuclides: + for other_nuclide in other.nuclides: + new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '-') + new_tally.add_nuclide(new_nuclide) + + # Generate score "cross products" + if self.scores == other.scores: + for self_score in self.scores: + new_score = _CrossScore(self_score, self_score, '-') + new_tally.add_score(new_score) + else: + for self_score in self.scores: + for other_score in other.scores: + new_score = _CrossScore(self_score, other_score, '-') + new_tally.add_score(new_score) + + elif isinstance(other, (Integral, Rational)): + + new_tally._mean = self._mean - other + new_tally._std_dev = self._std_dev + new_tally.estimator = self.estimator + new_tally.with_summary = self.with_summary + new_tally.num_realization = self.num_realizations + new_tally.num_score_bins = self.num_score_bins + + for filter in self.filters: + new_tally.add_filter(filter) + for nuclide in self.nuclides: + new_tally.add_nuclide(nuclide) + for score in self.scores: + new_tally.add_score(score) + + else: + msg = 'Unable to subtract {0} from Tally ' \ + 'ID={1}'.format(other, self.id) + raise ValueError(msg) + + return new_tally + + def __mul__(self, other): + + # Check that results have been read + if self.mean is None: + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + + new_tally = Tally(name='derived') + new_tally.with_batch_statistics = True + + if isinstance(other, Tally): + + # Check that results have been read + if other.mean is None: + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(other.id) + raise ValueError(msg) + + # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters + # FIXME: Need to be able to use StatePoint.get_tally + # FIXME: Need to be able to use Tally.get_value + # FIXME: Modularize + + data = self._align_tally_data(other) + + self_rel_err = data['self']['std. dev.'] / data['self']['mean'] + other_rel_err = data['other']['std. dev.'] / data['other']['mean'] + new_tally._mean = data['self']['mean'] * data['other']['mean'] + new_tally._std_dev = np.abs(new_tally.mean) * \ + np.sqrt(self_rel_err**2 + other_rel_err**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 + + # Generate filter "cross products" + if self.filters == other.filters: + for self_filter in self.filters: + new_filter = _CrossFilter(self_filter, self_filter, '*') + new_tally.add_filter(new_filter) + else: + for self_filter in self.filters: + for other_filter in other.filters: + new_filter = _CrossFilter(self_filter, other_filter, '*') + new_tally.add_filter(new_filter) + + # Generate nuclide "cross products" + if self.nuclides == other.nuclides: + for self_nuclide in self.nuclides: + new_nuclide = _CrossNuclide(self_nuclide, self_nuclide, '*') + new_tally.add_nuclide(new_nuclide) + else: + for self_nuclide in self.nuclides: + for other_nuclide in other.nuclides: + new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '*') + new_tally.add_nuclide(new_nuclide) + + # Generate score "cross products" + if self.scores == other.scores: + for self_score in self.scores: + new_score = _CrossScore(self_score, self_score, '*') + new_tally.add_score(new_score) + else: + for self_score in self.scores: + for other_score in other.scores: + new_score = _CrossScore(self_score, other_score, '*') + new_tally.add_score(new_score) + + elif isinstance(other, (Integral, Rational)): + + new_tally._mean = self._mean * other + new_tally._std_dev = self._std_dev * np.abs(other) + new_tally.estimator = self.estimator + new_tally.with_summary = self.with_summary + new_tally.num_realization = self.num_realizations + new_tally.num_score_bins = self.num_score_bins + + for filter in self.filters: + new_tally.add_filter(filter) + for nuclide in self.nuclides: + new_tally.add_nuclide(nuclide) + for score in self.scores: + new_tally.add_score(score) + + else: + msg = 'Unable to multiply Tally ID={1} ' \ + 'by {0}'.format(self.id, other) + raise ValueError(msg) + + return new_tally + + def __div__(self, other): + + # Check that results have been read + if self.mean is None: + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + + new_tally = Tally(name='derived') + new_tally.with_batch_statistics = True + + if isinstance(other, Tally): + + # Check that results have been read + if other.mean is None: + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(other.id) + raise ValueError(msg) + + # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters + # FIXME: Need to be able to use StatePoint.get_tally + # FIXME: Need to be able to use Tally.get_value + # FIXME: Modularize + + data = self._align_tally_data(other) + + self_rel_err = data['self']['std. dev.'] / data['self']['mean'] + other_rel_err = data['other']['std. dev.'] / data['other']['mean'] + new_tally._mean = data['self']['mean'] / data['other']['mean'] + new_tally._std_dev = np.abs(new_tally.mean) * \ + np.sqrt(self_rel_err**2 + other_rel_err**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 + + # Generate filter "cross products" + if self.filters == other.filters: + for self_filter in self.filters: + new_filter = _CrossFilter(self_filter, self_filter, '/') + new_tally.add_filter(new_filter) + else: + for self_filter in self.filters: + for other_filter in other.filters: + new_filter = _CrossFilter(self_filter, other_filter, '/') + new_tally.add_filter(new_filter) + + # Generate nuclide "cross products" + if self.nuclides == other.nuclides: + for self_nuclide in self.nuclides: + new_nuclide = _CrossNuclide(self_nuclide, self_nuclide, '/') + new_tally.add_nuclide(new_nuclide) + else: + for self_nuclide in self.nuclides: + for other_nuclide in other.nuclides: + new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '/') + new_tally.add_nuclide(new_nuclide) + + # Generate score "cross products" + if self.scores == other.scores: + for self_score in self.scores: + new_score = _CrossScore(self_score, self_score, '/') + new_tally.add_score(new_score) + else: + for self_score in self.scores: + for other_score in other.scores: + new_score = _CrossScore(self_score, other_score, '/') + new_tally.add_score(new_score) + + elif isinstance(other, (Integral, Rational)): + + new_tally._mean = self._mean / other + new_tally._std_dev = self._std_dev * np.abs(1. / other) + new_tally.estimator = self.estimator + new_tally.with_summary = self.with_summary + new_tally.num_realization = self.num_realizations + new_tally.num_score_bins = self.num_score_bins + + for filter in self.filters: + new_tally.add_filter(filter) + for nuclide in self.nuclides: + new_tally.add_nuclide(nuclide) + for score in self.scores: + new_tally.add_score(score) + + else: + msg = 'Unable to divide Tally ID={0} ' \ + 'by {1}'.format(self.id, other) + raise ValueError(msg) + + return new_tally + + def __pow__(self, power): + + # Check that results have been read + if self.mean is None: + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + + new_tally = Tally(name='derived') + new_tally.with_batch_statistics = True + + if isinstance(power, Tally): + + # Check that results have been read + if power.mean is None: + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(power.id) + raise ValueError(msg) + + # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters + # FIXME: Need to be able to use StatePoint.get_tally + # FIXME: Need to be able to use Tally.get_value + # FIXME: Modularize + + data = self._align_tally_data(power) + + mean_ratio = data['other']['mean'] / data['self']['mean'] + first_term = mean_ratio * data['self']['std. dev.'] + second_term = np.log(data['self']['mean']) * data['other']['std. dev.'] + new_tally._mean = data['self']['mean'] ** data['other']['mean'] + new_tally._std_dev = np.abs(new_tally.mean) * \ + np.sqrt(first_term**2 + second_term**2) + + if self.estimator == power.estimator: + new_tally.estimator = self.estimator + if self.with_summary and power.with_summary: + new_tally.with_summary = self.with_summary + if self.num_realizations == power.num_realizations: + new_tally.num_realizations = self.num_realizations + + # Generate nuclide "cross products" + if self.nuclides == power.nuclides: + for self_nuclide in self.nuclides: + new_nuclide = _CrossNuclide(self_nuclide, self_nuclide, '^') + new_tally.add_nuclide(new_nuclide) + else: + for self_nuclide in self.nuclides: + for other_nuclide in power.nuclides: + new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '^') + new_tally.add_nuclide(new_nuclide) + + # Generate score "cross products" + if self.scores == power.scores: + for self_score in self.scores: + new_score = _CrossScore(self_score, self_score, '^') + new_tally.add_score(new_score) + else: + for self_score in self.scores: + for other_score in power.scores: + new_score = _CrossScore(self_score, other_score, '^') + new_tally.add_score(new_score) + + # Generate score "cross products" + if self.scores == power.scores: + for self_score in self.scores: + new_score = _CrossScore(self_score, self_score, '^') + new_tally.add_score(new_score) + else: + for self_score in self.scores: + for other_score in power.scores: + new_score = _CrossScore(self_score, other_score, '^') + new_tally.add_score(new_score) + + elif isinstance(power, (Integral, Rational)): + + new_tally._mean = self._mean ** power + self_rel_err = self.std_dev / self.mean + new_tally._std_dev = np.abs(new_tally._mean * power * self_rel_err) + new_tally.estimator = self.estimator + new_tally.with_summary = self.with_summary + new_tally.num_realization = self.num_realizations + new_tally.num_score_bins = self.num_score_bins + + for filter in self.filters: + new_tally.add_filter(filter) + for nuclide in self.nuclides: + new_tally.add_nuclide(nuclide) + for score in self.scores: + new_tally.add_score(score) + + else: + msg = 'Unable to raise Tally ID={0} to ' \ + 'power {1}'.format(self.id, power) + raise ValueError(msg) + + return new_tally + + def __radd__(self, other): + return self + other + + def __rsub__(self, other): + return -1. * self + other + + def __rmul__(self, other): + return self * other + + def __rdiv__(self, other): + return self * (1. / other) + + def __pos__(self): + new_tally = copy.deepcopy(self) + new_tally._mean = np.abs(new_tally.mean) + return new_tally + + def __neg__(self): + new_tally = self * -1 + return new_tally + + def minimum(self, scores=[], filters=[], filter_bins=[], + nuclides=[], value='mean'): + """Returns the minimum of a slice of the Tally's data. + + Parameters + ---------- + scores : list + A list of one or more score strings + (e.g., ['absorption', 'nu-fission']; default is []) + + filters : list + A list of filter type strings + (e.g., ['mesh', 'energy']; default is []) + + filter_bins : list + A list of the filter bins corresponding to the filter_types + parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in + the list is the integer ID for 'material', 'surface', 'cell', + 'cellborn', and 'universe' Filters. Each bin is an integer for the + cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of + floats for 'energy' and 'energyout' filters corresponding to the + energy boundaries of the bin of interest. The bin is a (x,y,z) + 3-tuple for 'mesh' filters corresponding to the mesh cell of + interest. The order of the bins in the list must correspond of the + filter_types parameter. + + nuclides : list + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) + + value : str + A string for the type of value to return - 'mean' (default), + 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted + + Returns + ------- + float + A scalar float of the minimum value in the Tally data indexed by + each filter, nuclide and score as listed in the parameters. + """ + + data = self.get_values(scores, filters, filter_bins, nuclides, value) + return np.min(data) + + def maximum(self, scores=[], filters=[], filter_bins=[], + nuclides=[], value='mean'): + """Returns the maximum of a slice of the Tally's data. + + Parameters + ---------- + scores : list + A list of one or more score strings + (e.g., ['absorption', 'nu-fission']; default is []) + + filters : list + A list of filter type strings + (e.g., ['mesh', 'energy']; default is []) + + filter_bins : list + A list of the filter bins corresponding to the filter_types + parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in + the list is the integer ID for 'material', 'surface', 'cell', + 'cellborn', and 'universe' Filters. Each bin is an integer for the + cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of + floats for 'energy' and 'energyout' filters corresponding to the + energy boundaries of the bin of interest. The bin is a (x,y,z) + 3-tuple for 'mesh' filters corresponding to the mesh cell of + interest. The order of the bins in the list must correspond of the + filter_types parameter. + + nuclides : list + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) + + value : str + A string for the type of value to return - 'mean' (default), + 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted + + Returns + ------- + float + A scalar float of the maximum value in the Tally data indexed by + each filter, nuclide and score as listed in the parameters. + """ + + data = self.get_values(scores, filters, filter_bins, nuclides, value) + return np.max(data) + + def summation(self, scores=[], filters=[], filter_bins=[], + nuclides=[], value='mean'): + """Returns the sum of a slice of the Tally's data. + + Parameters + ---------- + scores : list + A list of one or more score strings + (e.g., ['absorption', 'nu-fission']; default is []) + + filters : list + A list of filter type strings + (e.g., ['mesh', 'energy']; default is []) + + filter_bins : list + A list of the filter bins corresponding to the filter_types + parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in + the list is the integer ID for 'material', 'surface', 'cell', + 'cellborn', and 'universe' Filters. Each bin is an integer for the + cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of + floats for 'energy' and 'energyout' filters corresponding to the + energy boundaries of the bin of interest. The bin is a (x,y,z) + 3-tuple for 'mesh' filters corresponding to the mesh cell of + interest. The order of the bins in the list must correspond of the + filter_types parameter. + + nuclides : list + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) + + value : str + A string for the type of value to return - 'mean' (default), + 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted + + Returns + ------- + float + A scalar float of the sum of the Tally data indexed by + each filter, nuclide and score as listed in the parameters. + """ + + data = self.get_values(scores, filters, filter_bins, nuclides, value) + return np.sum(data) + + def slice(self, scores=[], filters=[], filter_bins=[], nuclides=[]): + """ + """ + + # Ensure that StatePoint.read_results() was called first + if (self.mean is None) or (self.std_dev is None): + msg = 'The Tally ID={0} has no data to slice. Call the ' \ + 'StatePoint.read_results() routine before using ' \ + 'Tally.slice(...)'.format(self.id) + raise ValueError(msg) + + # Compute batch statistics if not yet computed + if not self.with_batch_statistics: + self.compute_std_dev() + + new_tally = copy.deepcopy(self) + new_sum = self.get_values(scores, filters, filter_bins, + nuclides, 'sum') + new_sum_sq = self.get_values(scores, filters, filter_bins, + nuclides, 'sum_sq') + new_tally.sum = new_sum + new_tally.sum_sq = new_sum_sq + + ############################ FILTERS ######################### + # Determine the score indices from any of the requested scores + if filters: + + # Initialize list of indices to Filters to exclude from slice + filter_indices = [] + + # Loop over all of the Tally's Filters + for i, filter in enumerate(self.filters): + + # FIXME: sum over unused filter bins + # FIXME: neglect bins not selected for selected filters + # NOTE: We must store filter indices here since they are strings + + if filter.type not in filters: + filter_index = self.get_filter_index(filters[i], filter_bins[i]) + filter_indices.append(filter_index) + + # Loop over indices in reverse to remove excluded Filters + for filter_index in filter_indices[::-1]: + new_tally.remove_filter(self.filters[filter_index]) + + for i, filter_type in enumerate(filters): + + if 'energy' in filter_type: + # Create a list of the first energy edge + bins = [filter_bin[0] for filter_bin in filter_bins] + + + + ############################ NUCLIDES ######################## + # Determine the score indices from any of the requested scores + if nuclides: + + # Initialize list of indices to Nuclides to exclude from slice + nuclide_indices = [] + + for nuclide in self.nuclides: + + if isinstance(nuclide, Nuclide): + if nuclide.name not in nuclides: + nuclide_index = self.get_nuclide_index(nuclide) + nuclide_indices.append(nuclide_index) + else: + if nuclide not in nuclides: + nuclide_index = self.get_nuclide_index(nuclide) + nuclide_indices.append(nuclide_index) + + # Loop over indices in reverse to remove excluded Nuclides + for nuclide_index in nuclide_indices[::-1]: + new_tally.remove_nuclide(self.nuclides[nuclide_index]) + + ############################# SCORES ######################### + # Determine the score indices from any of the requested scores + if scores: + + # Initialize list of indices to Nuclides to exclude from slice + score_indices = [] + + for score in self.scores: + + if score not in scores: + score_index = self.get_score_index(score) + score_indices.append(score_index) + + # Loop over indices in reverse to remove excluded scores + for score_index in score_indices[::-1]: + new_tally.remove_score(self.scores[score_index]) + new_tally.num_score_bins -= 1 + + return new_tally + class TalliesFile(object): """Tallies file used for an OpenMC simulation. Corresponds directly to the From dea42d7208991b7a489f4f07ce529da4f72c0392 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 29 Jul 2015 00:39:34 -0700 Subject: [PATCH 024/101] Created new Tally._cross_product(...) routine --- openmc/tallies.py | 276 ++++++++++------------------------------------ 1 file changed, 60 insertions(+), 216 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 66361a3e9d..6e9f06fee1 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1235,9 +1235,6 @@ class Tally(object): # energy, energyout filters elif 'energy' in filter.type: - - print filter - bins = filter.bins num_bins = filter.num_bins @@ -1296,7 +1293,7 @@ class Tally(object): Parameters ---------- filename : str - The name of the file for the results (default is 'tally-results') + The name of the file for the results (default is 'tally-results') directory : str The name of the directory for the results (default is '.') @@ -1436,6 +1433,59 @@ class Tally(object): # Pickle the Tally results to a file pickle.dump(tally_results, open(filename, 'wb')) + def _cross_product(self, other_tally, new_tally, binary_op): + """ + + Parameters + ---------- + other_tally : Tally + The tally on the right hand side of the cross-product + new_tally: Tally + The new tally to represent the cross-product + op : str + The binary operation in the cross product (+,-,*,/,^) + """ + + if self.estimator == other_tally.estimator: + new_tally.estimator = self.estimator + if self.with_summary and other_tally.with_summary: + new_tally.with_summary = self.with_summary + if self.num_realizations == other_tally.num_realizations: + new_tally.num_realizations = self.num_realizations + + # Generate nuclide "cross products" + if self.nuclides == other_tally.nuclides: + for self_nuclide in self.nuclides: + new_nuclide = _CrossNuclide(self_nuclide, self_nuclide, binary_op) + new_tally.add_nuclide(new_nuclide) + else: + all_nuclides = [self.nuclides, other_tally.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) + + # Generate filter "cross products" + if self.filters == other_tally.filters: + for self_filter in self.filters: + new_filter = _CrossScore(self_filter, self_filter, binary_op) + new_tally.add_filter(new_filter) + else: + all_filters = [self.filters, other_tally.filters] + for self_filter, other_filter in itertools.product(*all_filters): + new_filter = _CrossScore(self_filter, other_filter, binary_op) + new_tally.add_filter(new_filter) + + # Generate score "cross products" + if self.scores == other_tally.scores: + for self_score in self.scores: + new_score = _CrossScore(self_score, self_score, binary_op) + new_tally.add_score(new_score) + else: + all_scores = [self.scores, other_tally.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) + def _align_tally_data(self, other): self_mean = copy.deepcopy(self.mean) @@ -1522,56 +1572,14 @@ class Tally(object): # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value - # FIXME: Modularize - # FIXME: Redundant filters + self._cross_product(other, new_tally, binary_op='+') data = self._align_tally_data(other) - new_tally._mean = data['self']['mean'] + data['other']['mean'] new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + \ data['other']['std. dev.']**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 - - # Generate filter "cross products" - if self.filters == other.filters: - for self_filter in self.filters: - new_filter = _CrossFilter(self_filter, self_filter, '+') - new_tally.add_filter(new_filter) - else: - for self_filter in self.filters: - for other_filter in other.filters: - new_filter = _CrossFilter(self_filter, other_filter, '+') - new_tally.add_filter(new_filter) - - # Generate nuclide "cross products" - if self.nuclides == other.nuclides: - for self_nuclide in self.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, self_nuclide, '+') - new_tally.add_nuclide(new_nuclide) - else: - for self_nuclide in self.nuclides: - for other_nuclide in other.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '+') - new_tally.add_nuclide(new_nuclide) - - # Generate score "cross products" - if self.scores == other.scores: - for self_score in self.scores: - new_score = _CrossScore(self_score, self_score, '+') - new_tally.add_score(new_score) - else: - for self_score in self.scores: - for other_score in other.scores: - new_score = _CrossScore(self_score, other_score, '+') - new_tally.add_score(new_score) - - elif isinstance(other, Integral) or isinstance(other): + elif isinstance(other, (Integral, Rational)): new_tally._mean = self._mean + other new_tally._std_dev = self._std_dev @@ -1615,54 +1623,13 @@ class Tally(object): # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value - # FIXME: Modularize + self._cross_product(other, new_tally, binary_op='-') data = self._align_tally_data(other) - new_tally._mean = data['self']['mean'] - data['other']['mean'] new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + \ data['other']['std. dev.']**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 - - # Generate filter "cross products" - if self.filters == other.filters: - for self_filter in self.filters: - new_filter = _CrossFilter(self_filter, self_filter, '-') - new_tally.add_filter(new_filter) - else: - for self_filter in self.filters: - for other_filter in other.filters: - new_filter = _CrossFilter(self_filter, other_filter, '-') - new_tally.add_filter(new_filter) - - # Generate nuclide "cross products" - if self.nuclides == other.nuclides: - for self_nuclide in self.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, self_nuclide, '-') - new_tally.add_nuclide(new_nuclide) - else: - for self_nuclide in self.nuclides: - for other_nuclide in other.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '-') - new_tally.add_nuclide(new_nuclide) - - # Generate score "cross products" - if self.scores == other.scores: - for self_score in self.scores: - new_score = _CrossScore(self_score, self_score, '-') - new_tally.add_score(new_score) - else: - for self_score in self.scores: - for other_score in other.scores: - new_score = _CrossScore(self_score, other_score, '-') - new_tally.add_score(new_score) - elif isinstance(other, (Integral, Rational)): new_tally._mean = self._mean - other @@ -1708,56 +1675,15 @@ class Tally(object): # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value - # FIXME: Modularize + self._cross_product(other, new_tally, binary_op='*') data = self._align_tally_data(other) - self_rel_err = data['self']['std. dev.'] / data['self']['mean'] other_rel_err = data['other']['std. dev.'] / data['other']['mean'] new_tally._mean = data['self']['mean'] * data['other']['mean'] new_tally._std_dev = np.abs(new_tally.mean) * \ np.sqrt(self_rel_err**2 + other_rel_err**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 - - # Generate filter "cross products" - if self.filters == other.filters: - for self_filter in self.filters: - new_filter = _CrossFilter(self_filter, self_filter, '*') - new_tally.add_filter(new_filter) - else: - for self_filter in self.filters: - for other_filter in other.filters: - new_filter = _CrossFilter(self_filter, other_filter, '*') - new_tally.add_filter(new_filter) - - # Generate nuclide "cross products" - if self.nuclides == other.nuclides: - for self_nuclide in self.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, self_nuclide, '*') - new_tally.add_nuclide(new_nuclide) - else: - for self_nuclide in self.nuclides: - for other_nuclide in other.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '*') - new_tally.add_nuclide(new_nuclide) - - # Generate score "cross products" - if self.scores == other.scores: - for self_score in self.scores: - new_score = _CrossScore(self_score, self_score, '*') - new_tally.add_score(new_score) - else: - for self_score in self.scores: - for other_score in other.scores: - new_score = _CrossScore(self_score, other_score, '*') - new_tally.add_score(new_score) - elif isinstance(other, (Integral, Rational)): new_tally._mean = self._mean * other @@ -1803,56 +1729,15 @@ class Tally(object): # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value - # FIXME: Modularize + self._cross_product(other, new_tally, binary_op='/') data = self._align_tally_data(other) - self_rel_err = data['self']['std. dev.'] / data['self']['mean'] other_rel_err = data['other']['std. dev.'] / data['other']['mean'] new_tally._mean = data['self']['mean'] / data['other']['mean'] new_tally._std_dev = np.abs(new_tally.mean) * \ np.sqrt(self_rel_err**2 + other_rel_err**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 - - # Generate filter "cross products" - if self.filters == other.filters: - for self_filter in self.filters: - new_filter = _CrossFilter(self_filter, self_filter, '/') - new_tally.add_filter(new_filter) - else: - for self_filter in self.filters: - for other_filter in other.filters: - new_filter = _CrossFilter(self_filter, other_filter, '/') - new_tally.add_filter(new_filter) - - # Generate nuclide "cross products" - if self.nuclides == other.nuclides: - for self_nuclide in self.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, self_nuclide, '/') - new_tally.add_nuclide(new_nuclide) - else: - for self_nuclide in self.nuclides: - for other_nuclide in other.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '/') - new_tally.add_nuclide(new_nuclide) - - # Generate score "cross products" - if self.scores == other.scores: - for self_score in self.scores: - new_score = _CrossScore(self_score, self_score, '/') - new_tally.add_score(new_score) - else: - for self_score in self.scores: - for other_score in other.scores: - new_score = _CrossScore(self_score, other_score, '/') - new_tally.add_score(new_score) - elif isinstance(other, (Integral, Rational)): new_tally._mean = self._mean / other @@ -1898,10 +1783,9 @@ class Tally(object): # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value - # FIXME: Modularize + self._cross_product(power, new_tally, binary_op='^') data = self._align_tally_data(power) - mean_ratio = data['other']['mean'] / data['self']['mean'] first_term = mean_ratio * data['self']['std. dev.'] second_term = np.log(data['self']['mean']) * data['other']['std. dev.'] @@ -1909,46 +1793,6 @@ class Tally(object): new_tally._std_dev = np.abs(new_tally.mean) * \ np.sqrt(first_term**2 + second_term**2) - if self.estimator == power.estimator: - new_tally.estimator = self.estimator - if self.with_summary and power.with_summary: - new_tally.with_summary = self.with_summary - if self.num_realizations == power.num_realizations: - new_tally.num_realizations = self.num_realizations - - # Generate nuclide "cross products" - if self.nuclides == power.nuclides: - for self_nuclide in self.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, self_nuclide, '^') - new_tally.add_nuclide(new_nuclide) - else: - for self_nuclide in self.nuclides: - for other_nuclide in power.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, '^') - new_tally.add_nuclide(new_nuclide) - - # Generate score "cross products" - if self.scores == power.scores: - for self_score in self.scores: - new_score = _CrossScore(self_score, self_score, '^') - new_tally.add_score(new_score) - else: - for self_score in self.scores: - for other_score in power.scores: - new_score = _CrossScore(self_score, other_score, '^') - new_tally.add_score(new_score) - - # Generate score "cross products" - if self.scores == power.scores: - for self_score in self.scores: - new_score = _CrossScore(self_score, self_score, '^') - new_tally.add_score(new_score) - else: - for self_score in self.scores: - for other_score in power.scores: - new_score = _CrossScore(self_score, other_score, '^') - new_tally.add_score(new_score) - elif isinstance(power, (Integral, Rational)): new_tally._mean = self._mean ** power From 67fb220ada24372d29a8c72b63b37e382cf2c52f Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 29 Jul 2015 18:04:39 -0700 Subject: [PATCH 025/101] Renamed Tally._cross_product as Tally._outer_product --- openmc/tallies.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 6e9f06fee1..2f7a803351 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1433,7 +1433,7 @@ class Tally(object): # Pickle the Tally results to a file pickle.dump(tally_results, open(filename, 'wb')) - def _cross_product(self, other_tally, new_tally, binary_op): + def _outer_product(self, other_tally, new_tally, binary_op): """ Parameters @@ -1573,7 +1573,7 @@ class Tally(object): # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value - self._cross_product(other, new_tally, binary_op='+') + self._outer_product(other, new_tally, binary_op='+') data = self._align_tally_data(other) new_tally._mean = data['self']['mean'] + data['other']['mean'] new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + \ @@ -1624,7 +1624,7 @@ class Tally(object): # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value - self._cross_product(other, new_tally, binary_op='-') + self._outer_product(other, new_tally, binary_op='-') data = self._align_tally_data(other) new_tally._mean = data['self']['mean'] - data['other']['mean'] new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + \ @@ -1676,7 +1676,7 @@ class Tally(object): # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value - self._cross_product(other, new_tally, binary_op='*') + self._outer_product(other, new_tally, binary_op='*') data = self._align_tally_data(other) self_rel_err = data['self']['std. dev.'] / data['self']['mean'] other_rel_err = data['other']['std. dev.'] / data['other']['mean'] @@ -1730,7 +1730,7 @@ class Tally(object): # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value - self._cross_product(other, new_tally, binary_op='/') + self._outer_product(other, new_tally, binary_op='/') data = self._align_tally_data(other) self_rel_err = data['self']['std. dev.'] / data['self']['mean'] other_rel_err = data['other']['std. dev.'] / data['other']['mean'] @@ -1784,7 +1784,7 @@ class Tally(object): # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value - self._cross_product(power, new_tally, binary_op='^') + self._outer_product(power, new_tally, binary_op='^') data = self._align_tally_data(power) mean_ratio = data['other']['mean'] / data['self']['mean'] first_term = mean_ratio * data['self']['std. dev.'] From f6128ff387bbf4c0a4df690f2fd08438f25e56f5 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 29 Jul 2015 18:47:42 -0700 Subject: [PATCH 026/101] Added docstrings to tally arithmetic routines --- openmc/tallies.py | 345 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 294 insertions(+), 51 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 2f7a803351..db2f897ff6 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -803,8 +803,8 @@ class Tally(object): nuclides=[], value='mean'): """Returns a tally score value given a list of filters to satisfy. - This routine constructs a 3D NumPy array for the requested Tally data - indexed by filter bin, nuclide bin, and score index. The routine will + This method constructs a 3D NumPy array for the requested Tally data + indexed by filter bin, nuclide bin, and score index. The method will order the data in the array as specified in the parameter lists Parameters @@ -846,8 +846,8 @@ class Tally(object): Raises ------ ValueError - When this routine is called before the Tally is populated with data - by the StatePoint.read_results() routine. ValueError is also thrown + When this method is called before the Tally is populated with data + by the StatePoint.read_results() method. ValueError is also thrown if the input parameters do not correspond to the Tally's attributes, e.g., if the score(s) do not match those in the Tally. @@ -860,7 +860,7 @@ class Tally(object): (value == 'sum' and self.sum is None) or \ (value == 'sum_sq' and self.sum_sq is None): msg = 'The Tally ID={0} has no data to return. Call the ' \ - 'StatePoint.read_results() routine before using ' \ + 'StatePoint.read_results() method before using ' \ 'Tally.get_values(...)'.format(self.id) raise ValueError(msg) @@ -911,7 +911,7 @@ class Tally(object): filter_indices[i].append( self.get_filter_index(filter.type, bin)) - # Apply cross-product sum between all filter bin indices + # Apply outer product sum between all filter bin indices filter_indices = list(map(sum, itertools.product(*filter_indices))) # If user did not specify any specific Filters, use them all @@ -940,7 +940,7 @@ class Tally(object): else: score_indices = np.arange(self.num_scores) - # Construct cross-product of all three index types with each other + # Construct outer product of all three index types with each other indices = np.ix_(filter_indices, nuclide_indices, score_indices) # Return the desired result from Tally @@ -966,11 +966,11 @@ class Tally(object): scores=True, summary=None): """Build a Pandas DataFrame for the Tally data. - This routine constructs a Pandas DataFrame object for the Tally data + This method constructs a Pandas DataFrame object for the Tally data with columns annotated by filter, nuclide and score bin information. This capability has been tested for Pandas >=v0.13.1. However, if possible, it is recommended to use the v0.16 or newer versions of - Pandas since this this routine uses the Multi-index Pandas feature. + Pandas since this this method uses the Multi-index Pandas feature. Parameters ---------- @@ -1000,22 +1000,22 @@ class Tally(object): Raises ------ KeyError - When this routine is called before the Tally is populated with data - by the StatePoint.read_results() routine. + When this method is called before the Tally is populated with data + by the StatePoint.read_results() method. """ # Ensure that StatePoint.read_results() was called first if self.mean is None or self.std_dev is None: msg = 'The Tally ID={0} has no data to return. Call the ' \ - 'StatePoint.read_results() routine before using ' \ + 'StatePoint.read_results() method before using ' \ 'Tally.get_pandas_dataframe(...)'.format(self.id) raise KeyError(msg) # If using Summary, ensure StatePoint.link_with_summary(...) was called if summary and not self.with_summary: msg = 'The Tally ID={0} has not been linked with the Summary. ' \ - 'Call the StatePoint.link_with_summary(...) routine ' \ + 'Call the StatePoint.link_with_summary(...) method ' \ 'before using Tally.get_pandas_dataframe(...) with ' \ 'Summary info'.format(self.id) raise KeyError(msg) @@ -1308,15 +1308,15 @@ class Tally(object): Raises ------ KeyError - When this routine is called before the Tally is populated with data - by the StatePoint.read_results() routine. + When this method is called before the Tally is populated with data + by the StatePoint.read_results() method. """ # Ensure that StatePoint.read_results() was called first if self._sum is None or self._sum_sq is None: msg = 'The Tally ID={0} has no data to export. Call the ' \ - 'StatePoint.read_results() routine before using ' \ + 'StatePoint.read_results() method before using ' \ 'Tally.export_results(...)'.format(self.id) raise KeyError(msg) @@ -1433,60 +1433,91 @@ class Tally(object): # Pickle the Tally results to a file pickle.dump(tally_results, open(filename, 'wb')) - def _outer_product(self, other_tally, new_tally, binary_op): - """ + def _outer_product(self, other, new_tally, binary_op): + """Combines filters, scores and nuclides with another tally. + + This is a helper method for the tally arithmetic methods. The ilters, + scores and nuclides from both tallies are enumerated into all possible + combinations and expressed as _CrossFilter, _CrossScore and + _CrossNuclide objects in the new derived tally. Parameters ---------- - other_tally : Tally - The tally on the right hand side of the cross-product + other : Tally + The tally on the right hand side of the outer product new_tally: Tally - The new tally to represent the cross-product + The new tally to represent the outer product op : str - The binary operation in the cross product (+,-,*,/,^) + The binary operation in the outer product ('+', '-', '*', '/', '^') + """ - if self.estimator == other_tally.estimator: + new_tally.name = '({0} {1} {2})'.format(self.name, other.name, binary_op) + + if self.estimator == other.estimator: new_tally.estimator = self.estimator - if self.with_summary and other_tally.with_summary: + if self.with_summary and other.with_summary: new_tally.with_summary = self.with_summary - if self.num_realizations == other_tally.num_realizations: + if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations - # Generate nuclide "cross products" - if self.nuclides == other_tally.nuclides: - for self_nuclide in self.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, self_nuclide, binary_op) - new_tally.add_nuclide(new_nuclide) - else: - all_nuclides = [self.nuclides, other_tally.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) - - # Generate filter "cross products" - if self.filters == other_tally.filters: + # Generate filter "outer products" + if self.filters == other.filters: for self_filter in self.filters: new_filter = _CrossScore(self_filter, self_filter, binary_op) new_tally.add_filter(new_filter) else: - all_filters = [self.filters, other_tally.filters] + all_filters = [self.filters, other.filters] for self_filter, other_filter in itertools.product(*all_filters): new_filter = _CrossScore(self_filter, other_filter, binary_op) new_tally.add_filter(new_filter) - # Generate score "cross products" - if self.scores == other_tally.scores: + # Generate score "outer products" + if self.scores == other.scores: for self_score in self.scores: new_score = _CrossScore(self_score, self_score, binary_op) new_tally.add_score(new_score) else: - all_scores = [self.scores, other_tally.scores] + all_scores = [self.scores, other.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: + new_nuclide = _CrossNuclide(self_nuclide, self_nuclide, binary_op) + new_tally.add_nuclide(new_nuclide) + else: + all_nuclides = [self.nuclides, other.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) + def _align_tally_data(self, other): + """Aligns data from two tallies for tally arithmetic. + + This is a helper method to construct a dict of dicts of the "aligned" + data arrays from each tally for tally arithmetic. The method analyzes + the filters, scores and nuclides in both tally's and determines how to + appropriately align the data for vectorized arithmetic. For example, + if the two tallies have different filters, this method will use NumPy + 'tile' and 'repeat' operations to the new data arrays such that all + possible combinations of the data in each tally's bins will be made + when the arithmetic operation is applied to the arrays. + + Parameters + ---------- + other : Tally + The tally to outer product with this tally + + Returns + ------- + dict + A dictionary of dictionaries to "aligned" 'mean' and 'std. dev' + NumPy arrays for each tally's data. + + """ self_mean = copy.deepcopy(self.mean) self_std_dev = copy.deepcopy(self.std_dev) @@ -1551,6 +1582,34 @@ class Tally(object): return data def __add__(self, other): + """Adds this tally to another tally or scalar value. + + This method builds a new tally with data that is the sum of this + tally's data and that from the other tally or scalar value. If the + filters, scores and nuclides in the two tallies are not the same, then + they are combined in all possible ways in the new derived tally. + + Uncertainty propagation is used to compute the standard deviation + for the new tally's data. It is important to note that this makes + the assumption that the tally data is independently distributed. + In most use cases, this is *not* true and may lead to under-prediction + of the uncertainty. The uncertainty propagation model is from the + following source: + + https://en.wikipedia.org/wiki/Propagation_of_uncertainty + + Parameters + ---------- + other : Tally or Integer or Rational + The tally or scalar value to add to this tally + + Returns + ------- + Tally + A new derived tally which is the sum of this tally and the other + tally or scalar value in the addition. + + """ # Check that results have been read if self.mean is None: @@ -1558,7 +1617,7 @@ class Tally(object): 'since it does not contain any results.'.format(self.id) raise ValueError(msg) - new_tally = Tally(name='derived') + new_tally = Tally() new_tally.with_batch_statistics = True if isinstance(other, Tally): @@ -1569,7 +1628,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value @@ -1581,6 +1639,7 @@ class Tally(object): elif isinstance(other, (Integral, Rational)): + new_tally.name = self.name new_tally._mean = self._mean + other new_tally._std_dev = self._std_dev new_tally.estimator = self.estimator @@ -1602,6 +1661,34 @@ class Tally(object): return new_tally def __sub__(self, other): + """Subtracts another tally or scalar value from this tally. + + This method builds a new tally with data that is the difference of + this tally's data and that from the other tally or scalar value. If the + filters, scores and nuclides in the two tallies are not the same, then + they are combined in all possible ways in the new derived tally. + + Uncertainty propagation is used to compute the standard deviation + for the new tally's data. It is important to note that this makes + the assumption that the tally data is independently distributed. + In most use cases, this is *not* true and may lead to under-prediction + of the uncertainty. The uncertainty propagation model is from the + following source: + + https://en.wikipedia.org/wiki/Propagation_of_uncertainty + + Parameters + ---------- + other : Tally or Integer or Rational + The tally or scalar value to subtract from this tally + + Returns + ------- + Tally + A new derived tally which is the difference of this tally and the + other tally or scalar value in the subtraction. + + """ # Check that results have been read if self.mean is None: @@ -1609,7 +1696,7 @@ class Tally(object): 'since it does not contain any results.'.format(self.id) raise ValueError(msg) - new_tally = Tally(name='derived') + new_tally = Tally() new_tally.with_batch_statistics = True if isinstance(other, Tally): @@ -1620,7 +1707,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value @@ -1632,6 +1718,7 @@ class Tally(object): elif isinstance(other, (Integral, Rational)): + new_tally.name = self.name new_tally._mean = self._mean - other new_tally._std_dev = self._std_dev new_tally.estimator = self.estimator @@ -1654,6 +1741,34 @@ class Tally(object): return new_tally def __mul__(self, other): + """Multiplies this tally with another tally or scalar value. + + This method builds a new tally with data that is the product of + this tally's data and that from the other tally or scalar value. If the + filters, scores and nuclides in the two tallies are not the same, then + they are combined in all possible ways in the new derived tally. + + Uncertainty propagation is used to compute the standard deviation + for the new tally's data. It is important to note that this makes + the assumption that the tally data is independently distributed. + In most use cases, this is *not* true and may lead to under-prediction + of the uncertainty. The uncertainty propagation model is from the + following source: + + https://en.wikipedia.org/wiki/Propagation_of_uncertainty + + Parameters + ---------- + other : Tally or Integer or Rational + The tally or scalar value to multiply with this tally + + Returns + ------- + Tally + A new derived tally which is the product of this tally and the + other tally or scalar value in the multiplication. + + """ # Check that results have been read if self.mean is None: @@ -1661,7 +1776,7 @@ class Tally(object): 'since it does not contain any results.'.format(self.id) raise ValueError(msg) - new_tally = Tally(name='derived') + new_tally = Tally() new_tally.with_batch_statistics = True if isinstance(other, Tally): @@ -1672,7 +1787,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value @@ -1686,6 +1800,7 @@ class Tally(object): elif isinstance(other, (Integral, Rational)): + new_tally.name = self.name new_tally._mean = self._mean * other new_tally._std_dev = self._std_dev * np.abs(other) new_tally.estimator = self.estimator @@ -1708,6 +1823,34 @@ class Tally(object): return new_tally def __div__(self, other): + """Divides this tally by another tally or scalar value. + + This method builds a new tally with data that is the dividend of + this tally's data and that from the other tally or scalar value. If the + filters, scores and nuclides in the two tallies are not the same, then + they are combined in all possible ways in the new derived tally. + + Uncertainty propagation is used to compute the standard deviation + for the new tally's data. It is important to note that this makes + the assumption that the tally data is independently distributed. + In most use cases, this is *not* true and may lead to under-prediction + of the uncertainty. The uncertainty propagation model is from the + following source: + + https://en.wikipedia.org/wiki/Propagation_of_uncertainty + + Parameters + ---------- + other : Tally or Integer or Rational + The tally or scalar value to divide this tally by + + Returns + ------- + Tally + A new derived tally which is the dividend of this tally and the + other tally or scalar value in the division. + + """ # Check that results have been read if self.mean is None: @@ -1726,7 +1869,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value @@ -1740,6 +1882,7 @@ class Tally(object): elif isinstance(other, (Integral, Rational)): + new_tally.name = self.name new_tally._mean = self._mean / other new_tally._std_dev = self._std_dev * np.abs(1. / other) new_tally.estimator = self.estimator @@ -1762,6 +1905,34 @@ class Tally(object): return new_tally def __pow__(self, power): + """Raises this tally to another tally or scalar value power. + + This method builds a new tally with data that is the power of + this tally's data to that from the other tally or scalar value. If the + filters, scores and nuclides in the two tallies are not the same, then + they are combined in all possible ways in the new derived tally. + + Uncertainty propagation is used to compute the standard deviation + for the new tally's data. It is important to note that this makes + the assumption that the tally data is independently distributed. + In most use cases, this is *not* true and may lead to under-prediction + of the uncertainty. The uncertainty propagation model is from the + following source: + + https://en.wikipedia.org/wiki/Propagation_of_uncertainty + + Parameters + ---------- + other : Tally or Integer or Rational + The tally or scalar value exponent + + Returns + ------- + Tally + A new derived tally which is this tally raised to the power of the + other tally or scalar value in the exponentiation. + + """ # Check that results have been read if self.mean is None: @@ -1780,7 +1951,6 @@ class Tally(object): 'since it does not contain any results.'.format(power.id) raise ValueError(msg) - # FIXME: Need to be able to use Tally.get_pandas_dataframe - filters # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value @@ -1795,6 +1965,7 @@ class Tally(object): elif isinstance(power, (Integral, Rational)): + new_tally.name = self.name new_tally._mean = self._mean ** power self_rel_err = self.std_dev / self.mean new_tally._std_dev = np.abs(new_tally._mean * power * self_rel_err) @@ -1818,18 +1989,90 @@ class Tally(object): return new_tally def __radd__(self, other): + """Right addition with a scalar value. + + This reverses the operands and calls the __add__ method. + + Parameters + ---------- + other : Integer or Rational + The scalar value to add to this tally + + Returns + ------- + Tally + A new derived tally of this tally added with the scalar value. + + """ + return self + other def __rsub__(self, other): + """Right subtraction from a scalar value. + + This reverses the operands and calls the __sub__ method. + + Parameters + ---------- + other : Integer or Rational + The scalar value to subtract this tally from + + Returns + ------- + Tally + A new derived tally of this tally subtracted from the scalar value. + + """ + return -1. * self + other def __rmul__(self, other): + """Right multiplication with a scalar value. + + This reverses the operands and calls the __mul__ method. + + Parameters + ---------- + other : Integer or Rational + The scalar value to multiply with this tally + + Returns + ------- + Tally + A new derived tally of this tally multiplied by the scalar value. + + """ + return self * other def __rdiv__(self, other): + """Right division with a scalar value. + + This reverses the operands and calls the __div__ method. + + Parameters + ---------- + other : Integer or Rational + The scalar value to divide by this tally + + Returns + ------- + Tally + A new derived tally of the scalar value divided by this tally. + + """ + return self * (1. / other) def __pos__(self): + """The absolute value of this tally. + + Returns + ------- + Tally + A new derived tally which is the absolute value of this tally. + + """ new_tally = copy.deepcopy(self) new_tally._mean = np.abs(new_tally.mean) return new_tally @@ -1977,7 +2220,7 @@ class Tally(object): # Ensure that StatePoint.read_results() was called first if (self.mean is None) or (self.std_dev is None): msg = 'The Tally ID={0} has no data to slice. Call the ' \ - 'StatePoint.read_results() routine before using ' \ + 'StatePoint.read_results() method before using ' \ 'Tally.slice(...)'.format(self.id) raise ValueError(msg) From e8ab4b973106d0c030305fd249d4438c17033e49 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 29 Jul 2015 23:18:59 -0700 Subject: [PATCH 027/101] Removed Tally summation, minimum and maximum routines --- openmc/cross.py | 71 +++++++++-------- openmc/tallies.py | 192 ++++++---------------------------------------- 2 files changed, 59 insertions(+), 204 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 60a524b512..45c7ce2d8f 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -1,30 +1,29 @@ from openmc import Filter, Nuclide -from openmc.checkvalue import check_type class _CrossScore(object): """A special-purpose tally score used to encapsulate all combinations of two - tally's scores as a cross product for tally arithmetic. + tally's scores as a outer product for tally arithmetic. Parameters ---------- left_score : str or _CrossScore - The left score in the cross product. + The left score in the outer product right_score : str or _CrossScore - The right score in the cross product. + The right score in the outer product binary_op : str The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's scores with this _CrossNuclide. + combine two tally's scores with this _CrossNuclide Attributes ---------- left_score : str or _CrossScore - The left score in the cross product. + The left score in the outer product right_score : str or _CrossScore - The right score in the cross product. + The right score in the outer product binary_op : str The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's scores with this _CrossNuclide. + combine two tally's scores with this _CrossNuclide """ @@ -55,17 +54,14 @@ class _CrossScore(object): @left_score.setter def left_score(self, left_score): - check_type('left score', left_score, (str, _CrossScore)) self._left_score = left_score @right_score.setter def right_score(self, right_score): - check_type('right score', right_score, (str, _CrossScore)) self._right_score = right_score @binary_op.setter def binary_op(self, binary_op): - check_type('binary op', binary_op, str) self._binary_op = binary_op def __repr__(self): @@ -76,27 +72,27 @@ class _CrossScore(object): class _CrossNuclide(object): """A special-purpose nuclide used to encapsulate all combinations of two - tally's nuclides as a cross product for tally arithmetic. + tally's nuclides as a outer product for tally arithmetic. Parameters ---------- left_nuclide : Nuclide or _CrossNuclide - The left nuclide in the cross product. + The left nuclide in the outer product right_nuclide : Nuclide or _CrossNuclide - The right nuclide in the cross product. + The right nuclide in the outer product binary_op : str The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's nuclides with this _CrossNuclide. + combine two tally's nuclides with this _CrossNuclide Attributes ---------- left_nuclide : Nuclide or _CrossNuclide - The left nuclide in the cross product. + The left nuclide in the outer product right_nuclide : Nuclide or _CrossNuclide - The right nuclide in the cross product. + The right nuclide in the outer product binary_op : str The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's nuclides with this _CrossNuclide. + combine two tally's nuclides with this _CrossNuclide """ @@ -127,17 +123,14 @@ class _CrossNuclide(object): @left_nuclide.setter def left_nuclide(self, left_nuclide): - check_type('left nuclide', left_nuclide, (Nuclide, _CrossNuclide)) self._left_nuclide = left_nuclide @right_nuclide.setter def right_nuclide(self, right_nuclide): - check_type('right nuclide', right_nuclide, (Nuclide, _CrossNuclide)) self._right_nuclide = right_nuclide @binary_op.setter def binary_op(self, binary_op): - check_type('binary op', binary_op, str) self._binary_op = binary_op def __repr__(self): @@ -165,32 +158,41 @@ class _CrossNuclide(object): class _CrossFilter(object): """A special-purpose filter used to encapsulate all combinations of two - tally's filter bins as a cross product for tally arithmetic. + tally's filter bins as a outer product for tally arithmetic. Parameters ---------- left_filter : Filter or _CrossFilter - The left filter in the cross product. + The left filter in the outer product right_filter : Filter or _CrossFilter - The right filter in the cross product. + The right filter in the outer product binary_op : str The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's filter bins with this _CrossFilter. + combine two tally's filter bins with this _CrossFilter Attributes ---------- left_filter : Filter or _CrossFilter - The left filter in the cross product. + The left filter in the outer product right_filter : Filter or _CrossFilter - The right filter in the cross product. + The right filter in the outer product binary_op : str The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's filter bins with this _CrossFilter. + combine two tally's filter bins with this _CrossFilter """ def __init__(self, left_filter=None, right_filter=None, binary_op=None): + left_type = left_filter.type + right_type = right_filter.type + self.type = '({0} {1} {2})'.format(left_type, binary_op, right_type) + + self._bins = {} + self._bins['left'] = left_filter.bins + self._bins['right'] = right_filter.bins + self._num_bins = left_filter.num_bins * right_filter.num_bins + self._left_filter = None self._right_filter = None self._binary_op = None @@ -216,33 +218,34 @@ class _CrossFilter(object): @property def type(self): - return (self.right_filter.type, self.left_filter.type) + return self._type @property def bins(self): - return (self.right_filter.bins, self.left_filter.bins) + return (self._bins['left'], self._bins['right']) @property def num_bins(self): - return self.left_filter.num_bins * self.right_filter.num_bins + return self._num_bins @property def stride(self): return self.left_filter.stride * self.right_filter.stride + @type.setter + def type(self, filter_type): + self._type = filter_type + @left_filter.setter def left_filter(self, left_filter): - check_type('left filter', left_filter, (Filter, _CrossFilter)) self._left_filter = left_filter @right_filter.setter def right_filter(self, right_filter): - check_type('right filter', right_filter, (Filter, _CrossFilter)) self._right_filter = right_filter @binary_op.setter def binary_op(self, binary_op): - check_type('binary op', binary_op, str) self._binary_op = binary_op def __repr__(self): diff --git a/openmc/tallies.py b/openmc/tallies.py index db2f897ff6..85f2ecbd69 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -479,7 +479,7 @@ class Tally(object): 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}\n'.format('\tFilters') + string += '{0: <16}{1}\n'.format('\tFilters', '=\t') for filter in self.filters: string += '{0: <16}\t\t{1}\t{2}\n'.format('', filter.type, @@ -864,10 +864,6 @@ class Tally(object): 'Tally.get_values(...)'.format(self.id) raise ValueError(msg) - # Compute batch statistics if not yet computed - if not self.with_batch_statistics: - self.compute_std_dev() - ############################ FILTERS ######################### # Determine the score indices from any of the requested scores if filters: @@ -1027,10 +1023,6 @@ class Tally(object): msg = 'The pandas Python package must be installed on your system' raise ImportError(msg) - # Compute batch statistics if not yet computed - if not self.with_batch_statistics: - self.compute_std_dev() - # Initialize a pandas dataframe for the tally data df = pd.DataFrame() @@ -1452,7 +1444,7 @@ class Tally(object): """ - new_tally.name = '({0} {1} {2})'.format(self.name, other.name, binary_op) + new_tally.name = '({0} {1} {2})'.format(self.name, binary_op, other.name) if self.estimator == other.estimator: new_tally.estimator = self.estimator @@ -1464,12 +1456,12 @@ class Tally(object): # Generate filter "outer products" if self.filters == other.filters: for self_filter in self.filters: - new_filter = _CrossScore(self_filter, self_filter, binary_op) + new_filter = _CrossFilter(self_filter, self_filter, binary_op) new_tally.add_filter(new_filter) else: all_filters = [self.filters, other.filters] for self_filter, other_filter in itertools.product(*all_filters): - new_filter = _CrossScore(self_filter, other_filter, binary_op) + new_filter = _CrossFilter(self_filter, other_filter, binary_op) new_tally.add_filter(new_filter) # Generate score "outer products" @@ -1487,7 +1479,7 @@ class Tally(object): if self.nuclides == other.nuclides: for self_nuclide in self.nuclides: new_nuclide = _CrossNuclide(self_nuclide, self_nuclide, binary_op) - new_tally.add_nuclide(new_nuclide) + new_tally.nuclides.append(new_nuclide) else: all_nuclides = [self.nuclides, other.nuclides] for self_nuclide, other_nuclide in itertools.product(*all_nuclides): @@ -1612,7 +1604,7 @@ class Tally(object): """ # Check that results have been read - if self.mean is None: + if self.sum is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) @@ -1623,7 +1615,7 @@ class Tally(object): if isinstance(other, Tally): # Check that results have been read - if other.mean is None: + if other.sum is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(other.id) raise ValueError(msg) @@ -1691,7 +1683,7 @@ class Tally(object): """ # Check that results have been read - if self.mean is None: + if self.sum is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) @@ -1702,7 +1694,7 @@ class Tally(object): if isinstance(other, Tally): # Check that results have been read - if other.mean is None: + if other.sum is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(other.id) raise ValueError(msg) @@ -1771,7 +1763,7 @@ class Tally(object): """ # Check that results have been read - if self.mean is None: + if self.sum is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) @@ -1782,7 +1774,7 @@ class Tally(object): if isinstance(other, Tally): # Check that results have been read - if other.mean is None: + if other.sum is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(other.id) raise ValueError(msg) @@ -1853,7 +1845,7 @@ class Tally(object): """ # Check that results have been read - if self.mean is None: + if self.sum is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) @@ -1864,7 +1856,7 @@ class Tally(object): if isinstance(other, Tally): # Check that results have been read - if other.mean is None: + if other.sum is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(other.id) raise ValueError(msg) @@ -1935,7 +1927,7 @@ class Tally(object): """ # Check that results have been read - if self.mean is None: + if self.sum is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) @@ -1946,7 +1938,7 @@ class Tally(object): if isinstance(power, Tally): # Check that results have been read - if power.mean is None: + if power.sum is None: msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ 'since it does not contain any results.'.format(power.id) raise ValueError(msg) @@ -2081,153 +2073,16 @@ class Tally(object): new_tally = self * -1 return new_tally - def minimum(self, scores=[], filters=[], filter_bins=[], - nuclides=[], value='mean'): - """Returns the minimum of a slice of the Tally's data. - - Parameters - ---------- - scores : list - A list of one or more score strings - (e.g., ['absorption', 'nu-fission']; default is []) - - filters : list - A list of filter type strings - (e.g., ['mesh', 'energy']; default is []) - - filter_bins : list - A list of the filter bins corresponding to the filter_types - parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in - the list is the integer ID for 'material', 'surface', 'cell', - 'cellborn', and 'universe' Filters. Each bin is an integer for the - cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of - floats for 'energy' and 'energyout' filters corresponding to the - energy boundaries of the bin of interest. The bin is a (x,y,z) - 3-tuple for 'mesh' filters corresponding to the mesh cell of - interest. The order of the bins in the list must correspond of the - filter_types parameter. - - nuclides : list - A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) - - value : str - A string for the type of value to return - 'mean' (default), - 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted - - Returns - ------- - float - A scalar float of the minimum value in the Tally data indexed by - each filter, nuclide and score as listed in the parameters. - """ - - data = self.get_values(scores, filters, filter_bins, nuclides, value) - return np.min(data) - - def maximum(self, scores=[], filters=[], filter_bins=[], - nuclides=[], value='mean'): - """Returns the maximum of a slice of the Tally's data. - - Parameters - ---------- - scores : list - A list of one or more score strings - (e.g., ['absorption', 'nu-fission']; default is []) - - filters : list - A list of filter type strings - (e.g., ['mesh', 'energy']; default is []) - - filter_bins : list - A list of the filter bins corresponding to the filter_types - parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in - the list is the integer ID for 'material', 'surface', 'cell', - 'cellborn', and 'universe' Filters. Each bin is an integer for the - cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of - floats for 'energy' and 'energyout' filters corresponding to the - energy boundaries of the bin of interest. The bin is a (x,y,z) - 3-tuple for 'mesh' filters corresponding to the mesh cell of - interest. The order of the bins in the list must correspond of the - filter_types parameter. - - nuclides : list - A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) - - value : str - A string for the type of value to return - 'mean' (default), - 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted - - Returns - ------- - float - A scalar float of the maximum value in the Tally data indexed by - each filter, nuclide and score as listed in the parameters. - """ - - data = self.get_values(scores, filters, filter_bins, nuclides, value) - return np.max(data) - - def summation(self, scores=[], filters=[], filter_bins=[], - nuclides=[], value='mean'): - """Returns the sum of a slice of the Tally's data. - - Parameters - ---------- - scores : list - A list of one or more score strings - (e.g., ['absorption', 'nu-fission']; default is []) - - filters : list - A list of filter type strings - (e.g., ['mesh', 'energy']; default is []) - - filter_bins : list - A list of the filter bins corresponding to the filter_types - parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in - the list is the integer ID for 'material', 'surface', 'cell', - 'cellborn', and 'universe' Filters. Each bin is an integer for the - cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of - floats for 'energy' and 'energyout' filters corresponding to the - energy boundaries of the bin of interest. The bin is a (x,y,z) - 3-tuple for 'mesh' filters corresponding to the mesh cell of - interest. The order of the bins in the list must correspond of the - filter_types parameter. - - nuclides : list - A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) - - value : str - A string for the type of value to return - 'mean' (default), - 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted - - Returns - ------- - float - A scalar float of the sum of the Tally data indexed by - each filter, nuclide and score as listed in the parameters. - """ - - data = self.get_values(scores, filters, filter_bins, nuclides, value) - return np.sum(data) - def slice(self, scores=[], filters=[], filter_bins=[], nuclides=[]): """ """ # Ensure that StatePoint.read_results() was called first - if (self.mean is None) or (self.std_dev is None): - msg = 'The Tally ID={0} has no data to slice. Call the ' \ - 'StatePoint.read_results() method before using ' \ - 'Tally.slice(...)'.format(self.id) + if self.sum is None: + msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + 'since it does not contain any results.'.format(self.id) raise ValueError(msg) - # Compute batch statistics if not yet computed - if not self.with_batch_statistics: - self.compute_std_dev() - new_tally = copy.deepcopy(self) new_sum = self.get_values(scores, filters, filter_bins, nuclides, 'sum') @@ -2264,10 +2119,8 @@ class Tally(object): # Create a list of the first energy edge bins = [filter_bin[0] for filter_bin in filter_bins] - - - ############################ NUCLIDES ######################## - # Determine the score indices from any of the requested scores + ############################ NUCLIDES ######################### + # Determine the nuclide indices from any of the requested nuclides if nuclides: # Initialize list of indices to Nuclides to exclude from slice @@ -2288,15 +2141,14 @@ class Tally(object): for nuclide_index in nuclide_indices[::-1]: new_tally.remove_nuclide(self.nuclides[nuclide_index]) - ############################# SCORES ######################### + ############################ SCORES ########################## # Determine the score indices from any of the requested scores if scores: - # Initialize list of indices to Nuclides to exclude from slice + # Initialize list of indices to scores to exclude from slice score_indices = [] for score in self.scores: - if score not in scores: score_index = self.get_score_index(score) score_indices.append(score_index) From 48a3ffef8d2f82737b48d6bc0d493b79b08310da Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 29 Jul 2015 23:49:12 -0700 Subject: [PATCH 028/101] Removed Cross class objects for Filters, Nuclides and scores --- openmc/filter.py | 2 +- openmc/tallies.py | 61 ++++++++++++++++++----------------------------- 2 files changed, 24 insertions(+), 39 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index 68511771c7..6c4311291a 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -180,7 +180,7 @@ class Filter(object): raise ValueError(msg) # If all error checks passed, add bin edges - self._bins = bins + self._bins = np.array(bins) # FIXME @num_bins.setter diff --git a/openmc/tallies.py b/openmc/tallies.py index 85f2ecbd69..3695885b0c 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -983,8 +983,8 @@ class Tally(object): An optional Summary object to be used to construct columns for distribcell tally filters (default is None). The geometric information in the Summary object is embedded into a Multi-index - column with a geometric "path" to each distribcell intance. NOTE: - This option requires the OpenCG Python package. + column with a geometric "path" to each distribcell intance. + NOTE: This option requires the OpenCG Python package. Returns ------- @@ -1428,7 +1428,7 @@ class Tally(object): def _outer_product(self, other, new_tally, binary_op): """Combines filters, scores and nuclides with another tally. - This is a helper method for the tally arithmetic methods. The ilters, + This is a helper method for the tally arithmetic methods. The filters, scores and nuclides from both tallies are enumerated into all possible combinations and expressed as _CrossFilter, _CrossScore and _CrossNuclide objects in the new derived tally. @@ -1456,8 +1456,7 @@ class Tally(object): # Generate filter "outer products" if self.filters == other.filters: for self_filter in self.filters: - new_filter = _CrossFilter(self_filter, self_filter, binary_op) - new_tally.add_filter(new_filter) + new_tally.add_filter(self_filter) else: all_filters = [self.filters, other.filters] for self_filter, other_filter in itertools.product(*all_filters): @@ -1467,8 +1466,7 @@ class Tally(object): # Generate score "outer products" if self.scores == other.scores: for self_score in self.scores: - new_score = _CrossScore(self_score, self_score, binary_op) - new_tally.add_score(new_score) + new_tally.add_score(self_score) else: all_scores = [self.scores, other.scores] for self_score, other_score in itertools.product(*all_scores): @@ -1478,8 +1476,7 @@ class Tally(object): # Generate nuclide "outer products" if self.nuclides == other.nuclides: for self_nuclide in self.nuclides: - new_nuclide = _CrossNuclide(self_nuclide, self_nuclide, binary_op) - new_tally.nuclides.append(new_nuclide) + new_tally.nuclides.append(self_nuclide) else: all_nuclides = [self.nuclides, other.nuclides] for self_nuclide, other_nuclide in itertools.product(*all_nuclides): @@ -1620,7 +1617,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value self._outer_product(other, new_tally, binary_op='+') @@ -1699,7 +1695,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value self._outer_product(other, new_tally, binary_op='-') @@ -1779,7 +1774,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value self._outer_product(other, new_tally, binary_op='*') @@ -1861,7 +1855,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value self._outer_product(other, new_tally, binary_op='/') @@ -1943,7 +1936,6 @@ class Tally(object): 'since it does not contain any results.'.format(power.id) raise ValueError(msg) - # FIXME: Need to be able to use StatePoint.get_tally # FIXME: Need to be able to use Tally.get_value self._outer_product(power, new_tally, binary_op='^') @@ -2091,41 +2083,36 @@ class Tally(object): new_tally.sum = new_sum new_tally.sum_sq = new_sum_sq - ############################ FILTERS ######################### - # Determine the score indices from any of the requested scores + ############################ FILTERS ########################## if filters: - - # Initialize list of indices to Filters to exclude from slice filter_indices = [] - # Loop over all of the Tally's Filters + # Determine the filter indices from any of the requested filters for i, filter in enumerate(self.filters): - - # FIXME: sum over unused filter bins - # FIXME: neglect bins not selected for selected filters - # NOTE: We must store filter indices here since they are strings - if filter.type not in filters: - filter_index = self.get_filter_index(filters[i], filter_bins[i]) + filter_index = self.get_filter_index(filters[i], filter_bins[i][0]) filter_indices.append(filter_index) - # Loop over indices in reverse to remove excluded Filters - for filter_index in filter_indices[::-1]: - new_tally.remove_filter(self.filters[filter_index]) + # Remove and/or reorder filter bins to user specifications + else: + bin_indices = [] - for i, filter_type in enumerate(filters): + for filter_bin in filter_bins[i]: + bin_index = self.filters[filter_index].get_bin_index(filter_bin) + bin_indices.append(bin_index) - if 'energy' in filter_type: - # Create a list of the first energy edge - bins = [filter_bin[0] for filter_bin in filter_bins] + new_bins = self.filters[filter_index].bins[bin_indices] + self.filters[filter_index].bins = new_bins + + # Loop over indices in reverse to remove excluded Filters + for filter_index in filter_indices[::-1]: + new_tally.remove_filter(self.filters[filter_index]) ############################ NUCLIDES ######################### - # Determine the nuclide indices from any of the requested nuclides if nuclides: - - # Initialize list of indices to Nuclides to exclude from slice nuclide_indices = [] + # Determine the nuclide indices from any of the requested nuclides for nuclide in self.nuclides: if isinstance(nuclide, Nuclide): @@ -2142,12 +2129,10 @@ class Tally(object): new_tally.remove_nuclide(self.nuclides[nuclide_index]) ############################ SCORES ########################## - # Determine the score indices from any of the requested scores if scores: - - # Initialize list of indices to scores to exclude from slice score_indices = [] + # Determine the score indices from any of the requested scores for score in self.scores: if score not in scores: score_index = self.get_score_index(score) From 2db8bbe060867f1a0194ec4e5f0b2edea0055faf Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 29 Jul 2015 23:55:17 -0700 Subject: [PATCH 029/101] Now initialize mean and std_dev to None in Tally.slice(...) --- openmc/tallies.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openmc/tallies.py b/openmc/tallies.py index 3695885b0c..afdc19048b 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2082,6 +2082,8 @@ class Tally(object): nuclides, 'sum_sq') new_tally.sum = new_sum new_tally.sum_sq = new_sum_sq + new_tally._mean = None + new_tally._std_dev = None ############################ FILTERS ########################## if filters: From 1252dc8689e0ba31b53a48e7feb43afe980df538 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 30 Jul 2015 07:57:52 -0700 Subject: [PATCH 030/101] Fixed split filter loop --- openmc/tallies.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index afdc19048b..91777dcb02 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1031,9 +1031,7 @@ class Tally(object): # Split CrossFilters into separate filters split_filters = [] - for filter in self.filters: - if isinstance(filter, _CrossFilter): split_filters.extend(filter.split_filters()) else: @@ -1041,6 +1039,7 @@ class Tally(object): # Build DataFrame columns for filters if user requested them if filters: + for filter in split_filters: # mesh filters @@ -1233,7 +1232,7 @@ class Tally(object): # Create strings for template = '{0:.1e} - {1:.1e}' filter_bins = [] - for i in range(num_bins-1): + for i in range(num_bins): filter_bins.append(template.format(bins[i], bins[i+1])) # Tile the energy bins into a DataFrame column From 2cda46e38467f15078e9b1cee5dd788fbae411e1 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Sat, 1 Aug 2015 22:00:38 -0600 Subject: [PATCH 031/101] Fix Numpy type issue Numpy integer types aren't recognized as an instance of Integral, at least not with numpy 1.8.2 --- openmc/checkvalue.py | 18 +++++++++++++++--- openmc/filter.py | 21 ++++++--------------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/openmc/checkvalue.py b/openmc/checkvalue.py index f9e05e3f8c..5b5f302e5a 100644 --- a/openmc/checkvalue.py +++ b/openmc/checkvalue.py @@ -1,4 +1,16 @@ from collections import Iterable +from numbers import Integral + +import numpy as np + +def _isinstance(value, expected_type): + """A Numpy-aware replacement for isinstance""" + np_ints = [np.intc, np.intp, np.int8, np.int16, np.int32, np.int64, + np.uint8, np.uint16, np.uint32, np.uint64] + if expected_type is Integral: + types = np_ints + [Integral] + return any(isinstance(value, t) for t in types) + return isinstance(value, expected_type) def check_type(name, value, expected_type, expected_iter_type=None): """Ensure that an object is of an expected type. Optionally, if the object is @@ -18,14 +30,14 @@ def check_type(name, value, expected_type, expected_iter_type=None): """ - if not isinstance(value, expected_type): + if not _isinstance(value, expected_type): msg = 'Unable to set {0} to {1} which is not of type {2}'.format( name, value, expected_type.__name__) raise ValueError(msg) if expected_iter_type: for item in value: - if not isinstance(item, expected_iter_type): + if not _isinstance(item, expected_iter_type): msg = 'Unable to set {0} to {1} since each item must be ' \ 'of type {2}'.format(name, value, expected_iter_type.__name__) @@ -74,7 +86,7 @@ def check_iterable_type(name, value, expected_type, min_depth=1, max_depth=1): # If this item is of the expected type, then we've reached the bottom # level of this branch. - if isinstance(current_item, expected_type): + if _isinstance(current_item, expected_type): # Is this deep enough? if len(tree) < min_depth: msg = 'Error setting {0}: The item at {1} does not meet the ' \ diff --git a/openmc/filter.py b/openmc/filter.py index 09928e235a..ca5d430a95 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -6,7 +6,8 @@ import numpy as np from openmc import Mesh from openmc.constants import * -from openmc.checkvalue import check_type +from openmc.checkvalue import check_type, check_iterable_type, \ + check_greater_than class Filter(object): """A filter used to constrain a tally to a specific criterion, e.g. only tally @@ -134,15 +135,9 @@ class Filter(object): if self._type in ['cell', 'cellborn', 'surface', 'material', 'universe', 'distribcell']: + check_iterable_type('filter bins', bins, Integral) for edge in bins: - if not isinstance(edge, Integral): - msg = 'Unable to add bin "{0}" to a {1} Filter since ' \ - 'it is not an integer'.format(edge, self._type) - raise ValueError(msg) - elif edge < 0: - msg = 'Unable to add bin "{0}" to a {1} Filter since ' \ - 'it is negative'.format(edge, self._type) - raise ValueError(msg) + check_greater_than('filter bin', edge, 0, equality=True) elif self._type in ['energy', 'energyout']: for edge in bins: @@ -185,12 +180,8 @@ class Filter(object): # FIXME @num_bins.setter def num_bins(self, num_bins): - if not isinstance(num_bins, Integral) or num_bins < 0: - msg = 'Unable to set the number of bins "{0}" for a {1} Filter ' \ - 'since it is not a positive ' \ - 'integer'.format(num_bins, self._type) - raise ValueError(msg) - + check_type('filter num_bins', num_bins, Integral) + check_greater_than('filter num_bins', num_bins, 0, equality=True) self._num_bins = num_bins @mesh.setter From ce147bd68dd804b5dc3efadf32725ed6ff0ed9d6 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 1 Aug 2015 22:49:53 -0700 Subject: [PATCH 032/101] Tally slice routine now corrects new tally filter strides --- openmc/filter.py | 4 +-- openmc/tallies.py | 79 +++++++++++++++++++++++++++-------------------- 2 files changed, 47 insertions(+), 36 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index 6c4311291a..b46144f6ce 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -322,7 +322,7 @@ class Filter(object): # Use lower energy bound to find index for energy Filters elif self.type in ['energy', 'energyout']: - val = self.bins.index(filter_bin[0]) + val = np.where(self.bins == filter_bin[0])[0][0] filter_index = val # Filter bins for distribcell are the "IDs" of each unique placement @@ -332,7 +332,7 @@ class Filter(object): # Use ID for all other Filters (e.g., material, cell, etc.) else: - val = self.bins.index(filter_bin) + val = np.where(self.bins == filter_bin)[0][0] filter_index = val except ValueError: diff --git a/openmc/tallies.py b/openmc/tallies.py index 91777dcb02..40023c99a8 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1616,6 +1616,7 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) + # FIXME: New tally IDs collide with existing IDs # FIXME: Need to be able to use Tally.get_value self._outer_product(other, new_tally, binary_op='+') @@ -1694,6 +1695,7 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) + # FIXME: New tally IDs collide with existing IDs # FIXME: Need to be able to use Tally.get_value self._outer_product(other, new_tally, binary_op='-') @@ -1773,6 +1775,7 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) + # FIXME: New tally IDs collide with existing IDs # FIXME: Need to be able to use Tally.get_value self._outer_product(other, new_tally, binary_op='*') @@ -1854,6 +1857,7 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) + # FIXME: New tally IDs collide with existing IDs # FIXME: Need to be able to use Tally.get_value self._outer_product(other, new_tally, binary_op='/') @@ -1935,6 +1939,7 @@ class Tally(object): 'since it does not contain any results.'.format(power.id) raise ValueError(msg) + # FIXME: New tally IDs collide with existing IDs # FIXME: Need to be able to use Tally.get_value self._outer_product(power, new_tally, binary_op='^') @@ -2084,6 +2089,41 @@ class Tally(object): new_tally._mean = None new_tally._std_dev = None + ############################ SCORES ########################## + if scores: + score_indices = [] + + # Determine the score indices from any of the requested scores + for score in self.scores: + if score not in scores: + score_index = self.get_score_index(score) + score_indices.append(score_index) + + # Loop over indices in reverse to remove excluded scores + for score_index in score_indices[::-1]: + new_tally.remove_score(self.scores[score_index]) + new_tally.num_score_bins -= 1 + + ############################ NUCLIDES ######################### + if nuclides: + nuclide_indices = [] + + # Determine the nuclide indices from any of the requested nuclides + for nuclide in self.nuclides: + + if isinstance(nuclide, Nuclide): + if nuclide.name not in nuclides: + nuclide_index = self.get_nuclide_index(nuclide) + nuclide_indices.append(nuclide_index) + else: + if nuclide not in nuclides: + nuclide_index = self.get_nuclide_index(nuclide) + nuclide_indices.append(nuclide_index) + + # Loop over indices in reverse to remove excluded Nuclides + for nuclide_index in nuclide_indices[::-1]: + new_tally.remove_nuclide(self.nuclides[nuclide_index]) + ############################ FILTERS ########################## if filters: filter_indices = [] @@ -2109,40 +2149,11 @@ class Tally(object): for filter_index in filter_indices[::-1]: new_tally.remove_filter(self.filters[filter_index]) - ############################ NUCLIDES ######################### - if nuclides: - nuclide_indices = [] - - # Determine the nuclide indices from any of the requested nuclides - for nuclide in self.nuclides: - - if isinstance(nuclide, Nuclide): - if nuclide.name not in nuclides: - nuclide_index = self.get_nuclide_index(nuclide) - nuclide_indices.append(nuclide_index) - else: - if nuclide not in nuclides: - nuclide_index = self.get_nuclide_index(nuclide) - nuclide_indices.append(nuclide_index) - - # Loop over indices in reverse to remove excluded Nuclides - for nuclide_index in nuclide_indices[::-1]: - new_tally.remove_nuclide(self.nuclides[nuclide_index]) - - ############################ SCORES ########################## - if scores: - score_indices = [] - - # Determine the score indices from any of the requested scores - for score in self.scores: - if score not in scores: - score_index = self.get_score_index(score) - score_indices.append(score_index) - - # Loop over indices in reverse to remove excluded scores - for score_index in score_indices[::-1]: - new_tally.remove_score(self.scores[score_index]) - new_tally.num_score_bins -= 1 + # Correct each Filter's stride + stride = new_tally.num_nuclides * new_tally.num_score_bins + for filter in reversed(new_tally.filters): + filter.stride = stride + stride *= filter.num_bins return new_tally From 7ba69d893bdb8cfc7c66163b76f3394e580b25f2 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 2 Aug 2015 01:20:30 -0700 Subject: [PATCH 033/101] Made Tally.get_values(...) not NumPy squeeze data. Fixed bug in doubly used loop iterator i in Tally.slice(...) --- openmc/tallies.py | 56 +++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 40023c99a8..8b259c592f 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -895,8 +895,8 @@ class Tally(object): # Create list of 2-tuples for energy boundary bins elif filter.type in ['energy', 'energyout']: bins = [] - for i in range(filter.num_bins): - bins.append((filter.bins[i], filter.bins[i+1])) + for k in range(filter.num_bins): + bins.append((filter.bins[k], filter.bins[k+1])) # Create list of IDs for bins for all other Filter types else: @@ -956,7 +956,7 @@ class Tally(object): '\rel_err\', \'sum\', or \'sum_sq\''.format(self.id, value) raise LookupError(msg) - return data.squeeze() + return data def get_pandas_dataframe(self, filters=True, nuclides=True, scores=True, summary=None): @@ -1516,8 +1516,8 @@ class Tally(object): # Determine the number of paired combinations of filter bins # between the two tallies and repeat arrays along filter axes - self_num_filter_bins = self.mean.shape[0] - other_num_filter_bins = other.mean.shape[0] + self_num_filter_bins = self.num_filter_bins + other_num_filter_bins = other.num_filter_bins num_filter_bins = self_num_filter_bins * other_num_filter_bins self_repeat_factor = num_filter_bins / self_num_filter_bins other_tile_factor = num_filter_bins / other_num_filter_bins @@ -1532,8 +1532,8 @@ class Tally(object): # Determine the number of paired combinations of nuclides # between the two tallies and repeat arrays along nuclide axes - self_num_nuclide_bins = self.mean.shape[1] - other_num_nuclide_bins = other.mean.shape[1] + self_num_nuclide_bins = self.num_nuclides + other_num_nuclide_bins = other.num_nuclides num_nuclide_bins = self_num_nuclide_bins * other_num_nuclide_bins self_repeat_factor = num_nuclide_bins / self_num_nuclide_bins other_tile_factor = num_nuclide_bins / other_num_nuclide_bins @@ -1548,8 +1548,8 @@ class Tally(object): # Determine the number of paired combinations of score bins # between the two tallies and repeat arrays along score axes - self_num_score_bins = self.mean.shape[2] - other_num_score_bins = other.mean.shape[2] + self_num_score_bins = self.num_score_bins + other_num_score_bins = other.num_score_bins num_score_bins = self_num_score_bins * other_num_score_bins self_repeat_factor = num_score_bins / self_num_score_bins other_tile_factor = num_score_bins / other_num_score_bins @@ -1616,7 +1616,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: New tally IDs collide with existing IDs # FIXME: Need to be able to use Tally.get_value self._outer_product(other, new_tally, binary_op='+') @@ -1695,7 +1694,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: New tally IDs collide with existing IDs # FIXME: Need to be able to use Tally.get_value self._outer_product(other, new_tally, binary_op='-') @@ -1775,7 +1773,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: New tally IDs collide with existing IDs # FIXME: Need to be able to use Tally.get_value self._outer_product(other, new_tally, binary_op='*') @@ -1857,7 +1854,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: New tally IDs collide with existing IDs # FIXME: Need to be able to use Tally.get_value self._outer_product(other, new_tally, binary_op='/') @@ -1939,7 +1935,6 @@ class Tally(object): 'since it does not contain any results.'.format(power.id) raise ValueError(msg) - # FIXME: New tally IDs collide with existing IDs # FIXME: Need to be able to use Tally.get_value self._outer_product(power, new_tally, binary_op='^') @@ -2084,12 +2079,15 @@ class Tally(object): nuclides, 'sum') new_sum_sq = self.get_values(scores, filters, filter_bins, nuclides, 'sum_sq') + new_tally.sum = new_sum new_tally.sum_sq = new_sum_sq new_tally._mean = None new_tally._std_dev = None - ############################ SCORES ########################## + # FIXME: Reorder nuclides, scores, filters + + # SCORES if scores: score_indices = [] @@ -2104,7 +2102,7 @@ class Tally(object): new_tally.remove_score(self.scores[score_index]) new_tally.num_score_bins -= 1 - ############################ NUCLIDES ######################### + # NUCLIDES if nuclides: nuclide_indices = [] @@ -2124,30 +2122,22 @@ class Tally(object): for nuclide_index in nuclide_indices[::-1]: new_tally.remove_nuclide(self.nuclides[nuclide_index]) - ############################ FILTERS ########################## + # FILTERS if filters: - filter_indices = [] # Determine the filter indices from any of the requested filters - for i, filter in enumerate(self.filters): - if filter.type not in filters: - filter_index = self.get_filter_index(filters[i], filter_bins[i][0]) - filter_indices.append(filter_index) + for i, filter_type in enumerate(filters): + filter = new_tally.find_filter(filter_type) # Remove and/or reorder filter bins to user specifications - else: - bin_indices = [] + bin_indices = [] - for filter_bin in filter_bins[i]: - bin_index = self.filters[filter_index].get_bin_index(filter_bin) - bin_indices.append(bin_index) + for filter_bin in filter_bins[i]: + bin_index = filter.get_bin_index(filter_bin) + bin_indices.append(bin_index) - new_bins = self.filters[filter_index].bins[bin_indices] - self.filters[filter_index].bins = new_bins - - # Loop over indices in reverse to remove excluded Filters - for filter_index in filter_indices[::-1]: - new_tally.remove_filter(self.filters[filter_index]) + new_bins = filter.bins[bin_indices] + filter.bins = new_bins # Correct each Filter's stride stride = new_tally.num_nuclides * new_tally.num_score_bins From 4ded3a39e17b2c646f07902a8672f70b6ba605b8 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Sun, 2 Aug 2015 12:24:06 -0600 Subject: [PATCH 034/101] Forbid trailing whitespace in the style guide --- docs/source/devguide/styleguide.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/devguide/styleguide.rst b/docs/source/devguide/styleguide.rst index 25c58ae773..c8644e45cc 100644 --- a/docs/source/devguide/styleguide.rst +++ b/docs/source/devguide/styleguide.rst @@ -153,6 +153,8 @@ Avoid extraneous whitespace in the following situations: Yes: if (variable == 2) then No: if ( variable==2 ) then +Do not leave trailing whitespace at the end of a line. + ------ Python ------ From 587062ad39df850c4b8cd838d78c6a73061323c6 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 2 Aug 2015 23:19:46 -0700 Subject: [PATCH 035/101] Fixed Tally.get_values(...) bug with filter strides --- openmc/tallies.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 8b259c592f..ea4975173b 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -904,8 +904,16 @@ class Tally(object): # Add indices for each bin in this Filter to the list for bin in bins: - filter_indices[i].append( - self.get_filter_index(filter.type, bin)) + if user_filter: + filter_indices[i].append( + self.get_filter_index(filter.type, bin)) + else: + filter_indices[i].append( + self.get_filter_index(filter.type, bin)) + + # Account for stride in each of the previous filters + reverse_mult = lambda x: [xi * filter.num_bins for xi in x] + filter_indices[:i] = map(reverse_mult, filter_indices[:i]) # Apply outer product sum between all filter bin indices filter_indices = list(map(sum, itertools.product(*filter_indices))) @@ -2111,7 +2119,7 @@ class Tally(object): if isinstance(nuclide, Nuclide): if nuclide.name not in nuclides: - nuclide_index = self.get_nuclide_index(nuclide) + nuclide_index = self.get_nuclide_index(nuclide.name) nuclide_indices.append(nuclide_index) else: if nuclide not in nuclides: From 79055493e00dcc6d12f8578ed8b9c61e22d0f8a2 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 2 Aug 2015 23:52:36 -0700 Subject: [PATCH 036/101] Shortened nuclide slice block and added docstring to Tally.slice --- openmc/tallies.py | 70 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 59 insertions(+), 11 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index ea4975173b..75830d8f8e 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2064,16 +2064,70 @@ class Tally(object): A new derived tally which is the absolute value of this tally. """ + new_tally = copy.deepcopy(self) new_tally._mean = np.abs(new_tally.mean) return new_tally def __neg__(self): + """The negated value of this tally. + + Returns + ------- + Tally + A new derived tally which is the negated value of this tally. + + """ + new_tally = self * -1 return new_tally - def slice(self, scores=[], filters=[], filter_bins=[], nuclides=[]): - """ + def get_slice(self, scores=[], filters=[], filter_bins=[], nuclides=[]): + """Build a sliced tally for the specified filters, scores and nuclides. + + This method constructs a new tally to encapsulate a subset of the data + represented by this tally. The subset of data to included in the tally + slice is determined by the scores, filters and nuclides specified in + the input parameters. + + Parameters + ---------- + scores : list + A list of one or more score strings + (e.g., ['absorption', 'nu-fission']; default is []) + + filters : list + A list of filter type strings + (e.g., ['mesh', 'energy']; default is []) + + filter_bins : list + A list of the filter bins corresponding to the filter_types + parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in + the list is the integer ID for 'material', 'surface', 'cell', + 'cellborn', and 'universe' Filters. Each bin is an integer for the + cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of + floats for 'energy' and 'energyout' filters corresponding to the + energy boundaries of the bin of interest. The bin is a (x,y,z) + 3-tuple for 'mesh' filters corresponding to the mesh cell of + interest. The order of the bins in the list must correspond of the + filter_types parameter. + + nuclides : list + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) + + Returns + ------- + Tally + A new tally which encapsulates the subset of data requested in the + order each filter, nuclide and score is listed in the parameters. + + Raises + ------ + ValueError + When this method is called before the Tally is populated with data + by the StatePoint.read_results() method. + """ # Ensure that StatePoint.read_results() was called first @@ -2116,15 +2170,9 @@ class Tally(object): # Determine the nuclide indices from any of the requested nuclides for nuclide in self.nuclides: - - if isinstance(nuclide, Nuclide): - if nuclide.name not in nuclides: - nuclide_index = self.get_nuclide_index(nuclide.name) - nuclide_indices.append(nuclide_index) - else: - if nuclide not in nuclides: - nuclide_index = self.get_nuclide_index(nuclide) - nuclide_indices.append(nuclide_index) + if nuclide.name not in nuclides: + nuclide_index = self.get_nuclide_index(nuclide.name) + nuclide_indices.append(nuclide_index) # Loop over indices in reverse to remove excluded Nuclides for nuclide_index in nuclide_indices[::-1]: From fa57c16e7e63a55315e577f719973f9d69e2aed7 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 3 Aug 2015 00:00:40 -0700 Subject: [PATCH 037/101] Renamed _CrossXXX class types to CrossXXX --- openmc/cross.py | 44 ++++++++++++++++++++++---------------------- openmc/tallies.py | 18 +++++++++--------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 45c7ce2d8f..16b8bd5736 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -1,29 +1,29 @@ from openmc import Filter, Nuclide -class _CrossScore(object): +class CrossScore(object): """A special-purpose tally score used to encapsulate all combinations of two tally's scores as a outer product for tally arithmetic. Parameters ---------- - left_score : str or _CrossScore + left_score : str or CrossScore The left score in the outer product - right_score : str or _CrossScore + right_score : str or CrossScore The right score in the outer product binary_op : str The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's scores with this _CrossNuclide + combine two tally's scores with this CrossNuclide Attributes ---------- - left_score : str or _CrossScore + left_score : str or CrossScore The left score in the outer product - right_score : str or _CrossScore + right_score : str or CrossScore The right score in the outer product binary_op : str The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's scores with this _CrossNuclide + combine two tally's scores with this CrossNuclide """ @@ -70,29 +70,29 @@ class _CrossScore(object): return string -class _CrossNuclide(object): +class CrossNuclide(object): """A special-purpose nuclide used to encapsulate all combinations of two tally's nuclides as a outer product for tally arithmetic. Parameters ---------- - left_nuclide : Nuclide or _CrossNuclide + left_nuclide : Nuclide or CrossNuclide The left nuclide in the outer product - right_nuclide : Nuclide or _CrossNuclide + right_nuclide : Nuclide or CrossNuclide The right nuclide in the outer product binary_op : str The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's nuclides with this _CrossNuclide + combine two tally's nuclides with this CrossNuclide Attributes ---------- - left_nuclide : Nuclide or _CrossNuclide + left_nuclide : Nuclide or CrossNuclide The left nuclide in the outer product - right_nuclide : Nuclide or _CrossNuclide + right_nuclide : Nuclide or CrossNuclide The right nuclide in the outer product binary_op : str The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's nuclides with this _CrossNuclide + combine two tally's nuclides with this CrossNuclide """ @@ -156,29 +156,29 @@ class _CrossNuclide(object): return string -class _CrossFilter(object): +class CrossFilter(object): """A special-purpose filter used to encapsulate all combinations of two tally's filter bins as a outer product for tally arithmetic. Parameters ---------- - left_filter : Filter or _CrossFilter + left_filter : Filter or CrossFilter The left filter in the outer product - right_filter : Filter or _CrossFilter + right_filter : Filter or CrossFilter The right filter in the outer product binary_op : str The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's filter bins with this _CrossFilter + combine two tally's filter bins with this CrossFilter Attributes ---------- - left_filter : Filter or _CrossFilter + left_filter : Filter or CrossFilter The left filter in the outer product - right_filter : Filter or _CrossFilter + right_filter : Filter or CrossFilter The right filter in the outer product binary_op : str The tally arithmetic binary operator (e.g., '+', '-', etc.) used to - combine two tally's filter bins with this _CrossFilter + combine two tally's filter bins with this CrossFilter """ @@ -250,7 +250,7 @@ class _CrossFilter(object): def __repr__(self): - string = '_CrossFilter\n' + string = 'CrossFilter\n' filter_type = '({0} {1} {2})'.format(self.left_filter.type, self.binary_op, self.right_filter.type) diff --git a/openmc/tallies.py b/openmc/tallies.py index 75830d8f8e..4f30a9487d 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -10,7 +10,7 @@ import sys import numpy as np from openmc import Mesh, Filter, Trigger, Nuclide -from openmc.cross import _CrossScore, _CrossNuclide, _CrossFilter +from openmc.cross import CrossScore, CrossNuclide, CrossFilter from openmc.summary import Summary from openmc.checkvalue import check_type, check_value, check_greater_than from openmc.clean_xml import * @@ -329,7 +329,7 @@ class Tally(object): """ - if not isinstance(filter, (Filter, _CrossFilter)): + if not isinstance(filter, (Filter, CrossFilter)): msg = 'Unable to add Filter "{0}" to Tally ID={1} since it is ' \ 'not a Filter object'.format(filter, self.id) raise ValueError(msg) @@ -358,7 +358,7 @@ class Tally(object): """ - if not isinstance(score, (basestring, _CrossScore)): + if not isinstance(score, (basestring, CrossScore)): msg = 'Unable to add score "{0}" to Tally ID={1} since it is ' \ 'not a string'.format(score, self.id) raise ValueError(msg) @@ -1040,7 +1040,7 @@ class Tally(object): # Split CrossFilters into separate filters split_filters = [] for filter in self.filters: - if isinstance(filter, _CrossFilter): + if isinstance(filter, CrossFilter): split_filters.extend(filter.split_filters()) else: split_filters.append(filter) @@ -1437,8 +1437,8 @@ class Tally(object): This is a helper method for the tally arithmetic methods. The filters, scores and nuclides from both tallies are enumerated into all possible - combinations and expressed as _CrossFilter, _CrossScore and - _CrossNuclide objects in the new derived tally. + combinations and expressed as CrossFilter, CrossScore and + CrossNuclide objects in the new derived tally. Parameters ---------- @@ -1467,7 +1467,7 @@ class Tally(object): else: all_filters = [self.filters, other.filters] for self_filter, other_filter in itertools.product(*all_filters): - new_filter = _CrossFilter(self_filter, other_filter, binary_op) + new_filter = CrossFilter(self_filter, other_filter, binary_op) new_tally.add_filter(new_filter) # Generate score "outer products" @@ -1477,7 +1477,7 @@ class Tally(object): else: all_scores = [self.scores, other.scores] for self_score, other_score in itertools.product(*all_scores): - new_score = _CrossScore(self_score, other_score, binary_op) + new_score = CrossScore(self_score, other_score, binary_op) new_tally.add_score(new_score) # Generate nuclide "outer products" @@ -1487,7 +1487,7 @@ class Tally(object): else: all_nuclides = [self.nuclides, other.nuclides] for self_nuclide, other_nuclide in itertools.product(*all_nuclides): - new_nuclide = _CrossNuclide(self_nuclide, other_nuclide, binary_op) + new_nuclide = CrossNuclide(self_nuclide, other_nuclide, binary_op) new_tally.add_nuclide(new_nuclide) def _align_tally_data(self, other): From 0625350869223ed5247e88348ad1f9b7c1cc2de4 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 3 Aug 2015 00:26:42 -0700 Subject: [PATCH 038/101] Added __eq__ methods to CrossXXX classes to allow for Tally.get_values with derived Tallies --- openmc/cross.py | 9 +++++++++ openmc/tallies.py | 10 ---------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 16b8bd5736..123886ddf6 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -64,6 +64,9 @@ class CrossScore(object): def binary_op(self, binary_op): self._binary_op = binary_op + def __eq__(self, other): + return str(other) == str(self) + def __repr__(self): string = '({0} {1} {2})'.format(self.left_score, self.binary_op, self.right_score) @@ -133,6 +136,9 @@ class CrossNuclide(object): def binary_op(self, binary_op): self._binary_op = binary_op + def __eq__(self, other): + return str(other) == str(self) + def __repr__(self): string = '' @@ -248,6 +254,9 @@ class CrossFilter(object): def binary_op(self, binary_op): self._binary_op = binary_op + def __eq__(self, other): + return str(other) == str(self) + def __repr__(self): string = 'CrossFilter\n' diff --git a/openmc/tallies.py b/openmc/tallies.py index 4f30a9487d..6ac1e37690 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1624,8 +1624,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need to be able to use Tally.get_value - self._outer_product(other, new_tally, binary_op='+') data = self._align_tally_data(other) new_tally._mean = data['self']['mean'] + data['other']['mean'] @@ -1702,8 +1700,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need to be able to use Tally.get_value - self._outer_product(other, new_tally, binary_op='-') data = self._align_tally_data(other) new_tally._mean = data['self']['mean'] - data['other']['mean'] @@ -1781,8 +1777,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need to be able to use Tally.get_value - self._outer_product(other, new_tally, binary_op='*') data = self._align_tally_data(other) self_rel_err = data['self']['std. dev.'] / data['self']['mean'] @@ -1862,8 +1856,6 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - # FIXME: Need to be able to use Tally.get_value - self._outer_product(other, new_tally, binary_op='/') data = self._align_tally_data(other) self_rel_err = data['self']['std. dev.'] / data['self']['mean'] @@ -1943,8 +1935,6 @@ class Tally(object): 'since it does not contain any results.'.format(power.id) raise ValueError(msg) - # FIXME: Need to be able to use Tally.get_value - self._outer_product(power, new_tally, binary_op='^') data = self._align_tally_data(power) mean_ratio = data['other']['mean'] / data['self']['mean'] From f38c3bccfacbc347ad1de3b6a8102aaf73086c36 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 3 Aug 2015 00:28:13 -0700 Subject: [PATCH 039/101] Removed extraneous README comment --- openmc/tallies.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 6ac1e37690..ff44f3135b 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2137,8 +2137,6 @@ class Tally(object): new_tally._mean = None new_tally._std_dev = None - # FIXME: Reorder nuclides, scores, filters - # SCORES if scores: score_indices = [] From cd4fa9a649b951c70f9ecdbe04e55abbf9133832 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 3 Aug 2015 21:55:08 -0600 Subject: [PATCH 040/101] Fix 'atom/b-cm' density type in PyAPI --- openmc/material.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/material.py b/openmc/material.py index 2c10144b33..62e3d16d5a 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -26,7 +26,7 @@ def reset_auto_material_id(): # Units for density supported by OpenMC -DENSITY_UNITS = ['g/cm3', 'g/cc', 'kg/cm3', 'at/b-cm', 'at/cm3', 'sum'] +DENSITY_UNITS = ['g/cm3', 'g/cc', 'kg/cm3', 'atom/b-cm', 'atom/cm3', 'sum'] # Constant for density when not needed NO_DENSITY = 99999. From bf15c255c335cea19ae4cbe6492d7976bc49dc18 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 3 Aug 2015 21:32:06 -0700 Subject: [PATCH 041/101] Added double quotes around exception msgs in Python API --- openmc/ace.py | 4 +- openmc/checkvalue.py | 36 ++++++------- openmc/element.py | 4 +- openmc/executor.py | 10 ++-- openmc/filter.py | 34 ++++++------ openmc/geometry.py | 4 +- openmc/material.py | 70 ++++++++++++------------- openmc/mesh.py | 20 ++++---- openmc/nuclide.py | 6 +-- openmc/opencg_compatible.py | 40 +++++++-------- openmc/particle_restart.py | 2 +- openmc/plots.py | 36 ++++++------- openmc/settings.py | 22 ++++---- openmc/statepoint.py | 78 ++++++++++++++-------------- openmc/summary.py | 22 ++++---- openmc/surface.py | 10 ++-- openmc/tallies.py | 90 ++++++++++++++++---------------- openmc/trigger.py | 8 +-- openmc/universe.py | 100 ++++++++++++++++++------------------ 19 files changed, 298 insertions(+), 298 deletions(-) diff --git a/openmc/ace.py b/openmc/ace.py index 3606b1e947..7fab7c98f6 100644 --- a/openmc/ace.py +++ b/openmc/ace.py @@ -49,14 +49,14 @@ def ascii_to_binary(ascii_file, binary_file): # that XSS will start at the second record nxs = list(map(int, ' '.join(lines[idx + 6:idx + 8]).split())) jxs = list(map(int, ' '.join(lines[idx + 8:idx + 12]).split())) - binary.write(pack('=16i32i{0}x'.format(record_length - 500), *(nxs + jxs))) + binary.write(pack('=16i32i"{0}"x'.format(record_length - 500), *(nxs + jxs))) # Read/write XSS array. Null bytes are added to form a complete record # at the end of the file n_lines = (nxs[0] + 3)//4 xss = list(map(float, ' '.join(lines[idx + 12:idx + 12 + n_lines]).split())) extra_bytes = record_length - ((len(xss)*8 - 1) % record_length + 1) - binary.write(pack('={0}d{1}x'.format(nxs[0], extra_bytes), *xss)) + binary.write(pack('="{0}"d"{1}"x'.format(nxs[0], extra_bytes), *xss)) # Advance to next table in file idx += 12 + n_lines diff --git a/openmc/checkvalue.py b/openmc/checkvalue.py index 01613908ba..9488623996 100644 --- a/openmc/checkvalue.py +++ b/openmc/checkvalue.py @@ -17,15 +17,15 @@ def check_type(name, value, expected_type, expected_iter_type=None): """ if not isinstance(value, expected_type): - msg = 'Unable to set {0} to {1} which is not of type {2}'.format( + msg = 'Unable to set "{0}" to "{1}" which is not of type "{2}"'.format( name, value, expected_type.__name__) raise ValueError(msg) if expected_iter_type: for item in value: if not isinstance(item, expected_iter_type): - msg = 'Unable to set {0} to {1} since each item must be ' \ - 'of type {2}'.format(name, value, + msg = 'Unable to set "{0}" to "{1}" since each item must be ' \ + 'of type "{2}"'.format(name, value, expected_iter_type.__name__) raise ValueError(msg) @@ -49,16 +49,16 @@ def check_length(name, value, length_min, length_max=None): if length_max is None: if len(value) != length_min: - msg = 'Unable to set {0} to {1} since it must be of ' \ - 'length {2}'.format(name, value, length_min) + msg = 'Unable to set "{0}" to "{1}" since it must be of ' \ + 'length "{2}"'.format(name, value, length_min) raise ValueError(msg) elif not length_min <= len(value) <= length_max: if length_min == length_max: - msg = 'Unable to set {0} to {1} since it must be of ' \ - 'length {2}'.format(name, value, length_min) + msg = 'Unable to set "{0}" to "{1}" since it must be of ' \ + 'length "{2}"'.format(name, value, length_min) else: - msg = 'Unable to set {0} to {1} since it must have length ' \ - 'between {2} and {3}'.format(name, value, length_min, + msg = 'Unable to set "{0}" to "{1}" since it must have length ' \ + 'between "{2}" and "{3}"'.format(name, value, length_min, length_max) raise ValueError(msg) @@ -78,7 +78,7 @@ def check_value(name, value, accepted_values): """ if value not in accepted_values: - msg = 'Unable to set {0} to {1} since it is not in {2}'.format( + msg = 'Unable to set "{0}" to "{1}" since it is not in "{2}"'.format( name, value, accepted_values) raise ValueError(msg) @@ -100,13 +100,13 @@ def check_less_than(name, value, maximum, equality=False): if equality: if value > maximum: - msg = 'Unable to set {0} to {1} since it is greater than ' \ - '{2}'.format(name, value, maximum) + msg = 'Unable to set "{0}" to "{1}" since it is greater than ' \ + '"{2}"'.format(name, value, maximum) raise ValueError(msg) else: if value >= maximum: - msg = 'Unable to set {0} to {1} since it is greater than ' \ - 'or equal to {2}'.format(name, value, maximum) + msg = 'Unable to set "{0}" to "{1}" since it is greater than ' \ + 'or equal to "{2}"'.format(name, value, maximum) raise ValueError(msg) def check_greater_than(name, value, minimum, equality=False): @@ -127,11 +127,11 @@ def check_greater_than(name, value, minimum, equality=False): if equality: if value < minimum: - msg = 'Unable to set {0} to {1} since it is less than ' \ - '{2}'.format(name, value, minimum) + msg = 'Unable to set "{0}" to "{1}" since it is less than ' \ + '"{2}"'.format(name, value, minimum) raise ValueError(msg) else: if value <= minimum: - msg = 'Unable to set {0} to {1} since it is less than ' \ - 'or equal to {2}'.format(name, value, minimum) + msg = 'Unable to set "{0}" to "{1}" since it is less than ' \ + 'or equal to "{2}"'.format(name, value, minimum) raise ValueError(msg) diff --git a/openmc/element.py b/openmc/element.py index 2f81b9f308..d091db37d4 100644 --- a/openmc/element.py +++ b/openmc/element.py @@ -73,6 +73,6 @@ class Element(object): self._name = name def __repr__(self): - string = 'Element - {0}\n'.format(self._name) - string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs) + string = 'Element - "{0}"\n'.format(self._name) + string += '{0: <16}"{1}""{2}"\n'.format('\tXS', '=\t', self._xs) return string diff --git a/openmc/executor.py b/openmc/executor.py index 6dfb3566c6..1c1ff40c61 100644 --- a/openmc/executor.py +++ b/openmc/executor.py @@ -50,7 +50,7 @@ class Executor(object): check_type("Executor's working directory", working_directory, basestring) if not os.path.isdir(working_directory): - msg = 'Unable to set Executor\'s working directory to {0} ' \ + msg = 'Unable to set Executor\'s working directory to "{0}" ' \ 'which does not exist'.format(working_directory) raise ValueError(msg) @@ -92,16 +92,16 @@ class Executor(object): pre_args = '' if isinstance(particles, Integral) and particles > 0: - post_args += '-n {0} '.format(particles) + post_args += '-n "{0}" '.format(particles) if isinstance(threads, Integral) and threads > 0: - post_args += '-s {0} '.format(threads) + post_args += '-s "{0}" '.format(threads) if geometry_debug: post_args += '-g ' if isinstance(restart_file, basestring): - post_args += '-r {0} '.format(restart_file) + post_args += '-r "{0}" '.format(restart_file) if tracks: post_args += '-t' @@ -121,7 +121,7 @@ class Executor(object): pre_args += mpi_exec + ' ' else: pre_args += 'mpirun ' - pre_args += '-n {0} '.format(mpi_procs) + pre_args += '-n "{0}" '.format(mpi_procs) command = pre_args + openmc_exec + ' ' + post_args diff --git a/openmc/filter.py b/openmc/filter.py index 09928e235a..8bae47fa47 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -109,7 +109,7 @@ class Filter(object): if type is None: self._type = type elif type not in FILTER_TYPES.values(): - msg = 'Unable to set Filter type to "{0}" since it is not one ' \ + msg = 'Unable to set Filter type to ""{0}"" since it is not one ' \ 'of the supported types'.format(type) raise ValueError(msg) @@ -120,7 +120,7 @@ class Filter(object): if bins is None: self.num_bins = 0 elif self._type is None: - msg = 'Unable to set bins for Filter to "{0}" since ' \ + msg = 'Unable to set bins for Filter to ""{0}"" since ' \ 'the Filter type has not yet been set'.format(bins) raise ValueError(msg) @@ -136,30 +136,30 @@ class Filter(object): 'universe', 'distribcell']: for edge in bins: if not isinstance(edge, Integral): - msg = 'Unable to add bin "{0}" to a {1} Filter since ' \ + msg = 'Unable to add bin ""{0}"" to a "{1}" Filter since ' \ 'it is not an integer'.format(edge, self._type) raise ValueError(msg) elif edge < 0: - msg = 'Unable to add bin "{0}" to a {1} Filter since ' \ + msg = 'Unable to add bin ""{0}"" to a "{1}" Filter since ' \ 'it is negative'.format(edge, self._type) raise ValueError(msg) elif self._type in ['energy', 'energyout']: for edge in bins: if not isinstance(edge, Real): - msg = 'Unable to add bin edge "{0}" to a {1} Filter ' \ + msg = 'Unable to add bin edge ""{0}"" to a "{1}" Filter ' \ 'since it is a non-integer or floating point ' \ 'value'.format(edge, self._type) raise ValueError(msg) elif edge < 0.: - msg = 'Unable to add bin edge "{0}" to a {1} Filter ' \ + msg = 'Unable to add bin edge ""{0}"" to a "{1}" Filter ' \ 'since it is a negative value'.format(edge, self._type) raise ValueError(msg) # Check that bin edges are monotonically increasing for index in range(len(bins)): if index > 0 and bins[index] < bins[index-1]: - msg = 'Unable to add bin edges "{0}" to a {1} Filter ' \ + msg = 'Unable to add bin edges ""{0}"" to a "{1}" Filter ' \ 'since they are not monotonically ' \ 'increasing'.format(bins, self._type) raise ValueError(msg) @@ -167,15 +167,15 @@ class Filter(object): # mesh filters elif self._type == 'mesh': if not len(bins) == 1: - msg = 'Unable to add bins "{0}" to a mesh Filter since ' \ + msg = 'Unable to add bins ""{0}"" to a mesh Filter since ' \ 'only a single mesh can be used per tally'.format(bins) raise ValueError(msg) elif not isinstance(bins[0], Integral): - msg = 'Unable to add bin "{0}" to mesh Filter since it ' \ + msg = 'Unable to add bin ""{0}"" to mesh Filter since it ' \ 'is a non-integer'.format(bins[0]) raise ValueError(msg) elif bins[0] < 0: - msg = 'Unable to add bin "{0}" to mesh Filter since it ' \ + msg = 'Unable to add bin ""{0}"" to mesh Filter since it ' \ 'is a negative integer'.format(bins[0]) raise ValueError(msg) @@ -186,7 +186,7 @@ class Filter(object): @num_bins.setter def num_bins(self, num_bins): if not isinstance(num_bins, Integral) or num_bins < 0: - msg = 'Unable to set the number of bins "{0}" for a {1} Filter ' \ + msg = 'Unable to set the number of bins ""{0}"" for a "{1}" Filter ' \ 'since it is not a positive ' \ 'integer'.format(num_bins, self._type) raise ValueError(msg) @@ -210,7 +210,7 @@ class Filter(object): def stride(self, stride): check_type('filter stride', stride, Integral) if stride < 0: - msg = 'Unable to set stride "{0}" for a {1} Filter since it is a ' \ + msg = 'Unable to set stride ""{0}"" for a "{1}" Filter since it is a ' \ 'negative value'.format(stride, self._type) raise ValueError(msg) @@ -269,7 +269,7 @@ class Filter(object): """ if not self.can_merge(filter): - msg = 'Unable to merge {0} with {1} filters'.format(self._type, filter._type) + msg = 'Unable to merge "{0}" with "{1}" filters'.format(self._type, filter._type) raise ValueError(msg) # Create deep copy of filter to return as merged filter @@ -336,7 +336,7 @@ class Filter(object): filter_index = val except ValueError: - msg = 'Unable to get the bin index for Filter since "{0}" ' \ + msg = 'Unable to get the bin index for Filter since ""{0}"" ' \ 'is not one of the bins'.format(filter_bin) raise ValueError(msg) @@ -344,7 +344,7 @@ class Filter(object): def __repr__(self): string = 'Filter\n' - string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._type) - string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', self._bins) - string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self._offset) + string += '{0: <16}"{1}""{2}"\n'.format('\tType', '=\t', self._type) + string += '{0: <16}"{1}""{2}"\n'.format('\tBins', '=\t', self._bins) + string += '{0: <16}"{1}""{2}"\n'.format('\tOffset', '=\t', self._offset) return string diff --git a/openmc/geometry.py b/openmc/geometry.py index 2ea9705fa4..18fa698b50 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -34,8 +34,8 @@ class Geometry(object): def root_universe(self, root_universe): check_type('root universe', root_universe, openmc.Universe) if root_universe._id != 0: - msg = 'Unable to add root Universe {0} to Geometry since ' \ - 'it has ID={1} instead of ' \ + msg = 'Unable to add root Universe "{0}" to Geometry since ' \ + 'it has ID="{1}" instead of ' \ 'ID=0'.format(root_universe, root_universe._id) raise ValueError(msg) diff --git a/openmc/material.py b/openmc/material.py index 62e3d16d5a..84498bf062 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -122,7 +122,7 @@ class Material(object): 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 ' \ + 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) @@ -132,7 +132,7 @@ class Material(object): @name.setter def name(self, name): - check_type('name for Material ID={0}'.format(self._id), + check_type('name for Material ID="{0}"'.format(self._id), name, basestring) self._name = name @@ -149,12 +149,12 @@ class Material(object): """ - check_type('the density for Material ID={0}'.format(self._id), + check_type('the density for Material ID="{0}"'.format(self._id), density, Real) check_value('density units', units, DENSITY_UNITS) if density == NO_DENSITY and units is not 'sum': - msg = 'Unable to set the density Material ID={0} ' \ + msg = 'Unable to set the density Material ID="{0}" ' \ 'because a density must be set when not using ' \ 'sum unit'.format(self._id) raise ValueError(msg) @@ -169,8 +169,8 @@ class Material(object): 'version of openmc') if not isinstance(filename, basestring) and filename is not None: - msg = 'Unable to add OTF material file to Material ID={0} with a ' \ - 'non-string name {1}'.format(self._id, filename) + msg = 'Unable to add OTF material file to Material ID="{0}" with a ' \ + 'non-string name "{1}"'.format(self._id, filename) raise ValueError(msg) self._distrib_otf_file = filename @@ -198,18 +198,18 @@ class Material(object): """ if not isinstance(nuclide, (openmc.Nuclide, str)): - msg = 'Unable to add a Nuclide to Material ID={0} with a ' \ - 'non-Nuclide value {1}'.format(self._id, nuclide) + msg = 'Unable to add a Nuclide to Material ID="{0}" with a ' \ + 'non-Nuclide value "{1}"'.format(self._id, nuclide) raise ValueError(msg) elif not isinstance(percent, Real): - msg = 'Unable to add a Nuclide to Material ID={0} with a ' \ - 'non-floating point value {1}'.format(self._id, percent) + msg = 'Unable to add a Nuclide to Material ID="{0}" with a ' \ + 'non-floating point value "{1}"'.format(self._id, percent) raise ValueError(msg) elif percent_type not in ['ao', 'wo', 'at/g-cm']: - msg = 'Unable to add a Nuclide to Material ID={0} with a ' \ - 'percent type {1}'.format(self._id, percent_type) + msg = 'Unable to add a Nuclide to Material ID="{0}" with a ' \ + 'percent type "{1}"'.format(self._id, percent_type) raise ValueError(msg) if isinstance(nuclide, openmc.Nuclide): @@ -232,7 +232,7 @@ class Material(object): """ if not isinstance(nuclide, openmc.Nuclide): - msg = 'Unable to remove a Nuclide {0} in Material ID={1} ' \ + msg = 'Unable to remove a Nuclide "{0}" in Material ID="{1}" ' \ 'since it is not a Nuclide'.format(self._id, nuclide) raise ValueError(msg) @@ -255,18 +255,18 @@ class Material(object): """ if not isinstance(element, openmc.Element): - msg = 'Unable to add an Element to Material ID={0} with a ' \ - 'non-Element value {1}'.format(self._id, element) + msg = 'Unable to add an Element to Material ID="{0}" with a ' \ + 'non-Element value "{1}"'.format(self._id, element) raise ValueError(msg) if not isinstance(percent, Real): - msg = 'Unable to add an Element to Material ID={0} with a ' \ - 'non-floating point value {1}'.format(self._id, percent) + msg = 'Unable to add an Element to Material ID="{0}" with a ' \ + 'non-floating point value "{1}"'.format(self._id, percent) raise ValueError(msg) if percent_type not in ['ao', 'wo']: - msg = 'Unable to add an Element to Material ID={0} with a ' \ - 'percent type {1}'.format(self._id, percent_type) + msg = 'Unable to add an Element to Material ID="{0}" with a ' \ + 'percent type "{1}"'.format(self._id, percent_type) raise ValueError(msg) # Copy this Element to separate it from same Element in other Materials @@ -301,13 +301,13 @@ class Material(object): """ if not isinstance(name, basestring): - msg = 'Unable to add an S(a,b) table to Material ID={0} with a ' \ - 'non-string table name {1}'.format(self._id, name) + msg = 'Unable to add an S(a,b) table to Material ID="{0}" with a ' \ + 'non-string table name "{1}"'.format(self._id, name) raise ValueError(msg) if not isinstance(xs, basestring): - msg = 'Unable to add an S(a,b) table to Material ID={0} with a ' \ - 'non-string cross-section identifier {1}'.format(self._id, xs) + msg = 'Unable to add an S(a,b) table to Material ID="{0}" with a ' \ + 'non-string cross-section identifier "{1}"'.format(self._id, xs) raise ValueError(msg) self._sab.append((name, xs)) @@ -334,16 +334,16 @@ class Material(object): def _repr__(self): string = 'Material\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('\tID', '=\t', self._id) + string += '{0: <16}"{1}""{2}"\n'.format('\tName', '=\t', self._name) - string += '{0: <16}{1}{2}'.format('\tDensity', '=\t', self._density) - string += ' [{0}]\n'.format(self._density_units) + string += '{0: <16}"{1}""{2}"'.format('\tDensity', '=\t', self._density) + string += ' ["{0}"]\n'.format(self._density_units) string += '{0: <16}\n'.format('\tS(a,b) Tables') for sab in self._sab: - string += '{0: <16}{1}[{2}{3}]\n'.format('\tS(a,b)', '=\t', + string += '{0: <16}"{1}"["{2}""{3}"]\n'.format('\tS(a,b)', '=\t', sab[0], sab[1]) string += '{0: <16}\n'.format('\tNuclides') @@ -351,16 +351,16 @@ class Material(object): for nuclide in self._nuclides: percent = self._nuclides[nuclide][1] percent_type = self._nuclides[nuclide][2] - string += '{0: <16}'.format('\t{0}'.format(nuclide)) - string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type) + string += '{0: <16}'.format('\t"{0}"'.format(nuclide)) + string += '=\t{0: <12} ["{1}"]\n'.format(percent, percent_type) string += '{0: <16}\n'.format('\tElements') for element in self._elements: percent = self._nuclides[element][1] percent_type = self._nuclides[element][2] - string += '{0: >16}'.format('\t{0}'.format(element)) - string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type) + string += '{0: >16}'.format('\t"{0}"'.format(element)) + string += '=\t{0: <12} ["{1}"]\n'.format(percent, percent_type) return string @@ -522,7 +522,7 @@ class MaterialsFile(object): """ if not isinstance(material, Material): - msg = 'Unable to add a non-Material {0} to the ' \ + msg = 'Unable to add a non-Material "{0}" to the ' \ 'MaterialsFile'.format(material) raise ValueError(msg) @@ -539,7 +539,7 @@ class MaterialsFile(object): """ if not isinstance(materials, Iterable): - msg = 'Unable to create OpenMC materials.xml file from {0} which ' \ + msg = 'Unable to create OpenMC materials.xml file from "{0}" which ' \ 'is not iterable'.format(materials) raise ValueError(msg) @@ -557,7 +557,7 @@ class MaterialsFile(object): """ if not isinstance(material, Material): - msg = 'Unable to remove a non-Material {0} from the ' \ + msg = 'Unable to remove a non-Material "{0}" from the ' \ 'MaterialsFile'.format(material) raise ValueError(msg) diff --git a/openmc/mesh.py b/openmc/mesh.py index 1ba0f28a5b..7ef3719412 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -148,14 +148,14 @@ class Mesh(object): @name.setter def name(self, name): - check_type('name for mesh ID={0}'.format(self._id), name, basestring) + check_type('name for mesh ID="{0}"'.format(self._id), name, basestring) self._name = name @type.setter def type(self, meshtype): - check_type('type for mesh ID={0}'.format(self._id), + check_type('type for mesh ID="{0}"'.format(self._id), meshtype, basestring) - check_value('type for mesh ID={0}'.format(self._id), + check_value('type for mesh ID="{0}"'.format(self._id), meshtype, ['rectangular', 'hexagonal']) self._type = meshtype @@ -185,13 +185,13 @@ class Mesh(object): def __repr__(self): string = 'Mesh\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('\tType', '=\t', self._type) - string += '{0: <16}{1}{2}\n'.format('\tBasis', '=\t', self._dimension) - string += '{0: <16}{1}{2}\n'.format('\tWidth', '=\t', self._lower_left) - string += '{0: <16}{1}{2}\n'.format('\tOrigin', '=\t', self._upper_right) - string += '{0: <16}{1}{2}\n'.format('\tPixels', '=\t', self._width) + 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('\tType', '=\t', self._type) + string += '{0: <16}"{1}""{2}"\n'.format('\tBasis', '=\t', self._dimension) + string += '{0: <16}"{1}""{2}"\n'.format('\tWidth', '=\t', self._lower_left) + string += '{0: <16}"{1}""{2}"\n'.format('\tOrigin', '=\t', self._upper_right) + string += '{0: <16}"{1}""{2}"\n'.format('\tPixels', '=\t', self._width) return string def get_mesh_xml(self): diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 7e7cd5af35..cc0267c658 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -88,8 +88,8 @@ class Nuclide(object): self._zaid = zaid def __repr__(self): - string = 'Nuclide - {0}\n'.format(self._name) - string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs) + string = 'Nuclide - "{0}"\n'.format(self._name) + string += '{0: <16}"{1}""{2}"\n'.format('\tXS', '=\t', self._xs) if self._zaid is not None: - string += '{0: <16}{1}{2}\n'.format('\tZAID', '=\t', self._zaid) + string += '{0: <16}"{1}""{2}"\n'.format('\tZAID', '=\t', self._zaid) return string diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 70e6ec306e..65e980c003 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -78,7 +78,7 @@ def get_opencg_material(openmc_material): """ if not isinstance(openmc_material, openmc.Material): - msg = 'Unable to create an OpenCG Material from {0} ' \ + msg = 'Unable to create an OpenCG Material from "{0}" ' \ 'which is not an OpenMC Material'.format(openmc_material) raise ValueError(msg) @@ -118,7 +118,7 @@ def get_openmc_material(opencg_material): """ if not isinstance(opencg_material, opencg.Material): - msg = 'Unable to create an OpenMC Material from {0} ' \ + msg = 'Unable to create an OpenMC Material from "{0}" ' \ 'which is not an OpenCG Material'.format(opencg_material) raise ValueError(msg) @@ -165,7 +165,7 @@ def is_opencg_surface_compatible(opencg_surface): if not isinstance(opencg_surface, opencg.Surface): msg = 'Unable to check if OpenCG Surface is compatible' \ - 'since {0} is not a Surface'.format(opencg_surface) + 'since "{0}" is not a Surface'.format(opencg_surface) raise ValueError(msg) if opencg_surface._type in ['x-squareprism', @@ -191,7 +191,7 @@ def get_opencg_surface(openmc_surface): """ if not isinstance(openmc_surface, openmc.Surface): - msg = 'Unable to create an OpenCG Surface from {0} ' \ + msg = 'Unable to create an OpenCG Surface from "{0}" ' \ 'which is not an OpenMC Surface'.format(openmc_surface) raise ValueError(msg) @@ -277,7 +277,7 @@ def get_openmc_surface(opencg_surface): """ if not isinstance(opencg_surface, opencg.Surface): - msg = 'Unable to create an OpenMC Surface from {0} which ' \ + msg = 'Unable to create an OpenMC Surface from "{0}" which ' \ 'is not an OpenCG Surface'.format(opencg_surface) raise ValueError(msg) @@ -335,7 +335,7 @@ def get_openmc_surface(opencg_surface): else: msg = 'Unable to create an OpenMC Surface from an OpenCG ' \ - 'Surface of type {0} since it is not a compatible ' \ + 'Surface of type "{0}" since it is not a compatible ' \ 'Surface type in OpenMC'.format(opencg_surface._type) raise ValueError(msg) @@ -368,7 +368,7 @@ def get_compatible_opencg_surfaces(opencg_surface): """ if not isinstance(opencg_surface, opencg.Surface): - msg = 'Unable to create an OpenMC Surface from {0} which ' \ + msg = 'Unable to create an OpenMC Surface from "{0}" which ' \ 'is not an OpenCG Surface'.format(opencg_surface) raise ValueError(msg) @@ -421,7 +421,7 @@ def get_compatible_opencg_surfaces(opencg_surface): else: msg = 'Unable to create a compatible OpenMC Surface an OpenCG ' \ - 'Surface of type {0} since it already a compatible ' \ + 'Surface of type "{0}" since it already a compatible ' \ 'Surface type in OpenMC'.format(opencg_surface._type) raise ValueError(msg) @@ -450,7 +450,7 @@ def get_opencg_cell(openmc_cell): """ if not isinstance(openmc_cell, openmc.Cell): - msg = 'Unable to create an OpenCG Cell from {0} which ' \ + msg = 'Unable to create an OpenCG Cell from "{0}" which ' \ 'is not an OpenMC Cell'.format(openmc_cell) raise ValueError(msg) @@ -518,17 +518,17 @@ def get_compatible_opencg_cells(opencg_cell, opencg_surface, halfspace): """ if not isinstance(opencg_cell, opencg.Cell): - msg = 'Unable to create compatible OpenMC Cell from {0} which ' \ + msg = 'Unable to create compatible OpenMC Cell from "{0}" which ' \ 'is not an OpenCG Cell'.format(opencg_cell) raise ValueError(msg) elif not isinstance(opencg_surface, opencg.Surface): - msg = 'Unable to create compatible OpenMC Cell since {0} is ' \ + msg = 'Unable to create compatible OpenMC Cell since "{0}" is ' \ 'not an OpenCG Surface'.format(opencg_surface) raise ValueError(msg) elif halfspace not in [-1, +1]: - msg = 'Unable to create compatible Cell since {0}' \ + msg = 'Unable to create compatible Cell since "{0}"' \ 'is not a +/-1 halfspace'.format(halfspace) raise ValueError(msg) @@ -626,7 +626,7 @@ def make_opencg_cells_compatible(opencg_universe): """ if not isinstance(opencg_universe, opencg.Universe): - msg = 'Unable to make compatible OpenCG Cells for {0} which ' \ + msg = 'Unable to make compatible OpenCG Cells for "{0}" which ' \ 'is not an OpenCG Universe'.format(opencg_universe) raise ValueError(msg) @@ -685,7 +685,7 @@ def get_openmc_cell(opencg_cell): """ if not isinstance(opencg_cell, opencg.Cell): - msg = 'Unable to create an OpenMC Cell from {0} which ' \ + msg = 'Unable to create an OpenMC Cell from "{0}" which ' \ 'is not an OpenCG Cell'.format(opencg_cell) raise ValueError(msg) @@ -749,7 +749,7 @@ def get_opencg_universe(openmc_universe): """ if not isinstance(openmc_universe, openmc.Universe): - msg = 'Unable to create an OpenCG Universe from {0} which ' \ + msg = 'Unable to create an OpenCG Universe from "{0}" which ' \ 'is not an OpenMC Universe'.format(openmc_universe) raise ValueError(msg) @@ -796,7 +796,7 @@ def get_openmc_universe(opencg_universe): """ if not isinstance(opencg_universe, opencg.Universe): - msg = 'Unable to create an OpenMC Universe from {0} which ' \ + msg = 'Unable to create an OpenMC Universe from "{0}" which ' \ 'is not an OpenCG Universe'.format(opencg_universe) raise ValueError(msg) @@ -846,7 +846,7 @@ def get_opencg_lattice(openmc_lattice): """ if not isinstance(openmc_lattice, openmc.Lattice): - msg = 'Unable to create an OpenCG Lattice from {0} which ' \ + msg = 'Unable to create an OpenCG Lattice from "{0}" which ' \ 'is not an OpenMC Lattice'.format(openmc_lattice) raise ValueError(msg) @@ -926,7 +926,7 @@ def get_openmc_lattice(opencg_lattice): """ if not isinstance(opencg_lattice, opencg.Lattice): - msg = 'Unable to create an OpenMC Lattice from {0} which ' \ + msg = 'Unable to create an OpenMC Lattice from "{0}" which ' \ 'is not an OpenCG Lattice'.format(opencg_lattice) raise ValueError(msg) @@ -997,7 +997,7 @@ def get_opencg_geometry(openmc_geometry): """ if not isinstance(openmc_geometry, openmc.Geometry): - msg = 'Unable to get OpenCG geometry from {0} which is ' \ + msg = 'Unable to get OpenCG geometry from "{0}" which is ' \ 'not an OpenMC Geometry object'.format(openmc_geometry) raise ValueError(msg) @@ -1037,7 +1037,7 @@ def get_openmc_geometry(opencg_geometry): """ if not isinstance(opencg_geometry, opencg.Geometry): - msg = 'Unable to get OpenMC geometry from {0} which is ' \ + msg = 'Unable to get OpenMC geometry from "{0}" which is ' \ 'not an OpenCG Geometry object'.format(opencg_geometry) raise ValueError(msg) diff --git a/openmc/particle_restart.py b/openmc/particle_restart.py index d664de1aee..41ac5f81ac 100644 --- a/openmc/particle_restart.py +++ b/openmc/particle_restart.py @@ -75,7 +75,7 @@ class Particle(object): self.uvw = self._get_double(3, path='uvw') def _get_data(self, n, typeCode, size): - return list(struct.unpack('={0}{1}'.format(n, typeCode), + return list(struct.unpack('="{0}""{1}"'.format(n, typeCode), self._f.read(n*size))) def _get_int(self, n=1, path=None): diff --git a/openmc/plots.py b/openmc/plots.py index 44dde153ab..c3131b7536 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -210,18 +210,18 @@ class Plot(object): for key in col_spec: if key < 0: - msg = 'Unable to create Plot ID={0} with col_spec ID {1} ' \ + msg = 'Unable to create Plot ID="{0}" with col_spec ID "{1}" ' \ 'which is less than 0'.format(self._id, key) raise ValueError(msg) elif not isinstance(col_spec[key], Iterable): - msg = 'Unable to create Plot ID={0} with col_spec RGB values' \ - ' {1} which is not iterable'.format(self._id, col_spec[key]) + msg = 'Unable to create Plot ID="{0}" with col_spec RGB values' \ + ' "{1}" which is not iterable'.format(self._id, col_spec[key]) raise ValueError(msg) elif len(col_spec[key]) != 3: - msg = 'Unable to create Plot ID={0} with col_spec RGB ' \ - 'values of length {1} since 3 values must be ' \ + msg = 'Unable to create Plot ID="{0}" with col_spec RGB ' \ + 'values of length "{1}" since 3 values must be ' \ 'input'.format(self._id, len(col_spec[key])) raise ValueError(msg) @@ -245,20 +245,20 @@ class Plot(object): def __repr__(self): string = 'Plot\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('\tFilename', '=\t', self._filename) - string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._type) - string += '{0: <16}{1}{2}\n'.format('\tBasis', '=\t', self._basis) - string += '{0: <16}{1}{2}\n'.format('\tWidth', '=\t', self._width) - string += '{0: <16}{1}{2}\n'.format('\tOrigin', '=\t', self._origin) - string += '{0: <16}{1}{2}\n'.format('\tPixels', '=\t', self._origin) - string += '{0: <16}{1}{2}\n'.format('\tColor', '=\t', self._color) - string += '{0: <16}{1}{2}\n'.format('\tMask', '=\t', + 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('\tFilename', '=\t', self._filename) + string += '{0: <16}"{1}""{2}"\n'.format('\tType', '=\t', self._type) + string += '{0: <16}"{1}""{2}"\n'.format('\tBasis', '=\t', self._basis) + string += '{0: <16}"{1}""{2}"\n'.format('\tWidth', '=\t', self._width) + string += '{0: <16}"{1}""{2}"\n'.format('\tOrigin', '=\t', self._origin) + string += '{0: <16}"{1}""{2}"\n'.format('\tPixels', '=\t', self._origin) + string += '{0: <16}"{1}""{2}"\n'.format('\tColor', '=\t', self._color) + string += '{0: <16}"{1}""{2}"\n'.format('\tMask', '=\t', self._mask_components) - string += '{0: <16}{1}{2}\n'.format('\tMask', '=\t', + string += '{0: <16}"{1}""{2}"\n'.format('\tMask', '=\t', self._mask_background) - string += '{0: <16}{1}{2}\n'.format('\tCol Spec', '=\t', self._col_spec) + string += '{0: <16}"{1}""{2}"\n'.format('\tCol Spec', '=\t', self._col_spec) return string def get_plot_xml(self): @@ -332,7 +332,7 @@ class PlotsFile(object): """ if not isinstance(plot, Plot): - msg = 'Unable to add a non-Plot {0} to the PlotsFile'.format(plot) + msg = 'Unable to add a non-Plot "{0}" to the PlotsFile'.format(plot) raise ValueError(msg) self._plots.append(plot) diff --git a/openmc/settings.py b/openmc/settings.py index 60c74ab7af..981166af51 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -426,28 +426,28 @@ class SettingsFile(object): @keff_trigger.setter def keff_trigger(self, keff_trigger): if not isinstance(keff_trigger, dict): - msg = 'Unable to set a trigger on keff from {0} which ' \ + msg = 'Unable to set a trigger on keff from "{0}" which ' \ 'is not a Python dictionary'.format(keff_trigger) raise ValueError(msg) elif 'type' not in keff_trigger: - msg = 'Unable to set a trigger on keff from {0} which ' \ + msg = 'Unable to set a trigger on keff from "{0}" which ' \ 'does not have a "type" key'.format(keff_trigger) raise ValueError(msg) elif keff_trigger['type'] not in ['variance', 'std_dev', 'rel_err']: msg = 'Unable to set a trigger on keff with ' \ - 'type {0}'.format(keff_trigger['type']) + 'type "{0}"'.format(keff_trigger['type']) raise ValueError(msg) elif 'threshold' not in keff_trigger: - msg = 'Unable to set a trigger on keff from {0} which ' \ + msg = 'Unable to set a trigger on keff from "{0}" which ' \ 'does not have a "threshold" key'.format(keff_trigger) raise ValueError(msg) elif not isinstance(keff_trigger['threshold'], Real): msg = 'Unable to set a trigger on keff with ' \ - 'threshold {0}'.format(keff_trigger['threshold']) + 'threshold "{0}"'.format(keff_trigger['threshold']) raise ValueError(msg) self._keff_trigger = keff_trigger @@ -574,20 +574,20 @@ class SettingsFile(object): @output.setter def output(self, output): if not isinstance(output, dict): - msg = 'Unable to set output to {0} which is not a Python ' \ + msg = 'Unable to set output to "{0}" which is not a Python ' \ 'dictionary of string keys and boolean values'.format(output) raise ValueError(msg) for element in output: keys = ['summary', 'cross_sections', 'tallies', 'distribmats'] if element not in keys: - msg = 'Unable to set output to {0} which is unsupported by ' \ + msg = 'Unable to set output to "{0}" which is unsupported by ' \ 'OpenMC'.format(element) raise ValueError(msg) if not isinstance(output[element], (bool, np.bool)): - msg = 'Unable to set output for {0} to a non-boolean ' \ - 'value {1}'.format(element, output[element]) + msg = 'Unable to set output for "{0}" to a non-boolean ' \ + 'value "{1}"'.format(element, output[element]) raise ValueError(msg) self._output = output @@ -753,7 +753,7 @@ class SettingsFile(object): def track(self, track): check_type('track', track, Iterable, Integral) if len(track) % 3 != 0: - msg = 'Unable to set the track to {0} since its length is ' \ + msg = 'Unable to set the track to "{0}" since its length is ' \ 'not a multiple of 3'.format(track) raise ValueError(msg) for t in zip(track[::3], track[1::3], track[2::3]): @@ -832,7 +832,7 @@ class SettingsFile(object): len_nodemap = np.prod(self._dd_mesh_dimension) if len(nodemap) < len_nodemap or len(nodemap) > len_nodemap: - msg = 'Unable to set DD nodemap with length {0} which ' \ + msg = 'Unable to set DD nodemap with length "{0}" which ' \ 'does not have the same dimensionality as the domain ' \ 'mesh'.format(len(nodemap)) raise ValueError(msg) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index e0ef003d6e..ffee8c4494 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -36,10 +36,10 @@ class SourceSite(object): def __repr__(self): string = 'SourceSite\n' - string += '{0: <16}{1}{2}\n'.format('\tweight', '=\t', self._weight) - string += '{0: <16}{1}{2}\n'.format('\tE', '=\t', self._E) - string += '{0: <16}{1}{2}\n'.format('\t(x,y,z)', '=\t', self._xyz) - string += '{0: <16}{1}{2}\n'.format('\t(u,v,w)', '=\t', self._uvw) + string += '{0: <16}"{1}""{2}"\n'.format('\tweight', '=\t', self._weight) + string += '{0: <16}"{1}""{2}"\n'.format('\tE', '=\t', self._E) + string += '{0: <16}"{1}""{2}"\n'.format('\t(x,y,z)', '=\t', self._xyz) + string += '{0: <16}"{1}""{2}"\n'.format('\t(u,v,w)', '=\t', self._uvw) return string @property @@ -230,21 +230,21 @@ class StatePoint(object): if self._cmfd_on == 1: - self._cmfd_indices = self._get_int(4, path='{0}/indices'.format(base)) + self._cmfd_indices = self._get_int(4, path='"{0}"/indices'.format(base)) self._k_cmfd = self._get_double(self._current_batch, - path='{0}/k_cmfd'.format(base)) + path='"{0}"/k_cmfd'.format(base)) self._cmfd_src = self._get_double_array(np.product(self._cmfd_indices), - path='{0}/cmfd_src'.format(base)) + path='"{0}"/cmfd_src'.format(base)) self._cmfd_src = np.reshape(self._cmfd_src, tuple(self._cmfd_indices), order='F') self._cmfd_entropy = self._get_double(self._current_batch, - path='{0}/cmfd_entropy'.format(base)) + path='"{0}"/cmfd_entropy'.format(base)) self._cmfd_balance = self._get_double(self._current_batch, - path='{0}/cmfd_balance'.format(base)) + path='"{0}"/cmfd_balance'.format(base)) self._cmfd_dominance = self._get_double(self._current_batch, - path='{0}/cmfd_dominance'.format(base)) + path='"{0}"/cmfd_dominance'.format(base)) self._cmfd_srccmp = self._get_double(self._current_batch, - path='{0}/cmfd_srccmp'.format(base)) + path='"{0}"/cmfd_srccmp'.format(base)) def _read_meshes(self): # Initialize dictionaries for the Meshes @@ -277,23 +277,23 @@ class StatePoint(object): for mesh_key in self._mesh_keys: # Read the user-specified Mesh ID and type - mesh_id = self._get_int(path='{0}{1}/id'.format(base, mesh_key))[0] - mesh_type = self._get_int(path='{0}{1}/type'.format(base, mesh_key))[0] + mesh_id = self._get_int(path='"{0}""{1}"/id'.format(base, mesh_key))[0] + mesh_type = self._get_int(path='"{0}""{1}"/type'.format(base, mesh_key))[0] # Get the Mesh dimension n_dimension = self._get_int( - path='{0}{1}/n_dimension'.format(base, mesh_key))[0] + path='"{0}""{1}"/n_dimension'.format(base, mesh_key))[0] # Read the mesh dimensions, lower-left coordinates, # upper-right coordinates, and width of each mesh cell dimension = self._get_int( - n_dimension, path='{0}{1}/dimension'.format(base, mesh_key)) + n_dimension, path='"{0}""{1}"/dimension'.format(base, mesh_key)) lower_left = self._get_double( - n_dimension, path='{0}{1}/lower_left'.format(base, mesh_key)) + n_dimension, path='"{0}""{1}"/lower_left'.format(base, mesh_key)) upper_right = self._get_double( - n_dimension, path='{0}{1}/upper_right'.format(base, mesh_key)) + n_dimension, path='"{0}""{1}"/upper_right'.format(base, mesh_key)) width = self._get_double( - n_dimension, path='{0}{1}/width'.format(base, mesh_key)) + n_dimension, path='"{0}""{1}"/width'.format(base, mesh_key)) # Create the Mesh and assign properties to it mesh = openmc.Mesh(mesh_id) @@ -340,11 +340,11 @@ class StatePoint(object): # Read integer Tally estimator type code (analog or tracklength) estimator_type = self._get_int( - path='{0}{1}/estimator'.format(base, tally_key))[0] + path='"{0}""{1}"/estimator'.format(base, tally_key))[0] # Read the Tally size specifications n_realizations = self._get_int( - path='{0}{1}/n_realizations'.format(base, tally_key))[0] + path='"{0}""{1}"/n_realizations'.format(base, tally_key))[0] # Create Tally object and assign basic properties tally = openmc.Tally(tally_key) @@ -353,41 +353,41 @@ class StatePoint(object): # Read the number of Filters n_filters = self._get_int( - path='{0}{1}/n_filters'.format(base, tally_key))[0] + path='"{0}""{1}"/n_filters'.format(base, tally_key))[0] - subbase = '{0}{1}/filter '.format(base, tally_key) + subbase = '"{0}""{1}"/filter '.format(base, tally_key) # Initialize all Filters for j in range(1, n_filters+1): # Read the integer Filter type code filter_type = self._get_int( - path='{0}{1}/type'.format(subbase, j))[0] + path='"{0}""{1}"/type'.format(subbase, j))[0] # Read the Filter offset offset = self._get_int( - path='{0}{1}/offset'.format(subbase, j))[0] + path='"{0}""{1}"/offset'.format(subbase, j))[0] n_bins = self._get_int( - path='{0}{1}/n_bins'.format(subbase, j))[0] + path='"{0}""{1}"/n_bins'.format(subbase, j))[0] if n_bins <= 0: - msg = 'Unable to create Filter {0} for Tally ID={2} ' \ + msg = 'Unable to create Filter "{0}" for Tally ID="{2}" ' \ 'since no bins were specified'.format(j, tally_key) raise ValueError(msg) # Read the bin values if FILTER_TYPES[filter_type] in ['energy', 'energyout']: bins = self._get_double( - n_bins+1, path='{0}{1}/bins'.format(subbase, j)) + n_bins+1, path='"{0}""{1}"/bins'.format(subbase, j)) elif FILTER_TYPES[filter_type] in ['mesh', 'distribcell']: bins = self._get_int( - path='{0}{1}/bins'.format(subbase, j))[0] + path='"{0}""{1}"/bins'.format(subbase, j))[0] else: bins = self._get_int( - n_bins, path='{0}{1}/bins'.format(subbase, j)) + n_bins, path='"{0}""{1}"/bins'.format(subbase, j)) # Create Filter object filter = openmc.Filter(FILTER_TYPES[filter_type], bins) @@ -403,10 +403,10 @@ class StatePoint(object): # Read Nuclide bins n_nuclides = self._get_int( - path='{0}{1}/n_nuclides'.format(base, tally_key))[0] + path='"{0}""{1}"/n_nuclides'.format(base, tally_key))[0] nuclide_zaids = self._get_int( - n_nuclides, path='{0}{1}/nuclides'.format(base, tally_key)) + n_nuclides, path='"{0}""{1}"/nuclides'.format(base, tally_key)) # Add all Nuclides to the Tally for nuclide_zaid in nuclide_zaids: @@ -414,14 +414,14 @@ class StatePoint(object): # Read score bins n_score_bins = self._get_int( - path='{0}{1}/n_score_bins'.format(base, tally_key))[0] + path='"{0}""{1}"/n_score_bins'.format(base, tally_key))[0] tally.num_score_bins = n_score_bins scores = [SCORE_TYPES[j] for j in self._get_int( - n_score_bins, path='{0}{1}/score_bins'.format(base, tally_key))] + n_score_bins, path='"{0}""{1}"/score_bins'.format(base, tally_key))] n_user_scores = self._get_int( - path='{0}{1}/n_user_score_bins'.format(base, tally_key))[0] + path='"{0}""{1}"/n_user_score_bins'.format(base, tally_key))[0] # Compute and set the filter strides for i in range(n_filters): @@ -433,12 +433,12 @@ class StatePoint(object): # Read scattering moment order strings (e.g., P3, Y-1,2, etc.) moments = [] - subbase = '{0}{1}/moments/'.format(base, tally_key) + subbase = '"{0}""{1}"/moments/'.format(base, tally_key) # Extract the moment order string for each score for k in range(len(scores)): moment = self._get_string(8, - path='{0}order{1}'.format(subbase, k+1)) + path='"{0}"order"{1}"'.format(subbase, k+1)) moment = moment.lstrip('[\'') moment = moment.rstrip('\']') @@ -500,7 +500,7 @@ class StatePoint(object): # Extract Tally data from the file if self._hdf5: - data = self._f['{0}{1}/results'.format(base, tally_key)].value + data = self._f['"{0}""{1}"/results'.format(base, tally_key)].value sum = data['sum'] sum_sq = data['sum_sq'] @@ -748,7 +748,7 @@ class StatePoint(object): """ if not isinstance(summary, openmc.summary.Summary): - msg = 'Unable to link statepoint with {0} which ' \ + msg = 'Unable to link statepoint with "{0}" which ' \ 'is not a Summary object'.format(summary) raise ValueError(msg) @@ -794,7 +794,7 @@ class StatePoint(object): self._with_summary = True def _get_data(self, n, typeCode, size): - return list(struct.unpack('={0}{1}'.format(n, typeCode), + return list(struct.unpack('="{0}""{1}"'.format(n, typeCode), self._f.read(n*size))) def _get_int(self, n=1, path=None): diff --git a/openmc/summary.py b/openmc/summary.py index c0673ef233..2815390d8b 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -18,7 +18,7 @@ class Summary(object): openmc.reset_auto_ids() if not filename.endswith(('.h5', '.hdf5')): - msg = 'Unable to open "{0}" which is not an HDF5 summary file' + msg = 'Unable to open ""{0}"" which is not an HDF5 summary file' raise ValueError(msg) self._f = h5py.File(filename, 'r') @@ -479,12 +479,12 @@ class Summary(object): for tally_key in tally_keys: tally_id = int(tally_key.strip('tally ')) - subbase = '{0}{1}'.format(base, tally_id) + subbase = '"{0}""{1}"'.format(base, tally_id) # Read Tally name metadata - name_size = self._f['{0}/name_size'.format(subbase)][0] + name_size = self._f['"{0}"/name_size'.format(subbase)][0] if (name_size > 0): - tally_name = self._f['{0}/name'.format(subbase)][0] + tally_name = self._f['"{0}"/name'.format(subbase)][0] tally_name = tally_name.lstrip('[\'') tally_name = tally_name.rstrip('\']') else: @@ -494,27 +494,27 @@ class Summary(object): tally = openmc.Tally(tally_id, tally_name) # Read score metadata - score_bins = self._f['{0}/score_bins'.format(subbase)][...] + score_bins = self._f['"{0}"/score_bins'.format(subbase)][...] for score_bin in score_bins: tally.add_score(openmc.SCORE_TYPES[score_bin]) - num_score_bins = self._f['{0}/n_score_bins'.format(subbase)][...] + num_score_bins = self._f['"{0}"/n_score_bins'.format(subbase)][...] tally.num_score_bins = num_score_bins # Read filter metadata - num_filters = self._f['{0}/n_filters'.format(subbase)][0] + num_filters = self._f['"{0}"/n_filters'.format(subbase)][0] # Initialize all Filters for j in range(1, num_filters+1): - subsubbase = '{0}/filter {1}'.format(subbase, j) + subsubbase = '"{0}"/filter "{1}"'.format(subbase, j) # Read filter type (e.g., "cell", "energy", etc.) - filter_type_code = self._f['{0}/type'.format(subsubbase)][0] + filter_type_code = self._f['"{0}"/type'.format(subsubbase)][0] filter_type = openmc.FILTER_TYPES[filter_type_code] # Read the filter bins - num_bins = self._f['{0}/n_bins'.format(subsubbase)][0] - bins = self._f['{0}/bins'.format(subsubbase)][...] + num_bins = self._f['"{0}"/n_bins'.format(subsubbase)][0] + bins = self._f['"{0}"/bins'.format(subsubbase)][...] # Create Filter object filter = openmc.Filter(filter_type, bins) diff --git a/openmc/surface.py b/openmc/surface.py index d5d258fa7a..0d2e8fb27c 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -111,15 +111,15 @@ class Surface(object): def __repr__(self): string = 'Surface\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('\tType', '=\t', self._type) - string += '{0: <16}{1}{2}\n'.format('\tBoundary', '=\t', self._boundary_type) + 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('\tType', '=\t', self._type) + string += '{0: <16}"{1}""{2}"\n'.format('\tBoundary', '=\t', self._boundary_type) coeffs = '{0: <16}'.format('\tCoefficients') + '\n' for coeff in self._coeffs: - coeffs += '{0: <16}{1}{2}\n'.format(coeff, '=\t', self._coeffs[coeff]) + coeffs += '{0: <16}"{1}""{2}"\n'.format(coeff, '=\t', self._coeffs[coeff]) string += coeffs diff --git a/openmc/tallies.py b/openmc/tallies.py index a7605fbcc3..9474ef8fab 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -297,8 +297,8 @@ class Tally(object): """ if not isinstance(trigger, Trigger): - msg = 'Unable to add a tally trigger for Tally ID={0} to ' \ - 'since "{1}" is not a Trigger'.format(self.id, trigger) + msg = 'Unable to add a tally trigger for Tally ID="{0}" to ' \ + 'since ""{1}"" is not a Trigger'.format(self.id, trigger) raise ValueError(msg) self._triggers.append(trigger) @@ -330,7 +330,7 @@ class Tally(object): """ if not isinstance(filter, Filter): - msg = 'Unable to add Filter "{0}" to Tally ID={1} since it is ' \ + msg = 'Unable to add Filter ""{0}"" to Tally ID="{1}" since it is ' \ 'not a Filter object'.format(filter, self.id) raise ValueError(msg) @@ -359,7 +359,7 @@ class Tally(object): """ if not isinstance(score, basestring): - msg = 'Unable to add score "{0}" to Tally ID={1} since it is ' \ + msg = 'Unable to add score ""{0}"" to Tally ID="{1}" since it is ' \ 'not a string'.format(score, self.id) raise ValueError(msg) @@ -405,7 +405,7 @@ class Tally(object): """ if score not in self.scores: - msg = 'Unable to remove score "{0}" from Tally ID={1} since the ' \ + msg = 'Unable to remove score ""{0}"" from Tally ID="{1}" since the ' \ 'Tally does not contain this score'.format(score, self.id) ValueError(msg) @@ -422,7 +422,7 @@ class Tally(object): """ if filter not in self.filters: - msg = 'Unable to remove filter "{0}" from Tally ID={1} since the ' \ + msg = 'Unable to remove filter ""{0}"" from Tally ID="{1}" since the ' \ 'Tally does not contain this filter'.format(filter, self.id) ValueError(msg) @@ -439,7 +439,7 @@ class Tally(object): """ if nuclide not in self.nuclides: - msg = 'Unable to remove nuclide "{0}" from Tally ID={1} since the ' \ + msg = 'Unable to remove nuclide ""{0}"" from Tally ID="{1}" since the ' \ 'Tally does not contain this nuclide'.format(nuclide, self.id) ValueError(msg) @@ -470,27 +470,27 @@ class Tally(object): def __repr__(self): string = 'Tally\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('\tID', '=\t', self.id) + string += '{0: <16}"{1}""{2}"\n'.format('\tName', '=\t', self.name) string += '{0: <16}\n'.format('\tFilters') for filter in self.filters: - string += '{0: <16}\t\t{1}\t{2}\n'.format('', filter.type, + string += '{0: <16}\t\t"{1}"\t"{2}"\n'.format('', filter.type, filter.bins) - string += '{0: <16}{1}'.format('\tNuclides', '=\t') + string += '{0: <16}"{1}"'.format('\tNuclides', '=\t') for nuclide in self.nuclides: if isinstance(nuclide, Nuclide): - string += '{0} '.format(nuclide.name) + string += '"{0}" '.format(nuclide.name) else: - string += '{0} '.format(nuclide) + string += '"{0}" '.format(nuclide) string += '\n' - string += '{0: <16}{1}{2}\n'.format('\tScores', '=\t', self.scores) - string += '{0: <16}{1}{2}\n'.format('\tEstimator', '=\t', self.estimator) + string += '{0: <16}"{1}""{2}"\n'.format('\tScores', '=\t', self.scores) + string += '{0: <16}"{1}""{2}"\n'.format('\tEstimator', '=\t', self.estimator) return string @@ -555,7 +555,7 @@ class Tally(object): """ if not self.can_merge(tally): - msg = 'Unable to merge tally ID={0} with {1}'.format(tally.id, self.id) + msg = 'Unable to merge tally ID="{0}" with "{1}"'.format(tally.id, self.id) raise ValueError(msg) # Create deep copy of tally to return as merged tally @@ -609,7 +609,7 @@ class Tally(object): if filter.bins is not None: bins = '' for bin in filter.bins: - bins += '{0} '.format(bin) + bins += '"{0}" '.format(bin) subelement.set("bins", bins.rstrip(' ')) @@ -618,23 +618,23 @@ class Tally(object): nuclides = '' for nuclide in self.nuclides: if isinstance(nuclide, Nuclide): - nuclides += '{0} '.format(nuclide.name) + nuclides += '"{0}" '.format(nuclide.name) else: - nuclides += '{0} '.format(nuclide) + nuclides += '"{0}" '.format(nuclide) subelement = ET.SubElement(element, "nuclides") subelement.text = nuclides.rstrip(' ') # Scores if len(self.scores) == 0: - msg = 'Unable to get XML for Tally ID={0} since it does not ' \ + msg = 'Unable to get XML for Tally ID="{0}" since it does not ' \ 'contain any scores'.format(self.id) raise ValueError(msg) else: scores = '' for score in self.scores: - scores += '{0} '.format(score) + scores += '"{0}" '.format(score) subelement = ET.SubElement(element, "scores") subelement.text = scores.rstrip(' ') @@ -681,8 +681,8 @@ class Tally(object): # If we did not find the Filter, throw an Exception if filter is None: - msg = 'Unable to find filter type "{0}" in ' \ - 'Tally ID={1}'.format(filter_type, self.id) + msg = 'Unable to find filter type ""{0}"" in ' \ + 'Tally ID="{1}"'.format(filter_type, self.id) raise ValueError(msg) return filter @@ -756,7 +756,7 @@ class Tally(object): break if nuclide_index == -1: - msg = 'Unable to get the nuclide index for Tally since "{0}" ' \ + msg = 'Unable to get the nuclide index for Tally since ""{0}"" ' \ 'is not one of the nuclides'.format(nuclide) raise KeyError(msg) else: @@ -787,7 +787,7 @@ class Tally(object): score_index = self.scores.index(score) except ValueError: - msg = 'Unable to get the score index for Tally since "{0}" ' \ + msg = 'Unable to get the score index for Tally since ""{0}"" ' \ 'is not one of the scores'.format(score) raise ValueError(msg) @@ -849,7 +849,7 @@ class Tally(object): # Ensure that StatePoint.read_results() was called first if self._sum is None or self._sum_sq is None: - msg = 'The Tally ID={0} has no data to return. Call the ' \ + msg = 'The Tally ID="{0}" has no data to return. Call the ' \ 'StatePoint.read_results() routine before using ' \ 'Tally.get_values(...)'.format(self.id) raise ValueError(msg) @@ -944,8 +944,8 @@ class Tally(object): elif value == 'sum_sq': data = self.sum_sq[indices] else: - msg = 'Unable to return results from Tally ID={0} since the ' \ - 'the requested value "{1}" is not \'mean\', \'std_dev\', ' \ + msg = 'Unable to return results from Tally ID="{0}" since the ' \ + 'the requested value ""{1}"" is not \'mean\', \'std_dev\', ' \ '\rel_err\', \'sum\', or \'sum_sq\''.format(self.id, value) raise LookupError(msg) @@ -996,14 +996,14 @@ class Tally(object): # Ensure that StatePoint.read_results() was called first if self._sum is None or self._sum_sq is None: - msg = 'The Tally ID={0} has no data to return. Call the ' \ + msg = 'The Tally ID="{0}" has no data to return. Call the ' \ 'StatePoint.read_results() routine before using ' \ 'Tally.get_pandas_dataframe(...)'.format(self.id) raise KeyError(msg) # If using Summary, ensure StatePoint.link_with_summary(...) was called if summary and not self.with_summary: - msg = 'The Tally ID={0} has not been linked with the Summary. ' \ + msg = 'The Tally ID="{0}" has not been linked with the Summary. ' \ 'Call the StatePoint.link_with_summary(...) routine ' \ 'before using Tally.get_pandas_dataframe(...) with ' \ 'Summary info'.format(self.id) @@ -1036,7 +1036,7 @@ class Tally(object): # Append Mesh ID as outermost index of mult-index mesh_id = filter.mesh.id - mesh_key = 'mesh {0}'.format(mesh_id) + mesh_key = 'mesh "{0}"'.format(mesh_id) # Find mesh dimensions - use 3D indices for simplicity if (len(filter.mesh.dimension) == 3): @@ -1128,7 +1128,7 @@ class Tally(object): # Initialize prefix Multi-index keys counter += 1 - level_key = 'level {0}'.format(counter) + level_key = 'level "{0}"'.format(counter) univ_key = (level_key, 'univ', 'id') cell_key = (level_key, 'cell', 'id') lat_id_key = (level_key, 'lat', 'id') @@ -1292,30 +1292,30 @@ class Tally(object): # Ensure that StatePoint.read_results() was called first if self._sum is None or self._sum_sq is None: - msg = 'The Tally ID={0} has no data to export. Call the ' \ + msg = 'The Tally ID="{0}" has no data to export. Call the ' \ 'StatePoint.read_results() routine before using ' \ 'Tally.export_results(...)'.format(self.id) raise KeyError(msg) if not isinstance(filename, basestring): - msg = 'Unable to export the results for Tally ID={0} to ' \ - 'filename="{1}" since it is not a ' \ + msg = 'Unable to export the results for Tally ID="{0}" to ' \ + 'filename=""{1}"" since it is not a ' \ 'string'.format(self.id, filename) raise ValueError(msg) elif not isinstance(directory, basestring): - msg = 'Unable to export the results for Tally ID={0} to ' \ - 'directory="{1}" since it is not a ' \ + msg = 'Unable to export the results for Tally ID="{0}" to ' \ + 'directory=""{1}"" since it is not a ' \ 'string'.format(self.id, directory) raise ValueError(msg) elif format not in ['hdf5', 'pkl', 'csv']: - msg = 'Unable to export the results for Tally ID={0} to format ' \ - '"{1}" since it is not supported'.format(self.id, format) + msg = 'Unable to export the results for Tally ID="{0}" to format ' \ + '""{1}"" since it is not supported'.format(self.id, format) raise ValueError(msg) elif not isinstance(append, bool): - msg = 'Unable to export the results for Tally ID={0} since the ' \ + msg = 'Unable to export the results for Tally ID="{0}" since the ' \ 'append parameter is not True/False'.format(self.id, append) raise ValueError(msg) @@ -1335,7 +1335,7 @@ class Tally(object): tally_results = h5py.File(filename, 'w') # Create an HDF5 group within the file for this particular Tally - tally_group = tally_results.create_group('Tally-{0}'.format(self.id)) + tally_group = tally_results.create_group('Tally-"{0}"'.format(self.id)) # Add basic Tally data to the HDF5 group tally_group.create_dataset('id', data=self.id) @@ -1377,8 +1377,8 @@ class Tally(object): tally_results = {} # Create a nested dictionary within the file for this particular Tally - tally_results['Tally-{0}'.format(self.id)] = {} - tally_group = tally_results['Tally-{0}'.format(self.id)] + tally_results['Tally-"{0}"'.format(self.id)] = {} + tally_group = tally_results['Tally-"{0}"'.format(self.id)] # Add basic Tally data to the nested dictionary tally_group['id'] = self.id @@ -1437,7 +1437,7 @@ class TalliesFile(object): """ if not isinstance(tally, Tally): - msg = 'Unable to add a non-Tally {0} to the TalliesFile'.format(tally) + msg = 'Unable to add a non-Tally "{0}" to the TalliesFile'.format(tally) raise ValueError(msg) if merge: @@ -1508,7 +1508,7 @@ class TalliesFile(object): """ if not isinstance(mesh, Mesh): - msg = 'Unable to add a non-Mesh {0} to the TalliesFile'.format(mesh) + msg = 'Unable to add a non-Mesh "{0}" to the TalliesFile'.format(mesh) raise ValueError(msg) self._meshes.append(mesh) diff --git a/openmc/trigger.py b/openmc/trigger.py index e695defde2..a75ce4d168 100644 --- a/openmc/trigger.py +++ b/openmc/trigger.py @@ -92,7 +92,7 @@ class Trigger(object): """ if not isinstance(score, basestring): - msg = 'Unable to add score "{0}" to tally trigger since ' \ + msg = 'Unable to add score ""{0}"" to tally trigger since ' \ 'it is not a string'.format(score) raise ValueError(msg) @@ -104,9 +104,9 @@ class Trigger(object): def __repr__(self): string = 'Trigger\n' - string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._trigger_type) - string += '{0: <16}{1}{2}\n'.format('\tThreshold', '=\t', self._threshold) - string += '{0: <16}{1}{2}\n'.format('\tScores', '=\t', self._scores) + string += '{0: <16}"{1}""{2}"\n'.format('\tType', '=\t', self._trigger_type) + string += '{0: <16}"{1}""{2}"\n'.format('\tThreshold', '=\t', self._threshold) + string += '{0: <16}"{1}""{2}"\n'.format('\tScores', '=\t', self._scores) return string def get_trigger_xml(self, element): diff --git a/openmc/universe.py b/openmc/universe.py index 84ce3696ee..89699f0173 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -126,8 +126,8 @@ class Cell(object): if fill.strip().lower() == 'void': self._type = 'void' else: - msg = 'Unable to set Cell ID={0} to use a non-Material or ' \ - 'Universe fill {1}'.format(self._id, fill) + msg = 'Unable to set Cell ID="{0}" to use a non-Material or ' \ + 'Universe fill "{1}"'.format(self._id, fill) raise ValueError(msg) elif isinstance(fill, openmc.Material): @@ -140,8 +140,8 @@ class Cell(object): self._type = 'lattice' else: - msg = 'Unable to set Cell ID={0} to use a non-Material or ' \ - 'Universe fill {1}'.format(self._id, fill) + msg = 'Unable to set Cell ID="{0}" to use a non-Material or ' \ + 'Universe fill "{1}"'.format(self._id, fill) raise ValueError(msg) self._fill = fill @@ -177,13 +177,13 @@ class Cell(object): """ if not isinstance(surface, openmc.Surface): - msg = 'Unable to add Surface {0} to Cell ID={1} since it is ' \ + msg = 'Unable to add Surface "{0}" to Cell ID="{1}" since it is ' \ 'not a Surface object'.format(surface, self._id) raise ValueError(msg) if halfspace not in [-1, +1]: - msg = 'Unable to add Surface {0} to Cell ID={1} with halfspace ' \ - '{2} since it is not +/-1'.format(surface, self._id, halfspace) + msg = 'Unable to add Surface "{0}" to Cell ID="{1}" with halfspace ' \ + '"{2}" since it is not +/-1'.format(surface, self._id, halfspace) raise ValueError(msg) # If the Cell does not already contain the Surface, add it @@ -201,7 +201,7 @@ class Cell(object): """ if not isinstance(surface, openmc.Surface): - msg = 'Unable to remove Surface {0} from Cell ID={1} since it is ' \ + msg = 'Unable to remove Surface "{0}" from Cell ID="{1}" since it is ' \ 'not a Surface object'.format(surface, self._id) raise ValueError(msg) @@ -289,31 +289,31 @@ class Cell(object): def __repr__(self): string = 'Cell\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('\tID', '=\t', self._id) + string += '{0: <16}"{1}""{2}"\n'.format('\tName', '=\t', self._name) if isinstance(self._fill, openmc.Material): - string += '{0: <16}{1}{2}\n'.format('\tMaterial', '=\t', + string += '{0: <16}"{1}""{2}"\n'.format('\tMaterial', '=\t', self._fill._id) elif isinstance(self._fill, (Universe, Lattice)): - string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t', + string += '{0: <16}"{1}""{2}"\n'.format('\tFill', '=\t', self._fill._id) else: - string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t', self._fill) + string += '{0: <16}"{1}""{2}"\n'.format('\tFill', '=\t', self._fill) - string += '{0: <16}{1}\n'.format('\tSurfaces', '=\t') + string += '{0: <16}"{1}"\n'.format('\tSurfaces', '=\t') for surface_id in self._surfaces: halfspace = self._surfaces[surface_id][1] - string += '{0} '.format(halfspace * surface_id) + string += '"{0}" '.format(halfspace * surface_id) string = string.rstrip(' ') + '\n' - string += '{0: <16}{1}{2}\n'.format('\tRotation', '=\t', + string += '{0: <16}"{1}""{2}"\n'.format('\tRotation', '=\t', self._rotation) - string += '{0: <16}{1}{2}\n'.format('\tTranslation', '=\t', + string += '{0: <16}"{1}""{2}"\n'.format('\tTranslation', '=\t', self._translation) - string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self._offsets) + string += '{0: <16}"{1}""{2}"\n'.format('\tOffset', '=\t', self._offsets) return string @@ -343,7 +343,7 @@ class Cell(object): for surface_id in self._surfaces: # Determine if XML element already includes this Surface - path = './surface[@id=\'{0}\']'.format(surface_id) + path = './surface[@id=\'"{0}"\']'.format(surface_id) test = xml_element.find(path) # If the element does not contain the Surface subelement @@ -355,7 +355,7 @@ class Cell(object): # Append the halfspace and Surface ID halfspace = self._surfaces[surface_id][1] - surfaces += '{0} '.format(halfspace * surface_id) + surfaces += '"{0}" '.format(halfspace * surface_id) element.set("surfaces", surfaces.rstrip(' ')) @@ -452,7 +452,7 @@ class Universe(object): """ if not isinstance(cell, Cell): - msg = 'Unable to add a Cell to Universe ID={0} since {1} is not ' \ + msg = 'Unable to add a Cell to Universe ID="{0}" since "{1}" is not ' \ 'a Cell'.format(self._id, cell) raise ValueError(msg) @@ -472,7 +472,7 @@ class Universe(object): """ if not isinstance(cells, Iterable): - msg = 'Unable to add Cells to Universe ID={0} since {1} is not ' \ + msg = 'Unable to add Cells to Universe ID="{0}" since "{1}" is not ' \ 'iterable'.format(self._id, cells) raise ValueError(msg) @@ -490,7 +490,7 @@ class Universe(object): """ if not isinstance(cell, Cell): - msg = 'Unable to remove a Cell from Universe ID={0} since {1} is ' \ + msg = 'Unable to remove a Cell from Universe ID="{0}" since "{1}" is ' \ 'not a Cell'.format(self._id, cell) raise ValueError(msg) @@ -582,11 +582,11 @@ class Universe(object): 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', + 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', + string += '{0: <16}"{1}""{2}"\n'.format('\t# Regions', '=\t', self._num_regions) return string @@ -870,26 +870,26 @@ class RectLattice(Lattice): def __repr__(self): string = 'RectLattice\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('\tDimension', '=\t', + 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('\tDimension', '=\t', self._dimension) - string += '{0: <16}{1}{2}\n'.format('\tLower Left', '=\t', + string += '{0: <16}"{1}""{2}"\n'.format('\tLower Left', '=\t', self._lower_left) - string += '{0: <16}{1}{2}\n'.format('\tPitch', '=\t', self._pitch) + string += '{0: <16}"{1}""{2}"\n'.format('\tPitch', '=\t', self._pitch) if self._outer is not None: - string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', + string += '{0: <16}"{1}""{2}"\n'.format('\tOuter', '=\t', self._outer._id) else: - string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', + string += '{0: <16}"{1}""{2}"\n'.format('\tOuter', '=\t', self._outer) string += '{0: <16}\n'.format('\tUniverses') # Lattice nested Universe IDs - column major for Fortran for i, universe in enumerate(np.ravel(self._universes)): - string += '{0} '.format(universe._id) + string += '"{0}" '.format(universe._id) # Add a newline character every time we reach end of row of cells if (i+1) % self._dimension[-1] == 0: @@ -902,7 +902,7 @@ class RectLattice(Lattice): # Lattice cell offsets for i, offset in enumerate(np.ravel(self._offsets)): - string += '{0} '.format(offset) + string += '"{0}" '.format(offset) # Add a newline character when we reach end of row of cells if (i+1) % self._dimension[-1] == 0: @@ -914,7 +914,7 @@ class RectLattice(Lattice): def create_xml_subelement(self, xml_element): # Determine if XML element already contains subelement for this Lattice - path = './lattice[@id=\'{0}\']'.format(self._id) + path = './lattice[@id=\'"{0}"\']'.format(self._id) test = xml_element.find(path) # If the element does contain the Lattice subelement, then return @@ -934,7 +934,7 @@ class RectLattice(Lattice): # Export the Lattice outer Universe (if specified) if self._outer is not None: outer = ET.SubElement(lattice_subelement, "outer") - outer.text = '{0}'.format(self._outer._id) + outer.text = '"{0}"'.format(self._outer._id) self._outer.create_xml_subelement(xml_element) # Export Lattice cell dimensions @@ -956,7 +956,7 @@ class RectLattice(Lattice): universe = self._universes[x][y][z] # Append Universe ID to the Lattice XML subelement - universe_ids += '{0} '.format(universe._id) + universe_ids += '"{0}" '.format(universe._id) # Create XML subelement for this Universe universe.create_xml_subelement(xml_element) @@ -974,7 +974,7 @@ class RectLattice(Lattice): universe = self._universes[x][y] # Append Universe ID to Lattice XML subelement - universe_ids += '{0} '.format(universe._id) + universe_ids += '"{0}" '.format(universe._id) # Create XML subelement for this Universe universe.create_xml_subelement(xml_element) @@ -1149,19 +1149,19 @@ class HexLattice(Lattice): def __repr__(self): string = 'HexLattice\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('\t# Rings', '=\t', self._num_rings) - string += '{0: <16}{1}{2}\n'.format('\t# Axial', '=\t', self._num_axial) - string += '{0: <16}{1}{2}\n'.format('\tCenter', '=\t', + 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('\t# Rings', '=\t', self._num_rings) + string += '{0: <16}"{1}""{2}"\n'.format('\t# Axial', '=\t', self._num_axial) + string += '{0: <16}"{1}""{2}"\n'.format('\tCenter', '=\t', self._center) - string += '{0: <16}{1}{2}\n'.format('\tPitch', '=\t', self._pitch) + string += '{0: <16}"{1}""{2}"\n'.format('\tPitch', '=\t', self._pitch) if self._outer is not None: - string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', + string += '{0: <16}"{1}""{2}"\n'.format('\tOuter', '=\t', self._outer._id) else: - string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', + string += '{0: <16}"{1}""{2}"\n'.format('\tOuter', '=\t', self._outer) string += '{0: <16}\n'.format('\tUniverses') @@ -1177,7 +1177,7 @@ class HexLattice(Lattice): def create_xml_subelement(self, xml_element): # Determine if XML element already contains subelement for this Lattice - path = './hex_lattice[@id=\'{0}\']'.format(self._id) + path = './hex_lattice[@id=\'"{0}"\']'.format(self._id) test = xml_element.find(path) # If the element does contain the Lattice subelement, then return @@ -1197,7 +1197,7 @@ class HexLattice(Lattice): # Export the Lattice outer Universe (if specified) if self._outer is not None: outer = ET.SubElement(lattice_subelement, "outer") - outer.text = '{0}'.format(self._outer._id) + outer.text = '"{0}"'.format(self._outer._id) self._outer.create_xml_subelement(xml_element) lattice_subelement.set("n_rings", str(self._num_rings)) From f012c03e2bced39ecc79b1b6abd331a633887397 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 3 Aug 2015 21:34:03 -0700 Subject: [PATCH 042/101] Removed quotes from string args in ace.py --- openmc/ace.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/ace.py b/openmc/ace.py index 7fab7c98f6..3606b1e947 100644 --- a/openmc/ace.py +++ b/openmc/ace.py @@ -49,14 +49,14 @@ def ascii_to_binary(ascii_file, binary_file): # that XSS will start at the second record nxs = list(map(int, ' '.join(lines[idx + 6:idx + 8]).split())) jxs = list(map(int, ' '.join(lines[idx + 8:idx + 12]).split())) - binary.write(pack('=16i32i"{0}"x'.format(record_length - 500), *(nxs + jxs))) + binary.write(pack('=16i32i{0}x'.format(record_length - 500), *(nxs + jxs))) # Read/write XSS array. Null bytes are added to form a complete record # at the end of the file n_lines = (nxs[0] + 3)//4 xss = list(map(float, ' '.join(lines[idx + 12:idx + 12 + n_lines]).split())) extra_bytes = record_length - ((len(xss)*8 - 1) % record_length + 1) - binary.write(pack('="{0}"d"{1}"x'.format(nxs[0], extra_bytes), *xss)) + binary.write(pack('={0}d{1}x'.format(nxs[0], extra_bytes), *xss)) # Advance to next table in file idx += 12 + n_lines From d0afb964b73408e2fb1edfaefd7db83e7d28bc4e Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 3 Aug 2015 21:48:45 -0700 Subject: [PATCH 043/101] Removed quotations around string args in __repr__ methods --- openmc/element.py | 4 +- openmc/executor.py | 8 ++-- openmc/filter.py | 32 ++++++++-------- openmc/material.py | 18 ++++----- openmc/mesh.py | 14 +++---- openmc/nuclide.py | 4 +- openmc/particle_restart.py | 2 +- openmc/plots.py | 24 ++++++------ openmc/statepoint.py | 76 +++++++++++++++++++------------------- openmc/summary.py | 22 +++++------ openmc/surface.py | 10 ++--- openmc/tallies.py | 42 ++++++++++----------- openmc/trigger.py | 6 +-- openmc/universe.py | 54 +++++++++++++-------------- 14 files changed, 158 insertions(+), 158 deletions(-) diff --git a/openmc/element.py b/openmc/element.py index d091db37d4..2f81b9f308 100644 --- a/openmc/element.py +++ b/openmc/element.py @@ -73,6 +73,6 @@ class Element(object): self._name = name def __repr__(self): - string = 'Element - "{0}"\n'.format(self._name) - string += '{0: <16}"{1}""{2}"\n'.format('\tXS', '=\t', self._xs) + string = 'Element - {0}\n'.format(self._name) + string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs) return string diff --git a/openmc/executor.py b/openmc/executor.py index 1c1ff40c61..54c8a64c1a 100644 --- a/openmc/executor.py +++ b/openmc/executor.py @@ -92,16 +92,16 @@ class Executor(object): pre_args = '' if isinstance(particles, Integral) and particles > 0: - post_args += '-n "{0}" '.format(particles) + post_args += '-n {0} '.format(particles) if isinstance(threads, Integral) and threads > 0: - post_args += '-s "{0}" '.format(threads) + post_args += '-s {0} '.format(threads) if geometry_debug: post_args += '-g ' if isinstance(restart_file, basestring): - post_args += '-r "{0}" '.format(restart_file) + post_args += '-r {0} '.format(restart_file) if tracks: post_args += '-t' @@ -121,7 +121,7 @@ class Executor(object): pre_args += mpi_exec + ' ' else: pre_args += 'mpirun ' - pre_args += '-n "{0}" '.format(mpi_procs) + pre_args += '-n {0} '.format(mpi_procs) command = pre_args + openmc_exec + ' ' + post_args diff --git a/openmc/filter.py b/openmc/filter.py index 8bae47fa47..93ee094539 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -109,7 +109,7 @@ class Filter(object): if type is None: self._type = type elif type not in FILTER_TYPES.values(): - msg = 'Unable to set Filter type to ""{0}"" since it is not one ' \ + msg = 'Unable to set Filter type to ""{0}" since it is not one ' \ 'of the supported types'.format(type) raise ValueError(msg) @@ -120,7 +120,7 @@ class Filter(object): if bins is None: self.num_bins = 0 elif self._type is None: - msg = 'Unable to set bins for Filter to ""{0}"" since ' \ + msg = 'Unable to set bins for Filter to "{0}" since ' \ 'the Filter type has not yet been set'.format(bins) raise ValueError(msg) @@ -136,30 +136,30 @@ class Filter(object): 'universe', 'distribcell']: for edge in bins: if not isinstance(edge, Integral): - msg = 'Unable to add bin ""{0}"" to a "{1}" Filter since ' \ + msg = 'Unable to add bin "{0}" to a "{1}" Filter since ' \ 'it is not an integer'.format(edge, self._type) raise ValueError(msg) elif edge < 0: - msg = 'Unable to add bin ""{0}"" to a "{1}" Filter since ' \ + msg = 'Unable to add bin "{0}" to a "{1}" Filter since ' \ 'it is negative'.format(edge, self._type) raise ValueError(msg) elif self._type in ['energy', 'energyout']: for edge in bins: if not isinstance(edge, Real): - msg = 'Unable to add bin edge ""{0}"" to a "{1}" Filter ' \ + msg = 'Unable to add bin edge "{0}" to a "{1}" Filter ' \ 'since it is a non-integer or floating point ' \ 'value'.format(edge, self._type) raise ValueError(msg) elif edge < 0.: - msg = 'Unable to add bin edge ""{0}"" to a "{1}" Filter ' \ + msg = 'Unable to add bin edge "{0}" to a "{1}" Filter ' \ 'since it is a negative value'.format(edge, self._type) raise ValueError(msg) # Check that bin edges are monotonically increasing for index in range(len(bins)): if index > 0 and bins[index] < bins[index-1]: - msg = 'Unable to add bin edges ""{0}"" to a "{1}" Filter ' \ + msg = 'Unable to add bin edges "{0}" to a "{1}" Filter ' \ 'since they are not monotonically ' \ 'increasing'.format(bins, self._type) raise ValueError(msg) @@ -167,15 +167,15 @@ class Filter(object): # mesh filters elif self._type == 'mesh': if not len(bins) == 1: - msg = 'Unable to add bins ""{0}"" to a mesh Filter since ' \ + msg = 'Unable to add bins "{0}" to a mesh Filter since ' \ 'only a single mesh can be used per tally'.format(bins) raise ValueError(msg) elif not isinstance(bins[0], Integral): - msg = 'Unable to add bin ""{0}"" to mesh Filter since it ' \ + msg = 'Unable to add bin "{0}" to mesh Filter since it ' \ 'is a non-integer'.format(bins[0]) raise ValueError(msg) elif bins[0] < 0: - msg = 'Unable to add bin ""{0}"" to mesh Filter since it ' \ + msg = 'Unable to add bin "{0}" to mesh Filter since it ' \ 'is a negative integer'.format(bins[0]) raise ValueError(msg) @@ -186,7 +186,7 @@ class Filter(object): @num_bins.setter def num_bins(self, num_bins): if not isinstance(num_bins, Integral) or num_bins < 0: - msg = 'Unable to set the number of bins ""{0}"" for a "{1}" Filter ' \ + msg = 'Unable to set the number of bins "{0}" for a "{1}" Filter ' \ 'since it is not a positive ' \ 'integer'.format(num_bins, self._type) raise ValueError(msg) @@ -210,7 +210,7 @@ class Filter(object): def stride(self, stride): check_type('filter stride', stride, Integral) if stride < 0: - msg = 'Unable to set stride ""{0}"" for a "{1}" Filter since it is a ' \ + msg = 'Unable to set stride "{0}" for a "{1}" Filter since it is a ' \ 'negative value'.format(stride, self._type) raise ValueError(msg) @@ -336,7 +336,7 @@ class Filter(object): filter_index = val except ValueError: - msg = 'Unable to get the bin index for Filter since ""{0}"" ' \ + msg = 'Unable to get the bin index for Filter since "{0}" ' \ 'is not one of the bins'.format(filter_bin) raise ValueError(msg) @@ -344,7 +344,7 @@ class Filter(object): def __repr__(self): string = 'Filter\n' - string += '{0: <16}"{1}""{2}"\n'.format('\tType', '=\t', self._type) - string += '{0: <16}"{1}""{2}"\n'.format('\tBins', '=\t', self._bins) - string += '{0: <16}"{1}""{2}"\n'.format('\tOffset', '=\t', self._offset) + string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._type) + string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', self._bins) + string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self._offset) return string diff --git a/openmc/material.py b/openmc/material.py index 84498bf062..0f5a5a4434 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -332,18 +332,18 @@ class Material(object): return nuclides - def _repr__(self): + def __repr__(self): string = 'Material\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('\tID', '=\t', self._id) + string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) - string += '{0: <16}"{1}""{2}"'.format('\tDensity', '=\t', self._density) + string += '{0: <16}{1}{2}'.format('\tDensity', '=\t', self._density) string += ' ["{0}"]\n'.format(self._density_units) string += '{0: <16}\n'.format('\tS(a,b) Tables') for sab in self._sab: - string += '{0: <16}"{1}"["{2}""{3}"]\n'.format('\tS(a,b)', '=\t', + string += '{0: <16}{1}[{2}{3}]\n'.format('\tS(a,b)', '=\t', sab[0], sab[1]) string += '{0: <16}\n'.format('\tNuclides') @@ -351,16 +351,16 @@ class Material(object): for nuclide in self._nuclides: percent = self._nuclides[nuclide][1] percent_type = self._nuclides[nuclide][2] - string += '{0: <16}'.format('\t"{0}"'.format(nuclide)) - string += '=\t{0: <12} ["{1}"]\n'.format(percent, percent_type) + string += '{0: <16}'.format('\t{0}'.format(nuclide)) + string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type) string += '{0: <16}\n'.format('\tElements') for element in self._elements: percent = self._nuclides[element][1] percent_type = self._nuclides[element][2] - string += '{0: >16}'.format('\t"{0}"'.format(element)) - string += '=\t{0: <12} ["{1}"]\n'.format(percent, percent_type) + string += '{0: >16}'.format('\t{0}'.format(element)) + string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type) return string diff --git a/openmc/mesh.py b/openmc/mesh.py index 7ef3719412..7e907aaa57 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -185,13 +185,13 @@ class Mesh(object): def __repr__(self): string = 'Mesh\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('\tType', '=\t', self._type) - string += '{0: <16}"{1}""{2}"\n'.format('\tBasis', '=\t', self._dimension) - string += '{0: <16}"{1}""{2}"\n'.format('\tWidth', '=\t', self._lower_left) - string += '{0: <16}"{1}""{2}"\n'.format('\tOrigin', '=\t', self._upper_right) - string += '{0: <16}"{1}""{2}"\n'.format('\tPixels', '=\t', self._width) + 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('\tType', '=\t', self._type) + string += '{0: <16}{1}{2}\n'.format('\tBasis', '=\t', self._dimension) + string += '{0: <16}{1}{2}\n'.format('\tWidth', '=\t', self._lower_left) + string += '{0: <16}{1}{2}\n'.format('\tOrigin', '=\t', self._upper_right) + string += '{0: <16}{1}{2}\n'.format('\tPixels', '=\t', self._width) return string def get_mesh_xml(self): diff --git a/openmc/nuclide.py b/openmc/nuclide.py index cc0267c658..6f6f75f9c9 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -89,7 +89,7 @@ class Nuclide(object): def __repr__(self): string = 'Nuclide - "{0}"\n'.format(self._name) - string += '{0: <16}"{1}""{2}"\n'.format('\tXS', '=\t', self._xs) + string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs) if self._zaid is not None: - string += '{0: <16}"{1}""{2}"\n'.format('\tZAID', '=\t', self._zaid) + string += '{0: <16}{1}{2}\n'.format('\tZAID', '=\t', self._zaid) return string diff --git a/openmc/particle_restart.py b/openmc/particle_restart.py index 41ac5f81ac..d664de1aee 100644 --- a/openmc/particle_restart.py +++ b/openmc/particle_restart.py @@ -75,7 +75,7 @@ class Particle(object): self.uvw = self._get_double(3, path='uvw') def _get_data(self, n, typeCode, size): - return list(struct.unpack('="{0}""{1}"'.format(n, typeCode), + return list(struct.unpack('={0}{1}'.format(n, typeCode), self._f.read(n*size))) def _get_int(self, n=1, path=None): diff --git a/openmc/plots.py b/openmc/plots.py index c3131b7536..66419a6ffc 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -245,20 +245,20 @@ class Plot(object): def __repr__(self): string = 'Plot\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('\tFilename', '=\t', self._filename) - string += '{0: <16}"{1}""{2}"\n'.format('\tType', '=\t', self._type) - string += '{0: <16}"{1}""{2}"\n'.format('\tBasis', '=\t', self._basis) - string += '{0: <16}"{1}""{2}"\n'.format('\tWidth', '=\t', self._width) - string += '{0: <16}"{1}""{2}"\n'.format('\tOrigin', '=\t', self._origin) - string += '{0: <16}"{1}""{2}"\n'.format('\tPixels', '=\t', self._origin) - string += '{0: <16}"{1}""{2}"\n'.format('\tColor', '=\t', self._color) - string += '{0: <16}"{1}""{2}"\n'.format('\tMask', '=\t', + 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('\tFilename', '=\t', self._filename) + string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._type) + string += '{0: <16}{1}{2}\n'.format('\tBasis', '=\t', self._basis) + string += '{0: <16}{1}{2}\n'.format('\tWidth', '=\t', self._width) + string += '{0: <16}{1}{2}\n'.format('\tOrigin', '=\t', self._origin) + string += '{0: <16}{1}{2}\n'.format('\tPixels', '=\t', self._origin) + string += '{0: <16}{1}{2}\n'.format('\tColor', '=\t', self._color) + string += '{0: <16}{1}{2}\n'.format('\tMask', '=\t', self._mask_components) - string += '{0: <16}"{1}""{2}"\n'.format('\tMask', '=\t', + string += '{0: <16}{1}{2}\n'.format('\tMask', '=\t', self._mask_background) - string += '{0: <16}"{1}""{2}"\n'.format('\tCol Spec', '=\t', self._col_spec) + string += '{0: <16}{1}{2}\n'.format('\tCol Spec', '=\t', self._col_spec) return string def get_plot_xml(self): diff --git a/openmc/statepoint.py b/openmc/statepoint.py index ffee8c4494..6a4713e91d 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -36,10 +36,10 @@ class SourceSite(object): def __repr__(self): string = 'SourceSite\n' - string += '{0: <16}"{1}""{2}"\n'.format('\tweight', '=\t', self._weight) - string += '{0: <16}"{1}""{2}"\n'.format('\tE', '=\t', self._E) - string += '{0: <16}"{1}""{2}"\n'.format('\t(x,y,z)', '=\t', self._xyz) - string += '{0: <16}"{1}""{2}"\n'.format('\t(u,v,w)', '=\t', self._uvw) + string += '{0: <16}{1}{2}\n'.format('\tweight', '=\t', self._weight) + string += '{0: <16}{1}{2}\n'.format('\tE', '=\t', self._E) + string += '{0: <16}{1}{2}\n'.format('\t(x,y,z)', '=\t', self._xyz) + string += '{0: <16}{1}{2}\n'.format('\t(u,v,w)', '=\t', self._uvw) return string @property @@ -230,21 +230,21 @@ class StatePoint(object): if self._cmfd_on == 1: - self._cmfd_indices = self._get_int(4, path='"{0}"/indices'.format(base)) + self._cmfd_indices = self._get_int(4, path='{0}/indices'.format(base)) self._k_cmfd = self._get_double(self._current_batch, - path='"{0}"/k_cmfd'.format(base)) + path='{0}/k_cmfd'.format(base)) self._cmfd_src = self._get_double_array(np.product(self._cmfd_indices), - path='"{0}"/cmfd_src'.format(base)) + path='{0}/cmfd_src'.format(base)) self._cmfd_src = np.reshape(self._cmfd_src, tuple(self._cmfd_indices), order='F') self._cmfd_entropy = self._get_double(self._current_batch, - path='"{0}"/cmfd_entropy'.format(base)) + path='{0}/cmfd_entropy'.format(base)) self._cmfd_balance = self._get_double(self._current_batch, - path='"{0}"/cmfd_balance'.format(base)) + path='{0}/cmfd_balance'.format(base)) self._cmfd_dominance = self._get_double(self._current_batch, - path='"{0}"/cmfd_dominance'.format(base)) + path='{0}/cmfd_dominance'.format(base)) self._cmfd_srccmp = self._get_double(self._current_batch, - path='"{0}"/cmfd_srccmp'.format(base)) + path='{0}/cmfd_srccmp'.format(base)) def _read_meshes(self): # Initialize dictionaries for the Meshes @@ -277,23 +277,23 @@ class StatePoint(object): for mesh_key in self._mesh_keys: # Read the user-specified Mesh ID and type - mesh_id = self._get_int(path='"{0}""{1}"/id'.format(base, mesh_key))[0] - mesh_type = self._get_int(path='"{0}""{1}"/type'.format(base, mesh_key))[0] + mesh_id = self._get_int(path='{0}{1}/id'.format(base, mesh_key))[0] + mesh_type = self._get_int(path='{0}{1}/type'.format(base, mesh_key))[0] # Get the Mesh dimension n_dimension = self._get_int( - path='"{0}""{1}"/n_dimension'.format(base, mesh_key))[0] + path='{0}{1}/n_dimension'.format(base, mesh_key))[0] # Read the mesh dimensions, lower-left coordinates, # upper-right coordinates, and width of each mesh cell dimension = self._get_int( - n_dimension, path='"{0}""{1}"/dimension'.format(base, mesh_key)) + n_dimension, path='{0}{1}/dimension'.format(base, mesh_key)) lower_left = self._get_double( - n_dimension, path='"{0}""{1}"/lower_left'.format(base, mesh_key)) + n_dimension, path='{0}{1}/lower_left'.format(base, mesh_key)) upper_right = self._get_double( - n_dimension, path='"{0}""{1}"/upper_right'.format(base, mesh_key)) + n_dimension, path='{0}{1}/upper_right'.format(base, mesh_key)) width = self._get_double( - n_dimension, path='"{0}""{1}"/width'.format(base, mesh_key)) + n_dimension, path='{0}{1}/width'.format(base, mesh_key)) # Create the Mesh and assign properties to it mesh = openmc.Mesh(mesh_id) @@ -340,11 +340,11 @@ class StatePoint(object): # Read integer Tally estimator type code (analog or tracklength) estimator_type = self._get_int( - path='"{0}""{1}"/estimator'.format(base, tally_key))[0] + path='{0}{1}/estimator'.format(base, tally_key))[0] # Read the Tally size specifications n_realizations = self._get_int( - path='"{0}""{1}"/n_realizations'.format(base, tally_key))[0] + path='{0}{1}/n_realizations'.format(base, tally_key))[0] # Create Tally object and assign basic properties tally = openmc.Tally(tally_key) @@ -353,41 +353,41 @@ class StatePoint(object): # Read the number of Filters n_filters = self._get_int( - path='"{0}""{1}"/n_filters'.format(base, tally_key))[0] + path='{0}{1}/n_filters'.format(base, tally_key))[0] - subbase = '"{0}""{1}"/filter '.format(base, tally_key) + subbase = '{0}{1}/filter '.format(base, tally_key) # Initialize all Filters for j in range(1, n_filters+1): # Read the integer Filter type code filter_type = self._get_int( - path='"{0}""{1}"/type'.format(subbase, j))[0] + path='{0}{1}/type'.format(subbase, j))[0] # Read the Filter offset offset = self._get_int( - path='"{0}""{1}"/offset'.format(subbase, j))[0] + path='{0}{1}/offset'.format(subbase, j))[0] n_bins = self._get_int( - path='"{0}""{1}"/n_bins'.format(subbase, j))[0] + path='{0}{1}/n_bins'.format(subbase, j))[0] if n_bins <= 0: - msg = 'Unable to create Filter "{0}" for Tally ID="{2}" ' \ + msg = 'Unable to create Filter "{0}" for Tally ID="{1}" ' \ 'since no bins were specified'.format(j, tally_key) raise ValueError(msg) # Read the bin values if FILTER_TYPES[filter_type] in ['energy', 'energyout']: bins = self._get_double( - n_bins+1, path='"{0}""{1}"/bins'.format(subbase, j)) + n_bins+1, path='{0}{1}/bins'.format(subbase, j)) elif FILTER_TYPES[filter_type] in ['mesh', 'distribcell']: bins = self._get_int( - path='"{0}""{1}"/bins'.format(subbase, j))[0] + path='{0}{1}/bins'.format(subbase, j))[0] else: bins = self._get_int( - n_bins, path='"{0}""{1}"/bins'.format(subbase, j)) + n_bins, path='{0}{1}/bins'.format(subbase, j)) # Create Filter object filter = openmc.Filter(FILTER_TYPES[filter_type], bins) @@ -403,10 +403,10 @@ class StatePoint(object): # Read Nuclide bins n_nuclides = self._get_int( - path='"{0}""{1}"/n_nuclides'.format(base, tally_key))[0] + path='{0}{1}/n_nuclides'.format(base, tally_key))[0] nuclide_zaids = self._get_int( - n_nuclides, path='"{0}""{1}"/nuclides'.format(base, tally_key)) + n_nuclides, path='{0}{1}/nuclides'.format(base, tally_key)) # Add all Nuclides to the Tally for nuclide_zaid in nuclide_zaids: @@ -414,14 +414,14 @@ class StatePoint(object): # Read score bins n_score_bins = self._get_int( - path='"{0}""{1}"/n_score_bins'.format(base, tally_key))[0] + path='{0}{1}/n_score_bins'.format(base, tally_key))[0] tally.num_score_bins = n_score_bins scores = [SCORE_TYPES[j] for j in self._get_int( - n_score_bins, path='"{0}""{1}"/score_bins'.format(base, tally_key))] + n_score_bins, path='{0}{1}/score_bins'.format(base, tally_key))] n_user_scores = self._get_int( - path='"{0}""{1}"/n_user_score_bins'.format(base, tally_key))[0] + path='{0}{1}/n_user_score_bins'.format(base, tally_key))[0] # Compute and set the filter strides for i in range(n_filters): @@ -433,12 +433,12 @@ class StatePoint(object): # Read scattering moment order strings (e.g., P3, Y-1,2, etc.) moments = [] - subbase = '"{0}""{1}"/moments/'.format(base, tally_key) + subbase = '{0}{1}/moments/'.format(base, tally_key) # Extract the moment order string for each score for k in range(len(scores)): moment = self._get_string(8, - path='"{0}"order"{1}"'.format(subbase, k+1)) + path='{0}order{1}'.format(subbase, k+1)) moment = moment.lstrip('[\'') moment = moment.rstrip('\']') @@ -500,7 +500,7 @@ class StatePoint(object): # Extract Tally data from the file if self._hdf5: - data = self._f['"{0}""{1}"/results'.format(base, tally_key)].value + data = self._f['{0}{1}/results'.format(base, tally_key)].value sum = data['sum'] sum_sq = data['sum_sq'] @@ -794,7 +794,7 @@ class StatePoint(object): self._with_summary = True def _get_data(self, n, typeCode, size): - return list(struct.unpack('="{0}""{1}"'.format(n, typeCode), + return list(struct.unpack('={0}{1}'.format(n, typeCode), self._f.read(n*size))) def _get_int(self, n=1, path=None): diff --git a/openmc/summary.py b/openmc/summary.py index 2815390d8b..c0673ef233 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -18,7 +18,7 @@ class Summary(object): openmc.reset_auto_ids() if not filename.endswith(('.h5', '.hdf5')): - msg = 'Unable to open ""{0}"" which is not an HDF5 summary file' + msg = 'Unable to open "{0}" which is not an HDF5 summary file' raise ValueError(msg) self._f = h5py.File(filename, 'r') @@ -479,12 +479,12 @@ class Summary(object): for tally_key in tally_keys: tally_id = int(tally_key.strip('tally ')) - subbase = '"{0}""{1}"'.format(base, tally_id) + subbase = '{0}{1}'.format(base, tally_id) # Read Tally name metadata - name_size = self._f['"{0}"/name_size'.format(subbase)][0] + name_size = self._f['{0}/name_size'.format(subbase)][0] if (name_size > 0): - tally_name = self._f['"{0}"/name'.format(subbase)][0] + tally_name = self._f['{0}/name'.format(subbase)][0] tally_name = tally_name.lstrip('[\'') tally_name = tally_name.rstrip('\']') else: @@ -494,27 +494,27 @@ class Summary(object): tally = openmc.Tally(tally_id, tally_name) # Read score metadata - score_bins = self._f['"{0}"/score_bins'.format(subbase)][...] + score_bins = self._f['{0}/score_bins'.format(subbase)][...] for score_bin in score_bins: tally.add_score(openmc.SCORE_TYPES[score_bin]) - num_score_bins = self._f['"{0}"/n_score_bins'.format(subbase)][...] + num_score_bins = self._f['{0}/n_score_bins'.format(subbase)][...] tally.num_score_bins = num_score_bins # Read filter metadata - num_filters = self._f['"{0}"/n_filters'.format(subbase)][0] + num_filters = self._f['{0}/n_filters'.format(subbase)][0] # Initialize all Filters for j in range(1, num_filters+1): - subsubbase = '"{0}"/filter "{1}"'.format(subbase, j) + subsubbase = '{0}/filter {1}'.format(subbase, j) # Read filter type (e.g., "cell", "energy", etc.) - filter_type_code = self._f['"{0}"/type'.format(subsubbase)][0] + filter_type_code = self._f['{0}/type'.format(subsubbase)][0] filter_type = openmc.FILTER_TYPES[filter_type_code] # Read the filter bins - num_bins = self._f['"{0}"/n_bins'.format(subsubbase)][0] - bins = self._f['"{0}"/bins'.format(subsubbase)][...] + num_bins = self._f['{0}/n_bins'.format(subsubbase)][0] + bins = self._f['{0}/bins'.format(subsubbase)][...] # Create Filter object filter = openmc.Filter(filter_type, bins) diff --git a/openmc/surface.py b/openmc/surface.py index 0d2e8fb27c..d5d258fa7a 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -111,15 +111,15 @@ class Surface(object): def __repr__(self): string = 'Surface\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('\tType', '=\t', self._type) - string += '{0: <16}"{1}""{2}"\n'.format('\tBoundary', '=\t', self._boundary_type) + 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('\tType', '=\t', self._type) + string += '{0: <16}{1}{2}\n'.format('\tBoundary', '=\t', self._boundary_type) coeffs = '{0: <16}'.format('\tCoefficients') + '\n' for coeff in self._coeffs: - coeffs += '{0: <16}"{1}""{2}"\n'.format(coeff, '=\t', self._coeffs[coeff]) + coeffs += '{0: <16}{1}{2}\n'.format(coeff, '=\t', self._coeffs[coeff]) string += coeffs diff --git a/openmc/tallies.py b/openmc/tallies.py index 9474ef8fab..b5d626722c 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -298,7 +298,7 @@ class Tally(object): if not isinstance(trigger, Trigger): msg = 'Unable to add a tally trigger for Tally ID="{0}" to ' \ - 'since ""{1}"" is not a Trigger'.format(self.id, trigger) + 'since "{1}" is not a Trigger'.format(self.id, trigger) raise ValueError(msg) self._triggers.append(trigger) @@ -330,7 +330,7 @@ class Tally(object): """ if not isinstance(filter, Filter): - msg = 'Unable to add Filter ""{0}"" to Tally ID="{1}" since it is ' \ + msg = 'Unable to add Filter "{0}" to Tally ID="{1}" since it is ' \ 'not a Filter object'.format(filter, self.id) raise ValueError(msg) @@ -359,7 +359,7 @@ class Tally(object): """ if not isinstance(score, basestring): - msg = 'Unable to add score ""{0}"" to Tally ID="{1}" since it is ' \ + msg = 'Unable to add score "{0}" to Tally ID="{1}" since it is ' \ 'not a string'.format(score, self.id) raise ValueError(msg) @@ -405,7 +405,7 @@ class Tally(object): """ if score not in self.scores: - msg = 'Unable to remove score ""{0}"" from Tally ID="{1}" since the ' \ + msg = 'Unable to remove score "{0}" from Tally ID="{1}" since the ' \ 'Tally does not contain this score'.format(score, self.id) ValueError(msg) @@ -422,7 +422,7 @@ class Tally(object): """ if filter not in self.filters: - msg = 'Unable to remove filter ""{0}"" from Tally ID="{1}" since the ' \ + msg = 'Unable to remove filter "{0}" from Tally ID="{1}" since the ' \ 'Tally does not contain this filter'.format(filter, self.id) ValueError(msg) @@ -439,7 +439,7 @@ class Tally(object): """ if nuclide not in self.nuclides: - msg = 'Unable to remove nuclide ""{0}"" from Tally ID="{1}" since the ' \ + msg = 'Unable to remove nuclide "{0}" from Tally ID="{1}" since the ' \ 'Tally does not contain this nuclide'.format(nuclide, self.id) ValueError(msg) @@ -470,27 +470,27 @@ class Tally(object): def __repr__(self): string = 'Tally\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('\tID', '=\t', self.id) + string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self.name) string += '{0: <16}\n'.format('\tFilters') for filter in self.filters: - string += '{0: <16}\t\t"{1}"\t"{2}"\n'.format('', filter.type, + string += '{0: <16}\t\t{1}\t{2}\n'.format('', filter.type, filter.bins) - string += '{0: <16}"{1}"'.format('\tNuclides', '=\t') + string += '{0: <16}{1}'.format('\tNuclides', '=\t') for nuclide in self.nuclides: if isinstance(nuclide, Nuclide): - string += '"{0}" '.format(nuclide.name) + string += '{0} '.format(nuclide.name) else: - string += '"{0}" '.format(nuclide) + string += '{0} '.format(nuclide) string += '\n' - string += '{0: <16}"{1}""{2}"\n'.format('\tScores', '=\t', self.scores) - string += '{0: <16}"{1}""{2}"\n'.format('\tEstimator', '=\t', self.estimator) + string += '{0: <16}{1}{2}\n'.format('\tScores', '=\t', self.scores) + string += '{0: <16}{1}{2}\n'.format('\tEstimator', '=\t', self.estimator) return string @@ -681,7 +681,7 @@ class Tally(object): # If we did not find the Filter, throw an Exception if filter is None: - msg = 'Unable to find filter type ""{0}"" in ' \ + msg = 'Unable to find filter type "{0}" in ' \ 'Tally ID="{1}"'.format(filter_type, self.id) raise ValueError(msg) @@ -756,7 +756,7 @@ class Tally(object): break if nuclide_index == -1: - msg = 'Unable to get the nuclide index for Tally since ""{0}"" ' \ + msg = 'Unable to get the nuclide index for Tally since "{0}" ' \ 'is not one of the nuclides'.format(nuclide) raise KeyError(msg) else: @@ -787,7 +787,7 @@ class Tally(object): score_index = self.scores.index(score) except ValueError: - msg = 'Unable to get the score index for Tally since ""{0}"" ' \ + msg = 'Unable to get the score index for Tally since "{0}" ' \ 'is not one of the scores'.format(score) raise ValueError(msg) @@ -945,7 +945,7 @@ class Tally(object): data = self.sum_sq[indices] else: msg = 'Unable to return results from Tally ID="{0}" since the ' \ - 'the requested value ""{1}"" is not \'mean\', \'std_dev\', ' \ + 'the requested value "{1}" is not \'mean\', \'std_dev\', ' \ '\rel_err\', \'sum\', or \'sum_sq\''.format(self.id, value) raise LookupError(msg) @@ -1299,19 +1299,19 @@ class Tally(object): if not isinstance(filename, basestring): msg = 'Unable to export the results for Tally ID="{0}" to ' \ - 'filename=""{1}"" since it is not a ' \ + 'filename="{1}" since it is not a ' \ 'string'.format(self.id, filename) raise ValueError(msg) elif not isinstance(directory, basestring): msg = 'Unable to export the results for Tally ID="{0}" to ' \ - 'directory=""{1}"" since it is not a ' \ + 'directory="{1}" since it is not a ' \ 'string'.format(self.id, directory) raise ValueError(msg) elif format not in ['hdf5', 'pkl', 'csv']: msg = 'Unable to export the results for Tally ID="{0}" to format ' \ - '""{1}"" since it is not supported'.format(self.id, format) + '"{1}" since it is not supported'.format(self.id, format) raise ValueError(msg) elif not isinstance(append, bool): diff --git a/openmc/trigger.py b/openmc/trigger.py index a75ce4d168..569ccf7681 100644 --- a/openmc/trigger.py +++ b/openmc/trigger.py @@ -104,9 +104,9 @@ class Trigger(object): def __repr__(self): string = 'Trigger\n' - string += '{0: <16}"{1}""{2}"\n'.format('\tType', '=\t', self._trigger_type) - string += '{0: <16}"{1}""{2}"\n'.format('\tThreshold', '=\t', self._threshold) - string += '{0: <16}"{1}""{2}"\n'.format('\tScores', '=\t', self._scores) + string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._trigger_type) + string += '{0: <16}{1}{2}\n'.format('\tThreshold', '=\t', self._threshold) + string += '{0: <16}{1}{2}\n'.format('\tScores', '=\t', self._scores) return string def get_trigger_xml(self, element): diff --git a/openmc/universe.py b/openmc/universe.py index 89699f0173..b7ec86937c 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -289,31 +289,31 @@ class Cell(object): def __repr__(self): string = 'Cell\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('\tID', '=\t', self._id) + string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) if isinstance(self._fill, openmc.Material): - string += '{0: <16}"{1}""{2}"\n'.format('\tMaterial', '=\t', + string += '{0: <16}{1}{2}\n'.format('\tMaterial', '=\t', self._fill._id) elif isinstance(self._fill, (Universe, Lattice)): - string += '{0: <16}"{1}""{2}"\n'.format('\tFill', '=\t', + string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t', self._fill._id) else: - string += '{0: <16}"{1}""{2}"\n'.format('\tFill', '=\t', self._fill) + string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t', self._fill) - string += '{0: <16}"{1}"\n'.format('\tSurfaces', '=\t') + string += '{0: <16}{1}\n'.format('\tSurfaces', '=\t') for surface_id in self._surfaces: halfspace = self._surfaces[surface_id][1] - string += '"{0}" '.format(halfspace * surface_id) + string += '{0} '.format(halfspace * surface_id) string = string.rstrip(' ') + '\n' - string += '{0: <16}"{1}""{2}"\n'.format('\tRotation', '=\t', + string += '{0: <16}{1}{2}\n'.format('\tRotation', '=\t', self._rotation) - string += '{0: <16}"{1}""{2}"\n'.format('\tTranslation', '=\t', + string += '{0: <16}{1}{2}\n'.format('\tTranslation', '=\t', self._translation) - string += '{0: <16}"{1}""{2}"\n'.format('\tOffset', '=\t', self._offsets) + string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self._offsets) return string @@ -582,11 +582,11 @@ class Universe(object): 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', + 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', + string += '{0: <16}{1}{2}\n'.format('\t# Regions', '=\t', self._num_regions) return string @@ -870,26 +870,26 @@ class RectLattice(Lattice): def __repr__(self): string = 'RectLattice\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('\tDimension', '=\t', + 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('\tDimension', '=\t', self._dimension) - string += '{0: <16}"{1}""{2}"\n'.format('\tLower Left', '=\t', + string += '{0: <16}{1}{2}\n'.format('\tLower Left', '=\t', self._lower_left) - string += '{0: <16}"{1}""{2}"\n'.format('\tPitch', '=\t', self._pitch) + string += '{0: <16}{1}{2}\n'.format('\tPitch', '=\t', self._pitch) if self._outer is not None: - string += '{0: <16}"{1}""{2}"\n'.format('\tOuter', '=\t', + string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', self._outer._id) else: - string += '{0: <16}"{1}""{2}"\n'.format('\tOuter', '=\t', + string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', self._outer) string += '{0: <16}\n'.format('\tUniverses') # Lattice nested Universe IDs - column major for Fortran for i, universe in enumerate(np.ravel(self._universes)): - string += '"{0}" '.format(universe._id) + string += '{0} '.format(universe._id) # Add a newline character every time we reach end of row of cells if (i+1) % self._dimension[-1] == 0: @@ -902,7 +902,7 @@ class RectLattice(Lattice): # Lattice cell offsets for i, offset in enumerate(np.ravel(self._offsets)): - string += '"{0}" '.format(offset) + string += '{0} '.format(offset) # Add a newline character when we reach end of row of cells if (i+1) % self._dimension[-1] == 0: @@ -914,7 +914,7 @@ class RectLattice(Lattice): def create_xml_subelement(self, xml_element): # Determine if XML element already contains subelement for this Lattice - path = './lattice[@id=\'"{0}"\']'.format(self._id) + path = './lattice[@id=\'{0}\']'.format(self._id) test = xml_element.find(path) # If the element does contain the Lattice subelement, then return @@ -934,7 +934,7 @@ class RectLattice(Lattice): # Export the Lattice outer Universe (if specified) if self._outer is not None: outer = ET.SubElement(lattice_subelement, "outer") - outer.text = '"{0}"'.format(self._outer._id) + outer.text = '{0}'.format(self._outer._id) self._outer.create_xml_subelement(xml_element) # Export Lattice cell dimensions @@ -956,7 +956,7 @@ class RectLattice(Lattice): universe = self._universes[x][y][z] # Append Universe ID to the Lattice XML subelement - universe_ids += '"{0}" '.format(universe._id) + universe_ids += '{0} '.format(universe._id) # Create XML subelement for this Universe universe.create_xml_subelement(xml_element) @@ -974,7 +974,7 @@ class RectLattice(Lattice): universe = self._universes[x][y] # Append Universe ID to Lattice XML subelement - universe_ids += '"{0}" '.format(universe._id) + universe_ids += '{0} '.format(universe._id) # Create XML subelement for this Universe universe.create_xml_subelement(xml_element) From a11c1993c67a6abe604ef3d9e8abd7c7562a09aa Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 3 Aug 2015 22:02:44 -0700 Subject: [PATCH 044/101] Added get_bin_index, __hash__ and __deepcopy__ methods to CrossFilter --- openmc/cross.py | 78 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 15 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 123886ddf6..735bb4cd26 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -210,6 +210,28 @@ class CrossFilter(object): if binary_op is not None: self.binary_op = binary_op + def __hash__(self): + return hash((self.type, self.bins)) + + def __deepcopy__(self, memo): + existing = memo.get(id(self)) + + # If this is the first time we have tried to copy this object, create a copy + if existing is None: + clone = type(self).__new__(type(self)) + clone._left_filter = self.left_filter + clone._right_filter = self.right_filter + clone._type = self.type + clone._bins = self.bins + clone._num_bins = self.num_bins + memo[id(self)] = clone + + return clone + + # If this object has been copied before, return the first copy made + else: + return existing + @property def left_filter(self): return self._left_filter @@ -257,20 +279,6 @@ class CrossFilter(object): def __eq__(self, other): return str(other) == str(self) - def __repr__(self): - - string = 'CrossFilter\n' - filter_type = '({0} {1} {2})'.format(self.left_filter.type, - self.binary_op, - self.right_filter.type) - filter_bins = '({0} {1} {2})'.format(self.left_filter.bins, - self.binary_op, - self.right_filter.bins) - string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', filter_type) - string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', filter_bins) - return string - - def split_filters(self): split_filters = [] @@ -289,4 +297,44 @@ class CrossFilter(object): else: split_filters.extend(self.right_filter.split_filters()) - return split_filters \ No newline at end of file + return split_filters + + def get_bin_index(self, filter_bin): + """Returns the index in the CrossFilter for some bin. + + Parameters + ---------- + filter_bin : 2-tuple + A 2-tuple where each value corresponds to the bin of interest + in the left and right filter, respectively. A bin is the integer + ID for 'material', 'surface', 'cell', 'cellborn', and 'universe' + Filters. The bin is an integer for the cell instance ID for + 'distribcell' Filters. The bin is a 2-tuple of floats for 'energy' + and 'energyout' filters corresponding to the energy boundaries of + the bin of interest. The bin is a (x,y,z) 3-tuple for 'mesh' + filters corresponding to the mesh cell of interest. + + Returns + ------- + filter_index : int + The index in the Tally data array for this filter bin. + + """ + + left_index = self.left_filter.get_bin_index(filter_bin[0]) + right_index = self.right_filter.get_bin_index(filter_bin[0]) + filter_index = left_index * self.right_filter.num_bins + right_index + return filter_index + + def __repr__(self): + + string = 'CrossFilter\n' + filter_type = '({0} {1} {2})'.format(self.left_filter.type, + self.binary_op, + self.right_filter.type) + filter_bins = '({0} {1} {2})'.format(self.left_filter.bins, + self.binary_op, + self.right_filter.bins) + string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', filter_type) + string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', filter_bins) + return string From ff12e253afa550c7bd113bd5c7f5860b836b19fe Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 4 Aug 2015 21:33:34 -0700 Subject: [PATCH 045/101] Fixed double quotes in filter.py --- openmc/filter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/filter.py b/openmc/filter.py index 93ee094539..a68d2a8060 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -109,7 +109,7 @@ class Filter(object): if type is None: self._type = type elif type not in FILTER_TYPES.values(): - msg = 'Unable to set Filter type to ""{0}" since it is not one ' \ + msg = 'Unable to set Filter type to "{0}" since it is not one ' \ 'of the supported types'.format(type) raise ValueError(msg) From 547acb2ecccc1a6b88c1039dbccc38a163b7a754 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 4 Aug 2015 21:36:18 -0700 Subject: [PATCH 046/101] Removed extraneous quotes in __repr__ methods --- openmc/material.py | 2 +- openmc/nuclide.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index 0f5a5a4434..e495357b54 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -338,7 +338,7 @@ class Material(object): string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) string += '{0: <16}{1}{2}'.format('\tDensity', '=\t', self._density) - string += ' ["{0}"]\n'.format(self._density_units) + string += ' [{0}]\n'.format(self._density_units) string += '{0: <16}\n'.format('\tS(a,b) Tables') diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 6f6f75f9c9..7e7cd5af35 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -88,7 +88,7 @@ class Nuclide(object): self._zaid = zaid def __repr__(self): - string = 'Nuclide - "{0}"\n'.format(self._name) + string = 'Nuclide - {0}\n'.format(self._name) string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs) if self._zaid is not None: string += '{0: <16}{1}{2}\n'.format('\tZAID', '=\t', self._zaid) From df371b68570112f7a99fc148a5c4a9fd74efd58e Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 4 Aug 2015 21:39:11 -0700 Subject: [PATCH 047/101] Removed extraneous quotes from Tally.get_tally_xml --- openmc/tallies.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index b5d626722c..45ce74405a 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -609,7 +609,7 @@ class Tally(object): if filter.bins is not None: bins = '' for bin in filter.bins: - bins += '"{0}" '.format(bin) + bins += '{0} '.format(bin) subelement.set("bins", bins.rstrip(' ')) @@ -618,9 +618,9 @@ class Tally(object): nuclides = '' for nuclide in self.nuclides: if isinstance(nuclide, Nuclide): - nuclides += '"{0}" '.format(nuclide.name) + nuclides += '{0} '.format(nuclide.name) else: - nuclides += '"{0}" '.format(nuclide) + nuclides += '{0} '.format(nuclide) subelement = ET.SubElement(element, "nuclides") subelement.text = nuclides.rstrip(' ') @@ -634,7 +634,7 @@ class Tally(object): else: scores = '' for score in self.scores: - scores += '"{0}" '.format(score) + scores += '{0} '.format(score) subelement = ET.SubElement(element, "scores") subelement.text = scores.rstrip(' ') From 3b46d3174140672cb3f4be023f67ada00890989c Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 4 Aug 2015 21:40:57 -0700 Subject: [PATCH 048/101] Removed double quotes from Trigger.add_score --- openmc/trigger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/trigger.py b/openmc/trigger.py index 569ccf7681..e695defde2 100644 --- a/openmc/trigger.py +++ b/openmc/trigger.py @@ -92,7 +92,7 @@ class Trigger(object): """ if not isinstance(score, basestring): - msg = 'Unable to add score ""{0}"" to tally trigger since ' \ + msg = 'Unable to add score "{0}" to tally trigger since ' \ 'it is not a string'.format(score) raise ValueError(msg) From f6379265505302227e3665383491ff85b07b46de Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 4 Aug 2015 21:43:02 -0700 Subject: [PATCH 049/101] Removed quotes from Universe.create_xml_subelement --- openmc/universe.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/universe.py b/openmc/universe.py index b7ec86937c..c71b632164 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -343,7 +343,7 @@ class Cell(object): for surface_id in self._surfaces: # Determine if XML element already includes this Surface - path = './surface[@id=\'"{0}"\']'.format(surface_id) + path = './surface[@id=\'{0}\']'.format(surface_id) test = xml_element.find(path) # If the element does not contain the Surface subelement @@ -355,7 +355,7 @@ class Cell(object): # Append the halfspace and Surface ID halfspace = self._surfaces[surface_id][1] - surfaces += '"{0}" '.format(halfspace * surface_id) + surfaces += '{0} '.format(halfspace * surface_id) element.set("surfaces", surfaces.rstrip(' ')) From 4ed34c43c5cd7296ce8bf27969627023a46c2599 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 4 Aug 2015 21:45:42 -0700 Subject: [PATCH 050/101] Removed extraneous quotes from Universe and its subclasses --- openmc/universe.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/openmc/universe.py b/openmc/universe.py index c71b632164..a8b2f3a599 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -1149,19 +1149,19 @@ class HexLattice(Lattice): def __repr__(self): string = 'HexLattice\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('\t# Rings', '=\t', self._num_rings) - string += '{0: <16}"{1}""{2}"\n'.format('\t# Axial', '=\t', self._num_axial) - string += '{0: <16}"{1}""{2}"\n'.format('\tCenter', '=\t', + 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('\t# Rings', '=\t', self._num_rings) + string += '{0: <16}{1}{2}"\n'.format('\t# Axial', '=\t', self._num_axial) + string += '{0: <16}{1}{2}"\n'.format('\tCenter', '=\t', self._center) - string += '{0: <16}"{1}""{2}"\n'.format('\tPitch', '=\t', self._pitch) + string += '{0: <16}{1}{2}"\n'.format('\tPitch', '=\t', self._pitch) if self._outer is not None: - string += '{0: <16}"{1}""{2}"\n'.format('\tOuter', '=\t', + string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', self._outer._id) else: - string += '{0: <16}"{1}""{2}"\n'.format('\tOuter', '=\t', + string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', self._outer) string += '{0: <16}\n'.format('\tUniverses') @@ -1177,7 +1177,7 @@ class HexLattice(Lattice): def create_xml_subelement(self, xml_element): # Determine if XML element already contains subelement for this Lattice - path = './hex_lattice[@id=\'"{0}"\']'.format(self._id) + path = './hex_lattice[@id=\'{0}\']'.format(self._id) test = xml_element.find(path) # If the element does contain the Lattice subelement, then return @@ -1197,7 +1197,7 @@ class HexLattice(Lattice): # Export the Lattice outer Universe (if specified) if self._outer is not None: outer = ET.SubElement(lattice_subelement, "outer") - outer.text = '"{0}"'.format(self._outer._id) + outer.text = '{0}'.format(self._outer._id) self._outer.create_xml_subelement(xml_element) lattice_subelement.set("n_rings", str(self._num_rings)) From 0ee4df0f2ab278db919a936fffe30112ce56d3b3 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 4 Aug 2015 22:00:07 -0700 Subject: [PATCH 051/101] Removed extraneous quotes from Tally.get_pandas_dataframe(...) --- openmc/tallies.py | 10 +++++----- openmc/universe.py | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 45ce74405a..45cc4f0986 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1036,7 +1036,7 @@ class Tally(object): # Append Mesh ID as outermost index of mult-index mesh_id = filter.mesh.id - mesh_key = 'mesh "{0}"'.format(mesh_id) + mesh_key = 'mesh {0}'.format(mesh_id) # Find mesh dimensions - use 3D indices for simplicity if (len(filter.mesh.dimension) == 3): @@ -1128,7 +1128,7 @@ class Tally(object): # Initialize prefix Multi-index keys counter += 1 - level_key = 'level "{0}"'.format(counter) + level_key = 'level {0}'.format(counter) univ_key = (level_key, 'univ', 'id') cell_key = (level_key, 'cell', 'id') lat_id_key = (level_key, 'lat', 'id') @@ -1335,7 +1335,7 @@ class Tally(object): tally_results = h5py.File(filename, 'w') # Create an HDF5 group within the file for this particular Tally - tally_group = tally_results.create_group('Tally-"{0}"'.format(self.id)) + tally_group = tally_results.create_group('Tally-{0}'.format(self.id)) # Add basic Tally data to the HDF5 group tally_group.create_dataset('id', data=self.id) @@ -1377,8 +1377,8 @@ class Tally(object): tally_results = {} # Create a nested dictionary within the file for this particular Tally - tally_results['Tally-"{0}"'.format(self.id)] = {} - tally_group = tally_results['Tally-"{0}"'.format(self.id)] + tally_results['Tally-{0}'.format(self.id)] = {} + tally_group = tally_results['Tally-{0}'.format(self.id)] # Add basic Tally data to the nested dictionary tally_group['id'] = self.id diff --git a/openmc/universe.py b/openmc/universe.py index a8b2f3a599..1a45d86666 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -1149,13 +1149,13 @@ class HexLattice(Lattice): def __repr__(self): string = 'HexLattice\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('\t# Rings', '=\t', self._num_rings) - string += '{0: <16}{1}{2}"\n'.format('\t# Axial', '=\t', self._num_axial) - string += '{0: <16}{1}{2}"\n'.format('\tCenter', '=\t', + 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('\t# Rings', '=\t', self._num_rings) + string += '{0: <16}{1}{2}\n'.format('\t# Axial', '=\t', self._num_axial) + string += '{0: <16}{1}{2}\n'.format('\tCenter', '=\t', self._center) - string += '{0: <16}{1}{2}"\n'.format('\tPitch', '=\t', self._pitch) + string += '{0: <16}{1}{2}\n'.format('\tPitch', '=\t', self._pitch) if self._outer is not None: string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', From 1dca4d842bfff20f6ea3cb8a9a5faab2734f8792 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 5 Aug 2015 19:10:03 -0600 Subject: [PATCH 052/101] Fix hex lattices in HDF5 summary --- openmc/summary.py | 72 ++++++++++++++++++++++++++++++++++++++------ src/hdf5_summary.F90 | 8 ++--- 2 files changed, 67 insertions(+), 13 deletions(-) diff --git a/openmc/summary.py b/openmc/summary.py index c0673ef233..2165d114ad 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -411,16 +411,70 @@ class Summary(object): if outer != -22: lattice.outer = self.universes[outer] - # Build array of Universe pointers for the Lattice - universes = \ - np.ndarray(tuple(universe_ids.shape), dtype=openmc.Universe) + # Build array of Universe pointers for the Lattice. Note that + # we need to convert between the HDF5's square array of + # (x, alpha, z) to the PythonAPI's format of a ragged nested + # nested list of (z, ring, theta). + universes = [] + for z in range(lattice.num_axial): + # Add a list for this axial level. + universes.append([]) + x = lattice.num_rings - 1 + a = 2*lattice.num_rings - 2 + for r in range(lattice.num_rings - 1, 0, -1): + # Add a list for this ring. + universes[-1].append([]) - for i in range(universe_ids.shape[0]): - for j in range(universe_ids.shape[1]): - for k in range(universe_ids.shape[2]): - if universe_ids[i, j, k] != -1: - universes[i, j, k] = self.get_universe_by_id( - universe_ids[i, j, k]) + # Climb down the top-right. + for i in range(r): + universes[-1][-1].append(universe_ids[z, a, x]) + x += 1 + a -= 1 + + # Climb down the right. + for i in range(r): + universes[-1][-1].append(universe_ids[z, a, x]) + a -= 1 + + # Climb down the bottom-right. + for i in range(r): + universes[-1][-1].append(universe_ids[z, a, x]) + x -= 1 + + # Climb up the bottom-left. + for i in range(r): + universes[-1][-1].append(universe_ids[z, a, x]) + x -= 1 + a += 1 + + # Climb up the left. + for i in range(r): + universes[-1][-1].append(universe_ids[z, a, x]) + a += 1 + + # Climb up the top-left. + for i in range(r): + universes[-1][-1].append(universe_ids[z, a, x]) + x += 1 + + # Move down to the next ring. + a -= 1 + + # Convert the ids into Universe objects. + universes[-1][-1] = [self.get_universe_by_id(u_id) + for u_id in universes[-1][-1]] + + # Handle the degenerate center ring separately. + u_id = universe_ids[z, a, x] + universes[-1].append([self.get_universe_by_id(u_id)]) + + # Add the universes to the lattice. + if len(pitch) == 2: + # Lattice is 3D + lattice.universes = universes + else: + # Lattice is 2D; extract the only axial level + lattice.universes = universes[0] if offset_size > 0: lattice.offsets = offsets diff --git a/src/hdf5_summary.F90 b/src/hdf5_summary.F90 index 161246f1c9..15caf2edfa 100644 --- a/src/hdf5_summary.F90 +++ b/src/hdf5_summary.F90 @@ -394,7 +394,7 @@ contains ! Write number of lattice cells. call su % write_data(lat % n_rings, "n_rings", & group="geometry/lattices/lattice " // trim(to_str(lat % id))) - call su % write_data(lat % n_rings, "n_axial", & + call su % write_data(lat % n_axial, "n_axial", & group="geometry/lattices/lattice " // trim(to_str(lat % id))) ! Write lattice center, pitch and outer universe. @@ -407,10 +407,10 @@ contains end if if (lat % is_3d) then - call su % write_data(lat % pitch, "pitch", length=3, & + call su % write_data(lat % pitch, "pitch", length=2, & group="geometry/lattices/lattice " // trim(to_str(lat % id))) else - call su % write_data(lat % pitch, "pitch", length=2, & + call su % write_data(lat % pitch, "pitch", length=1, & group="geometry/lattices/lattice " // trim(to_str(lat % id))) end if @@ -447,7 +447,7 @@ contains end do end do call su % write_data(lattice_universes, "universes", & - &length=(/lat % n_axial, 2*lat % n_rings-1, 2*lat % n_rings-1/), & + &length=(/2*lat % n_rings-1, 2*lat % n_rings-1, lat % n_axial/), & &group="geometry/lattices/lattice " // trim(to_str(lat % id))) deallocate(lattice_universes) end select From 39ecaa225b0c3da04709b34b33f02ead7cdfe5b3 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 6 Aug 2015 22:53:48 -0700 Subject: [PATCH 053/101] Simplified filter index building in Tally.get_values(...) per @paulromanos comments --- openmc/tallies.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index bb9aaf06d4..ff32ba7b7e 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -872,9 +872,6 @@ class Tally(object): # Loop over all of the Tally's Filters for i, filter in enumerate(self.filters): - # Initialize empty list of indices for this Filter's bins - filter_indices.append([]) - user_filter = False # If a user-requested Filter, get the user-requested bins @@ -902,18 +899,16 @@ class Tally(object): else: bins = filter.bins + # Initialize a NumPy array for the Filter bin indices + filter_indices.append(np.zeros(len(bins), dtype=np.int)) + # Add indices for each bin in this Filter to the list - for bin in bins: - if user_filter: - filter_indices[i].append( - self.get_filter_index(filter.type, bin)) - else: - filter_indices[i].append( - self.get_filter_index(filter.type, bin)) + for j, bin in enumerate(bins): + filter_index = self.get_filter_index(filter.type, bin) + filter_indices[i][j] = filter_index # Account for stride in each of the previous filters - reverse_mult = lambda x: [xi * filter.num_bins for xi in x] - filter_indices[:i] = map(reverse_mult, filter_indices[:i]) + filter_indices[:i] *= filter.num_bins # Apply outer product sum between all filter bin indices filter_indices = list(map(sum, itertools.product(*filter_indices))) @@ -1010,7 +1005,7 @@ class Tally(object): """ # Ensure that StatePoint.read_results() was called first - if self._sum is None or self._sum_sq is None: + if self.mean is None or self.std_dev is None: msg = 'The Tally ID={0} has no data to return. Call the ' \ 'StatePoint.read_results() method before using ' \ 'Tally.get_pandas_dataframe(...)'.format(self.id) From 3890ed4d673c18fd18ace5746a824c21f9de6c89 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 6 Aug 2015 23:03:50 -0700 Subject: [PATCH 054/101] Simplified tile and repeat factors in Tally._align_tally_data() --- openmc/tallies.py | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index ff32ba7b7e..4689da0145 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1441,8 +1441,8 @@ class Tally(object): The tally on the right hand side of the outer product new_tally: Tally The new tally to represent the outer product - op : str - The binary operation in the outer product ('+', '-', '*', '/', '^') + binary_op : {'+', '-', '*', '/', '^'} + The binary operation in the outer product """ @@ -1519,11 +1519,8 @@ class Tally(object): # Determine the number of paired combinations of filter bins # between the two tallies and repeat arrays along filter axes - self_num_filter_bins = self.num_filter_bins - other_num_filter_bins = other.num_filter_bins - num_filter_bins = self_num_filter_bins * other_num_filter_bins - self_repeat_factor = num_filter_bins / self_num_filter_bins - other_tile_factor = num_filter_bins / other_num_filter_bins + self_repeat_factor = other.num_filter_bins + other_tile_factor = self.num_filter_bins # Replicate the data self_mean = np.repeat(self_mean, self_repeat_factor, axis=0) @@ -1535,11 +1532,8 @@ class Tally(object): # Determine the number of paired combinations of nuclides # between the two tallies and repeat arrays along nuclide axes - self_num_nuclide_bins = self.num_nuclides - other_num_nuclide_bins = other.num_nuclides - num_nuclide_bins = self_num_nuclide_bins * other_num_nuclide_bins - self_repeat_factor = num_nuclide_bins / self_num_nuclide_bins - other_tile_factor = num_nuclide_bins / other_num_nuclide_bins + self_repeat_factor = other.num_nuclides + other_tile_factor = self.num_nuclides # Replicate the data self_mean = np.repeat(self_mean, self_repeat_factor, axis=1) @@ -1551,11 +1545,8 @@ class Tally(object): # Determine the number of paired combinations of score bins # between the two tallies and repeat arrays along score axes - self_num_score_bins = self.num_score_bins - other_num_score_bins = other.num_score_bins - num_score_bins = self_num_score_bins * other_num_score_bins - self_repeat_factor = num_score_bins / self_num_score_bins - other_tile_factor = num_score_bins / other_num_score_bins + self_repeat_factor = other.num_score_bins + other_tile_factor = self.num_score_bins # Replicate the data self_mean = np.repeat(self_mean, self_repeat_factor, axis=2) From 9db3a343cab6ca41a1b48fb67af130b48a45e9fb Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 6 Aug 2015 23:12:22 -0700 Subject: [PATCH 055/101] Made all tallies created with tally arithmetic have name "derived" --- openmc/tallies.py | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 4689da0145..325eca925e 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -3,7 +3,7 @@ import copy import os import pickle import itertools -from numbers import Integral, Rational +from numbers import Integral, Real from xml.etree import ElementTree as ET import sys @@ -1582,7 +1582,7 @@ class Tally(object): Parameters ---------- - other : Tally or Integer or Rational + other : Tally or Real The tally or scalar value to add to this tally Returns @@ -1599,7 +1599,7 @@ class Tally(object): 'since it does not contain any results.'.format(self.id) raise ValueError(msg) - new_tally = Tally() + new_tally = Tally(name='derived') new_tally.with_batch_statistics = True if isinstance(other, Tally): @@ -1613,10 +1613,10 @@ class Tally(object): self._outer_product(other, new_tally, binary_op='+') data = self._align_tally_data(other) new_tally._mean = data['self']['mean'] + data['other']['mean'] - new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + \ + new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + data['other']['std. dev.']**2) - elif isinstance(other, (Integral, Rational)): + elif isinstance(other, Real): new_tally.name = self.name new_tally._mean = self._mean + other @@ -1658,7 +1658,7 @@ class Tally(object): Parameters ---------- - other : Tally or Integer or Rational + other : Tally or Real The tally or scalar value to subtract from this tally Returns @@ -1675,7 +1675,7 @@ class Tally(object): 'since it does not contain any results.'.format(self.id) raise ValueError(msg) - new_tally = Tally() + new_tally = Tally(name='derived') new_tally.with_batch_statistics = True if isinstance(other, Tally): @@ -1689,10 +1689,10 @@ class Tally(object): self._outer_product(other, new_tally, binary_op='-') data = self._align_tally_data(other) new_tally._mean = data['self']['mean'] - data['other']['mean'] - new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + \ + new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + data['other']['std. dev.']**2) - elif isinstance(other, (Integral, Rational)): + elif isinstance(other, Real): new_tally.name = self.name new_tally._mean = self._mean - other @@ -1735,7 +1735,7 @@ class Tally(object): Parameters ---------- - other : Tally or Integer or Rational + other : Tally or Real The tally or scalar value to multiply with this tally Returns @@ -1752,7 +1752,7 @@ class Tally(object): 'since it does not contain any results.'.format(self.id) raise ValueError(msg) - new_tally = Tally() + new_tally = Tally(name='derived') new_tally.with_batch_statistics = True if isinstance(other, Tally): @@ -1771,7 +1771,7 @@ class Tally(object): new_tally._std_dev = np.abs(new_tally.mean) * \ np.sqrt(self_rel_err**2 + other_rel_err**2) - elif isinstance(other, (Integral, Rational)): + elif isinstance(other, Real): new_tally.name = self.name new_tally._mean = self._mean * other @@ -1814,7 +1814,7 @@ class Tally(object): Parameters ---------- - other : Tally or Integer or Rational + other : Tally or Real The tally or scalar value to divide this tally by Returns @@ -1850,7 +1850,7 @@ class Tally(object): new_tally._std_dev = np.abs(new_tally.mean) * \ np.sqrt(self_rel_err**2 + other_rel_err**2) - elif isinstance(other, (Integral, Rational)): + elif isinstance(other, Real): new_tally.name = self.name new_tally._mean = self._mean / other @@ -1893,7 +1893,7 @@ class Tally(object): Parameters ---------- - other : Tally or Integer or Rational + power : Tally or Real The tally or scalar value exponent Returns @@ -1930,7 +1930,7 @@ class Tally(object): new_tally._std_dev = np.abs(new_tally.mean) * \ np.sqrt(first_term**2 + second_term**2) - elif isinstance(power, (Integral, Rational)): + elif isinstance(power, Real): new_tally.name = self.name new_tally._mean = self._mean ** power @@ -1962,7 +1962,7 @@ class Tally(object): Parameters ---------- - other : Integer or Rational + other : Integer or Real The scalar value to add to this tally Returns @@ -1981,7 +1981,7 @@ class Tally(object): Parameters ---------- - other : Integer or Rational + other : Integer or Real The scalar value to subtract this tally from Returns @@ -2000,7 +2000,7 @@ class Tally(object): Parameters ---------- - other : Integer or Rational + other : Integer or Real The scalar value to multiply with this tally Returns @@ -2019,7 +2019,7 @@ class Tally(object): Parameters ---------- - other : Integer or Rational + other : Integer or Real The scalar value to divide by this tally Returns @@ -2029,7 +2029,7 @@ class Tally(object): """ - return self * (1. / other) + return other * self**-1 def __pos__(self): """The absolute value of this tally. From 1154c07438cc5e66530464b6bf7ee5177d543ba5 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 6 Aug 2015 23:41:38 -0700 Subject: [PATCH 056/101] Refactored Tally._outer_product(...) and operator overloads per @paulromano suggestion --- openmc/tallies.py | 239 ++++++++++++++++++++++++---------------------- 1 file changed, 125 insertions(+), 114 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 325eca925e..733d053721 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -101,6 +101,7 @@ class Tally(object): self._mean = None self._std_dev = None self._with_batch_statistics = False + self._derived = False def __deepcopy__(self, memo): existing = memo.get(id(self)) @@ -119,6 +120,7 @@ class Tally(object): clone._std_dev = copy.deepcopy(self.std_dev, memo) clone._with_summary = self.with_summary clone._with_batch_statistics = self.with_batch_statistics + clone._derived = self.derived clone._filters = [] for filter in self.filters: @@ -281,6 +283,10 @@ class Tally(object): def with_batch_statistics(self): return self._with_batch_statistics + @property + def derived(self): + return self._derived + @estimator.setter def estimator(self, estimator): check_value('estimator', estimator, ['analog', 'tracklength']) @@ -410,8 +416,8 @@ class Tally(object): """ if score not in self.scores: - msg = 'Unable to remove score "{0}" from Tally ID="{1}" since the ' \ - 'Tally does not contain this score'.format(score, self.id) + msg = 'Unable to remove score "{0}" from Tally ID="{1}" since ' \ + 'the Tally does not contain this score'.format(score, self.id) ValueError(msg) self._scores.remove(score) @@ -1006,7 +1012,7 @@ class Tally(object): # Ensure that StatePoint.read_results() was called first if self.mean is None or self.std_dev is None: - msg = 'The Tally ID={0} has no data to return. Call the ' \ + msg = 'The Tally ID="{0}" has no data to return. Call the ' \ 'StatePoint.read_results() method before using ' \ 'Tally.get_pandas_dataframe(...)'.format(self.id) raise KeyError(msg) @@ -1427,7 +1433,7 @@ class Tally(object): # Pickle the Tally results to a file pickle.dump(tally_results, open(filename, 'wb')) - def _outer_product(self, other, new_tally, binary_op): + def _outer_product(self, other, binary_op): """Combines filters, scores and nuclides with another tally. This is a helper method for the tally arithmetic methods. The filters, @@ -1439,14 +1445,66 @@ class Tally(object): ---------- other : Tally The tally on the right hand side of the outer product - new_tally: Tally - The new tally to represent the outer product binary_op : {'+', '-', '*', '/', '^'} The binary operation in the outer product + Returns + ------- + Tally + A new Tally outer that is the outer product with this one. + + Raises + ------ + ValueError + When this method is called before the other tally is populated + with data by the StatePoint.read_results() method. + """ - new_tally.name = '({0} {1} {2})'.format(self.name, binary_op, other.name) + # Check that results have been read + if not other.derived and other.sum is None: + msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ + 'since it does not contain any results.'.format(other.id) + raise ValueError(msg) + + new_name = '({0} {1} {2})'.format(self.name, binary_op, other.name) + new_tally = Tally(name=new_name) + new_tally.with_batch_statistics = True + + data = self._align_tally_data(other) + + if binary_op == '+': + new_tally._mean = data['self']['mean'] + data['other']['mean'] + new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + + data['other']['std. dev.']**2) + elif binary_op == '-': + data = self._align_tally_data(other) + new_tally._mean = data['self']['mean'] - data['other']['mean'] + new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + + data['other']['std. dev.']**2) + elif binary_op == '*': + data = self._align_tally_data(other) + self_rel_err = data['self']['std. dev.'] / data['self']['mean'] + other_rel_err = data['other']['std. dev.'] / data['other']['mean'] + new_tally._mean = data['self']['mean'] * data['other']['mean'] + new_tally._std_dev = np.abs(new_tally.mean) * \ + np.sqrt(self_rel_err**2 + other_rel_err**2) + elif binary_op == '/': + data = self._align_tally_data(other) + self_rel_err = data['self']['std. dev.'] / data['self']['mean'] + other_rel_err = data['other']['std. dev.'] / data['other']['mean'] + new_tally._mean = data['self']['mean'] / data['other']['mean'] + new_tally._std_dev = np.abs(new_tally.mean) * \ + np.sqrt(self_rel_err**2 + other_rel_err**2) + elif binary_op == '^': + data = self._align_tally_data(power) + mean_ratio = data['other']['mean'] / data['self']['mean'] + first_term = mean_ratio * data['self']['std. dev.'] + second_term = \ + np.log(data['self']['mean']) * data['other']['std. dev.'] + new_tally._mean = data['self']['mean'] ** data['other']['mean'] + 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 @@ -1485,6 +1543,8 @@ class Tally(object): new_nuclide = CrossNuclide(self_nuclide, other_nuclide, binary_op) new_tally.add_nuclide(new_nuclide) + return new_tally + def _align_tally_data(self, other): """Aligns data from two tallies for tally arithmetic. @@ -1508,6 +1568,7 @@ class Tally(object): A dictionary of dictionaries to "aligned" 'mean' and 'std. dev' NumPy arrays for each tally's data. + """ self_mean = copy.deepcopy(self.mean) @@ -1591,33 +1652,26 @@ class Tally(object): A new derived tally which is the sum of this tally and the other tally or scalar value in the addition. + Raises + ------ + ValueError + When this method is called before the Tally is populated with data + by the StatePoint.read_results() method. + """ # Check that results have been read - if self.sum is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + if not self.derived and self.sum is None: + msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) - new_tally = Tally(name='derived') - new_tally.with_batch_statistics = True - if isinstance(other, Tally): - - # Check that results have been read - if other.sum is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(other.id) - raise ValueError(msg) - - self._outer_product(other, new_tally, binary_op='+') - data = self._align_tally_data(other) - new_tally._mean = data['self']['mean'] + data['other']['mean'] - new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + - data['other']['std. dev.']**2) + new_tally = self._outer_product(other, binary_op='+') elif isinstance(other, Real): - + new_tally = Tally(name='derived') + new_tally.with_batch_statistics = True new_tally.name = self.name new_tally._mean = self._mean + other new_tally._std_dev = self._std_dev @@ -1634,7 +1688,7 @@ class Tally(object): new_tally.add_score(score) else: - msg = 'Unable to add {0} to Tally ID={1}'.format(other, self.id) + msg = 'Unable to add "{0}" to Tally ID="{1}"'.format(other, self.id) raise ValueError(msg) return new_tally @@ -1667,33 +1721,24 @@ class Tally(object): A new derived tally which is the difference of this tally and the other tally or scalar value in the subtraction. + Raises + ------ + ValueError + When this method is called before the Tally is populated with data + by the StatePoint.read_results() method. + """ # Check that results have been read - if self.sum is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + if not self.derived and self.sum is None: + msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) - new_tally = Tally(name='derived') - new_tally.with_batch_statistics = True - if isinstance(other, Tally): - - # Check that results have been read - if other.sum is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(other.id) - raise ValueError(msg) - - self._outer_product(other, new_tally, binary_op='-') - data = self._align_tally_data(other) - new_tally._mean = data['self']['mean'] - data['other']['mean'] - new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + - data['other']['std. dev.']**2) + new_tally = self._outer_product(other, binary_op='-') elif isinstance(other, Real): - new_tally.name = self.name new_tally._mean = self._mean - other new_tally._std_dev = self._std_dev @@ -1710,8 +1755,8 @@ class Tally(object): new_tally.add_score(score) else: - msg = 'Unable to subtract {0} from Tally ' \ - 'ID={1}'.format(other, self.id) + msg = 'Unable to subtract "{0}" from Tally ' \ + 'ID="{1}"'.format(other, self.id) raise ValueError(msg) return new_tally @@ -1744,35 +1789,24 @@ class Tally(object): A new derived tally which is the product of this tally and the other tally or scalar value in the multiplication. + Raises + ------ + ValueError + When this method is called before the Tally is populated with data + by the StatePoint.read_results() method. + """ # Check that results have been read - if self.sum is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + if not self.derived and self.sum is None: + msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) - new_tally = Tally(name='derived') - new_tally.with_batch_statistics = True - if isinstance(other, Tally): - - # Check that results have been read - if other.sum is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(other.id) - raise ValueError(msg) - - self._outer_product(other, new_tally, binary_op='*') - data = self._align_tally_data(other) - self_rel_err = data['self']['std. dev.'] / data['self']['mean'] - other_rel_err = data['other']['std. dev.'] / data['other']['mean'] - new_tally._mean = data['self']['mean'] * data['other']['mean'] - new_tally._std_dev = np.abs(new_tally.mean) * \ - np.sqrt(self_rel_err**2 + other_rel_err**2) + new_tally = self._outer_product(other, binary_op='*') elif isinstance(other, Real): - new_tally.name = self.name new_tally._mean = self._mean * other new_tally._std_dev = self._std_dev * np.abs(other) @@ -1789,8 +1823,8 @@ class Tally(object): new_tally.add_score(score) else: - msg = 'Unable to multiply Tally ID={1} ' \ - 'by {0}'.format(self.id, other) + msg = 'Unable to multiply Tally ID="{0}" ' \ + 'by "{1}"'.format(self.id, other) raise ValueError(msg) return new_tally @@ -1823,35 +1857,24 @@ class Tally(object): A new derived tally which is the dividend of this tally and the other tally or scalar value in the division. + Raises + ------ + ValueError + When this method is called before the Tally is populated with data + by the StatePoint.read_results() method. + """ # Check that results have been read - if self.sum is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + if not self.derived and self.sum is None: + msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) - new_tally = Tally(name='derived') - new_tally.with_batch_statistics = True - if isinstance(other, Tally): - - # Check that results have been read - if other.sum is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(other.id) - raise ValueError(msg) - - self._outer_product(other, new_tally, binary_op='/') - data = self._align_tally_data(other) - self_rel_err = data['self']['std. dev.'] / data['self']['mean'] - other_rel_err = data['other']['std. dev.'] / data['other']['mean'] - new_tally._mean = data['self']['mean'] / data['other']['mean'] - new_tally._std_dev = np.abs(new_tally.mean) * \ - np.sqrt(self_rel_err**2 + other_rel_err**2) + new_tally = self._outer_product(other, binary_op='/') elif isinstance(other, Real): - new_tally.name = self.name new_tally._mean = self._mean / other new_tally._std_dev = self._std_dev * np.abs(1. / other) @@ -1868,8 +1891,8 @@ class Tally(object): new_tally.add_score(score) else: - msg = 'Unable to divide Tally ID={0} ' \ - 'by {1}'.format(self.id, other) + msg = 'Unable to divide Tally ID="{0}" ' \ + 'by "{1}"'.format(self.id, other) raise ValueError(msg) return new_tally @@ -1902,36 +1925,24 @@ class Tally(object): A new derived tally which is this tally raised to the power of the other tally or scalar value in the exponentiation. + Raises + ------ + ValueError + When this method is called before the Tally is populated with data + by the StatePoint.read_results() method. + """ # Check that results have been read - if self.sum is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + if not self.derived and self.sum is None: + msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) - new_tally = Tally(name='derived') - new_tally.with_batch_statistics = True - if isinstance(power, Tally): - - # Check that results have been read - if power.sum is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ - 'since it does not contain any results.'.format(power.id) - raise ValueError(msg) - - self._outer_product(power, new_tally, binary_op='^') - data = self._align_tally_data(power) - mean_ratio = data['other']['mean'] / data['self']['mean'] - first_term = mean_ratio * data['self']['std. dev.'] - second_term = np.log(data['self']['mean']) * data['other']['std. dev.'] - new_tally._mean = data['self']['mean'] ** data['other']['mean'] - new_tally._std_dev = np.abs(new_tally.mean) * \ - np.sqrt(first_term**2 + second_term**2) + new_tally = self._outer_product(power, binary_op='^') elif isinstance(power, Real): - new_tally.name = self.name new_tally._mean = self._mean ** power self_rel_err = self.std_dev / self.mean @@ -1949,8 +1960,8 @@ class Tally(object): new_tally.add_score(score) else: - msg = 'Unable to raise Tally ID={0} to ' \ - 'power {1}'.format(self.id, power) + msg = 'Unable to raise Tally ID="{0}" to ' \ + 'power "{1}"'.format(self.id, power) raise ValueError(msg) return new_tally @@ -2108,7 +2119,7 @@ class Tally(object): # Ensure that StatePoint.read_results() was called first if self.sum is None: - msg = 'Unable to use tally arithmetic with Tally ID={0} ' \ + msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) From d0dde6f5a8dbc3d37ffe916224dd01d61e8cc7ae Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Fri, 7 Aug 2015 07:31:10 -0700 Subject: [PATCH 057/101] Changed reverse iteration of filter bins, indices to use reversed(...) --- openmc/tallies.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 733d053721..fa41f5c7f8 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2145,7 +2145,7 @@ class Tally(object): score_indices.append(score_index) # Loop over indices in reverse to remove excluded scores - for score_index in score_indices[::-1]: + for score_index in reversed(score_indices): new_tally.remove_score(self.scores[score_index]) new_tally.num_score_bins -= 1 @@ -2160,7 +2160,7 @@ class Tally(object): nuclide_indices.append(nuclide_index) # Loop over indices in reverse to remove excluded Nuclides - for nuclide_index in nuclide_indices[::-1]: + for nuclide_index in reversed(nuclide_indices): new_tally.remove_nuclide(self.nuclides[nuclide_index]) # FILTERS From 65679c22207e0a1c09435fe3ea7229863406d5c3 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 7 Aug 2015 20:36:21 -0600 Subject: [PATCH 058/101] Small fixes for #425 --- openmc/checkvalue.py | 38 +++++++++++++++----- openmc/summary.py | 4 +-- openmc/temp.py | 12 +++++++ openmc/universe.py | 84 ++++++++++++++++++++------------------------ 4 files changed, 82 insertions(+), 56 deletions(-) create mode 100644 openmc/temp.py diff --git a/openmc/checkvalue.py b/openmc/checkvalue.py index d3f782ac6f..787052f5d6 100644 --- a/openmc/checkvalue.py +++ b/openmc/checkvalue.py @@ -1,15 +1,34 @@ from collections import Iterable -from numbers import Integral +from numbers import Integral, Real import numpy as np def _isinstance(value, expected_type): - """A Numpy-aware replacement for isinstance""" - np_ints = [np.intc, np.intp, np.int8, np.int16, np.int32, np.int64, - np.uint8, np.uint16, np.uint32, np.uint64] - if expected_type is Integral: - types = np_ints + [Integral] - return any(isinstance(value, t) for t in types) + """A Numpy-aware replacement for isinstance + + This function will be obsolete when Numpy v. >= 1.9 is established. + """ + + # Declare numpy numeric types. + np_ints = (np.int_, np.intc, np.intp, np.int8, np.int16, np.int32, np.int64, + np.uint8, np.uint16, np.uint32, np.uint64) + np_floats = (np.float_, np.float16, np.float32, np.float64) + + # Include numpy integers, if necessary. + if type(expected_type) is tuple: + if Integral in expected_type: + expected_type = expected_type + np_ints + elif expected_type is Integral: + expected_type = (Integral, ) + np_ints + + # Include numpy floats, if necessary. + if type(expected_type) is tuple: + if Real in expected_type: + expected_type = expected_type + np_floats + elif expected_type is Real: + expected_type = (Real, ) + np_floats + + # Now, make the instance check. return isinstance(value, expected_type) def check_type(name, value, expected_type, expected_iter_type=None): @@ -60,7 +79,8 @@ def check_iterable_type(name, value, expected_type, min_depth=1, max_depth=1): The minimum number of layers of nested iterables there should be before reaching the ultimately contained items max_depth : int - The maximum number of layers of nested iterables ... + The maximum number of layers of nested iterables there should be before + reaching the ultimately contained items """ # Initialize the tree at the very first item. tree = [value] @@ -112,7 +132,7 @@ def check_iterable_type(name, value, expected_type, min_depth=1, max_depth=1): raise ValueError(msg) else: - # This item is completely unexected. + # This item is completely unexpected. msg = "Error setting {0}: Items must be of type '{1}', but " \ "item at {2} is of type '{3}'"\ .format(name, expected_type.__name__, ind_str, diff --git a/openmc/summary.py b/openmc/summary.py index 2165d114ad..7f9d5387e9 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -413,8 +413,8 @@ class Summary(object): # Build array of Universe pointers for the Lattice. Note that # we need to convert between the HDF5's square array of - # (x, alpha, z) to the PythonAPI's format of a ragged nested - # nested list of (z, ring, theta). + # (x, alpha, z) to the Python API's format of a ragged nested + # list of (z, ring, theta). universes = [] for z in range(lattice.num_axial): # Add a list for this axial level. diff --git a/openmc/temp.py b/openmc/temp.py new file mode 100644 index 0000000000..91f6082996 --- /dev/null +++ b/openmc/temp.py @@ -0,0 +1,12 @@ +from checkvalue import * +from checkvalue import _isinstance + +import numpy as np + +zs = np.zeros((2,)) + +print _isinstance(zs[0], Integral) +print _isinstance(zs[0], Real) +print _isinstance(zs[0], (Integral, Real)) + +print check_iterable_type('thing', zs, (Real, Integral)) diff --git a/openmc/universe.py b/openmc/universe.py index 2785574008..75b6737465 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -7,8 +7,7 @@ import sys import numpy as np import openmc -from openmc.checkvalue import check_type, check_iterable_type, check_length, \ - check_greater_than +import openmc.checkvalue as cv if sys.version_info[0] >= 3: basestring = str @@ -112,13 +111,13 @@ class Cell(object): self._id = AUTO_CELL_ID AUTO_CELL_ID += 1 else: - check_type('cell ID', cell_id, Integral) - check_greater_than('cell ID', cell_id, 0) + cv.check_type('cell ID', cell_id, Integral) + cv.check_greater_than('cell ID', cell_id, 0) self._id = cell_id @name.setter def name(self, name): - check_type('cell name', name, basestring) + cv.check_type('cell name', name, basestring) self._name = name @fill.setter @@ -149,19 +148,19 @@ class Cell(object): @rotation.setter def rotation(self, rotation): - check_type('cell rotation', rotation, Iterable, Real) - check_length('cell rotation', rotation, 3) + cv.check_type('cell rotation', rotation, Iterable, Real) + cv.check_length('cell rotation', rotation, 3) self._rotation = rotation @translation.setter def translation(self, translation): - check_type('cell translation', translation, Iterable, Real) - check_length('cell translation', translation, 3) + cv.check_type('cell translation', translation, Iterable, Real) + cv.check_length('cell translation', translation, 3) self._translation = translation @offsets.setter def offsets(self, offsets): - check_type('cell offsets', offsets, Iterable) + cv.check_type('cell offsets', offsets, Iterable) self._offsets = offsets def add_surface(self, surface, halfspace): @@ -433,13 +432,13 @@ class Universe(object): self._id = AUTO_UNIVERSE_ID AUTO_UNIVERSE_ID += 1 else: - check_type('universe ID', universe_id, Integral) - check_greater_than('universe ID', universe_id, 0, True) + cv.check_type('universe ID', universe_id, Integral) + cv.check_greater_than('universe ID', universe_id, 0, True) self._id = universe_id @name.setter def name(self, name): - check_type('universe name', name, basestring) + cv.check_type('universe name', name, basestring) self._name = name def add_cell(self, cell): @@ -672,27 +671,25 @@ class Lattice(object): self._id = AUTO_UNIVERSE_ID AUTO_UNIVERSE_ID += 1 else: - check_type('lattice ID', lattice_id, Integral) - check_greater_than('lattice ID', lattice_id, 0) + cv.check_type('lattice ID', lattice_id, Integral) + cv.check_greater_than('lattice ID', lattice_id, 0) self._id = lattice_id @name.setter def name(self, name): - check_type('lattice name', name, basestring) + cv.check_type('lattice name', name, basestring) self._name = name @outer.setter def outer(self, outer): - check_type('outer universe', outer, Universe) + cv.check_type('outer universe', outer, Universe) self._outer = outer @universes.setter def universes(self, universes): - #check_type('lattice universes', universes, Iterable) - check_iterable_type('lattice universes', universes, Universe, - min_depth=2, max_depth=3) + cv.check_iterable_type('lattice universes', universes, Universe, + min_depth=2, max_depth=3) self._universes = universes - #self._universes = np.asarray(universes, dtype=Universe) def get_unique_universes(self): """Determine all unique universes in the lattice @@ -710,17 +707,14 @@ class Lattice(object): for j in range(len(self._universes[k])): if isinstance(self._universes[k][j], Universe): u = self._universes[k][j] - if u._id not in univs: - univs[u._id] = u + univs[u._id] = u else: for i in range(len(self._universes[k][j])): u = self._universes[k][j][i] assert isinstance(u, Universe) - if u._id not in univs: - univs[u._id] = u + univs[u._id] = u - if self._outer._id not in univs: - univs[self._outer._id] = self._outer + univs[self._outer._id] = self._outer return univs @@ -840,29 +834,29 @@ class RectLattice(Lattice): @dimension.setter def dimension(self, dimension): - check_type('lattice dimension', dimension, Iterable, Integral) - check_length('lattice dimension', dimension, 2, 3) + cv.check_type('lattice dimension', dimension, Iterable, Integral) + cv.check_length('lattice dimension', dimension, 2, 3) for dim in dimension: - check_greater_than('lattice dimension', dim, 0) + cv.check_greater_than('lattice dimension', dim, 0) self._dimension = dimension @lower_left.setter def lower_left(self, lower_left): - check_type('lattice lower left corner', lower_left, Iterable, Real) - check_length('lattice lower left corner', lower_left, 2, 3) + cv.check_type('lattice lower left corner', lower_left, Iterable, Real) + cv.check_length('lattice lower left corner', lower_left, 2, 3) self._lower_left = lower_left @offsets.setter def offsets(self, offsets): - check_type('lattice offsets', offsets, Iterable) + cv.check_type('lattice offsets', offsets, Iterable) self._offsets = offsets @Lattice.pitch.setter def pitch(self, pitch): - check_type('lattice pitch', pitch, Iterable, Real) - check_length('lattice pitch', pitch, 2, 3) + cv.check_type('lattice pitch', pitch, Iterable, Real) + cv.check_length('lattice pitch', pitch, 2, 3) for dim in pitch: - check_greater_than('lattice pitch', dim, 0.0) + cv.check_greater_than('lattice pitch', dim, 0.0) self._pitch = pitch def get_offset(self, path, filter_offset): @@ -1056,28 +1050,28 @@ class HexLattice(Lattice): @num_rings.setter def num_rings(self, num_rings): - check_type('number of rings', num_rings, Integral) - check_greater_than('number of rings', num_rings, 0) + cv.check_type('number of rings', num_rings, Integral) + cv.check_greater_than('number of rings', num_rings, 0) self._num_rings = num_rings @num_axial.setter def num_axial(self, num_axial): - check_type('number of axial', num_axial, Integral) - check_greater_than('number of axial', num_axial, 0) + cv.check_type('number of axial', num_axial, Integral) + cv.check_greater_than('number of axial', num_axial, 0) self._num_axial = num_axial @center.setter def center(self, center): - check_type('lattice center', center, Iterable, Real) - check_length('lattice center', center, 2, 3) + cv.check_type('lattice center', center, Iterable, Real) + cv.check_length('lattice center', center, 2, 3) self._center = center @Lattice.pitch.setter def pitch(self, pitch): - check_type('lattice pitch', pitch, Iterable, Real) - check_length('lattice pitch', pitch, 1, 2) + cv.check_type('lattice pitch', pitch, Iterable, Real) + cv.check_length('lattice pitch', pitch, 1, 2) for dim in pitch: - check_greater_than('lattice pitch', dim, 0) + cv.check_greater_than('lattice pitch', dim, 0) self._pitch = pitch @Lattice.universes.setter From 43b42bca20b5c04e0251fd16218f9c70954a338c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 7 Aug 2015 10:34:14 +0700 Subject: [PATCH 059/101] Added Jupyter notebook with tally arithmetic examples --- docs/source/conf.py | 3 +- .../pythonapi/examples/tally-arithmetic.ipynb | 1512 +++++++++++++++++ .../pythonapi/examples/tally-arithmetic.rst | 11 + docs/source/pythonapi/index.rst | 11 +- docs/sphinxext/LICENSE | 68 + docs/sphinxext/notebook_sphinxext.py | 120 ++ 6 files changed, 1721 insertions(+), 4 deletions(-) create mode 100644 docs/source/pythonapi/examples/tally-arithmetic.ipynb create mode 100644 docs/source/pythonapi/examples/tally-arithmetic.rst create mode 100644 docs/sphinxext/LICENSE create mode 100644 docs/sphinxext/notebook_sphinxext.py diff --git a/docs/source/conf.py b/docs/source/conf.py index 8af607a4b4..65ee4db6f6 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -28,7 +28,8 @@ extensions = ['sphinx.ext.autodoc', 'sphinx.ext.napoleon', 'sphinx.ext.pngmath', 'sphinxcontrib.tikz', - 'sphinx_numfig'] + 'sphinx_numfig', + 'notebook_sphinxext'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb new file mode 100644 index 0000000000..3223f23aa5 --- /dev/null +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -0,0 +1,1512 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook shows the how tallies can be combined (added, subtracted, multiplied, etc.) using the Python API in order to create derived tallies. Since no covariance information is obtained, it is assumed that tallies are completely independent of one another when propagating uncertainties. The target problem is a simple pin cell.\n", + "\n", + "**Note:** that this Notebook was created using the latest Pandas v0.16.1. Everything in the Notebook will wun with older versions of Pandas, but the multi-indexing option in >v0.15.0 makes the tables look prettier." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import glob\n", + "from IPython.display import Image\n", + "import numpy as np\n", + "\n", + "import openmc\n", + "from openmc.statepoint import StatePoint\n", + "from openmc.summary import Summary\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": 3, + "metadata": { + "collapsed": true + }, + "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 pin." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "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", + "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": 5, + "metadata": { + "collapsed": false + }, + "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": 6, + "metadata": { + "collapsed": false + }, + "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": 7, + "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.add_surface(fuel_outer_radius, halfspace=-1)\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.add_surface(fuel_outer_radius, halfspace=+1)\n", + "clad_cell.add_surface(clad_outer_radius, halfspace=-1)\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.add_surface(clad_outer_radius, halfspace=+1)\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": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create root Cell\n", + "root_cell = openmc.Cell(name='root cell')\n", + "root_cell.fill = pin_cell_universe\n", + "\n", + "# Add boundary planes\n", + "root_cell.add_surface(min_x, halfspace=+1)\n", + "root_cell.add_surface(max_x, halfspace=-1)\n", + "root_cell.add_surface(min_y, halfspace=+1)\n", + "root_cell.add_surface(max_y, halfspace=-1)\n", + "root_cell.add_surface(min_z, halfspace=+1)\n", + "root_cell.add_surface(max_z, halfspace=-1)\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": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "geometry = openmc.Geometry()\n", + "geometry.root_universe = root_universe" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "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 5 inactive batches and 15 active batches each with 2500 particles." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# OpenMC simulation parameters\n", + "batches = 20\n", + "inactive = 5\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", + "source_bounds = [-0.63, -0.63, -10, 0.63, 0.63, 10.]\n", + "settings_file.set_source_space('box', 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": 12, + "metadata": { + "collapsed": false + }, + "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 = [1.26, 1.26]\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": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Run openmc in plotting mode\n", + "executor = openmc.Executor()\n", + "executor.plot_geometry(output=False)\n", + "\n", + "# Convert OpenMC's funky ppm to png\n", + "!convert materials-xy.ppm materials-xy.png" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "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\nMTUtMDgtMDZUMTY6NDM6MTMrMDc6MDBtUQj+AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTA4LTA2\nVDE2OjQzOjEzKzA3OjAwHAywQgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 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 pin cell with fuel, cladding, and water! Before we run our simulation, we need to tell the code what we want to tally. The following code shows how to create a variety of tallies." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate an empty TalliesFile\n", + "tallies_file = openmc.TalliesFile()\n", + "tallies_file.tallies = []" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create Tallies to compute microscopic multi-group cross-sections\n", + "\n", + "# Instantiate energy filter for multi-group cross-section Tallies\n", + "energy_filter = openmc.Filter(type='energy', bins=[0., 0.625e-6, 20.])\n", + "\n", + "# Instantiate flux Tally in moderator and fuel\n", + "tally = openmc.Tally(name='flux')\n", + "tally.add_filter(openmc.Filter(type='cell', bins=[fuel_cell.id, moderator_cell.id]))\n", + "tally.add_filter(energy_filter)\n", + "tally.add_score('flux')\n", + "tallies_file.add_tally(tally)\n", + "\n", + "# Instantiate reaction rate Tally in fuel\n", + "tally = openmc.Tally(name='fuel rxn rates')\n", + "tally.add_filter(openmc.Filter(type='cell', bins=[fuel_cell.id]))\n", + "tally.add_filter(energy_filter)\n", + "tally.add_score('nu-fission')\n", + "tally.add_score('scatter')\n", + "tally.add_nuclide(u238)\n", + "tally.add_nuclide(u235)\n", + "tallies_file.add_tally(tally)\n", + "\n", + "# Instantiate reaction rate Tally in moderator\n", + "tally = openmc.Tally(name='moderator rxn rates')\n", + "tally.add_filter(openmc.Filter(type='cell', bins=[moderator_cell.id]))\n", + "tally.add_filter(energy_filter)\n", + "tally.add_score('absorption')\n", + "tally.add_score('total')\n", + "tally.add_nuclide(o16)\n", + "tally.add_nuclide(h1)\n", + "tallies_file.add_tally(tally)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# K-Eigenvalue (infinity) tallies\n", + "fiss_rate = openmc.Tally(name='fiss. rate')\n", + "abs_rate = openmc.Tally(name='abs. rate')\n", + "fiss_rate.add_score('nu-fission')\n", + "abs_rate.add_score('absorption')\n", + "tallies_file.add_tally(fiss_rate)\n", + "tallies_file.add_tally(abs_rate)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Resonance Escape Probability tallies\n", + "therm_abs_rate = openmc.Tally(name='therm. abs. rate')\n", + "therm_abs_rate.add_score('absorption')\n", + "therm_abs_rate.add_filter(openmc.Filter(type='energy', bins=[0., 0.625]))\n", + "tallies_file.add_tally(therm_abs_rate)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Thermal Flux Utilization tallies\n", + "fuel_therm_abs_rate = openmc.Tally(name='fuel therm. abs. rate')\n", + "fuel_therm_abs_rate.add_score('absorption')\n", + "fuel_therm_abs_rate.add_filter(openmc.Filter(type='energy', bins=[0., 0.625]))\n", + "fuel_therm_abs_rate.add_filter(openmc.Filter(type='cell', bins=[fuel_cell.id]))\n", + "tallies_file.add_tally(fuel_therm_abs_rate)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Fast Fission Factor tallies\n", + "therm_fiss_rate = openmc.Tally(name='therm. fiss. rate')\n", + "tot_fiss_rate = openmc.Tally(name='tot. fiss. rate')\n", + "therm_fiss_rate.add_score('fission')\n", + "tot_fiss_rate.add_score('fission')\n", + "therm_fiss_rate.add_filter(openmc.Filter(type='energy', bins=[0., 0.625]))\n", + "tallies_file.add_tally(therm_fiss_rate)\n", + "tallies_file.add_tally(tot_fiss_rate)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate energy filter to illustrate Tally slicing\n", + "energy_filter = openmc.Filter(type='energy', bins=np.logspace(np.log10(1e-8), np.log10(20), 10))\n", + "\n", + "# Instantiate flux Tally in moderator and fuel\n", + "tally = openmc.Tally(name='need-to-slice')\n", + "tally.add_filter(openmc.Filter(type='cell', bins=[fuel_cell.id, moderator_cell.id]))\n", + "tally.add_filter(energy_filter)\n", + "tally.add_score('nu-fission')\n", + "tally.add_score('scatter')\n", + "tally.add_nuclide(h1)\n", + "tally.add_nuclide(u238)\n", + "tallies_file.add_tally(tally)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# 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": 23, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "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.6.2\n", + " Date/Time: 2015-08-07 11:12:08\n", + " MPI Processes: 4\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: 92238.71c\n", + " Loading ACE cross section table: 8016.71c\n", + " Loading ACE cross section table: 92235.71c\n", + " Loading ACE cross section table: 5010.71c\n", + " Loading ACE cross section table: 1001.71c\n", + " Loading ACE cross section table: 40090.71c\n", + " Initializing source particles...\n", + "\n", + " ===========================================================================\n", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 1.04944 \n", + " 2/1 1.03451 \n", + " 3/1 1.06490 \n", + " 4/1 1.04020 \n", + " 5/1 1.03270 \n", + " 6/1 1.09507 \n", + " 7/1 1.06827 1.08167 +/- 0.01340\n", + " 8/1 1.06089 1.07474 +/- 0.01038\n", + " 9/1 1.03806 1.06557 +/- 0.01175\n", + " 10/1 1.05032 1.06252 +/- 0.00960\n", + " 11/1 1.03259 1.05753 +/- 0.00929\n", + " 12/1 1.02588 1.05301 +/- 0.00906\n", + " 13/1 1.03872 1.05123 +/- 0.00805\n", + " 14/1 1.05396 1.05153 +/- 0.00710\n", + " 15/1 1.03818 1.05019 +/- 0.00649\n", + " 16/1 1.05015 1.05019 +/- 0.00587\n", + " 17/1 1.01418 1.04719 +/- 0.00614\n", + " 18/1 1.07342 1.04921 +/- 0.00600\n", + " 19/1 1.03023 1.04785 +/- 0.00572\n", + " 20/1 1.05405 1.04827 +/- 0.00534\n", + " Creating state point statepoint.20.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 9.0500E-01 seconds\n", + " Reading cross sections = 2.6500E-01 seconds\n", + " Total time in simulation = 8.9630E+00 seconds\n", + " Time in transport only = 8.1580E+00 seconds\n", + " Time in inactive batches = 1.0700E+00 seconds\n", + " Time in active batches = 7.8930E+00 seconds\n", + " Time synchronizing fission bank = 7.6400E-01 seconds\n", + " Sampling source sites = 4.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 = 2.0000E-03 seconds\n", + " Total time elapsed = 9.8710E+00 seconds\n", + " Calculation Rate (inactive) = 11682.2 neutrons/second\n", + " Calculation Rate (active) = 4751.05 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.04399 +/- 0.00515\n", + " k-effective (Track-length) = 1.04827 +/- 0.00534\n", + " k-effective (Absorption) = 1.03932 +/- 0.00588\n", + " Combined k-effective = 1.04364 +/- 0.00533\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Remove old HDF5 (summary, statepoint) files\n", + "!rm statepoint.*\n", + "\n", + "# Run OpenMC with MPI!\n", + "executor.run_simulation(mpi_procs=4)" + ] + }, + { + "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, the tally results are not read into memory because they might be large, even large enough to exceed the available memory on a computer." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [], + "source": [ + "# Load the statepoint file\n", + "sp = StatePoint('statepoint.20.h5')\n", + "sp.read_results()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You may have also noticed we instructed OpenMC to create a summary file with lots of geometry information in it. This can help to produce more sensible output from the Python API, so we will use the summary file to link against." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [], + "source": [ + "# Load the summary file and link with statepoint\n", + "su = Summary('summary.h5')\n", + "sp.link_with_summary(su)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We have a tally of the total fission rate and the total absorption rate, so we can calculating k-infinity as:\n", + "$$k_\\infty = \\frac{\\nu \\Sigma_f \\phi}{\\Sigma_a \\phi}$$" + ] + }, + { + "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", + "
nuclidescoremeanstd. dev.
bin
0total(nu-fission / absorption)1.0420350.006584
\n", + "
" + ], + "text/plain": [ + " nuclide score mean std. dev.\n", + "bin \n", + "0 total (nu-fission / absorption) 1.042035 0.006584" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Compute k-infinity using tally arithmetic\n", + "fiss_rate = sp.get_tally(name='fiss. rate')\n", + "abs_rate = sp.get_tally(name='abs. rate')\n", + "keff = fiss_rate / abs_rate\n", + "keff.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice that even though the neutron production rate and absorption rate are separate tallies, we still get a first-order estimate of the uncertainty on the quotient of them automatically!\n", + "\n", + "Now, let's analyze of few of the classic factors in the four-factor formula, starting with the resonance escape probability, which we'll define as $$p=\\frac{\\Sigma_{a,thermal}\\phi}{\\Sigma_a\\phi}$$" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "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", + "
nuclidescoremeanstd. dev.
bin
0totalabsorption0.9590670.00517
\n", + "
" + ], + "text/plain": [ + " nuclide score mean std. dev.\n", + "bin \n", + "0 total absorption 0.959067 0.00517" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Compute resonance escape probability using tally arithmetic\n", + "therm_abs_rate = sp.get_tally(name='therm. abs. rate')\n", + "res_esc = therm_abs_rate / abs_rate\n", + "res_esc.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The fast fission factor can be calculated as\n", + "$$\\epsilon=\\frac{\\Sigma_f\\phi}{\\Sigma_{f,thermal}\\phi}$$" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "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", + "
nuclidescoremeanstd. dev.
bin
0totalfission1.0801240.008126
\n", + "
" + ], + "text/plain": [ + " nuclide score mean std. dev.\n", + "bin \n", + "0 total fission 1.080124 0.008126" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Compute fast fission factor factor using tally arithmetic\n", + "therm_fiss_rate = sp.get_tally(name='therm. fiss. rate')\n", + "tot_fiss_rate = sp.get_tally(name='tot. fiss. rate')\n", + "fast_fiss = tot_fiss_rate / therm_fiss_rate\n", + "fast_fiss.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The thermal flux utilization is calculated as\n", + "$$f=\\frac{\\Sigma_{a,thermal}^F\\phi}{\\Sigma_a\\phi}$$\n", + "where $F$ denotes fuel." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "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", + "
nuclidescoremeanstd. dev.
bin
0totalabsorption0.7692630.004172
\n", + "
" + ], + "text/plain": [ + " nuclide score mean std. dev.\n", + "bin \n", + "0 total absorption 0.769263 0.004172" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Compute thermal flux utilization factor using tally arithmetic\n", + "fuel_therm_abs_rate = sp.get_tally(name='fuel therm. abs. rate')\n", + "therm_util = fuel_therm_abs_rate / abs_rate\n", + "therm_util.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's move on to a more complicated example now. Before we set up tallies to get reaction rates in the fuel and moderator in two energy groups for two different nuclides. We can use tally arithmetic to divide each of these reaction rates by the flux to get microscopic multi-group cross sections." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [], + "source": [ + "# Compute microscopic multi-group cross-sections\n", + "flux = sp.get_tally(name='flux')\n", + "flux = flux.get_slice(filters=['cell'], filter_bins=[(fuel_cell.id,)])\n", + "fuel_rxn_rates = sp.get_tally(name='fuel rxn rates')\n", + "mod_rxn_rates = sp.get_tally(name='moderator rxn rates')" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "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", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
bin
0100000.0e+00 - 6.3e-07(U-238 / total)(nu-fission / flux)0.0000015.999638e-09
1100000.0e+00 - 6.3e-07(U-238 / total)(scatter / flux)0.2099851.975043e-03
2100000.0e+00 - 6.3e-07(U-235 / total)(nu-fission / flux)0.3556003.196431e-03
3100000.0e+00 - 6.3e-07(U-235 / total)(scatter / flux)0.0055555.223274e-05
4100006.3e-07 - 2.0e+01(U-238 / total)(nu-fission / flux)0.0072007.935962e-05
5100006.3e-07 - 2.0e+01(U-238 / total)(scatter / flux)0.2275348.747338e-04
6100006.3e-07 - 2.0e+01(U-235 / total)(nu-fission / flux)0.0080904.645182e-05
7100006.3e-07 - 2.0e+01(U-235 / total)(scatter / flux)0.0033701.274353e-05
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score mean \\\n", + "bin \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.209985 \n", + "2 10000 0.0e+00 - 6.3e-07 (U-235 / total) (nu-fission / flux) 0.355600 \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.007200 \n", + "5 10000 6.3e-07 - 2.0e+01 (U-238 / total) (scatter / flux) 0.227534 \n", + "6 10000 6.3e-07 - 2.0e+01 (U-235 / total) (nu-fission / flux) 0.008090 \n", + "7 10000 6.3e-07 - 2.0e+01 (U-235 / total) (scatter / flux) 0.003370 \n", + "\n", + " std. dev. \n", + "bin \n", + "0 5.999638e-09 \n", + "1 1.975043e-03 \n", + "2 3.196431e-03 \n", + "3 5.223274e-05 \n", + "4 7.935962e-05 \n", + "5 8.747338e-04 \n", + "6 4.645182e-05 \n", + "7 1.274353e-05 " + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fuel_xs = fuel_rxn_rates / flux\n", + "fuel_xs.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We see that when the two tallies with multiple bins were divided, the derived tally contains the outer product of the combinations. If the filters/scores are the same, no outer product is needed. The `get_values(...)` method allows us to obtain a subset of tally scores. In the following example, we obtain just the neutron production microscopic cross sections." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 6.64202005e-07]\n", + " [ 3.55599908e-01]]\n", + "\n", + " [[ 7.20046753e-03]\n", + " [ 8.09041760e-03]]]\n" + ] + } + ], + "source": [ + "# Show how to use Tally.get_values(...) with a CrossScore\n", + "nu_fiss_xs = fuel_xs.get_values(scores=['(nu-fission / flux)'])\n", + "print(nu_fiss_xs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The same idea can be used not only for scores but also for filters and nuclides." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 0.00555494]]\n", + "\n", + " [[ 0.00337012]]]\n" + ] + } + ], + "source": [ + "# Show how to use Tally.get_values(...) with a CrossScore and CrossNuclide\n", + "u235_scatter_xs = fuel_xs.get_values(nuclides=['(U-235 / total)'], \n", + " scores=['(scatter / flux)'])\n", + "print(u235_scatter_xs)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 0.22753371]\n", + " [ 0.00337012]]]\n" + ] + } + ], + "source": [ + "# Show how to use Tally.get_values(...) with a CrossFilter and CrossScore\n", + "fast_scatter_xs = fuel_xs.get_values(filters=['energy'], \n", + " filter_bins=[((0.625e-6, 20.),)], \n", + " scores=['(scatter / flux)'])\n", + "print(fast_scatter_xs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A more advanced method is to use `get_slice(...)` to create a new derived tally that is a subset of an existing tally. This has the benefit that we can use `get_pandas_dataframe()` to see the tallies in a more human-readable format." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "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", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
bin
0100000.0e+00 - 6.3e-07U-238nu-fission0.0000029.952309e-09
1100000.0e+00 - 6.3e-07U-235nu-fission0.8719945.271360e-03
2100006.3e-07 - 2.0e+01U-238nu-fission0.0830068.813292e-04
3100006.3e-07 - 2.0e+01U-235nu-fission0.0932654.590785e-04
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score mean std. dev.\n", + "bin \n", + "0 10000 0.0e+00 - 6.3e-07 U-238 nu-fission 0.000002 9.952309e-09\n", + "1 10000 0.0e+00 - 6.3e-07 U-235 nu-fission 0.871994 5.271360e-03\n", + "2 10000 6.3e-07 - 2.0e+01 U-238 nu-fission 0.083006 8.813292e-04\n", + "3 10000 6.3e-07 - 2.0e+01 U-235 nu-fission 0.093265 4.590785e-04" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# \"Slice\" the nu-fission data into a new derived Tally\n", + "nu_fission_rates = fuel_rxn_rates.get_slice(scores=['nu-fission'])\n", + "nu_fission_rates.get_pandas_dataframe()" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "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", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
bin
0100021.0e-08 - 1.1e-07H-1scatter4.6695350.032937
1100021.1e-07 - 1.2e-06H-1scatter2.0347860.014311
2100021.2e-06 - 1.3e-05H-1scatter1.6644400.014963
3100021.3e-05 - 1.4e-04H-1scatter1.8754060.011341
4100021.4e-04 - 1.5e-03H-1scatter2.0650550.013958
5100021.5e-03 - 1.6e-02H-1scatter2.1444620.011313
6100021.6e-02 - 1.7e-01H-1scatter2.2065290.011302
7100021.7e-01 - 1.9e+00H-1scatter1.9923360.012023
8100021.9e+00 - 2.0e+01H-1scatter0.3774000.004341
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score mean std. dev.\n", + "bin \n", + "0 10002 1.0e-08 - 1.1e-07 H-1 scatter 4.669535 0.032937\n", + "1 10002 1.1e-07 - 1.2e-06 H-1 scatter 2.034786 0.014311\n", + "2 10002 1.2e-06 - 1.3e-05 H-1 scatter 1.664440 0.014963\n", + "3 10002 1.3e-05 - 1.4e-04 H-1 scatter 1.875406 0.011341\n", + "4 10002 1.4e-04 - 1.5e-03 H-1 scatter 2.065055 0.013958\n", + "5 10002 1.5e-03 - 1.6e-02 H-1 scatter 2.144462 0.011313\n", + "6 10002 1.6e-02 - 1.7e-01 H-1 scatter 2.206529 0.011302\n", + "7 10002 1.7e-01 - 1.9e+00 H-1 scatter 1.992336 0.012023\n", + "8 10002 1.9e+00 - 2.0e+01 H-1 scatter 0.377400 0.004341" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# \"Slice\" the H-1 scatter data in the moderator Cell into a new derived Tally\n", + "need_to_slice = sp.get_tally(name='need-to-slice')\n", + "slice_test = need_to_slice.get_slice(scores=['scatter'], nuclides=['H-1'],\n", + " filters=['cell'], filter_bins=[(moderator_cell.id,)])\n", + "slice_test.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.8" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/pythonapi/examples/tally-arithmetic.rst b/docs/source/pythonapi/examples/tally-arithmetic.rst new file mode 100644 index 0000000000..5f3cf775e1 --- /dev/null +++ b/docs/source/pythonapi/examples/tally-arithmetic.rst @@ -0,0 +1,11 @@ +================ +Tally Arithmetic +================ + +.. only:: html + + .. notebook:: tally-arithmetic.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 f6c26557df..38314f4ea8 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -4,9 +4,7 @@ Python API ========== --------- -Contents --------- +**API Documentation:** .. toctree:: :maxdepth: 1 @@ -30,3 +28,10 @@ Contents tallies trigger universe + +**Examples:** + +.. toctree:: + :maxdepth: 1 + + examples/tally-arithmetic diff --git a/docs/sphinxext/LICENSE b/docs/sphinxext/LICENSE new file mode 100644 index 0000000000..2d508d2be9 --- /dev/null +++ b/docs/sphinxext/LICENSE @@ -0,0 +1,68 @@ +The file notebook_sphinxext.py was derived from code in PyNE and yt. + +PyNE has the following license: + +------------------------------------------------------------------------------- +Copyright 2011-2015, the PyNE Development Team. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are +permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE PYNE DEVELOPMENT TEAM ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the +authors and should not be interpreted as representing official policies, either expressed +or implied, of the stakeholders of the PyNE project or the employers of PyNE developers. +------------------------------------------------------------------------------- + +yt has the following license: + +------------------------------------------------------------------------------- +yt is licensed under the terms of the Modified BSD License (also known as New +or Revised BSD), as follows: + +Copyright (c) 2013-, yt Development Team +Copyright (c) 2006-2013, Matthew Turk + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +Neither the name of the yt Development Team nor the names of its +contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +------------------------------------------------------------------------------- diff --git a/docs/sphinxext/notebook_sphinxext.py b/docs/sphinxext/notebook_sphinxext.py new file mode 100644 index 0000000000..a9d634a351 --- /dev/null +++ b/docs/sphinxext/notebook_sphinxext.py @@ -0,0 +1,120 @@ +import sys +import os.path +import re +import time +from docutils import io, nodes, statemachine, utils +try: + from docutils.utils.error_reporting import ErrorString # the new way +except ImportError: + from docutils.error_reporting import ErrorString # the old way +from docutils.parsers.rst import Directive, convert_directive_function +from docutils.parsers.rst import directives, roles, states +from docutils.parsers.rst.roles import set_classes +from docutils.transforms import misc + +try: + from IPython.nbconver.exporters import html +except ImportError: + from IPython.nbconvert import html + + +class Notebook(Directive): + """Use nbconvert to insert a notebook into the environment. + This is based on the Raw directive in docutils + """ + required_arguments = 1 + optional_arguments = 0 + final_argument_whitespace = True + option_spec = {} + has_content = False + + def run(self): + # check if raw html is supported + if not self.state.document.settings.raw_enabled: + raise self.warning('"%s" directive disabled.' % self.name) + + # set up encoding + attributes = {'format': 'html'} + encoding = self.options.get( + 'encoding', self.state.document.settings.input_encoding) + e_handler = self.state.document.settings.input_encoding_error_handler + + # get path to notebook + source_dir = os.path.dirname( + os.path.abspath(self.state.document.current_source)) + nb_path = os.path.normpath(os.path.join(source_dir, + self.arguments[0])) + nb_path = utils.relative_path(None, nb_path) + + # convert notebook to html + exporter = html.HTMLExporter(template_file='full') + output, resources = exporter.from_filename(nb_path) + header = output.split('', 1)[1].split('',1)[0] + body = output.split('', 1)[1].split('',1)[0] + + # add HTML5 scoped attribute to header style tags + header = header.replace(''] + lines.append(header) + lines.append(body) + lines.append('') + text = '\n'.join(lines) + + # add dependency + self.state.document.settings.record_dependencies.add(nb_path) + attributes['source'] = nb_path + + # create notebook node + nb_node = notebook('', text, **attributes) + (nb_node.source, nb_node.line) = \ + self.state_machine.get_source_and_line(self.lineno) + + return [nb_node] + + +class notebook(nodes.raw): + pass + + +def visit_notebook_node(self, node): + self.visit_raw(node) + + +def depart_notebook_node(self, node): + self.depart_raw(node) + + +def setup(app): + app.add_node(notebook, + html=(visit_notebook_node, depart_notebook_node)) + + app.add_directive('notebook', Notebook) From 043bb1b1f689d697201ec4d0c3c0992c105c41c5 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 7 Aug 2015 12:01:38 +0700 Subject: [PATCH 060/101] Better organization of top-level Python API page --- docs/source/pythonapi/index.rst | 34 ++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 38314f4ea8..2533625970 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -4,31 +4,55 @@ Python API ========== -**API Documentation:** +OpenMC includes a rich Python API that enables programmatic pre- and +post-processing. The easiest way to begin using the API is to take a look at the +example IPython notebooks provided. The full API documentation serves to provide +more information on a given module or class. + +**Handling nuclear data:** .. toctree:: :maxdepth: 1 ace + +**Creating input files:** + +.. toctree:: + :maxdepth: 1 + cmfd element - executor filter geometry material mesh nuclide opencg_compatible - particle_restart plots settings - statepoint - summary surface tallies trigger universe +**Running OpenMC:** + +.. toctree:: + :maxdepth: 1 + + executor + +**Post-processing:** + +.. toctree:: + :maxdepth: 1 + + particle_restart + statepoint + summary + tallies + **Examples:** .. toctree:: From 56b0cbb1e721b8edb708dd216d6f896eb63d7129 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 8 Aug 2015 09:51:29 +0700 Subject: [PATCH 061/101] Add Jupyter notebook showing use of Pandas dataframes --- .gitignore | 3 + .../examples/pandas-dataframes.ipynb | 2482 +++++++++++++++++ .../pythonapi/examples/pandas-dataframes.rst | 11 + docs/source/pythonapi/index.rst | 5 +- 4 files changed, 2499 insertions(+), 2 deletions(-) create mode 100644 docs/source/pythonapi/examples/pandas-dataframes.ipynb create mode 100644 docs/source/pythonapi/examples/pandas-dataframes.rst diff --git a/.gitignore b/.gitignore index bfa33d856a..5634632fa4 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,6 @@ data/nndc # PyCharm project configuration files .idea .idea/* + +# IPython notebook checkpoints +.ipynb_checkpoints \ No newline at end of file diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb new file mode 100644 index 0000000000..485420565b --- /dev/null +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -0,0 +1,2482 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook demonstrates how systematic analysis of tally scores is possible using Pandas dataframes. A dataframe can be automatically generated using the `Tally.get_pandas_dataframe(...)` method. Furthermore, by linking the tally data in a statepoint file with geometry and material information from a summary file, the dataframe can be shown with user-supplied labels.\n", + "\n", + "**Note:** that this Notebook was created using the latest Pandas v0.16.1. Everything in the Notebook will wun with older versions of Pandas, but the multi-indexing option in >v0.15.0 makes the tables look prettier." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import glob\n", + "from IPython.display import Image\n", + "import matplotlib.pylab as pylab\n", + "import scipy.stats\n", + "import numpy as np\n", + "\n", + "import openmc\n", + "from openmc.statepoint import StatePoint\n", + "from openmc.summary import Summary\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": true + }, + "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 pin." + ] + }, + { + "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", + "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": false + }, + "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, 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." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "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=-10.71, boundary_type='reflective')\n", + "max_x = openmc.XPlane(x0=+10.71, boundary_type='vacuum')\n", + "min_y = openmc.YPlane(y0=-10.71, boundary_type='vacuum')\n", + "max_y = openmc.YPlane(y0=+10.71, boundary_type='reflective')\n", + "min_z = openmc.ZPlane(z0=-10.71, boundary_type='reflective')\n", + "max_z = openmc.ZPlane(z0=+10.71, 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.add_surface(fuel_outer_radius, halfspace=-1)\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.add_surface(fuel_outer_radius, halfspace=+1)\n", + "clad_cell.add_surface(clad_outer_radius, halfspace=-1)\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.add_surface(clad_outer_radius, halfspace=+1)\n", + "pin_cell_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": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create fuel assembly Lattice\n", + "assembly = openmc.RectLattice(name='1.6% Fuel - 0BA')\n", + "assembly.dimension = (17, 17)\n", + "assembly.pitch = (1.26, 1.26)\n", + "assembly.lower_left = [-1.26 * 17. / 2.0] * 2\n", + "assembly.universes = [[pin_cell_universe] * 17] * 17" + ] + }, + { + "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": 8, + "metadata": { + "collapsed": false + }, + "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.add_surface(min_x, halfspace=+1)\n", + "root_cell.add_surface(max_x, halfspace=-1)\n", + "root_cell.add_surface(min_y, halfspace=+1)\n", + "root_cell.add_surface(max_y, halfspace=-1)\n", + "root_cell.add_surface(min_z, halfspace=+1)\n", + "root_cell.add_surface(max_z, halfspace=-1)\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": 9, + "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": 10, + "metadata": { + "collapsed": false + }, + "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 5 inactive batches and 15 minimum active batches each with 2500 particles. We also tell OpenMC to turn tally triggers on, which means it will keep running until some criterion on the uncertainty of tallies is reached." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# OpenMC simulation parameters\n", + "min_batches = 20\n", + "max_batches = 200\n", + "inactive = 5\n", + "particles = 2500\n", + "\n", + "# Instantiate a SettingsFile\n", + "settings_file = openmc.SettingsFile()\n", + "settings_file.batches = min_batches\n", + "settings_file.inactive = inactive\n", + "settings_file.particles = particles\n", + "settings_file.output = {'tallies': False, 'summary': True}\n", + "settings_file.trigger_active = True\n", + "settings_file.trigger_max_batches = max_batches\n", + "source_bounds = [-10.71, -10.71, -10, 10.71, 10.71, 10.]\n", + "settings_file.set_source_space('box', 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": 12, + "metadata": { + "collapsed": false + }, + "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": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTA4LTA4VDA5OjI2\nOjM4KzA3OjAwuRKYlgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wOC0wOFQwOToyNjozOCswNzow\nMMhPICoAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run openmc in plotting mode\n", + "executor = openmc.Executor()\n", + "executor.plot_geometry(output=False)\n", + "\n", + "# 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! Before we run our simulation, we need to tell the code what we want to tally. The following code shows how to create a variety of tallies." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate an empty TalliesFile\n", + "tallies_file = openmc.TalliesFile()\n", + "tallies_file._tallies = []" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Instantiate a fission rate mesh Tally" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a tally Mesh\n", + "mesh = openmc.Mesh(mesh_id=1)\n", + "mesh.type = 'rectangular'\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 energy Filter\n", + "energy_filter = openmc.Filter()\n", + "energy_filter.type = 'energy'\n", + "energy_filter.bins = np.array([0, 0.625e-6, 20.])\n", + "\n", + "# Instantiate the Tally\n", + "tally = openmc.Tally(name='mesh tally')\n", + "tally.add_filter(mesh_filter)\n", + "tally.add_filter(energy_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": "markdown", + "metadata": {}, + "source": [ + "Instantiate a cell Tally with nuclides" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate tally Filter\n", + "cell_filter = openmc.Filter(type='cell', bins=[fuel_cell.id])\n", + "\n", + "# Instantiate the tally\n", + "tally = openmc.Tally(name='cell tally')\n", + "tally.add_filter(cell_filter)\n", + "tally.add_score('scatter-y2')\n", + "tally.add_nuclide(u235)\n", + "tally.add_nuclide(u238)\n", + "\n", + "# Add mesh and tally to TalliesFile\n", + "tallies_file.add_tally(tally)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create a \"distribcell\" Tally. The distribcell filter allows us to tally multiple repeated instances of the same cell throughout the geometry." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate tally Filter\n", + "distribcell_filter = openmc.Filter(type='distribcell', bins=[moderator_cell.id])\n", + "\n", + "# Instantiate tally Trigger for kicks\n", + "trigger = openmc.Trigger(trigger_type='std_dev', threshold=5e-5)\n", + "trigger.add_score('absorption')\n", + "\n", + "# Instantiate the Tally\n", + "tally = openmc.Tally(name='distribcell tally')\n", + "tally.add_filter(distribcell_filter)\n", + "tally.add_score('absorption')\n", + "tally.add_score('scatter')\n", + "tally.add_trigger(trigger)\n", + "\n", + "# Add mesh and tally to TalliesFile\n", + "tallies_file.add_tally(tally)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# 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": 19, + "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.6.2\n", + " Date/Time: 2015-08-08 09:29:37\n", + " MPI Processes: 4\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: 92238.71c\n", + " Loading ACE cross section table: 8016.71c\n", + " Loading ACE cross section table: 92235.71c\n", + " Loading ACE cross section table: 5010.71c\n", + " Loading ACE cross section table: 1001.71c\n", + " Loading ACE cross section table: 40090.71c\n", + " Initializing source particles...\n", + "\n", + " ===========================================================================\n", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 0.60069 \n", + " 2/1 0.62857 \n", + " 3/1 0.69431 \n", + " 4/1 0.65935 \n", + " 5/1 0.68092 \n", + " 6/1 0.64791 \n", + " 7/1 0.65859 0.65325 +/- 0.00534\n", + " 8/1 0.67381 0.66010 +/- 0.00752\n", + " 9/1 0.74149 0.68045 +/- 0.02103\n", + " 10/1 0.68244 0.68085 +/- 0.01629\n", + " 11/1 0.68068 0.68082 +/- 0.01330\n", + " 12/1 0.70394 0.68412 +/- 0.01172\n", + " 13/1 0.68624 0.68439 +/- 0.01015\n", + " 14/1 0.65667 0.68131 +/- 0.00947\n", + " 15/1 0.70080 0.68326 +/- 0.00869\n", + " 16/1 0.69639 0.68445 +/- 0.00795\n", + " 17/1 0.68786 0.68474 +/- 0.00726\n", + " 18/1 0.63698 0.68106 +/- 0.00762\n", + " 19/1 0.62785 0.67726 +/- 0.00802\n", + " 20/1 0.65759 0.67595 +/- 0.00758\n", + " Triggers unsatisfied, max unc./thresh. is 1.20713 for absorption in tally 10002\n", + " The estimated number of batches is 27\n", + " Creating state point statepoint.020.h5...\n", + " 21/1 0.68391 0.67645 +/- 0.00711\n", + " 22/1 0.69243 0.67739 +/- 0.00674\n", + " 23/1 0.65491 0.67614 +/- 0.00648\n", + " 24/1 0.64021 0.67425 +/- 0.00641\n", + " 25/1 0.72281 0.67668 +/- 0.00655\n", + " 26/1 0.71261 0.67839 +/- 0.00646\n", + " 27/1 0.69503 0.67914 +/- 0.00621\n", + " Triggers satisfied for batch 27\n", + " Creating state point statepoint.027.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 9.4600E-01 seconds\n", + " Reading cross sections = 2.8400E-01 seconds\n", + " Total time in simulation = 5.9780E+00 seconds\n", + " Time in transport only = 5.6820E+00 seconds\n", + " Time in inactive batches = 7.8500E-01 seconds\n", + " Time in active batches = 5.1930E+00 seconds\n", + " Time synchronizing fission bank = 2.3000E-01 seconds\n", + " Sampling source sites = 1.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 = 1.0000E-03 seconds\n", + " Total time elapsed = 6.9280E+00 seconds\n", + " Calculation Rate (inactive) = 15923.6 neutrons/second\n", + " Calculation Rate (active) = 7221.26 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 0.68117 +/- 0.00597\n", + " k-effective (Track-length) = 0.67914 +/- 0.00621\n", + " k-effective (Absorption) = 0.67898 +/- 0.00471\n", + " Combined k-effective = 0.67922 +/- 0.00479\n", + " Leakage Fraction = 0.34264 +/- 0.00301\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Remove old HDF5 (summary, statepoint) files\n", + "!rm statepoint.*\n", + "\n", + "# Run OpenMC with MPI!\n", + "executor.run_simulation(mpi_procs=4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tally Data Processing" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# We do not know how many batches were needed to satisfy the \n", + "# tally trigger(s), so find the statepoint file(s)\n", + "statepoints = glob.glob('statepoint.*.h5')\n", + "\n", + "# Load the last statepoint file\n", + "sp = StatePoint(statepoints[-1])\n", + "sp.read_results()\n", + "sp.compute_stdev()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [], + "source": [ + "# Load the summary file and link with statepoint\n", + "su = Summary('summary.h5')\n", + "sp.link_with_summary(su)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Analyze the mesh fission rate tally**" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10000\n", + "\tName =\tmesh tally\n", + "\tFilters =\t\n", + " \t\tmesh\t[1]\n", + " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t['fission', 'nu-fission']\n", + "\tEstimator =\ttracklength\n", + "\n" + ] + } + ], + "source": [ + "# Find the mesh tally with the StatePoint API\n", + "tally = sp.get_tally(name='mesh tally')\n", + "\n", + "# Print a little info about the mesh tally to the screen\n", + "print(tally)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the new Tally data retrieval API with pure NumPy" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 0.14583021]]\n", + "\n", + " [[ 0.07919847]]\n", + "\n", + " [[ 0.22707514]]\n", + "\n", + " [[ 0.07537836]]\n", + "\n", + " [[ 0.07919847]]\n", + "\n", + " [[ 0.07846909]]\n", + "\n", + " [[ 0.07537836]]\n", + "\n", + " [[ 0.07177901]]\n", + "\n", + " [[ 0.22707514]]\n", + "\n", + " [[ 0.07537836]]\n", + "\n", + " [[ 0.33705448]]\n", + "\n", + " [[ 0.177405 ]]\n", + "\n", + " [[ 0.07537836]]\n", + "\n", + " [[ 0.07177901]]\n", + "\n", + " [[ 0.177405 ]]\n", + "\n", + " [[ 0.15150059]]]\n" + ] + } + ], + "source": [ + "# Get the relative error for the thermal fission reaction \n", + "# rates in the four corner pins \n", + "data = tally.get_values(scores=['fission'], filters=['mesh', 'energy'], \\\n", + " filter_bins=[((1,1),(1,17), (17,1), (17,17)), \\\n", + " ((0., 0.625e-6),)], value='rel_err')\n", + "print(data)" + ] + }, + { + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
mesh 1energy [MeV]scoremeanstd. dev.
xyz
bin
01110.0e+00 - 6.3e-07fission0.0002360.000034
11110.0e+00 - 6.3e-07nu-fission0.0005760.000084
21116.3e-07 - 2.0e+01fission0.0000690.000004
31116.3e-07 - 2.0e+01nu-fission0.0001830.000011
41210.0e+00 - 6.3e-07fission0.0003660.000052
51210.0e+00 - 6.3e-07nu-fission0.0008920.000127
61216.3e-07 - 2.0e+01fission0.0001090.000009
71216.3e-07 - 2.0e+01nu-fission0.0002840.000021
81310.0e+00 - 6.3e-07fission0.0005400.000058
91310.0e+00 - 6.3e-07nu-fission0.0013160.000141
101316.3e-07 - 2.0e+01fission0.0001440.000017
111316.3e-07 - 2.0e+01nu-fission0.0003760.000041
121410.0e+00 - 6.3e-07fission0.0008300.000085
131410.0e+00 - 6.3e-07nu-fission0.0020220.000207
141416.3e-07 - 2.0e+01fission0.0001680.000013
151416.3e-07 - 2.0e+01nu-fission0.0004340.000034
161510.0e+00 - 6.3e-07fission0.0007380.000043
171510.0e+00 - 6.3e-07nu-fission0.0017990.000105
181516.3e-07 - 2.0e+01fission0.0001860.000010
191516.3e-07 - 2.0e+01nu-fission0.0004860.000026
\n", + "
" + ], + "text/plain": [ + " mesh 1 energy [MeV] score mean std. dev.\n", + " x y z \n", + "bin \n", + "0 1 1 1 0.0e+00 - 6.3e-07 fission 0.000236 0.000034\n", + "1 1 1 1 0.0e+00 - 6.3e-07 nu-fission 0.000576 0.000084\n", + "2 1 1 1 6.3e-07 - 2.0e+01 fission 0.000069 0.000004\n", + "3 1 1 1 6.3e-07 - 2.0e+01 nu-fission 0.000183 0.000011\n", + "4 1 2 1 0.0e+00 - 6.3e-07 fission 0.000366 0.000052\n", + "5 1 2 1 0.0e+00 - 6.3e-07 nu-fission 0.000892 0.000127\n", + "6 1 2 1 6.3e-07 - 2.0e+01 fission 0.000109 0.000009\n", + "7 1 2 1 6.3e-07 - 2.0e+01 nu-fission 0.000284 0.000021\n", + "8 1 3 1 0.0e+00 - 6.3e-07 fission 0.000540 0.000058\n", + "9 1 3 1 0.0e+00 - 6.3e-07 nu-fission 0.001316 0.000141\n", + "10 1 3 1 6.3e-07 - 2.0e+01 fission 0.000144 0.000017\n", + "11 1 3 1 6.3e-07 - 2.0e+01 nu-fission 0.000376 0.000041\n", + "12 1 4 1 0.0e+00 - 6.3e-07 fission 0.000830 0.000085\n", + "13 1 4 1 0.0e+00 - 6.3e-07 nu-fission 0.002022 0.000207\n", + "14 1 4 1 6.3e-07 - 2.0e+01 fission 0.000168 0.000013\n", + "15 1 4 1 6.3e-07 - 2.0e+01 nu-fission 0.000434 0.000034\n", + "16 1 5 1 0.0e+00 - 6.3e-07 fission 0.000738 0.000043\n", + "17 1 5 1 0.0e+00 - 6.3e-07 nu-fission 0.001799 0.000105\n", + "18 1 5 1 6.3e-07 - 2.0e+01 fission 0.000186 0.000010\n", + "19 1 5 1 6.3e-07 - 2.0e+01 nu-fission 0.000486 0.000026" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get a pandas dataframe for the mesh tally data\n", + "df = tally.get_pandas_dataframe(nuclides=False)\n", + "\n", + "# Print the first twenty rows in the dataframe\n", + "df.head(20)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create a boxplot to view the distribution of\n", + "# fission and nu-fission rates in the pins\n", + "bp = df.boxplot(column='mean', by='score')" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Extract thermal nu-fission rates from pandas\n", + "fiss = df[df['score'] == 'nu-fission']\n", + "fiss = fiss[fiss['energy [MeV]'] == '0.0e+00 - 6.3e-07']\n", + "\n", + "# Extract mean and reshape as 2D NumPy arrays\n", + "mean = fiss['mean'].reshape((17,17))\n", + "\n", + "pylab.imshow(mean, interpolation='nearest')\n", + "pylab.title('fission rate')\n", + "pylab.xlabel('x')\n", + "pylab.ylabel('y')\n", + "pylab.colorbar()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Analyze the cell+nuclides scatter-y2 rate tally**" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10001\n", + "\tName =\tcell tally\n", + "\tFilters =\t\n", + " \t\tcell\t[10000]\n", + "\tNuclides =\tU-235 U-238 \n", + "\tScores =\t['scatter-Y0,0', 'scatter-Y1,-1', 'scatter-Y1,0', 'scatter-Y1,1', 'scatter-Y2,-2', 'scatter-Y2,-1', 'scatter-Y2,0', 'scatter-Y2,1', 'scatter-Y2,2']\n", + "\tEstimator =\tanalog\n", + "\n" + ] + } + ], + "source": [ + "# Find the cell Tally with the StatePoint API\n", + "tally = sp.get_tally(name='cell tally')\n", + "\n", + "# Print a little info about the cell tally to the screen\n", + "print(tally)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellnuclidescoremeanstd. dev.
bin
010000U-235scatter-Y0,00.0364530.000941
110000U-235scatter-Y1,-1-0.0007250.000261
210000U-235scatter-Y1,0-0.0000880.000408
310000U-235scatter-Y1,10.0009860.000412
410000U-235scatter-Y2,-20.0000980.000204
510000U-235scatter-Y2,-1-0.0003580.000247
610000U-235scatter-Y2,00.0001970.000140
710000U-235scatter-Y2,1-0.0000840.000196
810000U-235scatter-Y2,20.0000520.000168
910000U-238scatter-Y0,02.3256000.015545
1010000U-238scatter-Y1,-1-0.0300890.002460
1110000U-238scatter-Y1,0-0.0044510.003663
1210000U-238scatter-Y1,10.0208320.002831
1310000U-238scatter-Y2,-2-0.0041490.001530
1410000U-238scatter-Y2,-10.0007350.001729
1510000U-238scatter-Y2,00.0034310.002098
1610000U-238scatter-Y2,10.0003850.001263
1710000U-238scatter-Y2,20.0000020.001718
\n", + "
" + ], + "text/plain": [ + " cell nuclide score mean std. dev.\n", + "bin \n", + "0 10000 U-235 scatter-Y0,0 0.036453 0.000941\n", + "1 10000 U-235 scatter-Y1,-1 -0.000725 0.000261\n", + "2 10000 U-235 scatter-Y1,0 -0.000088 0.000408\n", + "3 10000 U-235 scatter-Y1,1 0.000986 0.000412\n", + "4 10000 U-235 scatter-Y2,-2 0.000098 0.000204\n", + "5 10000 U-235 scatter-Y2,-1 -0.000358 0.000247\n", + "6 10000 U-235 scatter-Y2,0 0.000197 0.000140\n", + "7 10000 U-235 scatter-Y2,1 -0.000084 0.000196\n", + "8 10000 U-235 scatter-Y2,2 0.000052 0.000168\n", + "9 10000 U-238 scatter-Y0,0 2.325600 0.015545\n", + "10 10000 U-238 scatter-Y1,-1 -0.030089 0.002460\n", + "11 10000 U-238 scatter-Y1,0 -0.004451 0.003663\n", + "12 10000 U-238 scatter-Y1,1 0.020832 0.002831\n", + "13 10000 U-238 scatter-Y2,-2 -0.004149 0.001530\n", + "14 10000 U-238 scatter-Y2,-1 0.000735 0.001729\n", + "15 10000 U-238 scatter-Y2,0 0.003431 0.002098\n", + "16 10000 U-238 scatter-Y2,1 0.000385 0.001263\n", + "17 10000 U-238 scatter-Y2,2 0.000002 0.001718" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get a pandas dataframe for the cell tally data\n", + "df = tally.get_pandas_dataframe()\n", + "\n", + "# Print the first twenty rows in the dataframe\n", + "df.head(100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the new Tally data retrieval API with pure NumPy" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 0.00171834 0.01554515]\n", + " [ 0.00016768 0.00094081]]]\n" + ] + } + ], + "source": [ + "# Get the standard deviations for two of the spherical harmonic\n", + "# scattering reaction rates \n", + "data = tally.get_values(scores=['scatter-Y2,2', 'scatter-Y0,0'], \n", + " nuclides=['U-238', 'U-235'], value='std_dev')\n", + "print(data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Analyze the distribcell tally**" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10002\n", + "\tName =\tdistribcell tally\n", + "\tFilters =\t\n", + " \t\tdistribcell\t[10002]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t['absorption', 'scatter']\n", + "\tEstimator =\ttracklength\n", + "\n" + ] + } + ], + "source": [ + "# Find the distribcell Tally with the StatePoint API\n", + "tally = sp.get_tally(name='distribcell tally')\n", + "\n", + "# Print a little info about the distribcell tally to the screen\n", + "print(tally)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the new Tally data retrieval API with pure NumPy" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 0.04682759]]\n", + "\n", + " [[ 0.03205271]]\n", + "\n", + " [[ 0.03592433]]\n", + "\n", + " [[ 0.02417979]]\n", + "\n", + " [[ 0.02524314]]\n", + "\n", + " [[ 0.02390359]]\n", + "\n", + " [[ 0.0274475 ]]\n", + "\n", + " [[ 0.02827721]]\n", + "\n", + " [[ 0.0231313 ]]\n", + "\n", + " [[ 0.01898386]]]\n" + ] + } + ], + "source": [ + "# Get the relative error for the scattering reaction rates in\n", + "# the first 30 distribcell instances \n", + "data = tally.get_values(scores=['scatter'], filters=['distribcell'],\n", + " filter_bins=[range(10)], value='rel_err')\n", + "print(data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Print the distribcell tally dataframe **without** OpenCG info" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
distribcellscoremeanstd. dev.
bin
558279absorption0.0000950.000009
559279scatter0.0136110.000544
560280absorption0.0000960.000009
561280scatter0.0139990.000568
562281absorption0.0001170.000015
563281scatter0.0159510.000682
564282absorption0.0001040.000011
565282scatter0.0160570.000574
566283absorption0.0001170.000013
567283scatter0.0159970.000706
568284absorption0.0001080.000007
569284scatter0.0167200.000639
570285absorption0.0001160.000008
571285scatter0.0177640.000639
572286absorption0.0001110.000014
573286scatter0.0181010.000766
574287absorption0.0001150.000012
575287scatter0.0184110.000655
576288absorption0.0001380.000014
577288scatter0.0191540.000763
\n", + "
" + ], + "text/plain": [ + " distribcell score mean std. dev.\n", + "bin \n", + "558 279 absorption 0.000095 0.000009\n", + "559 279 scatter 0.013611 0.000544\n", + "560 280 absorption 0.000096 0.000009\n", + "561 280 scatter 0.013999 0.000568\n", + "562 281 absorption 0.000117 0.000015\n", + "563 281 scatter 0.015951 0.000682\n", + "564 282 absorption 0.000104 0.000011\n", + "565 282 scatter 0.016057 0.000574\n", + "566 283 absorption 0.000117 0.000013\n", + "567 283 scatter 0.015997 0.000706\n", + "568 284 absorption 0.000108 0.000007\n", + "569 284 scatter 0.016720 0.000639\n", + "570 285 absorption 0.000116 0.000008\n", + "571 285 scatter 0.017764 0.000639\n", + "572 286 absorption 0.000111 0.000014\n", + "573 286 scatter 0.018101 0.000766\n", + "574 287 absorption 0.000115 0.000012\n", + "575 287 scatter 0.018411 0.000655\n", + "576 288 absorption 0.000138 0.000014\n", + "577 288 scatter 0.019154 0.000763" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get a pandas dataframe for the distribcell tally data\n", + "df = tally.get_pandas_dataframe(nuclides=False)\n", + "\n", + "# Print the last twenty rows in the dataframe\n", + "df.tail(20)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Print the distribcell tally dataframe **with** OpenCG info" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
level 1level 2level 3distribcellscoremeanstd. dev.
cellunivlatcelluniv
idididxyzidid
bin
01000301000100010002100000absorption0.0001220.000010
11000301000100010002100000scatter0.0185960.000871
21000301000110010002100001absorption0.0002060.000014
31000301000110010002100001scatter0.0297330.000953
41000301000120010002100002absorption0.0002800.000018
51000301000120010002100002scatter0.0384940.001383
61000301000130010002100003absorption0.0003840.000026
71000301000130010002100003scatter0.0488390.001181
81000301000140010002100004absorption0.0004570.000023
91000301000140010002100004scatter0.0580610.001466
101000301000150010002100005absorption0.0004940.000026
111000301000150010002100005scatter0.0658740.001575
121000301000160010002100006absorption0.0004900.000032
131000301000160010002100006scatter0.0724200.001988
141000301000170010002100007absorption0.0006050.000042
151000301000170010002100007scatter0.0788020.002228
161000301000180010002100008absorption0.0006270.000037
171000301000180010002100008scatter0.0836840.001936
181000301000190010002100009absorption0.0007110.000040
191000301000190010002100009scatter0.0889890.001689
\n", + "
" + ], + "text/plain": [ + " level 1 level 2 level 3 distribcell score \\\n", + " cell univ lat cell univ \n", + " id id id x y z id id \n", + "bin \n", + "0 10003 0 10001 0 0 0 10002 10000 0 absorption \n", + "1 10003 0 10001 0 0 0 10002 10000 0 scatter \n", + "2 10003 0 10001 1 0 0 10002 10000 1 absorption \n", + "3 10003 0 10001 1 0 0 10002 10000 1 scatter \n", + "4 10003 0 10001 2 0 0 10002 10000 2 absorption \n", + "5 10003 0 10001 2 0 0 10002 10000 2 scatter \n", + "6 10003 0 10001 3 0 0 10002 10000 3 absorption \n", + "7 10003 0 10001 3 0 0 10002 10000 3 scatter \n", + "8 10003 0 10001 4 0 0 10002 10000 4 absorption \n", + "9 10003 0 10001 4 0 0 10002 10000 4 scatter \n", + "10 10003 0 10001 5 0 0 10002 10000 5 absorption \n", + "11 10003 0 10001 5 0 0 10002 10000 5 scatter \n", + "12 10003 0 10001 6 0 0 10002 10000 6 absorption \n", + "13 10003 0 10001 6 0 0 10002 10000 6 scatter \n", + "14 10003 0 10001 7 0 0 10002 10000 7 absorption \n", + "15 10003 0 10001 7 0 0 10002 10000 7 scatter \n", + "16 10003 0 10001 8 0 0 10002 10000 8 absorption \n", + "17 10003 0 10001 8 0 0 10002 10000 8 scatter \n", + "18 10003 0 10001 9 0 0 10002 10000 9 absorption \n", + "19 10003 0 10001 9 0 0 10002 10000 9 scatter \n", + "\n", + " mean std. dev. \n", + " \n", + " \n", + "bin \n", + "0 0.000122 0.000010 \n", + "1 0.018596 0.000871 \n", + "2 0.000206 0.000014 \n", + "3 0.029733 0.000953 \n", + "4 0.000280 0.000018 \n", + "5 0.038494 0.001383 \n", + "6 0.000384 0.000026 \n", + "7 0.048839 0.001181 \n", + "8 0.000457 0.000023 \n", + "9 0.058061 0.001466 \n", + "10 0.000494 0.000026 \n", + "11 0.065874 0.001575 \n", + "12 0.000490 0.000032 \n", + "13 0.072420 0.001988 \n", + "14 0.000605 0.000042 \n", + "15 0.078802 0.002228 \n", + "16 0.000627 0.000037 \n", + "17 0.083684 0.001936 \n", + "18 0.000711 0.000040 \n", + "19 0.088989 0.001689 " + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get a pandas dataframe for the distribcell tally data\n", + "df = tally.get_pandas_dataframe(summary=su, nuclides=False)\n", + "\n", + "# Print the last twenty rows in the dataframe\n", + "df.head(20)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "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", + "
meanstd. dev.
count289.000000289.000000
mean0.0004140.000025
std0.0002410.000010
min0.0000130.000003
25%0.0002040.000017
50%0.0003870.000024
75%0.0005940.000031
max0.0009190.000060
\n", + "
" + ], + "text/plain": [ + " mean std. dev.\n", + " \n", + " \n", + "count 289.000000 289.000000\n", + "mean 0.000414 0.000025\n", + "std 0.000241 0.000010\n", + "min 0.000013 0.000003\n", + "25% 0.000204 0.000017\n", + "50% 0.000387 0.000024\n", + "75% 0.000594 0.000031\n", + "max 0.000919 0.000060" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Show summary statistics for absorption distribcell tally data\n", + "absorption = df[df['score'] == 'absorption']\n", + "absorption[['mean', 'std. dev.']].dropna().describe()\n", + "\n", + "# Note that the maximum standard deviation does indeed\n", + "# meet the 5e-4 threshold set by the tally trigger" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Perform a statistical test comparing the tally sample distributions for two categories of fuel pins." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mann-Whitney Test p-value: 0.378626583393\n" + ] + } + ], + "source": [ + "# Extract tally data from pins in the pins divided along y=x diagonal \n", + "multi_index = ('level 2', 'lat',)\n", + "lower = df[df[multi_index + ('x',)] + df[multi_index + ('y',)] < 16]\n", + "upper = df[df[multi_index + ('x',)] + df[multi_index + ('y',)] > 16]\n", + "lower = lower[lower['score'] == 'absorption']\n", + "upper = upper[upper['score'] == 'absorption']\n", + "\n", + "# Perform non-parametric Mann-Whitney U Test to see if the \n", + "# absorption rates (may) come from same sampling distribution\n", + "u, p = scipy.stats.mannwhitneyu(lower['mean'], upper['mean'])\n", + "print('Mann-Whitney Test p-value: {0}'.format(p))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that the symmetry implied by the y=x diagonal ensures that the two sampling distributions are identical. Indeed, as illustrated by the test above, for any reasonable significance level (*e.g.*, $\\alpha$=0.05) one would **not reject** the null hypothesis that the two sampling distributions are identical.\n", + "\n", + "Next, perform the same test but with two groupings of pins which are not symmetrically identical to one another." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mann-Whitney Test p-value: 7.18782749267e-43\n" + ] + } + ], + "source": [ + "# Extract tally data from pins in the pins divided along y=-x diagonal\n", + "multi_index = ('level 2', 'lat',)\n", + "lower = df[df[multi_index + ('x',)] > df[multi_index + ('y',)]]\n", + "upper = df[df[multi_index + ('x',)] < df[multi_index + ('y',)]]\n", + "lower = lower[lower['score'] == 'absorption']\n", + "upper = upper[upper['score'] == 'absorption']\n", + "\n", + "# Perform non-parametric Mann-Whitney U Test to see if the \n", + "# absorption rates (may) come from same sampling distribution\n", + "u, p = scipy.stats.mannwhitneyu(lower['mean'], upper['mean'])\n", + "print('Mann-Whitney Test p-value: {0}'.format(p))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that the asymmetry implied by the y=-x diagonal ensures that the two sampling distributions are *not* identical. Indeed, as illustrated by the test above, for any reasonable significance level (*e.g.*, $\\alpha$=0.05) one would **reject** the null hypothesis that the two sampling distributions are identical." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:4: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Extract the scatter tally data from pandas\n", + "scatter = df[df['score'] == 'scatter']\n", + "\n", + "scatter['rel. err.'] = scatter['std. dev.'] / scatter['mean']\n", + "\n", + "# Show a scatter plot of the mean vs. the std. dev.\n", + "scatter.plot(kind='scatter', x='mean', y='rel. err.', title='Scattering Rates')" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\ngXbt2u1+pgym9cts2bx+2bxuiaJRUkVkp8Lx9rJOnz59oo6QEInasVyWioKIlCtZHzxSNcks2Oo+\nEhGRGBUFERGJUVEQEZEYFQUREYlRURCRjFJQUMD48eNjj0eOHEmTJk344IMPyMnJIS8vj7y8PJo2\nbcqZZ57JuHHjdmhfr1692Hx5eXlcf/31qV6NtKWiICIZxcxiR98MGzaMa6+9ljfffJNWrVoBUFxc\nzJo1a5gyZQonn3wy55xzDsOGDduu/euvv86aNWtit4ceeiiSdUlHKgoiknHcnUcffZSBAwcyZswY\njjnmmB3m2Weffbj++usZNGgQt9xySwQpM5OKgohknCFDhnD77bfzzjvv0KlTp13Oe84557B06VJm\nzJgRm6bzL8qnk9dEpFLsjsScQOW3V+wD2t0ZN24c3bp1o3379rudv3nz5gCsXLky1v7ss8+mRo3/\nfPzdd999XH755RXKka1UFESkUir6YZ4oZsY///lP7rrrLq644goef/zxXc7/ww8/ANCkSZNY+1df\nfZVu3bolPWsmUveRiGSc/Px8xo8fz4cffsg111yzy3lffvll8vPzOfjgg1OULrOpKIhIRmrWrBnj\nx4/nrbfe4sYbb4xN37a/YMmSJTz88MPceeed3HPPPdu11T6F8qn7SEQyVsuWLXnnnXc44YQTWLx4\nMQCNGjXC3alfvz5HH300L774Iqeccsp27c4880xyc3Njj0855RRGjRqV0uzpSkVBRDLK3Llzt3tc\nUFDA/PnzASgsLKxwe9meuo9ERCRGRUFERGJUFEREJEZFQUREYlQUREQkRkVBRERiVBRERCRGRUFE\nRGJUFEQkq7Rv354PPvgg6hgZS0VBROKy7YpnybzFo+zlOAGeeuopfvGLXwAwbdo0TjjhhF0uY968\neeTk5FBSUlK5X0YW0zAXIlIByRxILr6iUJECsjvJGhhv69at242tlEm0pSAiWaWgoIB33nkHgEmT\nJnHUUUfRsGFDmjZtysCBAwFiWxKNGjUiLy+PTz/9FHfn7rvvpqCggPz8fC6++GJWr14dW+7w4cNp\n3bo1e+21V2y+ba8zaNAgzjvvPPr27UvDhg0ZNmwYn332GcceeyyNGzemefPmXHfddWzevDm2vJyc\nHB555BEOPPBAGjRowG233cbs2bM59thjadSoET179txu/lRRURCRjLOrb/iltyJuuOEGBgwYQHFx\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot a histogram and kernel density estimate for the scattering rates\n", + "scatter['mean'].plot(kind='hist', bins=25)\n", + "scatter['mean'].plot(kind='kde')\n", + "pylab.title('Scattering Rates')\n", + "pylab.xlabel('Mean')\n", + "pylab.legend(['KDE', 'Histogram'])" + ] + } + ], + "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.8" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/pythonapi/examples/pandas-dataframes.rst b/docs/source/pythonapi/examples/pandas-dataframes.rst new file mode 100644 index 0000000000..7eacf4d328 --- /dev/null +++ b/docs/source/pythonapi/examples/pandas-dataframes.rst @@ -0,0 +1,11 @@ +================= +Pandas Dataframes +================= + +.. only:: html + + .. notebook:: pandas-dataframes.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 2533625970..6e272b1551 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -6,7 +6,7 @@ Python API OpenMC includes a rich Python API that enables programmatic pre- and post-processing. The easiest way to begin using the API is to take a look at the -example IPython notebooks provided. The full API documentation serves to provide +example Jupyter notebooks provided. The full API documentation serves to provide more information on a given module or class. **Handling nuclear data:** @@ -53,9 +53,10 @@ more information on a given module or class. summary tallies -**Examples:** +**Example Jupyter Notebooks:** .. toctree:: :maxdepth: 1 + examples/pandas-dataframes examples/tally-arithmetic From e550a8de27a7da0a7584ca09ddab54005126f95c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 10 Aug 2015 06:54:02 +0700 Subject: [PATCH 062/101] Fix bug in get_unique_universes introduced by #425 --- openmc/universe.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openmc/universe.py b/openmc/universe.py index 75b6737465..cdec833cb6 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -714,7 +714,8 @@ class Lattice(object): assert isinstance(u, Universe) univs[u._id] = u - univs[self._outer._id] = self._outer + if self._outer is not None: + univs[self._outer._id] = self._outer return univs From 20d915809af47949dcaae515578e0fa35e8934ae Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 10 Aug 2015 06:54:33 +0700 Subject: [PATCH 063/101] Make sure plotting geometry works in two notebooks --- .../examples/pandas-dataframes.ipynb | 131 ++++++++++-------- .../pythonapi/examples/tally-arithmetic.ipynb | 36 ++--- 2 files changed, 88 insertions(+), 79 deletions(-) diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index 485420565b..6d7dff9c14 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -358,6 +358,19 @@ "metadata": { "collapsed": false }, + "outputs": [], + "source": [ + "# Run openmc in plotting mode\n", + "executor = openmc.Executor()\n", + "executor.plot_geometry(output=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, "outputs": [ { "data": { @@ -366,16 +379,12 @@ "" ] }, - "execution_count": 13, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Run openmc in plotting mode\n", - "executor = openmc.Executor()\n", - "executor.plot_geometry(output=False)\n", - "\n", "# Convert OpenMC's funky ppm to png\n", "!convert materials-xy.ppm materials-xy.png\n", "\n", @@ -392,7 +401,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": { "collapsed": true }, @@ -412,7 +421,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -455,7 +464,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -484,7 +493,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": { "collapsed": true }, @@ -510,7 +519,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "metadata": { "collapsed": true }, @@ -529,7 +538,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "metadata": { "collapsed": false }, @@ -554,7 +563,7 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.6.2\n", - " Date/Time: 2015-08-08 09:29:37\n", + " Date/Time: 2015-08-10 06:49:48\n", " MPI Processes: 4\n", "\n", " ===========================================================================\n", @@ -621,20 +630,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 9.4600E-01 seconds\n", - " Reading cross sections = 2.8400E-01 seconds\n", - " Total time in simulation = 5.9780E+00 seconds\n", - " Time in transport only = 5.6820E+00 seconds\n", - " Time in inactive batches = 7.8500E-01 seconds\n", - " Time in active batches = 5.1930E+00 seconds\n", - " Time synchronizing fission bank = 2.3000E-01 seconds\n", - " Sampling source sites = 1.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 = 1.0000E-03 seconds\n", - " Total time elapsed = 6.9280E+00 seconds\n", - " Calculation Rate (inactive) = 15923.6 neutrons/second\n", - " Calculation Rate (active) = 7221.26 neutrons/second\n", + " Total time for initialization = 9.4100E-01 seconds\n", + " Reading cross sections = 2.9400E-01 seconds\n", + " Total time in simulation = 7.4740E+00 seconds\n", + " Time in transport only = 6.3910E+00 seconds\n", + " Time in inactive batches = 8.9600E-01 seconds\n", + " Time in active batches = 6.5780E+00 seconds\n", + " Time synchronizing fission bank = 9.9000E-01 seconds\n", + " Sampling source sites = 4.7000E-02 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 6.0000E-03 seconds\n", + " Total time for finalization = 0.0000E+00 seconds\n", + " Total time elapsed = 8.4190E+00 seconds\n", + " Calculation Rate (inactive) = 13950.9 neutrons/second\n", + " Calculation Rate (active) = 5700.82 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -652,7 +661,7 @@ "0" ] }, - "execution_count": 19, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -674,7 +683,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "metadata": { "collapsed": false }, @@ -692,7 +701,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "metadata": { "collapsed": false, "scrolled": true @@ -713,7 +722,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "metadata": { "collapsed": false }, @@ -752,7 +761,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "metadata": { "collapsed": false }, @@ -806,7 +815,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "metadata": { "collapsed": false }, @@ -1077,7 +1086,7 @@ "19 1 5 1 6.3e-07 - 2.0e+01 nu-fission 0.000486 0.000026" ] }, - "execution_count": 24, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -1092,7 +1101,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "metadata": { "collapsed": false }, @@ -1101,7 +1110,7 @@ "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1116,7 +1125,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "metadata": { "collapsed": false }, @@ -1124,10 +1133,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 26, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, @@ -1135,7 +1144,7 @@ "data": { "image/png": "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\nTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1166,7 +1175,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "metadata": { "collapsed": false }, @@ -1197,7 +1206,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, "metadata": { "collapsed": false }, @@ -1397,7 +1406,7 @@ "17 10000 U-238 scatter-Y2,2 0.000002 0.001718" ] }, - "execution_count": 28, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -1419,7 +1428,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 30, "metadata": { "collapsed": false }, @@ -1450,7 +1459,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 31, "metadata": { "collapsed": false }, @@ -1488,7 +1497,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "metadata": { "collapsed": false }, @@ -1536,7 +1545,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 33, "metadata": { "collapsed": false }, @@ -1732,7 +1741,7 @@ "577 288 scatter 0.019154 0.000763" ] }, - "execution_count": 32, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -1754,7 +1763,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 34, "metadata": { "collapsed": false }, @@ -2175,7 +2184,7 @@ "19 0.088989 0.001689 " ] }, - "execution_count": 33, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -2190,7 +2199,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 35, "metadata": { "collapsed": false }, @@ -2276,7 +2285,7 @@ "max 0.000919 0.000060" ] }, - "execution_count": 34, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -2299,7 +2308,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 36, "metadata": { "collapsed": false }, @@ -2337,7 +2346,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 37, "metadata": { "collapsed": false }, @@ -2373,7 +2382,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 38, "metadata": { "collapsed": false }, @@ -2392,10 +2401,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 37, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" }, @@ -2403,7 +2412,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2422,7 +2431,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 39, "metadata": { "collapsed": false }, @@ -2430,10 +2439,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 38, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" }, @@ -2441,7 +2450,7 @@ "data": { "image/png": "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\ngXbt2u1+pgym9cts2bx+2bxuiaJRUkVkp8Lx9rJOnz59oo6QEInasVyWioKIlCtZHzxSNcks2Oo+\nEhGRGBUFERGJUVEQEZEYFQUREYlRURCRjFJQUMD48eNjj0eOHEmTJk344IMPyMnJIS8vj7y8PJo2\nbcqZZ57JuHHjdmhfr1692Hx5eXlcf/31qV6NtKWiICIZxcxiR98MGzaMa6+9ljfffJNWrVoBUFxc\nzJo1a5gyZQonn3wy55xzDsOGDduu/euvv86aNWtit4ceeiiSdUlHKgoiknHcnUcffZSBAwcyZswY\njjnmmB3m2Weffbj++usZNGgQt9xySwQpM5OKgohknCFDhnD77bfzzjvv0KlTp13Oe84557B06VJm\nzJgRm6bzL8qnk9dEpFLsjsScQOW3V+wD2t0ZN24c3bp1o3379rudv3nz5gCsXLky1v7ss8+mRo3/\nfPzdd999XH755RXKka1UFESkUir6YZ4oZsY///lP7rrrLq644goef/zxXc7/ww8/ANCkSZNY+1df\nfZVu3bolPWsmUveRiGSc/Px8xo8fz4cffsg111yzy3lffvll8vPzOfjgg1OULrOpKIhIRmrWrBnj\nx4/nrbfe4sYbb4xN37a/YMmSJTz88MPceeed3HPPPdu11T6F8qn7SEQyVsuWLXnnnXc44YQTWLx4\nMQCNGjXC3alfvz5HH300L774Iqeccsp27c4880xyc3Njj0855RRGjRqV0uzpSkVBRDLK3Llzt3tc\nUFDA/PnzASgsLKxwe9meuo9ERCRGRUFERGJUFEREJEZFQUREYlQUREQkRkVBRERiVBRERCRGRUFE\nRGJUFEQkq7Rv354PPvgg6hgZS0VBROKy7YpnybzFo+zlOAGeeuopfvGLXwAwbdo0TjjhhF0uY968\neeTk5FBSUlK5X0YW0zAXIlIByRxILr6iUJECsjvJGhhv69at242tlEm0pSAiWaWgoIB33nkHgEmT\nJnHUUUfRsGFDmjZtysCBAwFiWxKNGjUiLy+PTz/9FHfn7rvvpqCggPz8fC6++GJWr14dW+7w4cNp\n3bo1e+21V2y+ba8zaNAgzjvvPPr27UvDhg0ZNmwYn332GcceeyyNGzemefPmXHfddWzevDm2vJyc\nHB555BEOPPBAGjRowG233cbs2bM59thjadSoET179txu/lRRURCRjLOrb/iltyJuuOEGBgwYQHFx\nMXPmzOH8888H4MMPPwSguLiYNWvW0KVLF5588kmGDRvGe++9x5w5c1i7di3XXnstAEVFRfTv358R\nI0awaNEiiouL+fHHH7d73dGjR3P++edTXFxM7969yc3N5cEHH2TFihVMnDiR8ePHM2TIkO3ajBkz\nhsmTJ/PJJ59w77330q9fP0aMGMH8+fOZOnUqI0aMSMjvqyJUFEQko2y7nGbjxo1jt/79+++0S6lW\nrVp89913LF++nHr16tGlS5fYMsp69tlnuemmmygoKKB+/frcc889jBw5kq1bt/Liiy/SvXt3jjvu\nOGrWrMmdd965w+sdd9xxdO/eHYA6derQqVMnOnfuTE5ODq1bt+bKK6/k/fff367NzTffzB577EG7\ndu047LDDOP300ykoKKBBgwacfvrpTJ48OVG/tripKIhIRtl2Oc2ffvopdhsyZMhOP+gff/xxZs6c\nSdu2bencuTNvvPFGuctdtGgRrVu3jj1u1aoVW7ZsYcmSJSxatIh999039lzdunXZc889t2tf+nmA\nmTNncsYZZ9CsWTMaNmzIrbfeyooVK7abJz8/f7tlln28du3a3fw2Ek9FQUQyXnndSQcccACFhYUs\nW7aMW265hfPOO48NGzbsdKuiefPmzJs3L/Z4/vz51KhRg6ZNm9KsWTMWLlwYe27Dhg07fMCXXebV\nV19Nu3btmDVrFsXFxfzlL3/JiKOdVBREJGs988wzLFu2DICGDRtiZuTk5LD33nuTk5PD7NmzY/P2\n6tWL//u//2PevHmsXbuWP//5z/Ts2ZOcnBx69OjBa6+9xsSJE/n5558ZNGjQbo9cWrt2LXl5edSr\nV49vv/2WRx55ZLd5Sy8zqkuGqiiISAVYEm9VSFXOYapvv/027du3Jy8vjwEDBjBy5Ehq165NvXr1\nuPXWW+natSuNGzdm0qRJXHbZZfTt25cTTjiBNm3aUK9ePQYPHgzAoYceyuDBg+nZsyfNmzcnLy+P\nffbZh9q1a5f7+vfddx+FhYU0aNCAK6+8kp49e243z87yln0+UYfeVoSl4wWszczTMVeiFBYW0rt3\n76hjJE2i1i/4hyj7d2CRX3S9urx/ZtH/rtPV2rVrady4MbNmzdpuP0SqlPfehNOrVEm0pSAiEofX\nXnuN9evXs27dOgYOHEiHDh0iKQjJpqIgIhKH0aNH06JFC1q0aMHs2bMZOXJk1JGSQsNciIjEYejQ\noQwdOjTqGEmnoiBpoSo71Mprq/5wkYpTUZA0suNO5dS0FZFttE9BRERitKUgIuWK4jh5iZaKgojs\nVDbuk8n2c0wSQd1HIiISo6IgIiIxSS0KZvaEmS0xs6mlpg0ys4VmNjm8nZbMDCIiEr9kbyk8CZT9\n0HfgAXfvGN7eSnIGERGJU1KLgrt/CPy0k6d0SIOISBqKap/CdWb2tZk9bmaNIsogIiJlRHFI6iPA\nneH9u4D7gcvLztSjR4/Y/bZt29KuXbuUhEuFCRMmRB0hqZK9foWFhZWar0+fPjud79lnn93tssq2\n7dOnT1ztMlE2/31m27oVFRUxffr0hC4z6ddTMLMC4DV3Pyze53Q9hcxWmfUr79oJ8VxPId7rLlTl\n+gw7ts3eaw1k899nNq8bZOj1FMysWamH5wBTy5tXRERSK6ndR2Y2AjgR2MvMFgC3AyeZ2REEX7vm\nAlclM4OIiMQvqUXB3XvtZPITyXxNERGpPJ3RLCIiMSoKIiISo6IgIiIxKgoiIhKjoiAiIjEqCiIi\nEqOiICIiMbocp2Styl5fWNcllupMRUGy2M7GUkpFW5HMpe4jERGJUVEQEZEYFQUREYlRURARkRgV\nBRERiVFREBGRGBUFERGJUVEQEZEYFQUREYnRGc0iaaC8oTXcvVLziVSWioJI2oh3aA0NwSHJo+4j\nERGJUVEQEZEYFQUREYlRURARkRgVBRERiVFREBGRGBUFERGJUVEQEZEYFQUREYnRGc1S7ZU3dERl\n2mX6sBTb8vbp02e76emaVxJPRUGk0sNGZOuwFJmWVxJJ3UciIhKjoiAiIjEqCiIiErPbomBmL5nZ\nb81MBUREJMvFs6P5EeBSYLCZPQ886e4zkhtLZPc2bN5A4dRC6A3kt4Ka62H9XrD8EPgemDELVh4Q\ndUyRjLLbouDuY4GxZtYI6AmMN7P5wFDgGXffnOSMIjt4b957XPbqZbTduy18BSx6DzblQf1lkD8F\nCl6Fy46HVa3hq0tgSl/4OeLQIhkgri4hM9sTuAS4AvgSeAg4EhibtGQi5Rg5bSQXvHgBg08fzBu9\n34Ai4Kc2sH5vWNYOpvWE14EHFsK7d0KbcfD71nAK0HhOxOlF0ttutxTM7GXgEOBp4Ex3XxQ+NdLM\nvkhmOJEdtIEBbw9gXN9xHJZ/2K7nLakBs08Nbo3mwdH7Qb/OMPsU+OiPsKRDSiKLZJJ49ikMdfc3\nS08ws9ruvsndj0xSLpEdNVgA58KIHiN2XxDKWlUQbNd+MAeOfBQuPBV+PAo+BBYmIatIhoqn++gv\nO5k2MdFBRHbN4bf94TP45X6/xMxitwrZ1AA+/gM8OAe++w2cB1z8Syh4NyEpS+eq7PAZyVA2V7rl\nk/RR7paCmTUDmgN1zawTwbnuDjQA6qUmnkjokFehySx4HhIyDMOWuvD51fDlNXDYpdD9Clh5IIz7\nKyyuStB0HiIinbNJuthV99GpwMVAC+D+UtPXAH9OZiiR7dhW6HYrvH0/bP1NYpddAnx9UbBz+sh/\nQZ/TYS4wZhGsbZbY1xLJAOUWBXd/CnjKzHq4+6jURRIpo/1zsKkhzDotea+xtRZMuha+uhiObwBX\nd4D3BsHn/wWem7zXFUkzu+o+6uvuTwMFZnZj6acAd/cHkp5OBIeufwu6dVLR3fFzHrwDTH0fzrgK\nDiuEl56FVcl/aZF0sKsdzdv2G+SVcxNJvlYToMaG4DDSVFrWDp56H6afC/2OhvapfXmRqOyq++jR\n8OeglKURKavzYPisP3gEQ295Dky8CeadBOcdBa36w1t/h5Kaqc8ikiLxDIj3NzNrYGY1zWy8mS03\ns77xLNzMnjCzJWY2tdS0JmY21sxmmtmYcPgMkR3VB/YfE/TzR2nRkfAvoPFcuPB0qLsy2jwiSRTP\n169T3X01cAYwD9gf+EOcy38SKLt38I/AWHc/CBgfPhbZUXtg5pnBTuaobQIKX4PFR8AVx0DjqAOJ\nJEc8RWFbF9MZwIvuXsyOBzzvlLt/CPxUZnJ3YFh4fxhwdjzLkmroMGBq76hT/Ifnwpj7YOKAYNzg\nfabutolIpomnKLxmZt8SDIA33sz2ATZW4TXz3X1JeH8JkF+FZUm2ajw7+DY+51dRJ9nR51fDGOCi\nX0PLj6NOI5JQ8Qyd/Ucz+19glbtvNbN1wFmJeHF3dzPb6VZHjx49Yvfbtm1Lu3btEvGSaWHChAlR\nR0iqhKxf+5HwDem7U3casHEY9DwLXh4Os06vUPN4h5goLCxM6HypXn66ybb/vaKiIqZPn57QZZr7\n7nuCzKwr0BrY9h/q7j48rhcwKwBec/fDwsffAie5++JwKI133f2QMm08nlyZqrCwkN6906hbJMEq\ns37Bh2Sp97zf0TDuc5i7s6EZ0mFa+HjfidDzbPj3YPjmgoS/Ztn/gx1+T+XMV1a87Sq7/EyR7f97\nZoa7V+mEnniGzn4GaENwKZOtpZ6KqyjsxGiC4TPuDX++UsnlSLbK+zEY5+j7qIPEYeGx8PSY4Kik\n2gRXGxHJYPEMnX0k0K4yX93NbARwIrCXmS0AbgP+CjxvZpcTHM30u4ouV7LcgW8E10AoeS7qJPFZ\ncjg8+T5cdBDUvj84t0EkQ8VTFKYBzYAfK7pwd+9VzlO/ruiypBo5+DWYdgGQIUUBghFWnwAuGgp1\nVgVXfNMopJKB4ikKewNFZjaJ4GhtCPYpdE9eLKm2amyAgvfglaeiTlJxq4EnPoS+pwaF4a0H4zx4\nWyR9xFMUBoU/nf989dGfuiRHwfuw+HDY0CTqJJWzfm946l3ofQacfQm8SjA8t0iG2O15Cu7+HkHf\nf83w/iRgclJTSfW133iYc3LUKapmU0N45u1gOIwLgborok4kErd4xj66EngBeDSctC/wcjJDSTXW\nZjzM7RZ1iqrbXA9GvAqLgH6ddfazZIx4zmjuDxxP0GOKu88E9klmKKmm6q4IDkX9oXPUSRLDc2Es\nwU7ni7tBp6Go51XSXTz7FDa5+6ZtZ2CaWQ30ly3JUPA+zO8aXAUtm0ztA4s7wrl94KA3gjN11kcd\nSmTn4tlSeN/MbgXqmdnJBF1JryU3lmQ7M9vuBgT7E+am4VhHibCsHTz2KSw/GK4BOj0Glpw90GV/\nt7saUiPe+aT6iKco/BFYBkwFrgLeBP47maGkuvBSN2C/d7Jjf0J5ttaCcffCM0DHx+Hy46DFp0l6\nMWeH32+V5pPqIp4B8baa2SvAK+6+NAWZpDrKA+ovDQ5HzXaLgScmwOHD4HfnBRfxeQfQf5ekgXK3\nFCwwyMyWAzOAGeFV1243bWdKorUC5h8f7JytDjwHvroUBn8H806Ei4Bz+gY72kUitKvuowFAV+Bo\nd2/s7o2BzuG0AakIJ9VIK2BB16hTpN6WOvDJABgMrDgouKpb98uh0byok0k1tauicBHQ293nbpvg\n7nOAPuFzIonTkuDIo+pqE/DB/4OHvoM1zeHKI+EMWFC8IOpkUs3sqijUcPdlZSeG0+I5lFUkPrXW\nwl4EfevV3cbG8O5d8PAM2AiH//Nwrv/39SxasyjqZFJN7KoobK7kcyIV02JScGHWLXWiTpI+1u8F\n42B6/+nUyKnBoUMOZeCYgVAv6mCS7XZVFDqY2Zqd3QguqS6SGC0nwPyoQ6Sn/D3yeeDUB5h2zTQ2\nbN4QjC9wzN8hR9/LJDnKLQrunuvueeXc1H0kidPyY1DX+S41z2vOP377D3gSOODfcPXh0GZs1LEk\nC+nDXaJlJdByoi7KGq/lwDNvwcGj4Yz/gqWHwb+jDiXZJJ4zmkWSZ+9vYN3esC7qIJnEYMZZMOQb\n+OFouAru//h+tpRsiTqYZAEVBYlWy4mw4LioU6StXY5NtKUOfHgrPAYDHx1IzWtqYi10XqlUjYqC\nRKvFJPihS9Qp0lgcYxOtBIaXwMTh0DsfTgNqrUlZQskuKgoSreafBV0gUkUGU/rCP76B2sA17aHg\n3ahDSQZSUZDo1FwfjPWzpEPUSbLHhj2D60K//iiceyGceiPU2Bh1KskgKgoSnaaTg+sMbK0ddZLs\nM+s0eGQKNFgA/Y6GPaMOJJlCRUGi0+Iz+FFdR0mzYU944XmYdB1cBhz4ZtSJJAOoKEh0tD8hBQy+\nuBJGAmf2gy4PRh1I0pyKgkRHWwqpswB4fCJ0/geceAe6ypqUR2c0SzTqAHssgmVto05SfRS3gic+\nhItOBnN4L+pAko60pSDRaA4s7lh9rrSWLtblw/Cx0OEZ0EjlshPaUpCk6tnzEiZO/HK7abVqERQF\n7U+Ixrr8YPykSw+E1W/Cd7+JOpGkERUFSaqiojnMnz+A0l9L69Y9NXj4jYpCZFYeAC8Av7sUhk6C\n4tYVal7eZdrdta8i06n7SFJgf6BD7JaTU0tbCulgPvDxH+D831Xy+gxxDMEhGUdFQVKupP5WqAn8\n1CbqKPLxTbChCXT9W9RJJE2oKEjKlTTdBD8CaETP6FkwJMYxfw+GMZdqT0VBUq6k6c9hUZC0UNwK\n3rkbuveLOomkARUFSbmSpj/DD1GnkO182Q9yN0H7qINI1FQUJMWcrdpSSD+eA2/9HU4mGL1Wqi0V\nBUmtRvOwrQa6Bkz6mf8LWEiwf0GqLRUFSa0Wn5GzuFbUKaQ87xIUhdqro04iEVFRkNRqrqKQ1pYD\ns0+Bzg9HnUQioqIgqaUthfT3wX9ra6EaU1GQ1LGt0OxLclUU0tvyQ2D2yXDUI1EnkQioKEjq7DUD\n1u2DbdTIqGnv44FBF1Klhr+QTKaiIKmjK61ljsUdg0Hz2r0YdRJJMRUFSR1daS2zfDIAjn0g6hSS\nYioKkjraUsgsM8+AOqugVdRBJJVUFCQ1cn+GfabBok5RJ5F4eQ581h+OijqIpJKKgqTGPlODobI3\n1486iVTE1xfBQbBi/Yqok0iKRFYUzGyemU0xs8lmNimqHJIiLT6DHzpHnUIqakMTmAFPT3k66iSS\nIlFuKThwkrt3dHd9WmS75trJnLG+gEe/eFSX2qwmou4+0lVWqosWk7STOVPNB8P4aP5HUSeRFIh6\nS2GcmX1uZrq6RzaruQEaz4Glh0WdRCqpX6d+PDb5sahjSArUiPC1u7r7IjPbGxhrZt+6+4fbnuzR\no0dsxrZt29KuXbsoMibFhAkToo6QVKXXb9WqVdBsJixtD1uD4S22bNkSVTSppBtPvhGuheG/Gw67\nOMm5sLAwdaEqIdv+94qKipg+fXpClxlZUXD3ReHPZWb2MtAZiBWFUaNGRRUtJXr37h11hKTatn5/\n/es/WbDHt9vtT6hRowabNkWVTCplncOCM6BtT5hyIeX1/GbC33UmZKwss6r3yEfSfWRm9cwsL7xf\nHzgFmBpFFkmB5t9qf0I2+LovHD486hSSZFHtU8gHPjSzr4BPgdfdfUxEWSTZWszQkUfZYEZ3aP45\n5OkC29ksku4jd58LHBHFa0tqbam5Ger/BMsPjjqKVNWWulDUAzo8C9nVNS+lRH1IqmS5DU3Wwo8H\ngWu47Kzw9UVw+LCoU0gSqShIUq1vshoWHhp1DEmUBV2DQ4ybRR1EkkVFQZJq/Z6rYYGKQtbwnODo\no8OjDiLJoqIgSbO1ZCvrG6/RlkK2mdIH2gM5Ot8kG6koSNIULSuixqZasL5R1FEkkVYcDMXAfuOj\nTiJJoKIgSTNx4UTqrcyLOoYkwxSgwzNRp5AkUFGQpJm4cCL1VjSIOoYkwzTg4Neg1tqok0iCqShI\n0ny84GMVhWy1DlhwHBz8atRJJMFUFCQplq9fzuK1i6mzul7UUSRZplwYnMgmWUVFQZLik4Wf0LlF\nZ0yXzMhe354FLT+G+kuiTiIJpKIgSfHR/I/o2rJr1DEkmTbXD8ZDav9c1EkkgVQUJCnem/ceJ7Y+\nMeoYkmxTLtRRSFlGRUESbmPJRqYtncYx+x4TdRRJtrndoMEC2HNG1EkkQVQUJOFmbphJp2adqFuz\nbtRRJNlKasC0XtrhnEVUFCThpm+YzkkFJ0UdQ1JFXUhZRUVBEm76hunan1CdLOoIW+pAy6iDSCKo\nKEhCrft5HfM3zefYlsdGHUVSxsKthahzSCKoKEhCTVw4kda1W1Ovpk5aq1am9oZD4eetP0edRKpI\nRUESauzssRxaT0NlVzurCmAZvDXrraiTSBWpKEhCvT37bTrUUz9CtTQFnpmiHc6ZTkVBEmbRmkXM\nL57P/nUvwTm0AAAK9ElEQVT2jzqKRKEo+FJQvLE46iRSBSoKkjBjZo+h237dyLXcqKNIFDZAt/26\nMWr6qKiTSBWoKEjCvD37bU7d/9SoY0iELjzsQnUhZTgVBUmIEi9h7JyxnHqAikJ19tuDfstXi79i\nQfGCqKNIJakoSEJ8svAT8uvn06phq6ijSITq1KhDj7Y9eHaqhr3IVCoKkhAvT3+Zc9ueG3UMSQNX\ndLqCoV8OpcRLoo4ilaCiIFXm7rz07Uucc8g5UUeRNNC5RWca1WnEmNljoo4ilaCiIFU2delUSryE\nI5oeEXUUSQNmxtVHXc2Qz4ZEHUUqQUVBquzl6S9zziHnYKZLb0qgV/teTFgwge9XfR91FKkgFQWp\nEnfnhaIXtD9BtlO/Vn36dujLo188GnUUqSAVBamSrxZ/xbrN6ziu5XFRR5E0c83R1zD0y6Gs+3ld\n1FGkAlQUpEqGfz2cvh36kmP6U5LtHbTnQZzQ+gQe+/KxqKNIBeg/WSpt89bNFE4rpG+HvlFHkTR1\nS9dbeOCTB9i8dXPUUSROKgpSaW9+9yb7N96fA/c8MOookqY6t+hMm8ZteO6b56KOInFSUZBKGzxp\nMP2P7h91DElzfz7+z9z9wd1sKdkSdRSJg4qCVErRsiK+WfYN5x96ftRRJM39us2vaZ7XnKe+eirq\nKBIHFQWplMGfDubKTldSK7dW1FEkzZkZ9/zqHu54/w42bN4QdRzZDRUFqbAfVv/A80XPc83R10Qd\nRTJEl3270LlFZx789MGoo8huqChIhd3z0T1cdsRl5O+RH3UUySD3/vpe7vv4Pp3lnOZUFKRCvl/1\nPSOmjeAPXf8QdRTJMAc0OYDfH/N7rv33tbh71HGkHCoKUiG/f/v33NDlBvapv0/UUSQD3dz1Zmav\nnM2IaSOijiLlUFGQuL353ZtMWzqNm7veHHUUyVC1cmvxzLnPcMNbNzBr5ayo48hOqChIXJavX85V\nr1/FkN8MoU6NOlHHkQzWqVknbjvhNnq+2FNHI6UhFQXZrRIv4ZJXLqFX+16cvP/JUceRLHBt52s5\nZK9D6DWql05qSzMqCrJL7s7AMQMp3lTMX7r9Jeo4kiXMjCfOeoL1m9dz5WtXsrVka9SRJKSiIOVy\ndwa9N4ixc8YyuudoaubWjDqSZJFaubV46YKXWLB6AT2e76GupDQRSVEws9PM7Fsz+87Mbokig+za\n+s3ruWz0Zbzx3RuM7TuWxnUbRx1JstAetfbgjd5vkFc7jy6PdWHqkqlRR6r2Ul4UzCwXeBg4DWgH\n9DKztqnOEaWioqKoI+zSO3PfoeOjHdm0ZRPvX/I+TfdoWqH26b5+kl5q5dZi+NnDGXDMALoN78Yt\nY2/hpw0/JeW19Le5e1FsKXQGZrn7PHffDIwEzoogR2SmT58edYQdbNyykReLXuSkp07iqtev4p5f\n3UNhj0Lq16pf4WWl4/pJejMzLu14KV9d9RUrN6xk/4f2p/8b/fnixy8SeqKb/jZ3r0YEr9kCWFDq\n8UKgSwQ5qiV3Z83Pa5i3ah6zV86maFkRHy34iIkLJnJk8yO5otMV9Gzfkxo5UfxpSHXXokELhnYf\nym0n3sYTk5+g16herN60ml/u90uOyD+Cw/IPo6BRAc32aEajOo0ws6gjZx1L9enmZtYDOM3d+4WP\nLwS6uPt1pebxbDwN/rZ3b+OLRV/wxRdf0LFTR9wdx7f7CewwLZ6fQLnPlXgJqzetpnhjMas3raZO\njTq0btSa/Rvvz8F7HkzXVl05vtXx7FVvr4SsZ48ePRg1ahQAnTqdwMyZW8jN3TP2/Pr149iyZSNQ\n+j22Mo/TfVq65EivbMn4v53z0xw++P4Dpi6ZytSlU1mwegE/rvmRTVs20aB2A+rXqk+9mvWoX7M+\nNXNrkmM55FgOuZYbu59jOeTm5PLlF19y5JFHJizb490fT6sxwMwMd69SpYyiKBwDDHL308LHfwJK\n3P3eUvNkX0UQEUmBTCwKNYAZwK+AH4FJQC93V2efiEjEUt5x7O5bzOxa4G0gF3hcBUFEJD2kfEtB\nRETSV2RnNJtZEzMba2YzzWyMmTUqZ74nzGyJmU2tTPuoVGD9dnoin5kNMrOFZjY5vJ2WuvTli+fE\nQzN7KHz+azPrWJG2Uarius0zsynhezUpdanjt7v1M7NDzGyimW00s5sq0jYdVHH9suH96xP+XU4x\nswlm1iHetttx90huwN+Am8P7twB/LWe+XwAdgamVaZ/O60fQfTYLKABqAl8BbcPnbgdujHo94s1b\nap7fAG+G97sAn8TbNlPXLXw8F2gS9XpUcf32Bo4C7gZuqkjbqG9VWb8sev+OBRqG90+r7P9elGMf\ndQeGhfeHAWfvbCZ3/xDY2emNcbWPUDz5dnciX7odhB3PiYex9Xb3T4FGZtY0zrZRquy6lT4eMd3e\nr9J2u37uvszdPwc2V7RtGqjK+m2T6e/fRHcvDh9+Cuwbb9vSoiwK+e6+JLy/BKjowb5VbZ9s8eTb\n2Yl8LUo9vi7cHHw8TbrHdpd3V/M0j6NtlKqybhActD/OzD43s35JS1l58axfMtqmSlUzZtv7dznw\nZmXaJvXoIzMbC+xs4JxbSz9wd6/KuQlVbV9ZCVi/XWV+BLgzvH8XcD/BGx2leH/H6fyNqzxVXbfj\n3f1HM9sbGGtm34ZbuemiKv8fmXA0SlUzdnX3Rdnw/pnZL4HLgK4VbQtJLgruXu4VWcKdx03dfbGZ\nNQOWVnDxVW1fZQlYvx+AlqUetySo4rh7bH4zewx4LTGpq6TcvLuYZ99wnppxtI1SZdftBwB3/zH8\nuczMXibYZE+nD5V41i8ZbVOlShndfVH4M6Pfv3Dn8lCCUSN+qkjbbaLsPhoNXBzevxh4JcXtky2e\nfJ8DB5pZgZnVAi4I2xEWkm3OAdJhTOFy85YyGrgIYmevrwq70eJpG6VKr5uZ1TOzvHB6feAU0uP9\nKq0iv/+yW0Pp/t5BFdYvW94/M2sFvARc6O6zKtJ2OxHuTW8CjANmAmOARuH05sAbpeYbQXDm8yaC\nfrFLd9U+XW4VWL/TCc7wngX8qdT04cAU4GuCgpIf9TqVlxe4Criq1DwPh89/DXTa3bqmy62y6wa0\nITii4ytgWjquWzzrR9AVugAoJji4Yz6wRya8d1VZvyx6/x4DVgCTw9ukXbUt76aT10REJEaX4xQR\nkRgVBRERiVFREBGRGBUFERGJUVEQEZEYFQUREYlRUZBqzcxKzOzpUo9rmNkyM0uHM8hFUk5FQaq7\ndcChZlYnfHwywRAAOoFHqiUVBZFgNMnfhvd7EZxFbxAMe2DBhZ4+NbMvzax7OL3AzD4wsy/C27Hh\n9JPM7D0ze8HMppvZM1GskEhlqSiIwHNATzOrDRxGMBb9NrcC4929C9AN+F8zq0cwHPrJ7n4k0BN4\nqFSbI4AbgHZAGzPrikiGSOooqSKZwN2nmlkBwVbCG2WePgU408wGho9rE4wyuRh42MwOB7YCB5Zq\nM8nDUVPN7CuCK15NSFZ+kURSURAJjAbuA04kuGxjaee6+3elJ5jZIGCRu/c1s1xgY6mnN5W6vxX9\nn0kGUfeRSOAJYJC7f1Nm+tvA9dsemFnH8G4Dgq0FCIbTzk16QpEUUFGQ6s4B3P0Hd3+41LRtRx/d\nBdQ0sylmNg24I5w+BLg47B46GFhbdpm7eCyStjR0toiIxGhLQUREYlQUREQkRkVBRERiVBRERCRG\nRUFERGJUFEREJEZFQUREYlQUREQk5v8DDXXJy8JrhoYAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 3223f23aa5..e68aa36d6d 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -346,10 +346,7 @@ "source": [ "# Run openmc in plotting mode\n", "executor = openmc.Executor()\n", - "executor.plot_geometry(output=False)\n", - "\n", - "# Convert OpenMC's funky ppm to png\n", - "!convert materials-xy.ppm materials-xy.png" + "executor.plot_geometry(output=False)" ] }, { @@ -372,6 +369,9 @@ } ], "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')" ] @@ -572,7 +572,7 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.6.2\n", - " Date/Time: 2015-08-07 11:12:08\n", + " Date/Time: 2015-08-10 06:51:18\n", " MPI Processes: 4\n", "\n", " ===========================================================================\n", @@ -628,20 +628,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 9.0500E-01 seconds\n", - " Reading cross sections = 2.6500E-01 seconds\n", - " Total time in simulation = 8.9630E+00 seconds\n", - " Time in transport only = 8.1580E+00 seconds\n", - " Time in inactive batches = 1.0700E+00 seconds\n", - " Time in active batches = 7.8930E+00 seconds\n", - " Time synchronizing fission bank = 7.6400E-01 seconds\n", - " Sampling source sites = 4.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", + " Total time for initialization = 8.9900E-01 seconds\n", + " Reading cross sections = 2.5700E-01 seconds\n", + " Total time in simulation = 9.5070E+00 seconds\n", + " Time in transport only = 8.6890E+00 seconds\n", + " Time in inactive batches = 1.0080E+00 seconds\n", + " Time in active batches = 8.4990E+00 seconds\n", + " Time synchronizing fission bank = 7.8300E-01 seconds\n", + " Sampling source sites = 4.4000E-02 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 3.0000E-03 seconds\n", " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 9.8710E+00 seconds\n", - " Calculation Rate (inactive) = 11682.2 neutrons/second\n", - " Calculation Rate (active) = 4751.05 neutrons/second\n", + " Total time elapsed = 1.0410E+01 seconds\n", + " Calculation Rate (inactive) = 12400.8 neutrons/second\n", + " Calculation Rate (active) = 4412.28 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", From 8fd058a11ec875cb7760e0ee99ee82617bbfd46c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 10 Aug 2015 12:57:35 +0700 Subject: [PATCH 064/101] Use property decorators for Lattice.outer --- openmc/universe.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/universe.py b/openmc/universe.py index cdec833cb6..bab10f5df7 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -714,8 +714,8 @@ class Lattice(object): assert isinstance(u, Universe) univs[u._id] = u - if self._outer is not None: - univs[self._outer._id] = self._outer + if self.outer is not None: + univs[self.outer._id] = self.outer return univs From 812858cca0fd838ba77511d4a857e178eb109508 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 10 Aug 2015 12:59:04 +0700 Subject: [PATCH 065/101] Fix typo in tally-arithmetic notebook --- docs/source/pythonapi/examples/tally-arithmetic.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index e68aa36d6d..64681b424d 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -725,7 +725,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We have a tally of the total fission rate and the total absorption rate, so we can calculating k-infinity as:\n", + "We have a tally of the total fission rate and the total absorption rate, so we can calculate k-infinity as:\n", "$$k_\\infty = \\frac{\\nu \\Sigma_f \\phi}{\\Sigma_a \\phi}$$" ] }, From 8fff5b1810720d0d8b3450e892c0b7906ce2b158 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 10 Aug 2015 13:11:05 +0700 Subject: [PATCH 066/101] Add links to Python resources in main Python API doc page --- docs/source/pythonapi/index.rst | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 6e272b1551..8c42f2d7e2 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -6,8 +6,12 @@ Python API OpenMC includes a rich Python API that enables programmatic pre- and post-processing. The easiest way to begin using the API is to take a look at the -example Jupyter notebooks provided. The full API documentation serves to provide -more information on a given module or class. +example Jupyter_ notebooks provided. However, this assumes that you are already +familiar with Python and common third-party packages such as NumPy_. If you have +never programmed in Python before, there are many good tutorials available +online. We recommend going through the modules from Codecademy_ and/or the +`Scipy lectures`_. The full API documentation serves to provide more information +on a given module or class. **Handling nuclear data:** @@ -60,3 +64,8 @@ more information on a given module or class. examples/pandas-dataframes examples/tally-arithmetic + +.. _Jupyter: https://jupyter.org/ +.. _NumPy: http://www.numpy.org/ +.. _Codecademy: https://www.codecademy.com/tracks/python +.. _Scipy lectures: https://scipy-lectures.github.io/ From 0d75cbf8c1fe8bbc1fe62eca11c4586af1b90e86 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 10 Aug 2015 13:26:12 +0700 Subject: [PATCH 067/101] Update tally arithmetic notebook to fix an error in thermal flux utilization. Also make equations prettier. --- .../pythonapi/examples/tally-arithmetic.ipynb | 57 +++++++++++-------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 64681b424d..9d2a814930 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -572,7 +572,7 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.6.2\n", - " Date/Time: 2015-08-10 06:51:18\n", + " Date/Time: 2015-08-10 13:21:32\n", " MPI Processes: 4\n", "\n", " ===========================================================================\n", @@ -628,20 +628,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 8.9900E-01 seconds\n", - " Reading cross sections = 2.5700E-01 seconds\n", - " Total time in simulation = 9.5070E+00 seconds\n", - " Time in transport only = 8.6890E+00 seconds\n", - " Time in inactive batches = 1.0080E+00 seconds\n", - " Time in active batches = 8.4990E+00 seconds\n", - " Time synchronizing fission bank = 7.8300E-01 seconds\n", - " Sampling source sites = 4.4000E-02 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 3.0000E-03 seconds\n", + " Total time for initialization = 1.4260E+00 seconds\n", + " Reading cross sections = 3.8800E-01 seconds\n", + " Total time in simulation = 9.0700E+00 seconds\n", + " Time in transport only = 8.3270E+00 seconds\n", + " Time in inactive batches = 1.4110E+00 seconds\n", + " Time in active batches = 7.6590E+00 seconds\n", + " Time synchronizing fission bank = 6.7300E-01 seconds\n", + " Sampling source sites = 1.1000E-02 seconds\n", + " SEND/RECV source sites = 2.0000E-03 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.0410E+01 seconds\n", - " Calculation Rate (inactive) = 12400.8 neutrons/second\n", - " Calculation Rate (active) = 4412.28 neutrons/second\n", + " Total time elapsed = 1.0500E+01 seconds\n", + " Calculation Rate (inactive) = 8858.97 neutrons/second\n", + " Calculation Rate (active) = 4896.20 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -726,7 +726,8 @@ "metadata": {}, "source": [ "We have a tally of the total fission rate and the total absorption rate, so we can calculate k-infinity as:\n", - "$$k_\\infty = \\frac{\\nu \\Sigma_f \\phi}{\\Sigma_a \\phi}$$" + "$$k_\\infty = \\frac{\\langle \\nu \\Sigma_f \\phi \\rangle}{\\langle \\Sigma_a \\phi \\rangle}$$\n", + "In this notation, $\\langle \\cdot \\rangle^a_b$ represents an OpenMC that is integrated over region $a$ and energy range $b$. If $a$ or $b$ is not reported, it means the value represents an integral over all space or all energy, respectively." ] }, { @@ -794,7 +795,7 @@ "source": [ "Notice that even though the neutron production rate and absorption rate are separate tallies, we still get a first-order estimate of the uncertainty on the quotient of them automatically!\n", "\n", - "Now, let's analyze of few of the classic factors in the four-factor formula, starting with the resonance escape probability, which we'll define as $$p=\\frac{\\Sigma_{a,thermal}\\phi}{\\Sigma_a\\phi}$$" + "Now, let's analyze of few of the classic factors in the four-factor formula, starting with the resonance escape probability, which we'll define as $$p=\\frac{\\langle\\Sigma_a\\phi\\rangle_T}{\\langle\\Sigma_a\\phi\\rangle}$$ where the subscript $T$ means thermal energies." ] }, { @@ -860,7 +861,7 @@ "metadata": {}, "source": [ "The fast fission factor can be calculated as\n", - "$$\\epsilon=\\frac{\\Sigma_f\\phi}{\\Sigma_{f,thermal}\\phi}$$" + "$$\\epsilon=\\frac{\\langle\\Sigma_f\\phi\\rangle}{\\langle\\Sigma_f\\phi\\rangle_T}$$" ] }, { @@ -927,8 +928,8 @@ "metadata": {}, "source": [ "The thermal flux utilization is calculated as\n", - "$$f=\\frac{\\Sigma_{a,thermal}^F\\phi}{\\Sigma_a\\phi}$$\n", - "where $F$ denotes fuel." + "$$f=\\frac{\\langle\\Sigma_a\\phi\\rangle^F_T}{\\langle\\Sigma_a\\phi\\rangle_T}$$\n", + "where the superscript $F$ denotes fuel." ] }, { @@ -946,6 +947,8 @@ " \n", " \n", " \n", + " energy [MeV]\n", + " cell\n", " nuclide\n", " score\n", " mean\n", @@ -957,24 +960,28 @@ " \n", " \n", " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " 0\n", + " 0.0e+00 - 6.2e-01\n", + " 10000\n", " total\n", " absorption\n", - " 0.769263\n", - " 0.004172\n", + " 0.802094\n", + " 0.004432\n", " \n", " \n", "\n", "" ], "text/plain": [ - " nuclide score mean std. dev.\n", - "bin \n", - "0 total absorption 0.769263 0.004172" + " energy [MeV] cell nuclide score mean std. dev.\n", + "bin \n", + "0 0.0e+00 - 6.2e-01 10000 total absorption 0.802094 0.004432" ] }, "execution_count": 29, @@ -985,7 +992,7 @@ "source": [ "# Compute thermal flux utilization factor using tally arithmetic\n", "fuel_therm_abs_rate = sp.get_tally(name='fuel therm. abs. rate')\n", - "therm_util = fuel_therm_abs_rate / abs_rate\n", + "therm_util = fuel_therm_abs_rate / therm_abs_rate\n", "therm_util.get_pandas_dataframe()" ] }, From d9c6bcb887c0fc349cb1c11afce74a4638f5f564 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 10 Aug 2015 13:52:41 +0700 Subject: [PATCH 068/101] Add last factor of four-factor formula to arithmetic notebook --- .../pythonapi/examples/tally-arithmetic.ipynb | 148 +++++++++++++----- 1 file changed, 109 insertions(+), 39 deletions(-) diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 9d2a814930..acadc4c4be 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -495,12 +495,9 @@ "source": [ "# Fast Fission Factor tallies\n", "therm_fiss_rate = openmc.Tally(name='therm. fiss. rate')\n", - "tot_fiss_rate = openmc.Tally(name='tot. fiss. rate')\n", - "therm_fiss_rate.add_score('fission')\n", - "tot_fiss_rate.add_score('fission')\n", + "therm_fiss_rate.add_score('nu-fission')\n", "therm_fiss_rate.add_filter(openmc.Filter(type='energy', bins=[0., 0.625]))\n", - "tallies_file.add_tally(therm_fiss_rate)\n", - "tallies_file.add_tally(tot_fiss_rate)" + "tallies_file.add_tally(therm_fiss_rate)" ] }, { @@ -572,7 +569,7 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.6.2\n", - " Date/Time: 2015-08-10 13:21:32\n", + " Date/Time: 2015-08-10 13:51:02\n", " MPI Processes: 4\n", "\n", " ===========================================================================\n", @@ -628,20 +625,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 1.4260E+00 seconds\n", - " Reading cross sections = 3.8800E-01 seconds\n", - " Total time in simulation = 9.0700E+00 seconds\n", - " Time in transport only = 8.3270E+00 seconds\n", - " Time in inactive batches = 1.4110E+00 seconds\n", - " Time in active batches = 7.6590E+00 seconds\n", - " Time synchronizing fission bank = 6.7300E-01 seconds\n", - " Sampling source sites = 1.1000E-02 seconds\n", - " SEND/RECV source sites = 2.0000E-03 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", + " Total time for initialization = 1.0760E+00 seconds\n", + " Reading cross sections = 3.6600E-01 seconds\n", + " Total time in simulation = 1.0001E+01 seconds\n", + " Time in transport only = 9.0020E+00 seconds\n", + " Time in inactive batches = 1.7190E+00 seconds\n", + " Time in active batches = 8.2820E+00 seconds\n", + " Time synchronizing fission bank = 8.8400E-01 seconds\n", + " Sampling source sites = 3.7000E-02 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 1.6000E-02 seconds\n", " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.0500E+01 seconds\n", - " Calculation Rate (inactive) = 8858.97 neutrons/second\n", - " Calculation Rate (active) = 4896.20 neutrons/second\n", + " Total time elapsed = 1.1089E+01 seconds\n", + " Calculation Rate (inactive) = 7271.67 neutrons/second\n", + " Calculation Rate (active) = 4527.89 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -795,7 +792,7 @@ "source": [ "Notice that even though the neutron production rate and absorption rate are separate tallies, we still get a first-order estimate of the uncertainty on the quotient of them automatically!\n", "\n", - "Now, let's analyze of few of the classic factors in the four-factor formula, starting with the resonance escape probability, which we'll define as $$p=\\frac{\\langle\\Sigma_a\\phi\\rangle_T}{\\langle\\Sigma_a\\phi\\rangle}$$ where the subscript $T$ means thermal energies." + "Now, let's analyze the classic factors in the four-factor formula, starting with the resonance escape probability, which we'll define as $$p=\\frac{\\langle\\Sigma_a\\phi\\rangle_T}{\\langle\\Sigma_a\\phi\\rangle}$$ where the subscript $T$ means thermal energies." ] }, { @@ -861,7 +858,7 @@ "metadata": {}, "source": [ "The fast fission factor can be calculated as\n", - "$$\\epsilon=\\frac{\\langle\\Sigma_f\\phi\\rangle}{\\langle\\Sigma_f\\phi\\rangle_T}$$" + "$$\\epsilon=\\frac{\\langle\\nu\\Sigma_f\\phi\\rangle}{\\langle\\nu\\Sigma_f\\phi\\rangle_T}$$" ] }, { @@ -896,18 +893,18 @@ " \n", " 0\n", " total\n", - " fission\n", - " 1.080124\n", - " 0.008126\n", + " nu-fission\n", + " 1.09144\n", + " 0.008201\n", " \n", " \n", "\n", "" ], "text/plain": [ - " nuclide score mean std. dev.\n", - "bin \n", - "0 total fission 1.080124 0.008126" + " nuclide score mean std. dev.\n", + "bin \n", + "0 total nu-fission 1.09144 0.008201" ] }, "execution_count": 28, @@ -918,8 +915,7 @@ "source": [ "# Compute fast fission factor factor using tally arithmetic\n", "therm_fiss_rate = sp.get_tally(name='therm. fiss. rate')\n", - "tot_fiss_rate = sp.get_tally(name='tot. fiss. rate')\n", - "fast_fiss = tot_fiss_rate / therm_fiss_rate\n", + "fast_fiss = fiss_rate / therm_fiss_rate\n", "fast_fiss.get_pandas_dataframe()" ] }, @@ -1000,12 +996,86 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Let's move on to a more complicated example now. Before we set up tallies to get reaction rates in the fuel and moderator in two energy groups for two different nuclides. We can use tally arithmetic to divide each of these reaction rates by the flux to get microscopic multi-group cross sections." + "The final factor is the number of fission neutrons produced per absorption in fuel, calculated as $$\\eta = \\frac{\\langle \\nu\\Sigma_f\\phi \\rangle_T}{\\langle \\Sigma_a \\phi \\rangle^F_T}$$" ] }, { "cell_type": "code", "execution_count": 30, + "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", + "
energy [MeV]cellnuclidescoremeanstd. dev.
bin
00.0e+00 - 6.2e-0110000total(nu-fission / absorption)1.2411030.008414
\n", + "
" + ], + "text/plain": [ + " energy [MeV] cell nuclide score mean \\\n", + "bin \n", + "0 0.0e+00 - 6.2e-01 10000 total (nu-fission / absorption) 1.241103 \n", + "\n", + " std. dev. \n", + "bin \n", + "0 0.008414 " + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Compute neutrons produced per absorption (eta) using tally arithmetic\n", + "eta = therm_fiss_rate / fuel_therm_abs_rate\n", + "eta.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's move on to a more complicated example now. Before we set up tallies to get reaction rates in the fuel and moderator in two energy groups for two different nuclides. We can use tally arithmetic to divide each of these reaction rates by the flux to get microscopic multi-group cross sections." + ] + }, + { + "cell_type": "code", + "execution_count": 31, "metadata": { "collapsed": false, "scrolled": true @@ -1021,7 +1091,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "metadata": { "collapsed": false }, @@ -1152,7 +1222,7 @@ "7 1.274353e-05 " ] }, - "execution_count": 31, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -1171,7 +1241,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 33, "metadata": { "collapsed": false }, @@ -1203,7 +1273,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 34, "metadata": { "collapsed": false }, @@ -1227,7 +1297,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 35, "metadata": { "collapsed": false }, @@ -1258,7 +1328,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 36, "metadata": { "collapsed": false }, @@ -1338,7 +1408,7 @@ "3 10000 6.3e-07 - 2.0e+01 U-235 nu-fission 0.093265 4.590785e-04" ] }, - "execution_count": 35, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1351,7 +1421,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 37, "metadata": { "collapsed": false }, @@ -1481,7 +1551,7 @@ "8 10002 1.9e+00 - 2.0e+01 H-1 scatter 0.377400 0.004341" ] }, - "execution_count": 36, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } From 788e03b208fd170b690d0c78daaecdf2289c53a8 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 10 Aug 2015 19:10:01 -0700 Subject: [PATCH 069/101] Fixed filter indexing issue in Tally.get_values(...) introduced in #426 --- openmc/tallies.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index fa41f5c7f8..4108b09321 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -914,7 +914,8 @@ class Tally(object): filter_indices[i][j] = filter_index # Account for stride in each of the previous filters - filter_indices[:i] *= filter.num_bins + for indices in filter_indices[:i]: + indices *= filter.num_bins # Apply outer product sum between all filter bin indices filter_indices = list(map(sum, itertools.product(*filter_indices))) From ff49e1de372a1dc2e7733cd83c0035004c8404ee Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 11 Aug 2015 13:42:36 +0700 Subject: [PATCH 070/101] Re-run pandas-dataframe notebook after bug fix --- .../examples/pandas-dataframes.ipynb | 64 ++++++------------- 1 file changed, 20 insertions(+), 44 deletions(-) diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index 6d7dff9c14..24c5c00a02 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -563,7 +563,7 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.6.2\n", - " Date/Time: 2015-08-10 06:49:48\n", + " Date/Time: 2015-08-11 13:40:43\n", " MPI Processes: 4\n", "\n", " ===========================================================================\n", @@ -630,20 +630,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 9.4100E-01 seconds\n", - " Reading cross sections = 2.9400E-01 seconds\n", - " Total time in simulation = 7.4740E+00 seconds\n", - " Time in transport only = 6.3910E+00 seconds\n", - " Time in inactive batches = 8.9600E-01 seconds\n", - " Time in active batches = 6.5780E+00 seconds\n", - " Time synchronizing fission bank = 9.9000E-01 seconds\n", - " Sampling source sites = 4.7000E-02 seconds\n", + " Total time for initialization = 9.7300E-01 seconds\n", + " Reading cross sections = 3.0300E-01 seconds\n", + " Total time in simulation = 5.9130E+00 seconds\n", + " Time in transport only = 5.4000E+00 seconds\n", + " Time in inactive batches = 7.7300E-01 seconds\n", + " Time in active batches = 5.1400E+00 seconds\n", + " Time synchronizing fission bank = 4.4600E-01 seconds\n", + " Sampling source sites = 0.0000E+00 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 6.0000E-03 seconds\n", + " Time accumulating tallies = 9.0000E-03 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 8.4190E+00 seconds\n", - " Calculation Rate (inactive) = 13950.9 neutrons/second\n", - " Calculation Rate (active) = 5700.82 neutrons/second\n", + " Total time elapsed = 6.8870E+00 seconds\n", + " Calculation Rate (inactive) = 16170.8 neutrons/second\n", + " Calculation Rate (active) = 7295.72 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -772,34 +772,10 @@ "text": [ "[[[ 0.14583021]]\n", "\n", - " [[ 0.07919847]]\n", - "\n", - " [[ 0.22707514]]\n", - "\n", - " [[ 0.07537836]]\n", - "\n", - " [[ 0.07919847]]\n", - "\n", " [[ 0.07846909]]\n", "\n", - " [[ 0.07537836]]\n", - "\n", - " [[ 0.07177901]]\n", - "\n", - " [[ 0.22707514]]\n", - "\n", - " [[ 0.07537836]]\n", - "\n", " [[ 0.33705448]]\n", "\n", - " [[ 0.177405 ]]\n", - "\n", - " [[ 0.07537836]]\n", - "\n", - " [[ 0.07177901]]\n", - "\n", - " [[ 0.177405 ]]\n", - "\n", " [[ 0.15150059]]]\n" ] } @@ -1110,7 +1086,7 @@ "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1133,7 +1109,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 27, @@ -1144,7 +1120,7 @@ "data": { "image/png": "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\nTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2401,7 +2377,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 38, @@ -2412,7 +2388,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZcAAAEZCAYAAABb3GilAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztvX+cHGWV7/8+k2HcYAIhGQy/AsEhSsaEMJHVaNTILvkh\nuHFhdIGIBtY1eHcBwYmG3Fy9KmGjK1lclt3lhyxESb64irrxBmYI6I1foquCmAAJQhAwQECSiIIb\nDWHO/aOqp6urq3q6p6unu5PP+/Xq13RVPT9O1XQ/p59zznMec3eEEEKILGmptwBCCCH2P6RchBBC\nZI6UixBCiMyRchFCCJE5Ui5CCCEyR8pFCCFE5ki5CFFjzGypmd1YbzmEGE6kXERTYmbvMLMfmtmL\nZrbLzO41s1OqbPN8M/v/Y+duMbMrqmnX3Ve4+0eraSMNM+s3s5fN7CUze8bMrjGz1jLrftbMvlYL\nuYSQchFNh5kdAvwf4J+Aw4Cjgc8Bf6ynXEmY2Yhh6OYkdx8NvAs4C1g0DH0KURIpF9GMvAFwd/+6\nB/zB3de7+4O5Amb2UTPbYma/M7OHzawrPH+5mW2LnP/L8Pxk4N+At4WzgN+Y2UeBBcCnwnP/GZY9\nysxuN7Nfm9kvzeziSL+fNbNvmtnXzOy3wPnRGYKZTQxnGx82s6fM7AUz+5+R+iPNbJWZ7Q7l/5SZ\nbS/nobj748BGoDPS3j+Z2a/M7Ldmdp+ZvSM8Pw9YCpwd3tsD4flDzewmM3vWzJ42syvMrCW8doKZ\nbQhniy+Y2W2V/uPEgYOUi2hGfgG8Gpqs5pnZYdGLZvYB4H8DH3L3Q4D5wK7w8jbgHeH5zwG3mtl4\nd98KfAz4kbuPdvfD3P1GYDXwxfDc+8KB9rvAA8BRwJ8Dl5rZnIgI84FvuPuhYf2kHEszCZTknwOf\nMbM3huf/N3AscDwwGzgvpX7BLYf3fSLwTuAnkWs/AaYRzPDWAN8wszZ37wX+HrgtvLeusPwtwF6g\nA+gC5gB/E167Auh19zEEs8VrBpFLHMBIuYimw91fAt5BMOjeCPzazP7TzF4XFvkbAoVwf1j+cXf/\nVfj+m+7+XPj+P4DHgLeG9Syly+j5PwXa3X25u+9z9yeArwDnRMr80N3Xhn38IaXdz7n7H919M7CJ\nQAEAfAD4e3f/rbs/Q2D6S5Mrx8/M7GVgC/BNd/9q7oK7r3b337h7v7v/I/AaIKfILNq2mY0H3gNc\n5u573P0F4MuRe9sLTDSzo919r7v/cBC5xAGMlItoStz9EXe/wN0nAFMIZhFfDi8fAzyeVC80Rz0Q\nmr1+E9YdV0HXxwFH5eqHbSwFXhcp83QZ7TwXef/fwKjw/VFA1AxWTltd7j4KOBv4sJkdl7tgZotD\n89qLoayHAu0p7RwHHATsiNzbdcDh4fVPESijn5jZQ2Z2QRmyiQOUsqJKhGhk3P0XZraKvCN7O3BC\nvFw46N4A/BmB+ctDX0Pu13uS+Sl+7lfAE+7+hjRxEupUknp8BzABeCQ8nlBuRXf/hpm9D/gscIGZ\nvRP4JPBn7v4wgJntJv1+txMERYxz9/6E9p8nfMZmNhO428w2uPsvy5VRHDho5iKaDjN7o5l9wsyO\nDo8nAOcCPwqLfAVYbGbTLeAEMzsWeC3BgLoTaAl/eU+JNP08cIyZHRQ79/rI8U+Al0JH+0gzG2Fm\nUywfBp1kwhrMrBXlP4ClZjYmvL+LqEw5fQE418yOAUYD+4CdZtZmZp8BDomUfY7AzGUA7r4DuAv4\nRzMbbWYtZtZhZu+CwJcVtgvwYihXkRISAqRcRHPyEoGf5Mehr+FHwGagBwK/CnAlgQP7d8C3gMPc\nfQuwMiz/HIFiuTfS7j3Aw8BzZvbr8NxNQGdoJvpW+Iv+vcDJwC+BFwhmQ7lBO23m4rHjND5PYAp7\ngmCg/waBryONgrbc/SHge8AngN7w9SjwJLCHYOaV4xvh311mdl/4/sNAG4H/ZndY5ojw2inAf5nZ\nS8B/Ape4+5MlZBMHMFbPzcLCcMgvAyOAr7j7F2PXTwRuJohaWebuK2PXRwD3AU+7+18Mj9RCDB9m\n9j+Av3L3U+stixCVULeZS6gYrgXmEcTln2vBWoMou4CLgatSmvk4wS8sbacp9gvM7AgzmxmapN5I\nMAP5dr3lEqJS6mkWewuwzd2fdPdXgNuA90ULuPsL7n4f8Eq8cmj7PZ3Avl6JTVuIRqaNIELrdwRm\nuu8A/1pXiYQYAvWMFjua4pDLt6aUTeJqgkiYQwYrKESzEK7HmVpvOYSolnrOXIZsyjKz9wK/dvdo\nGKkQQogGoZ4zl2cojOGfQHkLxgDeDsw3s9OBPwEOMbOvuvuHo4XMTL4YIYQYAu5e1Q/3es5c7gMm\nhYn82ghWF69NKVtwk+7+P919grsfT5Ca4ntxxRIp2/Cvs846q+4y7C9yNoOMklNyNvorC+o2c3H3\nfWZ2EdBHEIp8k7tvNbMLw+vXm9kRwE8J/Cr9ZvZxoNPdX443N5yyCyGEKE1d07+4+53AnbFz10fe\nP8cg6S/cfQOwoSYCCiGEGBJaod8ATJ4cX97TmDSDnM0gI0jOrJGcjYeUSwPQ2dk5eKEGoBnkbAYZ\nQXJmjeRsPKRchBBCZI6UixBCiMyRchFCCJE5Ui5CCCEyR8pFCCFE5ki5CCGEyBwpFyGEEJkj5SKE\nECJzpFyEEEJkjpSLEEKIzJFyEUIIkTlSLkIIITJHykUIIUTmSLkIIYTIHCkXIYQQmSPlIoQQInOk\nXIQQQmROXZWLmc0zs0fM7DEzW5Jw/UQz+5GZ/cHMeiLnJ5jZ983sYTN7yMwuGV7JhRBClKK1Xh2b\n2QjgWuA04Bngp2a21t23RortAi4G/jJW/RXgMnf/uZmNAu43s/WxukIIIepEPWcubwG2ufuT7v4K\ncBvwvmgBd3/B3e8jUCbR88+5+8/D9y8DW4GjhkdsIYQQg1FP5XI0sD1y/HR4riLMbCLQBfw4E6ka\nkL6+PubM6WbOnG76+vrqLY4QQgxK3cxigFfbQGgS+ybw8XAGs9/R19fHmWcuZM+eLwJw770L+fa3\nVzF37tw6SyaEEOnUU7k8A0yIHE8gmL2UhZkdBNwO3Oru30kr193dPfB+8uTJdHZ2Vi5pjdm4cWPq\ntRUrrg0Vy0IA9uyBxYs/x65du4ZJujyl5GwUmkFGkJxZIzmrY8uWLWzdmq3Lup7K5T5gUmjWehY4\nGzg3pawVHJgZcBOwxd2/XKqT22+/vWpBh4MFCxYknr/lltt56KHCc0ceeWRq+VpTr34roRlkBMmZ\nNZIzO4IhtjrqplzcfZ+ZXQT0ASOAm9x9q5ldGF6/3syOAH4KHAL0m9nHgU7gZOA8YLOZPRA2udTd\ne4f9RmpMT88i7r13IXv2BMcjRy6hp2dVfYUSQohBqOfMBXe/E7gzdu76yPvnKDSd5biXA2QB6Ny5\nc/n2t1excuUNAPT0yN8ihGh86qpcRHnMnTtXCkUI0VQcEL/+hRBCDC9SLkIIITJHykUIIUTmSLkI\nIYTIHCkXIYQQmSPlIoQQInOkXIQQQmSOlIsQQojMkXIRQgiROVIuQgghMkfKRQghROZIuQghhMgc\nKRchhBCZI+UihBAic6RchBBCZI6UixBCiMyRchFCCJE5Ui5CCCEyp67KxczmmdkjZvaYmS1JuH6i\nmf3IzP5gZj2V1BVCCFE/6qZczGwEcC0wD+gEzjWzybFiu4CLgauGUFcIIUSdqOfM5S3ANnd/0t1f\nAW4D3hct4O4vuPt9wCuV1hVCCFE/6qlcjga2R46fDs/Vuq4QQoga01rHvn046nZ3dw+8nzx5Mp2d\nnVV0Wxs2btxYdG7z5s2sW/cDAM44412cdNJJwy1WEUlyNhrNICNIzqyRnNWxZcsWtm7dmmmb9VQu\nzwATIscTCGYgmda9/fbbhyTccLNgwYKB9319fVxzzS3s2fNFAB5/fAnf/vYq5s6dWy/xBojK2ag0\ng4wgObNGcmaHmVXdRj3NYvcBk8xsopm1AWcDa1PKxu+0krpNx8qVN4SKZSGwkD17vsjKlTfUWywh\nhCibus1c3H2fmV0E9AEjgJvcfauZXRhev97MjgB+ChwC9JvZx4FOd385qW597kQIIUSceprFcPc7\ngTtj566PvH+OQvNXybr7Cz09i7j33oXs2RMcjxy5hJ6eVfUVSgghKqCuykUkM3fuXL797VUDprCe\nnsbwtwghRLlIuTQoc+fOlUIRQjQtyi0mhBAic6RchBBCZI6UixBCiMyRchFCCJE5Ui5NQl9fH3Pm\ndDNnTjd9fX31FkcIIUqiaLEmoK+vjzPPXDiQDubeexc2TDoYIYRIQsqlCShMBwN79gTnpFyEEI2K\nzGJCCCEyRzOXJkDpYIQQzYZmLk1ALh3M7NlrmT177YC/RU5+IUSjoplLkxBPByMnvxCikZFyaVLk\n5BdCNDIyiwkhhMgczVyakL6+Pnbu3EVLSw/9/Q8CU+XkF0I0FFIuTUbc19LSchnTpnWyYoX8LUKI\nxkHKpcmI+1r6+6G9fa0UixCioZDPRQghRObUVbmY2Twze8TMHjOzJSllrgmvbzKzrsj5pWb2sJk9\naGZrzOw1wyd5/ejpWcTIkUuAVcCq0NeyqN5iCSFEAXVTLmY2ArgWmAd0Auea2eRYmdOBE9x9ErAI\n+Lfw/ETgo8B0d58KjADOGTbh60jagkohhGgk6ulzeQuwzd2fBDCz24D3AVsjZeYT/ETH3X9sZmPM\nbDzwO+AV4GAzexU4GHhmGGWvK/EFlUII0WjU0yx2NLA9cvx0eG7QMu6+G1gJ/Ap4FnjR3e+uoaxC\nCCEqoJ4zFy+znBWdMOsALgUmAr8FvmFmH3T31fGy3d3dA+8nT55MZ2fnkIStJRs3bsy0vc2bN7Nu\n3Q8AOOOMd3HSSSdl0m7WctaCZpARJGfWSM7q2LJlC1u3bh28YAXUU7k8A0yIHE8gmJmUKnNMeO7d\nwA/dfReAmX0LeDtQpFxuv/327CSuIQsWLMiknb6+Pq655paBdTCPP74kU79MVnLWkmaQESRn1kjO\n7DAr+k1fMfU0i90HTDKziWbWBpwNrI2VWQt8GMDMZhCYv54HfgHMMLORFjyF04Atwyd641K4DiZY\nbLly5Q31FksIcYBRt5mLu+8zs4uAPoJor5vcfauZXRhev97d7zCz081sG/B74ILw2s/N7KsECqof\n+BmgEVQIIRqEuq7Qd/c7gTtj566PHV+UUvcfgH+onXTNiTYWE0I0Akr/sp+RWweTM4X19GgdjBBi\n+JFy2Q/ROhghRL1RbjEhhBCZI+UihBAic6RchBBCZI6UixBCiMyRchFCCJE5Q1IuZnZj1oKIodHX\n18ecOd3MmdNNX19fvcURQghgEOViZiPM7LKES9cnnBPDTF9fH2eeuZD16+ezfv18zjxzoRSMEKIh\nKKlc3P1VoCjLmrvfVzOJRNkoj5gQolEpZxHlvWZ2LfB1gvxeALj7z2omlRBCiKamHOXSRbD3yudj\n50/NXhxRCcojJoRoVEoql3Cf+7Xu/o/DJI+oAOURE0I0KiWVi7u/ambnAlIuDYryiAkhGpFyQpHv\nNbNrzeydZjbdzN5sZtNrLpkYNhTOLITIGvlcDnBy4cy5bZHvvXdhptsiCyEOTAZVLu7+7mGQQ9SJ\nwnBm2LMnOCflIoSohkHNYmZ2hJndZGa94XGnmX2k9qKJoVCuiStX7v77NwEPDp+AQogDgnJ8LrcA\ndwFHhcePAUmr9sUwkqREClfsH8/pp3+Q6dPfXaRkouV27/40cCOwGFgVhjMvGvb7EULsX5SjXNrd\n/evAqwDu/gqwL4vOzWyemT1iZo+Z2ZKUMteE1zeZWVfk/Bgz+6aZbTWzLWY2IwuZmoG0tC95E9cR\nwK3096/kgQcuKEoLE1/ZD9cwdux3mD17rfwtQohMKMeh/7KZjcsdhIP4b6vtOFxDcy1wGvAM8FMz\nW+vuWyNlTgdOcPdJZvZW4N+AnBL5J+AOd3+/mbUCr61WpmYhzU+S5wag8PqCBX/Hm988LXVW8uY3\nT+Ouu26vSI6cQoNgQaeUkhAiRzkzlx7gu8DrzeyHwNeASzLo+y3ANnd/MpwN3Qa8L1ZmPrAKwN1/\nDIwxs/FmdijwTnf/9/DaPnevWuE1Oz09ixg5cgnwbNG13bsPH5jlzJo1PSy3iqGawpQ0UwhRinKi\nxe43s1nAGwEDfuHuezPo+2hge+T4aeCtZZQ5hsBE94KZ3QxMA+4HPu7u/52BXA1PWtqX3Ir9pUuv\nYNOmy+jvz9VYDNwKzGXPHtiwYW3VK/sVZSaEKEU5ZrGcn+WhjPv2MstZQr1WYDpwkbv/1My+DFwO\nfCZeubu7e+D95MmT6ezsHJq0NWTjxo0V17nkkvNZty7Y+eCMM85n165drFmzBoDFi/+WzZs3s27d\n9TzxxHZ+//uFQH7Q37FjB7t27eL884NnE60LhHV/ELb9Lk466aQiOXfs2FEk044dOwraqQdDeZb1\nQHJmi+Ssji1btrB169bBC1aCu9flReA76Y0cLwWWxMpcB5wTOX4EGE/gsX4icv4dwP9J6MObgdWr\nV9es7d7eXh85crzDLQ63+MiR4723t3dI5aNyVtJub2+vz559ls+efVbJvrOgls8ySyRntkjObAnH\nzqrG+Hpuc3wfMMnMJppZG3A2sDZWZi3wYRgIJHjR3Z939+eA7Wb2hrDcacDDwyR3UzF37lyWLbuY\nsWOvYOzYK1i27OKSpqty94jJmeBmz15bMspMvhkhDkzKMovVAnffZ2YXAX3ACOAmd99qZheG1693\n9zvM7HQz20awl8wFkSYuBlaHiunx2LUDnlwk186dz/Pww4+yd++XALjyyiWccsopFflG7r9/E3Pm\ndDN9+iQWLMjvHVdO0kz5ZoQ4MBmScjGzB9y9a/CSpXH3O4E7Y+eujx1flFJ3E/Cn1cqwP1KYL+w6\n4EuUO7jHgwXgEnbv/ijr109lw4bFnHrqqVIMQohBGZJZLAvFImpH4WzhqMGKFxA1d40dewXwUeAq\nYCF7915V8TbK+fDooYc9CyGaj7qZxcRwsQg4b+ConN0qc+auOXO6Wb9+alW9a0MzIQ5MUpWLmb1M\neriwu/shtRFJVELSKvm4aautbR9vetPNtLePq2hwL25nMbNmXcqcOd0F/Q2GNjQT4sAjVbm4+6jh\nFERUTqm9WApnC7cNaXCPtzNmzKlceeU/a+8XIcSglGUWM7N3EuT4utnMDgdGufsTtRVNDEapSKys\nZgvRdqZOfXtqTjPlGBNCRBlUuZjZZ4FTgDcANwNtwGrg7TWVTNSNqKlt1qzpbNjwMwBefvnlorI7\nd+7STpZCiCLKmbmcSbDV8f0A7v6MmclkVifiA/+99y4pyjFWTdtBXrIt9PdfDcD69ZcQRIxNpbX1\nEtraPsnevfn+4AStYxFCFFGOcvmju/ebBSm+zOyASW3faBT7WJawbNnFbNgQJDaoJhIr3/bxwNXk\nlEXAWuAq9u2Drq4baW/P91dpaLIQ4sCgHOXyDTO7niDd/SLgr4Gv1FYskUSSj2XDhrUV78NSuu14\nBp5C2tvHF/UXz9A8a9bFFUeUCSH2L0oqFwumK18HTgReIvC7fNrd1w+DbKIuLKJw1pIzi62irW0x\nPT23FpSOR5TNmnVx1RFlgXluBU899TTHHXcEK1Z8WgpKiCajnJnLHe4+Bbir1sKI0qTt4zJUkv03\nXwTOo6Wlh2nTptDd/anQof8E06d/JHGQj0aUzZnTXZUPpq+vj/nzPzSQC2337sXMn38Oa9cOLZxa\nCFEfSioXd3czu9/M3uLuPxkuoUQyWa52j/tv7rnnMj70ofk8+2xgFps16zI2bPgZGzb8bMC0NRx7\ntaxceUOoWPKzp717r1OQgBBNRjkzlxnAeWb2FEFmYgj0zkm1E0ukkdX6lbj/pr8fvva1Hu64YzVA\nqHjOAzZyzz0f5POfv4zjjz9+0Haznl0JIZqTchJXzgU6gD8D/iJ8za+lUGJo9PX1MWdON3PmdA9p\nz5T+/kl84AOLeP/7L2DPnsOArwIfo79/JZ/5zEo2b948aBvl7vOSxqxZ0wn8PKvC12JaW7cOJLus\n5h6rfT5CiPIZdObi7k8OgxyiSpJSwQRhysECyHjUVk/PIu6551z6+x8ENgKPAe/mpZcAthF8NPLm\nqf5+WLfuer7whcFlqWZ2Fcj7UYL1uk8D7UydOo65c+cW3eOGDefwpjdNC3OmlY5KK5UqJ2uS8r0J\ncaBRz50oRYYU7yB5Hp/5zMrUHSDnzp3Lhz40H7gR+BiwElgPvJcgxf6e4k6GjanA/yVQcpfT3j4e\niN/jEezd28oDD1xQ1g6X5e6wWYpyZj6V7LypmZTYn1HK/f2WjeEq+3zU1oIFf8eaNf8y8Ev62Wdf\nAq6heMHkMcARwOKBsyNHLuGMM84fOM7y13l+18xd/O53u2lp6QlnVFNL+GxuILfPTO7+Vq68gfPP\n7x6yHIPJWM7Mp9ydNzdv3sw119yitDliv0XKZT8h7kg3exSPbZiwe/fhnHlmfhDbuXNXQkuPEvg8\njsXsVV7/+pW8/vWT6OlZxa5dQfm0gRYqT2AZbytQaOfT0vLvTJvWyYoV+QG38B6fLfvZFNetPNAg\n6+2a1637gdLmiP0aKZf9hGiY8s6du3jwwT+yb9/iSIlgN8g9e56LDGL7iM5OYDFtba/wyistuC/G\nHZ59dgn/8i9fKghFThpoly5dwSOPPBIJbT6Xz3++h2XLlgHpM514WwFr6e+/mvb2tQO+llzdXLqb\nnTtH8PDDhXnOogqw1PMJZKjNLEHRckKEuHvdXsA84BECb/KSlDLXhNc3AV2xayOAB4DvptT1ZmD1\n6tWZtjd79lkOtzj0OnQ4zAjfu0OPjx3b4bNnn+VdXbMcehzOCl/BtaCuh69bfPbsswrkDNofvF5L\nyzjv7e315cuXe0vLuFCOHh85crz39vbGZM3XC9oM+i1Vt7e312fPPstnzz5r4FzWzzJHb2+vjxw5\nPpTvlgI5ksrG5YqzZMmSsturJ7V6nlkjObMlHDurG9+rbWDIHQeKYRswETgI+DkwOVbmdIIMAQBv\nBf4rdv0TBOn/16b0kdGjri21Uy4eKpX28Ljb4ZCBAa2tbYy3to6LHB/uHR0nx+rO8LFjO7y3t3dA\nzuXLlxe0A4d4R0dngpKY4V1dM72l5bBI2fEOPQMKK6ktmOktLeO8o+NkNxuVWjdKbkCfMuVtNRuk\ny1Ea5bJ69epM26sVzTIYSs5saXbl8jagN3J8OXB5rMx1wNmR40eA8eH7Y4C7gVM1cykk/is7GLCn\nOhyWoABGhbOCGd7SMtpbWl7jMCacmbR79Jf1kiVL3D15ttHVNStUIj1he+Mcur219XWJSienIIpn\nQd0Oh0Zkby+YdcExA8ou7X6HOgsYzsG+WQYZyZktzSJnFsqlnqHIRwPbI8dPh+fKLXM18Emgv1YC\nNivRhYxjx15BsG5kEvDGhNJTgB8BP6K/fxH9/SOBjxDkK81FYwUO93XrfpDaZ3v7uMTQ5n37RheV\nbWl5bGBRZMBU4Pbw9QzwTwP9BjLcAPQRLKpczu7dny4I8c0qzLjcEOJq6evrY8WKaxWCLPZr6unQ\n9zLLWfzYzN4L/NrdHzCzd5eq3N2dD02dPHkynZ2dFQk5HGzcuLEm7Z5/fjfTp0/i6qtvYu/eE4CZ\nBI79HLmMxxAM3rkE2LOBJ4rae/HFF1mzZg3Tp0/i+9+/hH37rgOgtXUL06f/j1D5xEObbyzo0+xS\nurtns2vXroG2NmxYPOCYT4pyCyLDPks89Li7+284/vgJiTtkPvbYY0ydGmyWesYZ7+Kkk4qzFW3e\nvHlAYb788stFQQqLF38uNUBgMKJtR/vfvHlz+P+4iocegrvvPodjjz2Sc86ZnyhjvanVZzNrJGd1\nbNmyha1bt2bbaLVTn6G+CHKWRc1iS4k59QnMYudEjh8hWIDx9wQzmieAHQQ5z76a0EdGk8TaUuup\ncm9vb8T3kTNbjXWYGZrMCk1ggW9jeapZrLe3t8BX09o6bsCklOycL/TdxM1PCxcu9NbW13lr6+v8\ntNNOSzDpnehwTKJ5Lec7ams7fKBOW9vh3tY2pqSZrNh0WGwyTPLtFD7TWT52bId3dc0s20yX/Ixm\nyKFfJZIzW2hyn0sr8DiBQ7+NwR36M4g59MPzs5DPpSx6e3vDqK7C6LG8Eikc8FpbD/WOjpMHBtCc\ncgmizIp9Lsm+np6CAba4zGs97tA/7bTTfPbss0JZu0MFNStW7lCHzvA+bvGurpkDDv2urpmDKori\nQb7HA19TedFgUWUG7d7WNqakAimM0EuPjivnfzicQQDNMhhKzmzJQrnUzSzm7vvM7CICe8wI4CZ3\n32pmF4bXr3f3O8zsdDPbRjA7uSCtueGRurmZO3cub37zNNavn0+QjzRH9PH1AV8AXuDww8ezffuT\n7N37ZXbvhocfXsypp57KU089XdT2U089nbBxWH4vmNy6kvh+L8Hk9GNETWl3330Zvb3/H0uXXsHu\n3RsIzGEAm4GLCPxEf0PggzmHwEfUyl133c6aNWu45ZboTpl9wHXcf/8L9PX1lVjbMhV4E3AdY8e+\nwJo16etghrItwO7dh7N+/Xza2i6lrS2/Pie3/gieS5ErcifDmB9NiKqpVjs18gvNXIoonDn0xMxi\nueOoiWxsZJZzS/jre2asTLt3dc0sq/+g7owCc1laNFnyr/wZCcdjB2YOuRDf4B6LI96ia2QKZ1Dj\nB2ZBg80g0kxbuXrFbUcj3oJZ1sSJU8P1Oz1FslXSbzmznWpoll/akjNbaPJoMVEHCiPJvkPggL8K\nuJXAod9JNEoM/pEgWivPihWfpq1tH8Gs4zra2vaxYsWnB+27r6+Phx9+lGCmcjywANgK/C35FPtL\nCAIPyuVFYBR7957I0qVXDNzjsmUX09r6NeIRb7lZVe45dHXdTEtLD3Ae8BwjRy5h1qzpJRNK9vQs\noq3tk0S3BWhre2QgAq44Wm8h0Zlie/t4rrzycu64YzWzZz/B7NlrWbbsYlauvEERZGL/oVrt1Mgv\nNHMpSfFpAmASAAAZmklEQVQv4RmpM4nAUd5ecnV8lKTrhZkDor/sx3jge8mvwl++fHnolM/PPMwO\n9ZaW0ZF6cX/NoX7ccZN9+fLl4cyh+F5KLcDMZQSIzjpaWg7z5cuXJ9bp6DjZW1tf56NGHZlYJlcu\nybkf/Z+Xu04nq/U8ldAsv7QlZ7bQzA794XhJuZQmPlgFK/YPLRjQW1vHDTjLcw79StvNDYJ5M1ex\neaej4+QCZVSoiM4KFcVxoXyHhcdTEhVhPiquUInllFYppZhkesqlsSnnHtOeR6k0NZWYu+TQTyYn\nZ6NnPWiW5ynlIuVSNfEvYy5sefToY3306AkFYbblypk2WOZ9NYPPKJL9GjkfRc7vMiuhTG7F/zHh\n++WeC4OOz0ra2sZ4V9eslNlVocIqR75K/B9DVS6VkMVAW+1nc7gG+0JfW+Pma5Ny2U9eUi5DoxxT\nTimKnfa3DAwwwcA/0/PrSoJ1KUkzg6ScZHnTXa8H5rRDIudGexCePCZSLx8mXDiIL/cgWKEwIWZa\nv7VULrUYFAdrs9xBv5rP5nAM9tGccuWEoKfV10ywECkXKZeakDZwliNnqTUghQN3TzgTmZIaaZak\npMzGhr6YGWEb0b5yCy6L1+AU3ldvgXJLSqaZlok5ep/VDJzxZ1nOIFfJQFhK+VUiezWfzazNfUmz\n7Lh/LPhMlKdc5MNKR8pFyqUmVKNc0pJa5kib1SSRNHgsX748thg0bsJK3zIg3156+HNuAOvqmllk\nMkuSLz4g1mpGkDYQpvVXamCvZNBPkrPcexzsszDYvQ1WJmmmEvwoKE9ZKLQ7HSkXKZeakJQGf/ny\n5alyRgebtNX7adFYgw0AaQNZMAsaV9RX4IcpVEhRv1Fvb6+PHj0hcVBauHBhgUmsVNRWmky1mhGk\nDdRp/VWagqZc5VJpIEOpTAa5MsVZI8rzwSXtIRT9rGnd0NCRcpFyqQl530h+M7C0mUtSxFl0QGlt\nPdTNctFd+TDjLOzcgfkqat7KLQjtcbOxYb/dHkSQjRuY9bS0HOx5f0u3wxgfPfooz28/kD7IBQNm\nziwXpMjJRdMlKdak+jkfQSWznfTBtfj/lGuzq2tmmLpnVtlKMC5L/H9e6YBcaqYal6PUQtZylGta\n2HgaMoulI+Ui5VITKjGLJX/pc4PtTDcbExs8kjf7GirxNSpTprwtEpnWUzSL6eiY6vlQ61xGgvwv\n63yd5EEuKTtBzs+TNJOK1k8azMqdySXVDTZoK5Slo2Nq2WamJJNevF48/LxS5VKpeS5QRIcUKYm0\ne1q+fLmb5QMzkoJDSiGHfjJSLlIuNWGwaLFCM1h6hE6hAz23VuXEmpoeCrdiLvatFG5elr7FclD3\n4ILEnXkTTpKfxx16SprVSpt28s8oLcAhrkhHjz62qD2zw8qaQSW1m58J5etNmfK2grLx2WI5Zs3K\nMkQHMuR+oESd90lZqNPMsI1Ko33X08hCudRzPxfRoMQTUOaSTq5Zs6YoeWJb2ydpa7t0IBHjyJFL\n6OlZFWntQYKULl8Mjy9h1qzzan4PPT2LuOeeD9If20pu5MjX8NJL5bTwCHAQjz9+KfBddu/+PvPm\nncvYsYcklD0m/DuVadM6gZt56qmnOe64ExLKPgi8m2Dfu4PYu/e/iT+jTZsuK5lk85e/fIy77/4e\n7scUXXN/I9u2PVF0fufO5H1p8v/P8wj2zbkZ2Am8BDzLSy/9tqDslVf+M/39fwb8L+C/+au/+ouS\niTPTPkvB+0Xce+9C9uzJlc4l8VzPpk1b6O8P9hrasOEcgmf1JQD27MnvD5SWRFU0ANVqp0Z+oZlL\npqxevTrV9p0UYZXmdB+OmUtvb5CeJQg5zieHDNLK5HxCaWaxMR74X27xYD1MtMzBHg92CMxiPYOa\nuYoDJdq9pWV06BsqfkbxmUq+3RkROaNmscMdenzUqCO93MSief9a8lYJra1jYzONYlNjNaHTuRlJ\nNIln8WcmfdFtYBrMm8UqSaJaCVmZz5rlu45mLqIRaG8fR0/PosR08NOmTeGBB4ZXnvjsqqXlMqZN\n62TFiuBX8ymnnBLbFmAtO3fu4ne/O5Lf/OY7HHfcm4DWUO6bKd5dc3F4/iGCnTyn0tJyGcuW9bBh\nw8+KdrRcsODvOO64I9i2bXtRW/391zF69LNFs6mdO58vuId77rmM/v6/DuuuBTYCXybYO+8GglnH\nOEaOvJVJk07ggQdmhOUAFtLeXjybybORYNYUvce1wFXs28fAs7r//k3ATwrK9veTuNVAqe0B+vr6\nIs9/Ou3t45g27UTgPtrbn2DnzvI+M319fWzf/gJBclWAS2lp2QO0MmdONz09izLZjkBbHQyRarVT\nI7/QzCVTSqXYSHPclhuRk+Uvw2pDTHORVkEwQtIOmLnUMsWRWsl+hBM9Le1NzscSj3pKCpfOp73p\nDX+tF/tvkhYXDhYunBzSnd8SYfToYyM7e+buIe8jGjXqyKL2y/08RGdJuXQ8wYzz4EiZgwt2Pi31\nmQuc+4UBE0Ndi1Toi8pm9t0s33Xk0JdyGU5KJQcsNaAP9mXOMiS0WuVSKEuPw5943AzW2vraiMIo\nND0VD57tns+BFs8GXZi9oNA8lKSIomHXB3uwG2dyOHHaFsxJ9xs3Hwb32+15M2FuW+zl4T0U7/kT\nX7+S9j9IVr45RRbfR2im5xR33MGf1kd8v5/4osqhReeVl127HJrluy7lIuUyrJSSsxoFkeVitsES\nGA6m6JJk6ejo9LFjOwaSXwa+kzFF5XJRSsXRV9E2g9lAS0t70cBf2Hd8sG0PB/yxHmSDnhm+phTM\nWOL+i1Ir+ePPKbfgdPny5RHZo8rwsFCu5GzUUT9RV9fMgvVOpWYb+dlf0vn0z0Nc/mCm2VMkV/ra\noFkOJw48v/TPQeH/otofP82AlIuUy7AymJxDNW1lrVzSZClHARbL0uNjx3Yk/GIe/Ndsvr/iHTGj\n60fSQ4F7fMSIcR6Y4WZ62s6dXV0zw/U7+ZlMdK1Oktlt+fLliWG8uXsNrqXt7VMcgBCY92YVLaCN\nB3h0dc1MWfiavo9QOdsZTJw4NZxRRvf/KVY2ScEOSfnjyvkcVPP5bHSkXKRcKqYa30at5MzaLJZG\nOUqs2Cx2SJFc5UZNRc1THR2dBQNtVAmW8kEUL0LtLhicgwF1rCf7hoL7LV4P0xPWSVYS+b6L/TqB\nL6hwEIexbjYqVHDps7noc21pGeddXbMGfCLxmU5b2+EDprByPgtTprwtrJv3BXV0TE1YeHpy6nMq\nnHnNiviZslu9L+UyfIP/PIIFBY8BS1LKXBNe3wR0hecmAN8HHiYI2bkkpW5Gj7q2DNcHrtpBfKhy\nlhuSWutQz3JnSIM5cgtnJPnUMvE2Sj3rJUuWpC5cLJw9FPaf66s4A0LyL//85mpJJp54KPYYj6a+\n6ejoLFBuQYaDzqJBPOdvSnpeY8d2lP3sK3W0R8sdd9xkT0ozEy+bbpYrTidTqYIrBymX4VEsI4Bt\nwETgIODnwORYmdOBO8L3bwX+K3x/BHBy+H4U8It4XZdyKaJa81O5cqavz6h9/qZSMla6uryaIIXB\n6ra1xU0zxfnM0tYUJfcR99EcGlEOUbNcXAn1eLAqPsieEDe3ve51J3gwywnW8iSltc/t1FmYGieY\nHY0ePSF1UI/6inLKNOffyuVDiz/n4Nnl1ymZjfWOjqk+YkTU1FacIDNHYf28WSynSKr5fpSDlMvw\nKJe3Ab2R48uBy2NlrgPOjhw/AoxPaOs7wJ8nnM/iOdec/Um5JDmJK9ljo1pKZW5Om22kKYpaBSmk\nRzkVJl8crP8kv0BgojpsYHZTqHxmRAb/wr7jCUbjCUijPpxoBFZc3sCUdKJHN2xrazvcOzo6Y76W\n9oR+CmdSra2HFgUF5E1vyz0/I0vyQ81K/d/kk2nO8sCXNWNghiLlEtDsyuX9wI2R4/OAf46V+S7w\n9sjx3cCbY2UmAk8BoxL6yORB15r9ySxWTnhoPZTLUNfhDNVcV6rd5GdUvCvmYP0X+2uC2UrpfkYl\nmrqig3hwLt03EU9rH5+pFpvHcttOT/HizNNRxRCXNy03XG6jubR6Q0ummaXvL40DSbnUc4W+l1nO\n0uqZ2Sjgm8DH3f3lpMrd3d0D7ydPnkxnZ2eFYtaejRs3Dltfl1xyPuvWXQ/AGWecz65du1izZk1Z\ndcuRc8eOHUXnzB7FPcg31ta2mOnTP1J2n5WSJmOSXDt27GDx4s8VrahfvPhz7NqVz8V1/vnBZ6iS\nZwXpz3r69El873uf4NVXg3Jml+L+EeCqUIapBTKU6r+wj49x0kknFfSzYcPigbxvZpfy/ve/h9e/\n/vWROotYt+4H7N37qYFn0N8Pzz33vxLu6Fna2hYzZ85HOOmkkwD4/ve/z9VX38TevYHsGzYs5qij\njmT37lydPoJ8YVeFx5cCM4GhrW5vbW1h376bgTdEzi4i+G2aK/MJHn10PFOnvp0zznjXgKw54s8l\n95nctWtX6v9s8+bNrFv3g/B8cZvlMpzf9UrYsmULW7duzbbRarXTUF/ADArNYkuJOfUJzGLnRI4H\nzGIEfpo+4NISfWShxGtOs/yaGYpZLMv9W6qRMe1XaTV+lWrIOfRzjvlKzTHVOL/jJPt2isOXkxZk\nDl639GLQtrYxkdX3g5vFghT7OVNrdNb2Wu/qmlV2lFcl/9vhimZsJGhys1gr8DiBWauNwR36M8g7\n9A34KnD1IH1k9KhrS7N84Ibi0K+1Mokz2ELPcte+ZG0iifcdlbPSvrKWLQh0GOdxs1xvb+/A/jiV\nKKZoZFbStgAdHScXmNHym69NcRjpo0cfm+rQz8ubUzCB/+wDH/hASXnKIW7eyyv/WUNuM06zfNeb\nWrkE8vMegkivbcDS8NyFwIWRMteG1zcB08Nz7wD6Q4X0QPial9B+dk+7hjTLB64Z5ByKjEkDWJbO\n3SRlEN+EK+eryGUBKEUtZYNDfeHChQPXy1k4O5jPKr5+pXRQQnn3kqasixVBj48efWxZM7y09UZZ\nZvZuhu+Q+36gXGr9knLJlmaQMysZsxzAk9qKbsJV6Uyk1rLlQovdyzeFlpqplrqe1b3klUs8HLp4\nEWwS6etfAgVVSQh7OXI2OlkoF6XcFyKB+EZWxZugZcfKlTcUBRUkpbEfLtn6+yeV7D/O3LlzB90w\nbLjupb19PIEFfS2BsSO/xcFgzzWdqRx//JH85jdXAPCJT1ysdPtl0FJvAYRoRHI7KM6evZbZs9eW\n3L+jr6+POXO6mTOnm76+vqLrPT2LGDkyt8viKkaOXMIZZ7xrWGQbjJ6eRbS0XDYgW7Ab5Mwhy1Yp\nWd4L5J71rcB84PAK6+X/R3AJcDywira2S9m+/QV27/40u3d/miuv/OfE/7OIUe3Up5FfyCyWKc0g\n53DLWK5JK0uHftakOfTdm+N/7u5FzzMXhZeUmTkNOfTzILOYEPWlXJNW3DQUXa9Sap/54WDZsmWR\n3TmfGPb+syb6rKO7Xg52X/H/0bJlwd85c7pTaohSSLkI0QAM5rcYzv5zZj4IFhwuWLCgbnJVSxbP\ndTj9b/sTUi5CVMH+NvDE94vfsGExp556alPPZKql3jPLZkXKRYgq2N8GnriZb+/eoUZY7V/Ue2bZ\njEi5CFElGniEKEbKRQgxQNzM19a2mJ6eW+srlGhKpFyEEAPEzXzTp39EszIxJKRchBAFRM18tdoa\nQez/aIW+EEKIzJFyEUIIkTlSLkIIITJHykUIIUTmSLkIIYTIHCkXIYQQmSPlIoQQInPqqlzMbJ6Z\nPWJmj5nZkpQy14TXN5lZVyV1hRBC1Ie6KRczGwFcC8wDOoFzzWxyrMzpwAnuPglYBPxbuXWFEELU\nj3rOXN4CbHP3J939FeA24H2xMvMJ9hzF3X8MjDGzI8qsK4QQok7UU7kcDWyPHD8dniunzFFl1BVC\nCFEn6qlcvMxyVlMphBBCZE49E1c+A0yIHE8gmIGUKnNMWOagMuoC0N2d3/968uTJdHZ2Dl3iGrFx\n48Z6i1AWzSBnM8gIkjNrJGd1bNmyha1bt2baZj2Vy33AJDObCDwLnA2cGyuzFrgIuM3MZgAvuvvz\nZrarjLoA3H777bWQPXOaZZ/yZpCzGWQEyZk1kjM7zKo3GNVNubj7PjO7COgDRgA3uftWM7swvH69\nu99hZqeb2Tbg98AFperW506EEELEqet+Lu5+J3Bn7Nz1seOLyq0rhBCiMdAKfSGEEJkj5SKEECJz\npFyEEEJkjpSLEEKIzJFyEUIIkTlSLkIIITJHykUIIUTmSLkIIYTIHCkXIYQQmSPlIoQQInOkXIQQ\nQmSOlIsQQojMkXIRQgiROVIuQgghMkfKRQghROZIuQghhMgcKRchhBCZI+UihBAic6RchBBCZE5d\nlIuZjTWz9Wb2qJndZWZjUsrNM7NHzOwxM1sSOf8lM9tqZpvM7FtmdujwSS+EEGIw6jVzuRxY7+5v\nAO4JjwswsxHAtcA8oBM418wmh5fvAt7k7tOAR4GlwyJ1jdiyZUu9RSiLZpCzGWQEyZk1krPxqJdy\nmQ+sCt+vAv4yocxbgG3u/qS7vwLcBrwPwN3Xu3t/WO7HwDE1lrembN26td4ilEUzyNkMMoLkzBrJ\n2XjUS7mMd/fnw/fPA+MTyhwNbI8cPx2ei/PXwB3ZiieEEKIaWmvVsJmtB45IuLQseuDubmaeUC7p\nXLyPZcBed18zNCmFEELUgpopF3efnXbNzJ43syPc/TkzOxL4dUKxZ4AJkeMJBLOXXBvnA6cDf15K\nDjOrROy6ITmzoxlkBMmZNZKzsaiZchmEtcBC4Ivh3+8klLkPmGRmE4FngbOBcyGIIgM+Ccxy9z+k\ndeLuB8Z/UQghGgxzH9T6lH2nZmOB/wCOBZ4E/srdXzSzo4Ab3f2MsNx7gC8DI4Cb3H1FeP4xoA3Y\nHTb5I3f/2+G9CyGEEGnURbkIIYTYv2n6FfqNvCAzrc9YmWvC65vMrKuSuvWW08wmmNn3zexhM3vI\nzC5pRDkj10aY2QNm9t1GldPMxpjZN8PP5BYzm9Ggci4N/+8PmtkaM3tNPWQ0sxPN7Edm9gcz66mk\nbiPI2WjfoVLPM7xe/nfI3Zv6BfwD8Knw/RLgCwllRgDbgInAQcDPgcnhtdlAS/j+C0n1hyhXap+R\nMqcDd4Tv3wr8V7l1M3x+1ch5BHBy+H4U8ItGlDNy/RPAamBtDT+PVclJsO7rr8P3rcChjSZnWOeX\nwGvC468DC+sk4+HAKcByoKeSug0iZ6N9hxLljFwv+zvU9DMXGndBZmqfSbK7+4+BMWZ2RJl1s2Ko\nco539+fc/efh+ZeBrcBRjSYngJkdQzBYfgWoZaDHkOUMZ83vdPd/D6/tc/ffNpqcwO+AV4CDzawV\nOJggunPYZXT3F9z9vlCeiuo2gpyN9h0q8Twr/g7tD8qlURdkltNnWpmjyqibFUOVs0AJh1F9XQQK\nuhZU8zwBriaIMOyntlTzPI8HXjCzm83sZ2Z2o5kd3GByHu3uu4GVwK8IIjlfdPe76yRjLepWSiZ9\nNch3qBQVfYeaQrmEPpUHE17zo+U8mLc1yoLMciMl6h0uPVQ5B+qZ2Sjgm8DHw19ftWCocpqZvRf4\ntbs/kHA9a6p5nq3AdOBf3X068HsS8u5lxJA/n2bWAVxKYF45ChhlZh/MTrQBqok2Gs5Ipar7arDv\nUBFD+Q7Va51LRXiDLMiskJJ9ppQ5JixzUBl1s2Kocj4DYGYHAbcDt7p70nqlRpCzG5hvZqcDfwIc\nYmZfdfcPN5icBjzt7j8Nz3+T2imXauR8N/BDd98FYGbfAt5OYIsfbhlrUbdSquqrwb5DabydSr9D\ntXAcDeeLwKG/JHx/OckO/VbgcYJfWm0UOvTnAQ8D7RnLldpnpEzUYTqDvMN00LoNIqcBXwWuHob/\n85DljJWZBXy3UeUEfgC8IXz/WeCLjSYncDLwEDAy/AysAv6uHjJGyn6WQkd5Q32HSsjZUN+hNDlj\n18r6DtX0ZobjBYwF7iZIvX8XMCY8fxSwLlLuPQSRGNuApZHzjwFPAQ+Er3/NULaiPoELgQsjZa4N\nr28Cpg8mb42e4ZDkBN5BYH/9eeT5zWs0OWNtzKKG0WIZ/N+nAT8Nz3+LGkWLZSDnpwh+lD1IoFwO\nqoeMBNFW24HfAr8h8AONSqtbr2eZJmejfYdKPc9IG2V9h7SIUgghROY0hUNfCCFEcyHlIoQQInOk\nXIQQQmSOlIsQQojMkXIRQgiROVIuQgghMkfKRQghROZIuQghhMgcKRchqsTMJoYbMN1sZr8ws9Vm\nNsfMNlqwid2fmtlrzezfzezHYcbj+ZG6PzCz+8PX28Lz7zaz/2tm3wg3Dru1vncpRGVohb4QVRKm\nSn+MIOfWFsL0Le7+kVCJXBCe3+Luqy3YLfXHBOnVHeh39z+a2SRgjbv/qZm9G/gO0AnsADYCn3T3\njcN6c0IMkabIiixEE/CEuz8MYGYPE+S7gyDB40SCjMLzzWxxeP41BFlpnwOuNbNpwKvApEibP3H3\nZ8M2fx62I+UimgIpFyGy4Y+R9/3A3sj7VmAfcJa7PxatZGafBXa4+4fMbATwh5Q2X0XfV9FEyOci\nxPDQB1ySOzCzrvDtIQSzF4APE+xzLkTTI+UiRDbEnZcee38FcJCZbTazh4DPhdf+FVgYmr3eCLyc\n0kbSsRANixz6QgghMkczFyGEEJkj5SKEECJzpFyEEEJkjpSLEEKIzJFyEUIIkTlSLkIIITJHykUI\nIUTmSLkIIYTInP8HkW6mvM8NxhcAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2439,7 +2415,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 39, @@ -2450,7 +2426,7 @@ "data": { "image/png": "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\ngXbt2u1+pgym9cts2bx+2bxuiaJRUkVkp8Lx9rJOnz59oo6QEInasVyWioKIlCtZHzxSNcks2Oo+\nEhGRGBUFERGJUVEQEZEYFQUREYlRURCRjFJQUMD48eNjj0eOHEmTJk344IMPyMnJIS8vj7y8PJo2\nbcqZZ57JuHHjdmhfr1692Hx5eXlcf/31qV6NtKWiICIZxcxiR98MGzaMa6+9ljfffJNWrVoBUFxc\nzJo1a5gyZQonn3wy55xzDsOGDduu/euvv86aNWtit4ceeiiSdUlHKgoiknHcnUcffZSBAwcyZswY\njjnmmB3m2Weffbj++usZNGgQt9xySwQpM5OKgohknCFDhnD77bfzzjvv0KlTp13Oe84557B06VJm\nzJgRm6bzL8qnk9dEpFLsjsScQOW3V+wD2t0ZN24c3bp1o3379rudv3nz5gCsXLky1v7ss8+mRo3/\nfPzdd999XH755RXKka1UFESkUir6YZ4oZsY///lP7rrrLq644goef/zxXc7/ww8/ANCkSZNY+1df\nfZVu3bolPWsmUveRiGSc/Px8xo8fz4cffsg111yzy3lffvll8vPzOfjgg1OULrOpKIhIRmrWrBnj\nx4/nrbfe4sYbb4xN37a/YMmSJTz88MPceeed3HPPPdu11T6F8qn7SEQyVsuWLXnnnXc44YQTWLx4\nMQCNGjXC3alfvz5HH300L774Iqeccsp27c4880xyc3Njj0855RRGjRqV0uzpSkVBRDLK3Llzt3tc\nUFDA/PnzASgsLKxwe9meuo9ERCRGRUFERGJUFEREJEZFQUREYlQUREQkRkVBRERiVBRERCRGRUFE\nRGJUFEQkq7Rv354PPvgg6hgZS0VBROKy7YpnybzFo+zlOAGeeuopfvGLXwAwbdo0TjjhhF0uY968\neeTk5FBSUlK5X0YW0zAXIlIByRxILr6iUJECsjvJGhhv69at242tlEm0pSAiWaWgoIB33nkHgEmT\nJnHUUUfRsGFDmjZtysCBAwFiWxKNGjUiLy+PTz/9FHfn7rvvpqCggPz8fC6++GJWr14dW+7w4cNp\n3bo1e+21V2y+ba8zaNAgzjvvPPr27UvDhg0ZNmwYn332GcceeyyNGzemefPmXHfddWzevDm2vJyc\nHB555BEOPPBAGjRowG233cbs2bM59thjadSoET179txu/lRRURCRjLOrb/iltyJuuOEGBgwYQHFx\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, From 817403ae79e8341013ab38c8ca750ad587aef3f9 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 11 Aug 2015 18:44:22 -0700 Subject: [PATCH 071/101] Now set num_score_bins attribute for derived tallies in arithmetic operations --- openmc/tallies.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 4108b09321..7837681492 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1471,6 +1471,7 @@ class Tally(object): new_name = '({0} {1} {2})'.format(self.name, binary_op, other.name) new_tally = Tally(name=new_name) new_tally.with_batch_statistics = True + new_tally._derived = True data = self._align_tally_data(other) @@ -1498,7 +1499,7 @@ class Tally(object): new_tally._std_dev = np.abs(new_tally.mean) * \ np.sqrt(self_rel_err**2 + other_rel_err**2) elif binary_op == '^': - data = self._align_tally_data(power) + data = self._align_tally_data(other) mean_ratio = data['other']['mean'] / data['self']['mean'] first_term = mean_ratio * data['self']['std. dev.'] second_term = \ @@ -1513,6 +1514,7 @@ class Tally(object): new_tally.with_summary = self.with_summary if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations + new_tally.num_score_bins = self.num_score_bins * other.num_score_bins # Generate filter "outer products" if self.filters == other.filters: @@ -1740,6 +1742,7 @@ class Tally(object): new_tally = self._outer_product(other, binary_op='-') elif isinstance(other, Real): + new_tally = Tally(name='derived') new_tally.name = self.name new_tally._mean = self._mean - other new_tally._std_dev = self._std_dev @@ -1808,6 +1811,7 @@ class Tally(object): new_tally = self._outer_product(other, binary_op='*') elif isinstance(other, Real): + new_tally = Tally(name='derived') new_tally.name = self.name new_tally._mean = self._mean * other new_tally._std_dev = self._std_dev * np.abs(other) @@ -1876,6 +1880,7 @@ class Tally(object): new_tally = self._outer_product(other, binary_op='/') elif isinstance(other, Real): + new_tally = Tally(name='derived') new_tally.name = self.name new_tally._mean = self._mean / other new_tally._std_dev = self._std_dev * np.abs(1. / other) @@ -1944,6 +1949,7 @@ class Tally(object): new_tally = self._outer_product(power, binary_op='^') elif isinstance(power, Real): + new_tally = Tally(name='derived') new_tally.name = self.name new_tally._mean = self._mean ** power self_rel_err = self.std_dev / self.mean From 0a024c8dd7b8846911e4f5698ad1b54def3e4fd3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 12 Aug 2015 09:06:06 +0700 Subject: [PATCH 072/101] Calculate k-infinity from four factors in tally-arithmetic notebook --- .../pythonapi/examples/tally-arithmetic.ipynb | 117 ++++++++++++++---- 1 file changed, 93 insertions(+), 24 deletions(-) diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index acadc4c4be..a2930a80bb 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -569,7 +569,7 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.6.2\n", - " Date/Time: 2015-08-10 13:51:02\n", + " Date/Time: 2015-08-12 08:58:22\n", " MPI Processes: 4\n", "\n", " ===========================================================================\n", @@ -625,20 +625,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 1.0760E+00 seconds\n", - " Reading cross sections = 3.6600E-01 seconds\n", - " Total time in simulation = 1.0001E+01 seconds\n", - " Time in transport only = 9.0020E+00 seconds\n", - " Time in inactive batches = 1.7190E+00 seconds\n", - " Time in active batches = 8.2820E+00 seconds\n", - " Time synchronizing fission bank = 8.8400E-01 seconds\n", - " Sampling source sites = 3.7000E-02 seconds\n", + " Total time for initialization = 9.7500E-01 seconds\n", + " Reading cross sections = 2.8800E-01 seconds\n", + " Total time in simulation = 8.2720E+00 seconds\n", + " Time in transport only = 7.8820E+00 seconds\n", + " Time in inactive batches = 1.0260E+00 seconds\n", + " Time in active batches = 7.2460E+00 seconds\n", + " Time synchronizing fission bank = 1.9500E-01 seconds\n", + " Sampling source sites = 2.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 1.6000E-02 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.1089E+01 seconds\n", - " Calculation Rate (inactive) = 7271.67 neutrons/second\n", - " Calculation Rate (active) = 4527.89 neutrons/second\n", + " Total time elapsed = 9.2580E+00 seconds\n", + " Calculation Rate (inactive) = 12183.2 neutrons/second\n", + " Calculation Rate (active) = 5175.27 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -792,7 +792,7 @@ "source": [ "Notice that even though the neutron production rate and absorption rate are separate tallies, we still get a first-order estimate of the uncertainty on the quotient of them automatically!\n", "\n", - "Now, let's analyze the classic factors in the four-factor formula, starting with the resonance escape probability, which we'll define as $$p=\\frac{\\langle\\Sigma_a\\phi\\rangle_T}{\\langle\\Sigma_a\\phi\\rangle}$$ where the subscript $T$ means thermal energies." + "Often in textbooks you'll see k-infinity represented using the four-factor formula $$k_\\infty = p \\epsilon f \\eta.$$ Let's analyze each of these factors, starting with the resonance escape probability which is defined as $$p=\\frac{\\langle\\Sigma_a\\phi\\rangle_T}{\\langle\\Sigma_a\\phi\\rangle}$$ where the subscript $T$ means thermal energies." ] }, { @@ -1070,12 +1070,81 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Let's move on to a more complicated example now. Before we set up tallies to get reaction rates in the fuel and moderator in two energy groups for two different nuclides. We can use tally arithmetic to divide each of these reaction rates by the flux to get microscopic multi-group cross sections." + "Now we can calculate $k_\\infty$ using the product of the factors form the four-factor formula." ] }, { "cell_type": "code", "execution_count": 31, + "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", + "
nuclidescoremeanstd. dev.
bin
0total(((absorption * nu-fission) * absorption) * (n...1.0420350.013263
\n", + "
" + ], + "text/plain": [ + " nuclide score mean \\\n", + "bin \n", + "0 total (((absorption * nu-fission) * absorption) * (n... 1.042035 \n", + "\n", + " std. dev. \n", + "bin \n", + "0 0.013263 " + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "keff = res_esc * fast_fiss * therm_util * eta\n", + "keff.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We see that the value we've obtained here has exactly the same mean as before. However, because of the way it was calculated, the standard deviation appears to be larger.\n", + "\n", + "Let's move on to a more complicated example now. Before we set up tallies to get reaction rates in the fuel and moderator in two energy groups for two different nuclides. We can use tally arithmetic to divide each of these reaction rates by the flux to get microscopic multi-group cross sections." + ] + }, + { + "cell_type": "code", + "execution_count": 32, "metadata": { "collapsed": false, "scrolled": true @@ -1091,7 +1160,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 33, "metadata": { "collapsed": false }, @@ -1222,7 +1291,7 @@ "7 1.274353e-05 " ] }, - "execution_count": 32, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -1241,7 +1310,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 34, "metadata": { "collapsed": false }, @@ -1273,7 +1342,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 35, "metadata": { "collapsed": false }, @@ -1297,7 +1366,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 36, "metadata": { "collapsed": false }, @@ -1328,7 +1397,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 37, "metadata": { "collapsed": false }, @@ -1408,7 +1477,7 @@ "3 10000 6.3e-07 - 2.0e+01 U-235 nu-fission 0.093265 4.590785e-04" ] }, - "execution_count": 36, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -1421,7 +1490,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 38, "metadata": { "collapsed": false }, @@ -1551,7 +1620,7 @@ "8 10002 1.9e+00 - 2.0e+01 H-1 scatter 0.377400 0.004341" ] }, - "execution_count": 37, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } From ff69982fe0c3cc4d8c4bffb0abbc835b34e467b2 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 4 Aug 2015 10:57:45 +1000 Subject: [PATCH 073/101] Started adding release notes for version 0.7.0 --- docs/source/index.rst | 2 +- docs/source/releasenotes.rst | 67 ++++++++++++++++++++++++ docs/source/releasenotes/index.rst | 25 --------- docs/source/releasenotes/notes_0.4.0.rst | 36 ------------- docs/source/releasenotes/notes_0.4.1.rst | 55 ------------------- docs/source/releasenotes/notes_0.4.2.rst | 56 -------------------- docs/source/releasenotes/notes_0.4.3.rst | 53 ------------------- docs/source/releasenotes/notes_0.4.4.rst | 45 ---------------- docs/source/releasenotes/notes_0.5.0.rst | 52 ------------------ docs/source/releasenotes/notes_0.5.1.rst | 45 ---------------- docs/source/releasenotes/notes_0.5.2.rst | 57 -------------------- docs/source/releasenotes/notes_0.5.3.rst | 49 ----------------- docs/source/releasenotes/notes_0.5.4.rst | 64 ---------------------- docs/source/releasenotes/notes_0.6.0.rst | 59 --------------------- docs/source/releasenotes/notes_0.6.1.rst | 65 ----------------------- docs/source/releasenotes/notes_0.6.2.rst | 58 -------------------- 16 files changed, 68 insertions(+), 720 deletions(-) create mode 100644 docs/source/releasenotes.rst delete mode 100644 docs/source/releasenotes/index.rst delete mode 100644 docs/source/releasenotes/notes_0.4.0.rst delete mode 100644 docs/source/releasenotes/notes_0.4.1.rst delete mode 100644 docs/source/releasenotes/notes_0.4.2.rst delete mode 100644 docs/source/releasenotes/notes_0.4.3.rst delete mode 100644 docs/source/releasenotes/notes_0.4.4.rst delete mode 100644 docs/source/releasenotes/notes_0.5.0.rst delete mode 100644 docs/source/releasenotes/notes_0.5.1.rst delete mode 100644 docs/source/releasenotes/notes_0.5.2.rst delete mode 100644 docs/source/releasenotes/notes_0.5.3.rst delete mode 100644 docs/source/releasenotes/notes_0.5.4.rst delete mode 100644 docs/source/releasenotes/notes_0.6.0.rst delete mode 100644 docs/source/releasenotes/notes_0.6.1.rst delete mode 100644 docs/source/releasenotes/notes_0.6.2.rst diff --git a/docs/source/index.rst b/docs/source/index.rst index 02eb1f6d94..8dba920161 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -28,7 +28,7 @@ free to send a message to the User's Group `mailing list`_. :maxdepth: 1 quickinstall - releasenotes/index + releasenotes methods/index usersguide/index devguide/index diff --git a/docs/source/releasenotes.rst b/docs/source/releasenotes.rst new file mode 100644 index 0000000000..dffc17201f --- /dev/null +++ b/docs/source/releasenotes.rst @@ -0,0 +1,67 @@ +.. _releasenotes: + +============================== +Release Notes for OpenMC 0.7.0 +============================== + +------------------- +System Requirements +------------------- + +There are no special requirements for running the OpenMC code. As of this +release, OpenMC has been tested on a variety of Linux distributions, Mac OS X, +and Microsoft Windows 7. Memory requirements will vary depending on the size of +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 + +--------- +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 + +.. _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 + +------------ +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 `_ +- `Jon Walsh `_ diff --git a/docs/source/releasenotes/index.rst b/docs/source/releasenotes/index.rst deleted file mode 100644 index 556cf518a5..0000000000 --- a/docs/source/releasenotes/index.rst +++ /dev/null @@ -1,25 +0,0 @@ -.. _releasenotes: - -============= -Release Notes -============= - -The release notes for OpenMC give a list of system requirements, new features, -bugs fixed, and known issues for each successive release. - -.. toctree:: - :maxdepth: 1 - - notes_0.6.2 - notes_0.6.1 - notes_0.6.0 - notes_0.5.4 - notes_0.5.3 - notes_0.5.2 - notes_0.5.1 - notes_0.5.0 - notes_0.4.4 - notes_0.4.3 - notes_0.4.2 - notes_0.4.1 - notes_0.4.0 diff --git a/docs/source/releasenotes/notes_0.4.0.rst b/docs/source/releasenotes/notes_0.4.0.rst deleted file mode 100644 index 3e0a444e35..0000000000 --- a/docs/source/releasenotes/notes_0.4.0.rst +++ /dev/null @@ -1,36 +0,0 @@ -.. _notes_0.4.0: - -============================== -Release Notes for OpenMC 0.4.0 -============================== - -------------------- -System Requirements -------------------- - -There are no special requirements for running the OpenMC code. As of this -release, OpenMC has been tested on a variety of Linux distributions as well as -Mac OS X. However, it has not been tested yet on any releases of Microsoft -Windows. Memory requirements will vary depending on the size of the problem at -hand (mostly on the number of nuclides in the problem). - ------------- -New Features ------------- - -- The probability table method for treatment of energy self-shielding in the - unresolved resonance range has been implemented and is now turned on by - default. -- Calculation of Shannon entropy for assessing convergence of the fission source - distribution. -- Ability to compile with the PGI Fortran compiler. -- Ability to run on IBM BlueGene/P machines. -- Completely rewrote how nested universes are handled. Geometry is now much more - robust. - ---------- -Bug Fixes ---------- - -- Many geometry errors have been fixed. The Monte Carlo performance benchmark - can now be successfully run in OpenMC. diff --git a/docs/source/releasenotes/notes_0.4.1.rst b/docs/source/releasenotes/notes_0.4.1.rst deleted file mode 100644 index 2492f23a98..0000000000 --- a/docs/source/releasenotes/notes_0.4.1.rst +++ /dev/null @@ -1,55 +0,0 @@ -.. _notes_0.4.1: - -============================== -Release Notes for OpenMC 0.4.1 -============================== - -------------------- -System Requirements -------------------- - -There are no special requirements for running the OpenMC code. As of this -release, OpenMC has been tested on a variety of Linux distributions as well as -Mac OS X. However, it has not been tested yet on any releases of Microsoft -Windows. Memory requirements will vary depending on the size of the problem at -hand (mostly on the number of nuclides in the problem). - ------------- -New Features ------------- - -- A batching method has been implemented so that statistics can be calculated - based on multiple generations instead of a single generation. This can help to - overcome problems with underpredicted variance in problems where there is - correlation between successive fission source iterations. -- Users now have the option to select a non-unionized energy grid for problems - with many nuclides where the use of a unionized grid is not feasible. -- Improved plotting capability (Nick Horelik). The plotting input is now in - ``plots.xml`` instead of ``plot.xml``. -- Added multiple estimators for k-effective and added a global tally for - leakage. -- Moved cross section-related output into cross_sections.out. -- Improved timing capabilities. -- Can now use more than 2**31 - 1 particles per generation. -- Improved fission bank synchronization method. This also necessitated changing - the source bank to be of type Bank rather than of type Particle. -- Added HDF5 output (not complete yet). -- Major changes to tally implementation. - ---------- -Bug Fixes ---------- - -- `b206a8`_: Fixed subtle error in the sampling of energy distributions. -- `800742`_: Fixed error in sampling of angle and rotating angles. -- `a07c08`_: Fixed bug in linear-linear interpolation during sampling energy. -- `a75283`_: Fixed energy and energyout tally filters to support many bins. -- `95cfac`_: Fixed error in cell neighbor searches. -- `83a803`_: Fixed bug related to probability tables. - -.. _b206a8: https://github.com/mit-crpg/openmc/commit/b206a8 -.. _800742: https://github.com/mit-crpg/openmc/commit/800742 -.. _a07c08: https://github.com/mit-crpg/openmc/commit/a07c08 -.. _a75283: https://github.com/mit-crpg/openmc/commit/a75283 -.. _95cfac: https://github.com/mit-crpg/openmc/commit/95cfac -.. _83a803: https://github.com/mit-crpg/openmc/commit/83a803 diff --git a/docs/source/releasenotes/notes_0.4.2.rst b/docs/source/releasenotes/notes_0.4.2.rst deleted file mode 100644 index 0ca5287a1c..0000000000 --- a/docs/source/releasenotes/notes_0.4.2.rst +++ /dev/null @@ -1,56 +0,0 @@ -.. _notes_0.4.2: - -============================== -Release Notes for OpenMC 0.4.2 -============================== - -------------------- -System Requirements -------------------- - -There are no special requirements for running the OpenMC code. As of this -release, OpenMC has been tested on a variety of Linux distributions, Mac OS X, -and Microsoft Windows 7. Memory requirements will vary depending on the size of -the problem at hand (mostly on the number of nuclides in the problem). - ------------- -New Features ------------- - -- Ability to specify void materials. -- Option to not reduce tallies across processors at end of each batch. -- Uniform fission site method for reducing variance on local tallies. -- Reading/writing binary source files. -- Added more messages for or high verbosity. -- Estimator for diffusion coefficient. -- Ability to specify 'point' source type. -- Ability to change random number seed. -- Users can now specify units='sum' on a tag. This tells the code that - the total material density is the sum of the atom fractions listed for each - nuclide on the material. - ---------- -Bug Fixes ---------- - -- a27f8f_: Fixed runtime error bug when using Intel compiler with DEBUG on. -- afe121_: Fixed minor bug in fission bank algorithms. -- e0968e_: Force re-evaluation of cross-sections when each particle is born. -- 298db8_: Fixed bug in surface currents when using energy-in filter. -- 2f3bbe_: Fixed subtle bug in S(a,b) cross section calculation. -- 671f30_: Fixed surface currents on mesh not encompassing geometry. -- b2c40e_: Fixed bug in incoming energy filter for track-length tallies. -- 5524fd_: Mesh filter now works with track-length tallies. -- d050c7_: Added Bessel's correction to make estimate of variance unbiased. -- 2a5b9c_: Fixed regression in plotting. - -.. _a27f8f: https://github.com/mit-crpg/openmc/commit/a27f8f -.. _afe121: https://github.com/mit-crpg/openmc/commit/afe121 -.. _e0968e: https://github.com/mit-crpg/openmc/commit/e0968e -.. _298db8: https://github.com/mit-crpg/openmc/commit/298db8 -.. _2f3bbe: https://github.com/mit-crpg/openmc/commit/2f3bbe -.. _671f30: https://github.com/mit-crpg/openmc/commit/671f30 -.. _b2c40e: https://github.com/mit-crpg/openmc/commit/b2c40e -.. _5524fd: https://github.com/mit-crpg/openmc/commit/5524fd -.. _d050c7: https://github.com/mit-crpg/openmc/commit/d050c7 -.. _2a5b9c: https://github.com/mit-crpg/openmc/commit/2a5b9c diff --git a/docs/source/releasenotes/notes_0.4.3.rst b/docs/source/releasenotes/notes_0.4.3.rst deleted file mode 100644 index fce7a7da37..0000000000 --- a/docs/source/releasenotes/notes_0.4.3.rst +++ /dev/null @@ -1,53 +0,0 @@ -.. _notes_0.4.3: - -============================== -Release Notes for OpenMC 0.4.3 -============================== - -------------------- -System Requirements -------------------- - -There are no special requirements for running the OpenMC code. As of this -release, OpenMC has been tested on a variety of Linux distributions, Mac OS X, -and Microsoft Windows 7. Memory requirements will vary depending on the size of -the problem at hand (mostly on the number of nuclides in the problem). - ------------- -New Features ------------- - -- Option to report confidence intervals for tally results. -- Rotation and translation for filled cells. -- Ability to explicitly specify for tallies. -- Ability to store state points and use them to restart runs. -- Fixed source calculations (no subcritical multiplication however). -- Expanded options for external source distribution. -- Ability to tally reaction rates for individual nuclides within a material. -- Reduced memory usage by removing redundant storage or some cross-sections. -- 3bd35b_: Log-log interpolation for URR probability tables. -- Support to specify labels on tallies (nelsonag_). - ---------- -Bug Fixes ---------- - -- 33f29a_: Handle negative values in probability table. -- 1c472d_: Fixed survival biasing with probability tables. -- 3c6e80_: Fixed writing tallies with no filters. -- 460ef1_: Invalid results for duplicate tallies. -- 0069d5_: Fixed bug with 0 inactive batches. -- 7af2cf_: Fixed bug in score_analog_tallies. -- 85a60e_: Pick closest angular distribution for law 61. -- 3212f5_: Fixed issue with blank line at beginning of XML files. - -.. _nelsonag: https://github.com/nelsonag -.. _33f29a: https://github.com/mit-crpg/openmc/commit/33f29a -.. _1c472d: https://github.com/mit-crpg/openmc/commit/1c472d -.. _3c6e80: https://github.com/mit-crpg/openmc/commit/3c6e80 -.. _3bd35b: https://github.com/mit-crpg/openmc/commit/3bd35b -.. _0069d5: https://github.com/mit-crpg/openmc/commit/0069d5 -.. _7af2cf: https://github.com/mit-crpg/openmc/commit/7af2cf -.. _460ef1: https://github.com/mit-crpg/openmc/commit/460ef1 -.. _85a60e: https://github.com/mit-crpg/openmc/commit/85a60e -.. _3212f5: https://github.com/mit-crpg/openmc/commit/3212f5 diff --git a/docs/source/releasenotes/notes_0.4.4.rst b/docs/source/releasenotes/notes_0.4.4.rst deleted file mode 100644 index 55a0c3f6f8..0000000000 --- a/docs/source/releasenotes/notes_0.4.4.rst +++ /dev/null @@ -1,45 +0,0 @@ -.. _notes_0.4.4: - -============================== -Release Notes for OpenMC 0.4.4 -============================== - -------------------- -System Requirements -------------------- - -There are no special requirements for running the OpenMC code. As of this -release, OpenMC has been tested on a variety of Linux distributions, Mac OS X, -and Microsoft Windows 7. Memory requirements will vary depending on the size of -the problem at hand (mostly on the number of nuclides in the problem). - ------------- -New Features ------------- - -- Ability to write state points when using . -- Real-time XML validation in GNU Emacs with RELAX NG schemata. -- Writing state points every n batches with -- Suppress creation of summary.out and cross_sections.out by default with option - to turn them on with tag in settings.xml file. -- Ability to create HDF5 state points. -- Binary source file is now part of state point file by default. -- Enhanced state point usage and added state point Python scripts. -- Turning confidence intervals on affects k-effective. -- Option to specify for tally meshes. - ---------- -Bug Fixes ---------- - -- 4654ee_: Fixed plotting with void cells. -- 7ee461_: Fixed bug with multi-line input using type='word'. -- 792eb3_: Fixed degrees of freedom for confidence intervals. -- 7fd617_: Fixed bug with restart runs in parallel. -- dc4a8f_: Fixed bug with fixed source restart runs. - -.. _4654ee: https://github.com/mit-crpg/openmc/commit/4654ee -.. _7ee461: https://github.com/mit-crpg/openmc/commit/7ee461 -.. _792eb3: https://github.com/mit-crpg/openmc/commit/792eb3 -.. _7fd617: https://github.com/mit-crpg/openmc/commit/7fd617 -.. _dc4a8f: https://github.com/mit-crpg/openmc/commit/dc4a8f diff --git a/docs/source/releasenotes/notes_0.5.0.rst b/docs/source/releasenotes/notes_0.5.0.rst deleted file mode 100644 index 16be1b063b..0000000000 --- a/docs/source/releasenotes/notes_0.5.0.rst +++ /dev/null @@ -1,52 +0,0 @@ -.. _notes_0.5.0: - -============================== -Release Notes for OpenMC 0.5.0 -============================== - -------------------- -System Requirements -------------------- - -There are no special requirements for running the OpenMC code. As of this -release, OpenMC has been tested on a variety of Linux distributions, Mac OS X, -and Microsoft Windows 7. Memory requirements will vary depending on the size of -the problem at hand (mostly on the number of nuclides in the problem). - ------------- -New Features ------------- - -- All user input options that formerly accepted "off" or "on" should now be - "false" or "true" (the proper XML schema datatype). -- The element is deprecated and was replaced with . -- Added 'events' score that returns number of events that scored to a tally. -- Restructured tally filter implementation and user input. -- Source convergence acceleration via CMFD (implemented with PETSc). -- Ability to read source files in parallel when number of particles is greater - than that number of source sites. -- Cone surface types. - ---------- -Bug Fixes ---------- - -- 737b90_: Coincident surfaces from separate universes / particle traveling - tangent to a surface. -- a819b4_: Output of surface neighbors in summary.out file. -- b11696_: Reading long attribute lists in XML input. -- 2bd46a_: Search for tallying nuclides when no default_xs specified. -- 7a1f08_: Fix word wrapping when writing messages. -- c0e3ec_: Prevent underflow when compiling with MPI=yes and DEBUG=yes. -- 6f8d9d_: Set default tally labels. -- 6a3a5e_: Fix problem with corner-crossing in lattices. - -.. _737b90: https://github.com/mit-crpg/openmc/commit/737b90 -.. _a819b4: https://github.com/mit-crpg/openmc/commit/a819b4 -.. _b11696: https://github.com/mit-crpg/openmc/commit/b11696 -.. _2bd46a: https://github.com/mit-crpg/openmc/commit/2bd46a -.. _7a1f08: https://github.com/mit-crpg/openmc/commit/7a1f08 -.. _c0e3ec: https://github.com/mit-crpg/openmc/commit/c0e3ec -.. _6f8d9d: https://github.com/mit-crpg/openmc/commit/6f8d9d -.. _6a3a5e: https://github.com/mit-crpg/openmc/commit/6a3a5e - diff --git a/docs/source/releasenotes/notes_0.5.1.rst b/docs/source/releasenotes/notes_0.5.1.rst deleted file mode 100644 index 9ba85d304c..0000000000 --- a/docs/source/releasenotes/notes_0.5.1.rst +++ /dev/null @@ -1,45 +0,0 @@ -.. _notes_0.5.1: - -============================== -Release Notes for OpenMC 0.5.1 -============================== - -------------------- -System Requirements -------------------- - -There are no special requirements for running the OpenMC code. As of this -release, OpenMC has been tested on a variety of Linux distributions, Mac OS X, -and Microsoft Windows 7. Memory requirements will vary depending on the size of -the problem at hand (mostly on the number of nuclides in the problem). - ------------- -New Features ------------- - -- Absorption and combined estimators for k-effective. -- Natural elements can now be specified in materials using rather than - . -- Support for multiple S(a,b) tables in a single material (e.g. BeO). -- Test suite using Python nosetests. -- Proper install capability with 'make install'. -- Lattices can now be 2 or 3 dimensions. -- New scatter-PN score type. -- New kappa-fission score type. -- Ability to tally any reaction by specifying MT. - ---------- -Bug Fixes ---------- - -- 94103e_: Two checks for outgoing energy filters. -- e77059_: Fix reaction name for MT=849. -- b0fe88_: Fix distance to surface for cones. -- 63bfd2_: Fix tracklength tallies with cell filter and universes. -- 88daf7_: Fix analog tallies with survival biasing. - -.. _94103e: https://github.com/mit-crpg/openmc/commit/94103e -.. _e77059: https://github.com/mit-crpg/openmc/commit/e77059 -.. _b0fe88: https://github.com/mit-crpg/openmc/commit/b0fe88 -.. _63bfd2: https://github.com/mit-crpg/openmc/commit/63bfd2 -.. _88daf7: https://github.com/mit-crpg/openmc/commit/88daf7 diff --git a/docs/source/releasenotes/notes_0.5.2.rst b/docs/source/releasenotes/notes_0.5.2.rst deleted file mode 100644 index d030615db7..0000000000 --- a/docs/source/releasenotes/notes_0.5.2.rst +++ /dev/null @@ -1,57 +0,0 @@ -.. _notes_0.5.2: - -============================== -Release Notes for OpenMC 0.5.2 -============================== - -------------------- -System Requirements -------------------- - -There are no special requirements for running the OpenMC code. As of this -release, OpenMC has been tested on a variety of Linux distributions, Mac OS X, -and Microsoft Windows 7. Memory requirements will vary depending on the size of -the problem at hand (mostly on the number of nuclides in the problem). - ------------- -New Features ------------- - -- Python script for mesh tally plotting -- Isotopic abundances based on IUPAC 2009 when using -- Particle restart files for debugging -- Code will abort after certain number of lost particles (defaults to 10) -- Region outside lattice can be filled with material (void by default) -- 3D voxel plots -- Full HDF5/PHDF5 support (including support in statepoint.py) -- Cell overlap checking with -g command line flag (or when plotting) - ---------- -Bug Fixes ---------- - -- 7632f3_: Fixed bug in statepoint.py for multiple generations per batch. -- f85ac4_: Fix infinite loop bug in error module. -- 49c36b_: Don't convert surface ids if surface filter is for current tallies. -- 5ccc78_: Fix bug in reassignment of bins for mesh filter. -- b1f52f_: Fixed bug in plot color specification. -- eae7e5_: Fixed many memory leaks. -- 10c1cc_: Minor CMFD fixes. -- afdb50_: Add compatibility for XML comments without whitespace. -- a3c593_: Fixed bug in use of free gas scattering for H-1. -- 3a66e3_: Fixed bug in 2D mesh tally implementation. -- ab0793_: Corrected PETSC_NULL references to their correct types. -- 182ebd_: Use analog estimator with energyout filter. - -.. _7632f3: https://github.com/mit-crpg/openmc/commit/7632f3 -.. _f85ac4: https://github.com/mit-crpg/openmc/commit/f85ac4 -.. _49c36b: https://github.com/mit-crpg/openmc/commit/49c36b -.. _5ccc78: https://github.com/mit-crpg/openmc/commit/5ccc78 -.. _b1f52f: https://github.com/mit-crpg/openmc/commit/b1f52f -.. _eae7e5: https://github.com/mit-crpg/openmc/commit/eae7e5 -.. _10c1cc: https://github.com/mit-crpg/openmc/commit/10c1cc -.. _afdb50: https://github.com/mit-crpg/openmc/commit/afdb50 -.. _a3c593: https://github.com/mit-crpg/openmc/commit/a3c593 -.. _3a66e3: https://github.com/mit-crpg/openmc/commit/3a66e3 -.. _ab0793: https://github.com/mit-crpg/openmc/commit/ab0793 -.. _182ebd: https://github.com/mit-crpg/openmc/commit/182ebd diff --git a/docs/source/releasenotes/notes_0.5.3.rst b/docs/source/releasenotes/notes_0.5.3.rst deleted file mode 100644 index 6d93f9aece..0000000000 --- a/docs/source/releasenotes/notes_0.5.3.rst +++ /dev/null @@ -1,49 +0,0 @@ -.. _notes_0.5.3: - -============================== -Release Notes for OpenMC 0.5.3 -============================== - -------------------- -System Requirements -------------------- - -There are no special requirements for running the OpenMC code. As of this -release, OpenMC has been tested on a variety of Linux distributions, Mac OS X, -and Microsoft Windows 7. Memory requirements will vary depending on the size of -the problem at hand (mostly on the number of nuclides in the problem). - ------------- -New Features ------------- - -- Output interface enhanced to allow multiple files handles to be opened -- Particle restart file linked to output interface -- Particle restarts and state point restarts are both identified with the -r - command line flag. -- Particle instance no longer global, passed to all physics routines -- Physics routines refactored to rely less on global memory, more arguments - passed in -- CMFD routines refactored and now can compute dominance ratio on the fly -- PETSc 3.4.2 or higher must be used and compiled with fortran datatype support -- Memory leaks fixed except for ones from xml-fortran package -- Test suite enhanced to test output with different compiler options -- Description of OpenMC development workflow added -- OpenMP shared-memory parallelism added -- Special run mode --tallies removed. - ---------- -Bug Fixes ---------- - -- 2b1e8a_: Normalize direction vector after reflecting particle. -- 5853d2_: Set blank default for cross section listing alias. -- e178c7_: Fix infinite loop with words greater than 80 characters in write_message. -- c18a6e_: Check for valid secondary mode on S(a,b) tables. -- 82c456_: Fix bug where last process could have zero particles. - -.. _2b1e8a: https://github.com/mit-crpg/openmc/commit/2b1e8a -.. _5853d2: https://github.com/mit-crpg/openmc/commit/5853d2 -.. _e178c7: https://github.com/mit-crpg/openmc/commit/e178c7 -.. _c18a6e: https://github.com/mit-crpg/openmc/commit/c18a6e -.. _82c456: https://github.com/mit-crpg/openmc/commit/82c456 diff --git a/docs/source/releasenotes/notes_0.5.4.rst b/docs/source/releasenotes/notes_0.5.4.rst deleted file mode 100644 index a69354aa0a..0000000000 --- a/docs/source/releasenotes/notes_0.5.4.rst +++ /dev/null @@ -1,64 +0,0 @@ -.. _notes_0.5.4: - -============================== -Release Notes for OpenMC 0.5.4 -============================== - -------------------- -System Requirements -------------------- - -There are no special requirements for running the OpenMC code. As of this -release, OpenMC has been tested on a variety of Linux distributions, Mac OS X, -and Microsoft Windows 7. Memory requirements will vary depending on the size of -the problem at hand (mostly on the number of nuclides in the problem). - ------------- -New Features ------------- - -- Source sites outside geometry are resampled -- XML-Fortran backend replaced by FoX XML -- Ability to write particle track files -- Handle lost particles more gracefully (via particle track files) -- Multiple random number generator streams -- Mesh tally plotting utility converted to use Tkinter rather than PyQt -- Script added to download ACE data from NNDC -- Mixed ASCII/binary cross_sections.xml now allowed -- Expanded options for writing source bank -- Re-enabled ability to use source file as starting source -- S(a,b) recalculation avoided when same nuclide and S(a,b) table are accessed - ---------- -Bug Fixes ---------- - -- 32c03c_: Check for valid data in cross_sections.xml -- c71ef5_: Fix bug in statepoint.py -- 8884fb_: Check for all ZAIDs for S(a,b) tables -- b38af0_: Fix XML reading on multiple levels of input -- d28750_: Fix bug in convert_xsdir.py -- cf567c_: ENDF/B-VI data checked for compatibility -- 6b9461_: Fix p_valid sampling inside of sample_energy - -.. _32c03c: https://github.com/mit-crpg/openmc/commit/32c03c -.. _c71ef5: https://github.com/mit-crpg/openmc/commit/c71ef5 -.. _8884fb: https://github.com/mit-crpg/openmc/commit/8884fb -.. _b38af0: https://github.com/mit-crpg/openmc/commit/b38af0 -.. _d28750: https://github.com/mit-crpg/openmc/commit/d28750 -.. _cf567c: https://github.com/mit-crpg/openmc/commit/cf567c -.. _6b9461: https://github.com/mit-crpg/openmc/commit/6b9461 - ------------- -Contributors ------------- - -This release contains new contributions from the following people: - -- `Sterling Harper `_ -- `Bryan Herman `_ -- `Nick Horelik `_ -- `Adam Nelson `_ -- `Paul Romano `_ -- `Tuomas Viitanen `_ -- `Jon Walsh `_ diff --git a/docs/source/releasenotes/notes_0.6.0.rst b/docs/source/releasenotes/notes_0.6.0.rst deleted file mode 100644 index 3f98c461dd..0000000000 --- a/docs/source/releasenotes/notes_0.6.0.rst +++ /dev/null @@ -1,59 +0,0 @@ -.. _notes_0.6.0: - -============================== -Release Notes for OpenMC 0.6.0 -============================== - -------------------- -System Requirements -------------------- - -There are no special requirements for running the OpenMC code. As of this -release, OpenMC has been tested on a variety of Linux distributions, Mac OS X, -and Microsoft Windows 7. Memory requirements will vary depending on the size of -the problem at hand (mostly on the number of nuclides in the problem). - ------------- -New Features ------------- - -- Legendre and spherical harmonic expansion tally scores -- CMake is now default build system -- Regression test suite based on CTests and NNDC cross sections -- FoX is now a git submodule -- Support for older cross sections (e.g. MCNP 66c) -- Progress bar for plots -- Expanded support for natural elements via in settings.xml - ---------- -Bug Fixes ---------- - -- 41f7ca_: Fixed erroneous results from survival biasing -- 038736_: Fix tallies over void materials -- 46f9e8_: Check for negative values in probability tables -- d1ca35_: Fixed sampling of angular distribution -- 0291c0_: Fixed indexing error in plotting -- d7a7d0_: Fix bug with specifying xs attribute -- 85b3cb_: Fix out-of-bounds error with OpenMP threading - -.. _41f7ca: https://github.com/mit-crpg/openmc/commit/41f7ca -.. _038736: https://github.com/mit-crpg/openmc/commit/038736 -.. _46f9e8: https://github.com/mit-crpg/openmc/commit/46f9e8 -.. _d1ca35: https://github.com/mit-crpg/openmc/commit/d1ca35 -.. _0291c0: https://github.com/mit-crpg/openmc/commit/0291c0 -.. _d7a7d0: https://github.com/mit-crpg/openmc/commit/d7a7d0 -.. _85b3cb: https://github.com/mit-crpg/openmc/commit/85b3cb - ------------- -Contributors ------------- - -This release contains new contributions from the following people: - -- `Sterling Harper `_ -- `Bryan Herman `_ -- `Nick Horelik `_ -- `Adam Nelson `_ -- `Paul Romano `_ -- `Jon Walsh `_ diff --git a/docs/source/releasenotes/notes_0.6.1.rst b/docs/source/releasenotes/notes_0.6.1.rst deleted file mode 100644 index 71852bd174..0000000000 --- a/docs/source/releasenotes/notes_0.6.1.rst +++ /dev/null @@ -1,65 +0,0 @@ -.. _notes_0.6.1: - -============================== -Release Notes for OpenMC 0.6.1 -============================== - -------------------- -System Requirements -------------------- - -There are no special requirements for running the OpenMC code. As of this -release, OpenMC has been tested on a variety of Linux distributions, Mac OS X, -and Microsoft Windows 7. Memory requirements will vary depending on the size of -the problem at hand (mostly on the number of nuclides in the problem). - ------------- -New Features ------------- - -- Coarse mesh finite difference (CMFD) acceleration no longer requires PETSc -- Statepoint file numbering is now zero-padded -- Python scripts now compatible with Python 2 or 3 -- Ability to run particle restarts in fixed source calculations -- Capability to filter box source by fissionable materials -- Nuclide/element names are now case insensitive in input files -- Improved treatment of resonance scattering for heavy nuclides - ---------- -Bug Fixes ---------- - -- 03e890_: Check for energy-dependent multiplicities in ACE files -- 4439de_: Fix distance-to-surface calculation for general plane surface -- 5808ed_: Account for differences in URR band probabilities at different energies -- 2e60c0_: Allow zero atom/weight percents in materials -- 3e0870_: Don't use PWD environment variable when setting path to input files -- dc4776_: Handle probability table resampling correctly -- 01178b_: Fix metastables nuclides in NNDC cross_sections.xml file -- 62ec43_: Don't read tallies.xml when OpenMC is run in plotting mode -- 2a95ef_: Prevent segmentation fault on "current" score without mesh filter -- 93e482_: Check for negative values in probability tables - -.. _03e890: https://github.com/mit-crpg/openmc/commit/03e890 -.. _4439de: https://github.com/mit-crpg/openmc/commit/4439de -.. _5808ed: https://github.com/mit-crpg/openmc/commit/5808ed -.. _2e60c0: https://github.com/mit-crpg/openmc/commit/2e60c0 -.. _3e0870: https://github.com/mit-crpg/openmc/commit/3e0870 -.. _dc4776: https://github.com/mit-crpg/openmc/commit/dc4776 -.. _01178b: https://github.com/mit-crpg/openmc/commit/01178b -.. _62ec43: https://github.com/mit-crpg/openmc/commit/62ec43 -.. _2a95ef: https://github.com/mit-crpg/openmc/commit/2a95ef -.. _93e482: https://github.com/mit-crpg/openmc/commit/93e482 - ------------- -Contributors ------------- - -This release contains new contributions from the following people: - -- `Sterling Harper `_ -- `Bryan Herman `_ -- `Adam Nelson `_ -- `Paul Romano `_ -- `Jon Walsh `_ -- `Will Boyd `_ diff --git a/docs/source/releasenotes/notes_0.6.2.rst b/docs/source/releasenotes/notes_0.6.2.rst deleted file mode 100644 index eefc493fcf..0000000000 --- a/docs/source/releasenotes/notes_0.6.2.rst +++ /dev/null @@ -1,58 +0,0 @@ -.. _notes_0.6.2: - -============================== -Release Notes for OpenMC 0.6.2 -============================== - -------------------- -System Requirements -------------------- - -There are no special requirements for running the OpenMC code. As of this -release, OpenMC has been tested on a variety of Linux distributions, Mac OS X, -and Microsoft Windows 7. Memory requirements will vary depending on the size of -the problem at hand (mostly on the number of nuclides in the problem). - ------------- -New Features ------------- - -- Meshline plotting capability -- Support for plotting cells/materials on middle universe levels -- Ability to model cells with no surfaces -- Compatibility with PETSc 3.5 -- Compatability with OpenMPI 1.7/1.8 -- Improved overall performance via logarithmic-mapped energy grid search -- Improved multi-threaded performance with atomic operations -- Support for fixed source problems with fissionable materials - ---------- -Bug Fixes ---------- - -- 26fb93_: Fix problem with -t, --track command-line flag -- 2f07c0_: Improved evaporation spectrum algorithm -- e6abb9_: Fix segfault when tallying in a void material -- 291b45_: Handle metastable nuclides in NNDC data and multiplicities in MT=5 data - -.. _26fb93: https://github.com/mit-crpg/openmc/commit/26fb93 -.. _2f07c0: https://github.com/mit-crpg/openmc/commit/2f07c0 -.. _e6abb9: https://github.com/mit-crpg/openmc/commit/e6abb9 -.. _291b45: https://github.com/mit-crpg/openmc/commit/291b45 - ------------- -Contributors ------------- - -This release contains new contributions from the following people: - -- `Will Boyd `_ -- `Matt Ellis `_ -- `Sterling Harper `_ -- `Bryan Herman `_ -- `Nicholas Horelik `_ -- `Anton Leontiev `_ -- `Adam Nelson `_ -- `Paul Romano `_ -- `Jon Walsh `_ -- `John Xia `_ From 487562c7a622f09b68249ab13581f367afc77aab Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 4 Aug 2015 11:01:10 +1000 Subject: [PATCH 074/101] Increment version number to 0.7.0 --- docs/source/conf.py | 4 ++-- setup.py | 2 +- src/constants.F90 | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 65ee4db6f6..4a18f14de5 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -52,9 +52,9 @@ copyright = u'2011-2015, Massachusetts Institute of Technology' # built documents. # # The short X.Y version. -version = "0.6" +version = "0.7" # The full version, including alpha/beta/rc tags. -release = "0.6.2" +release = "0.7.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/setup.py b/setup.py index b86582dd04..655e38e3a4 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ except ImportError: have_setuptools = False kwargs = {'name': 'openmc', - 'version': '0.6.2', + 'version': '0.7.0', 'packages': ['openmc'], 'scripts': glob.glob('scripts/openmc-*'), diff --git a/src/constants.F90 b/src/constants.F90 index b1af171ef1..3aaf08f0eb 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -7,8 +7,8 @@ module constants ! OpenMC major, minor, and release numbers integer, parameter :: VERSION_MAJOR = 0 - integer, parameter :: VERSION_MINOR = 6 - integer, parameter :: VERSION_RELEASE = 2 + integer, parameter :: VERSION_MINOR = 7 + integer, parameter :: VERSION_RELEASE = 0 ! Revision numbers for binary files integer, parameter :: REVISION_STATEPOINT = 13 From 5be8f5b97e8b473ebb61fef90211786a0a416dfa Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 12 Aug 2015 10:09:22 +0700 Subject: [PATCH 075/101] Fix CTest coverage runs for test_filter_distribcell --- CMakeLists.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3bbc353f63..45b626324c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -287,6 +287,22 @@ foreach(test ${TESTS}) WORKING_DIRECTORY ${TEST_PATH} COMMAND $ -p ${TEST_PATH}) + elseif(${test} MATCHES "test_filter_distribcell") + + # Add each case for distribcell tests + add_test(NAME ${TEST_NAME}_case-1 + WORKING_DIRECTORY ${TEST_PATH}/case-1 + COMMAND $ ${TEST_PATH}/case-1) + add_test(NAME ${TEST_NAME}_case-2 + WORKING_DIRECTORY ${TEST_PATH}/case-2 + COMMAND $ ${TEST_PATH}/case-2) + add_test(NAME ${TEST_NAME}_case-3 + WORKING_DIRECTORY ${TEST_PATH}/case-3 + COMMAND $ ${TEST_PATH}/case-3) + add_test(NAME ${TEST_NAME}_case-4 + WORKING_DIRECTORY ${TEST_PATH}/case-4 + COMMAND $ ${TEST_PATH}/case-4) + # If a restart test is encounted, need to run with -r and restart file(s) elseif(${test} MATCHES "restart") From 2eeb002a6dcfed292d771fc3d8263e246cdbeda5 Mon Sep 17 00:00:00 2001 From: walshjon Date: Thu, 13 Aug 2015 12:33:13 -0700 Subject: [PATCH 076/101] compute leakage for fixed source runs --- src/eigenvalue.F90 | 14 +++++++------- src/fixed_source.F90 | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index 1bbcbe850e..c4b9b9a678 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -176,19 +176,19 @@ contains !$omp critical global_tallies(K_TRACKLENGTH) % value = & global_tallies(K_TRACKLENGTH) % value + global_tally_tracklength - global_tallies(K_COLLISION) % value = & + global_tallies(K_COLLISION) % value = & global_tallies(K_COLLISION) % value + global_tally_collision - global_tallies(LEAKAGE) % value = & + global_tallies(LEAKAGE) % value = & global_tallies(LEAKAGE) % value + global_tally_leakage - global_tallies(K_ABSORPTION) % value = & + global_tallies(K_ABSORPTION) % value = & global_tallies(K_ABSORPTION) % value + global_tally_absorption !$omp end critical ! reset private tallies - global_tally_tracklength = 0 - global_tally_collision = 0 - global_tally_leakage = 0 - global_tally_absorption = 0 + global_tally_tracklength = ZERO + global_tally_collision = ZERO + global_tally_leakage = ZERO + global_tally_absorption = ZERO !$omp end parallel #ifdef _OPENMP diff --git a/src/fixed_source.F90 b/src/fixed_source.F90 index 9e2d34600b..9e7059aa80 100644 --- a/src/fixed_source.F90 +++ b/src/fixed_source.F90 @@ -6,7 +6,7 @@ module fixed_source use constants, only: ZERO, MAX_LINE_LEN use global - use output, only: write_message, header + use output, only: write_message, header, print_batch_leakage use particle_header, only: Particle use random_lcg, only: set_particle_seed use source, only: sample_external_source, copy_source_attributes @@ -117,11 +117,24 @@ contains subroutine finalize_batch() +! Update global tallies with the omp private accumulation variables +!$omp parallel +!$omp critical + global_tallies(LEAKAGE) % value = & + global_tallies(LEAKAGE) % value + global_tally_leakage +!$omp end critical + + ! reset private tallies + global_tally_leakage = ZERO +!$omp end parallel + ! Collect and accumulate tallies call time_tallies % start() call synchronize_tallies() call time_tallies % stop() + if (master) call print_batch_leakage() + ! Check_triggers if (master) call check_triggers() #ifdef MPI From 5cbaffbcc2047843bd053089aac5d102a92744a8 Mon Sep 17 00:00:00 2001 From: walshjon Date: Thu, 13 Aug 2015 12:39:28 -0700 Subject: [PATCH 077/101] remove calls to no-existent subroutine --- src/fixed_source.F90 | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/fixed_source.F90 b/src/fixed_source.F90 index 9e7059aa80..9dbd57324f 100644 --- a/src/fixed_source.F90 +++ b/src/fixed_source.F90 @@ -6,7 +6,7 @@ module fixed_source use constants, only: ZERO, MAX_LINE_LEN use global - use output, only: write_message, header, print_batch_leakage + use output, only: write_message, header use particle_header, only: Particle use random_lcg, only: set_particle_seed use source, only: sample_external_source, copy_source_attributes @@ -133,8 +133,6 @@ contains call synchronize_tallies() call time_tallies % stop() - if (master) call print_batch_leakage() - ! Check_triggers if (master) call check_triggers() #ifdef MPI From d45b9d87d563610805c6c9ca4f816318520223e6 Mon Sep 17 00:00:00 2001 From: walshjon Date: Thu, 13 Aug 2015 14:09:38 -0700 Subject: [PATCH 078/101] print out mean running leakage at each batch --- src/fixed_source.F90 | 13 ++++--- src/global.F90 | 4 +++ src/output.F90 | 80 ++++++++++++++++++++++++++++---------------- 3 files changed, 65 insertions(+), 32 deletions(-) diff --git a/src/fixed_source.F90 b/src/fixed_source.F90 index 9dbd57324f..76564ee2f3 100644 --- a/src/fixed_source.F90 +++ b/src/fixed_source.F90 @@ -6,7 +6,8 @@ module fixed_source use constants, only: ZERO, MAX_LINE_LEN use global - use output, only: write_message, header + use output, only: write_message, header, print_mean_leak,& + print_columns use particle_header, only: Particle use random_lcg, only: set_particle_seed use source, only: sample_external_source, copy_source_attributes @@ -26,6 +27,7 @@ contains type(Particle) :: p if (master) call header("FIXED SOURCE TRANSPORT SIMULATION", level=1) + if (master) call print_columns() ! Allocate particle and dummy source site !$omp parallel @@ -103,9 +105,6 @@ contains subroutine initialize_batch() - call write_message("Simulating batch " // trim(to_str(current_batch)) & - &// "...", 1) - ! Reset total starting particle weight used for normalizing tallies total_weight = ZERO @@ -133,6 +132,12 @@ contains call synchronize_tallies() call time_tallies % stop() + leak = global_tallies(LEAKAGE) % sum / n_realizations + leak_sem = sqrt(ONE / (n_realizations - ONE) & + * (global_tallies(LEAKAGE) % sum_sq / n_realizations& + - leak * leak)) + if (master) call print_mean_leak() + ! Check_triggers if (master) call check_triggers() #ifdef MPI diff --git a/src/global.F90 b/src/global.F90 index a5ff7453ea..b2a563d9ee 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -200,6 +200,10 @@ module global real(8) :: k_abs_tra = ZERO ! sum over batches of k_absorption * k_tracklength real(8) :: k_combined(2) ! combined best estimate of k-effective + ! Temorary leakage values + real(8) :: leak ! running mean leakage + real(8) :: leak_sem ! 1sigma SEM of the running mean leakage + ! Shannon entropy logical :: entropy_on = .false. real(8), allocatable :: entropy(:) ! shannon entropy at each generation diff --git a/src/output.F90 b/src/output.F90 index cd08e46110..ea918b4361 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -7,7 +7,7 @@ module output use endf, only: reaction_name use error, only: fatal_error, warning use geometry_header, only: Cell, Universe, Surface, Lattice, RectLattice, & - &HexLattice, BASE_UNIVERSE + HexLattice, BASE_UNIVERSE use global use math, only: t_percentile use mesh_header, only: StructuredMesh @@ -1346,35 +1346,44 @@ contains subroutine print_columns() - write(UNIT=ou, FMT='(2X,A9,3X)', ADVANCE='NO') "Bat./Gen." - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') " k " - if (entropy_on) write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "Entropy " - write(UNIT=ou, FMT='(A20,3X)', ADVANCE='NO') " Average k " - if (cmfd_run) then - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') " CMFD k " - select case(trim(cmfd_display)) - case('entropy') - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "CMFD Ent" - case('balance') - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "RMS Bal " - case('source') - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "RMS Src " - case('dominance') - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "Dom Rat " - end select - end if - write(UNIT=ou, FMT=*) + select case(run_mode) + case(MODE_EIGENVALUE) + write(UNIT=ou, FMT='(2X,A9,3X)', ADVANCE='NO') "Bat./Gen." + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') " k " + if (entropy_on) write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "Entropy " + write(UNIT=ou, FMT='(A20,3X)', ADVANCE='NO') " Average k " + if (cmfd_run) then + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') " CMFD k " + select case(trim(cmfd_display)) + case('entropy') + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "CMFD Ent" + case('balance') + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "RMS Bal " + case('source') + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "RMS Src " + case('dominance') + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "Dom Rat " + end select + end if + write(UNIT=ou, FMT=*) - write(UNIT=ou, FMT='(2X,A9,3X)', ADVANCE='NO') "=========" - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" - if (entropy_on) write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" - write(UNIT=ou, FMT='(A20,3X)', ADVANCE='NO') "====================" - if (cmfd_run) then + write(UNIT=ou, FMT='(2X,A9,3X)', ADVANCE='NO') "=========" write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" - if (cmfd_display /= '') & - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" - end if - write(UNIT=ou, FMT=*) + if (entropy_on) write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" + write(UNIT=ou, FMT='(A20,3X)', ADVANCE='NO') "====================" + if (cmfd_run) then + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" + if (cmfd_display /= '') & + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" + end if + write(UNIT=ou, FMT=*) + case(MODE_FIXEDSOURCE) + write(ou, '(A10)', advance='no') 'Batch' + write(ou, '(A24)', advance='no') 'Mean Leakage' + write(ou, '(A24)') '1sigma SEM' + case default + continue + end select end subroutine print_columns @@ -1454,6 +1463,21 @@ contains end subroutine print_batch_keff +!=============================================================================== +! PRINT_MEAN_LEAK displays the overall mean system leakage and 1sigma SEM at +! each batch +!=============================================================================== + + subroutine print_mean_leak() + + ! write out information batch and option independent output + write(ou, '(A10)', advance='no') trim(to_str(current_batch)) + write(ou, '(ES24.16)', advance='no') leak + if (n_realizations > 1) write(ou, '(ES24.16)', advance='no') leak_sem + write(ou, *) + + end subroutine print_mean_leak + !=============================================================================== ! PRINT_PLOT displays selected options for plotting !=============================================================================== From 6ecc9ae6a124b61d37bd65ba994683508cc3e514 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Thu, 13 Aug 2015 20:51:27 -0600 Subject: [PATCH 079/101] Fix clean_xml.py indentation --- openmc/clean_xml.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openmc/clean_xml.py b/openmc/clean_xml.py index 619475fa07..2bb3f39f1b 100644 --- a/openmc/clean_xml.py +++ b/openmc/clean_xml.py @@ -82,11 +82,11 @@ def clean_xml_indentation(element, level=0): if not element.tail or not element.tail.strip(): element.tail = i - for element in element: - clean_xml_indentation(element, level+1) + for sub_element in element: + clean_xml_indentation(sub_element, level+1) - if not element.tail or not element.tail.strip(): - element.tail = i + if not sub_element.tail or not sub_element.tail.strip(): + sub_element.tail = i else: if level and (not element.tail or not element.tail.strip()): From fc5fd61b7fe533148cea21df0a9997b2ddf5b68d Mon Sep 17 00:00:00 2001 From: walshjon Date: Thu, 13 Aug 2015 23:01:02 -0700 Subject: [PATCH 080/101] incorporate leakage into fixed source test --- tests/test_fixed_source/results_true.dat | 3 +++ tests/test_fixed_source/test_fixed_source.py | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/tests/test_fixed_source/results_true.dat b/tests/test_fixed_source/results_true.dat index 2ec2d00b8e..99eb15e10d 100644 --- a/tests/test_fixed_source/results_true.dat +++ b/tests/test_fixed_source/results_true.dat @@ -1,3 +1,6 @@ tally 1: 4.483337E+02 2.017057E+04 +leakage: +9.820000E+00 +9.648000E+00 diff --git a/tests/test_fixed_source/test_fixed_source.py b/tests/test_fixed_source/test_fixed_source.py index 1f4382c08f..e96a3ad8fe 100644 --- a/tests/test_fixed_source/test_fixed_source.py +++ b/tests/test_fixed_source/test_fixed_source.py @@ -28,6 +28,10 @@ class FixedSourceTestHarness(TestHarness): outstr += '\n'.join(results) + '\n' tally_num += 1 + outstr += 'leakage:\n' + outstr += '{0:12.6E}'.format(sp._global_tallies[3][0]) + '\n' + outstr += '{0:12.6E}'.format(sp._global_tallies[3][1]) + '\n' + return outstr From e1868225ddb40ff3cf01bcce8b52232d81c87854 Mon Sep 17 00:00:00 2001 From: walshjon Date: Thu, 13 Aug 2015 23:07:45 -0700 Subject: [PATCH 081/101] simplified hotfix version of PR 440 --- src/fixed_source.F90 | 10 +----- src/global.F90 | 4 --- src/output.F90 | 78 +++++++++++++++----------------------------- 3 files changed, 28 insertions(+), 64 deletions(-) diff --git a/src/fixed_source.F90 b/src/fixed_source.F90 index 76564ee2f3..1c34c8f2af 100644 --- a/src/fixed_source.F90 +++ b/src/fixed_source.F90 @@ -6,8 +6,7 @@ module fixed_source use constants, only: ZERO, MAX_LINE_LEN use global - use output, only: write_message, header, print_mean_leak,& - print_columns + use output, only: write_message, header use particle_header, only: Particle use random_lcg, only: set_particle_seed use source, only: sample_external_source, copy_source_attributes @@ -27,7 +26,6 @@ contains type(Particle) :: p if (master) call header("FIXED SOURCE TRANSPORT SIMULATION", level=1) - if (master) call print_columns() ! Allocate particle and dummy source site !$omp parallel @@ -132,12 +130,6 @@ contains call synchronize_tallies() call time_tallies % stop() - leak = global_tallies(LEAKAGE) % sum / n_realizations - leak_sem = sqrt(ONE / (n_realizations - ONE) & - * (global_tallies(LEAKAGE) % sum_sq / n_realizations& - - leak * leak)) - if (master) call print_mean_leak() - ! Check_triggers if (master) call check_triggers() #ifdef MPI diff --git a/src/global.F90 b/src/global.F90 index b2a563d9ee..a5ff7453ea 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -200,10 +200,6 @@ module global real(8) :: k_abs_tra = ZERO ! sum over batches of k_absorption * k_tracklength real(8) :: k_combined(2) ! combined best estimate of k-effective - ! Temorary leakage values - real(8) :: leak ! running mean leakage - real(8) :: leak_sem ! 1sigma SEM of the running mean leakage - ! Shannon entropy logical :: entropy_on = .false. real(8), allocatable :: entropy(:) ! shannon entropy at each generation diff --git a/src/output.F90 b/src/output.F90 index ea918b4361..939451c6fb 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1346,44 +1346,35 @@ contains subroutine print_columns() - select case(run_mode) - case(MODE_EIGENVALUE) - write(UNIT=ou, FMT='(2X,A9,3X)', ADVANCE='NO') "Bat./Gen." - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') " k " - if (entropy_on) write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "Entropy " - write(UNIT=ou, FMT='(A20,3X)', ADVANCE='NO') " Average k " - if (cmfd_run) then - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') " CMFD k " - select case(trim(cmfd_display)) - case('entropy') - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "CMFD Ent" - case('balance') - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "RMS Bal " - case('source') - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "RMS Src " - case('dominance') - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "Dom Rat " - end select - end if - write(UNIT=ou, FMT=*) + write(UNIT=ou, FMT='(2X,A9,3X)', ADVANCE='NO') "Bat./Gen." + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') " k " + if (entropy_on) write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "Entropy " + write(UNIT=ou, FMT='(A20,3X)', ADVANCE='NO') " Average k " + if (cmfd_run) then + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') " CMFD k " + select case(trim(cmfd_display)) + case('entropy') + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "CMFD Ent" + case('balance') + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "RMS Bal " + case('source') + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "RMS Src " + case('dominance') + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "Dom Rat " + end select + end if + write(UNIT=ou, FMT=*) - write(UNIT=ou, FMT='(2X,A9,3X)', ADVANCE='NO') "=========" + write(UNIT=ou, FMT='(2X,A9,3X)', ADVANCE='NO') "=========" + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" + if (entropy_on) write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" + write(UNIT=ou, FMT='(A20,3X)', ADVANCE='NO') "====================" + if (cmfd_run) then write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" - if (entropy_on) write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" - write(UNIT=ou, FMT='(A20,3X)', ADVANCE='NO') "====================" - if (cmfd_run) then - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" - if (cmfd_display /= '') & - write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" - end if - write(UNIT=ou, FMT=*) - case(MODE_FIXEDSOURCE) - write(ou, '(A10)', advance='no') 'Batch' - write(ou, '(A24)', advance='no') 'Mean Leakage' - write(ou, '(A24)') '1sigma SEM' - case default - continue - end select + if (cmfd_display /= '') & + write(UNIT=ou, FMT='(A8,3X)', ADVANCE='NO') "========" + end if + write(UNIT=ou, FMT=*) end subroutine print_columns @@ -1463,21 +1454,6 @@ contains end subroutine print_batch_keff -!=============================================================================== -! PRINT_MEAN_LEAK displays the overall mean system leakage and 1sigma SEM at -! each batch -!=============================================================================== - - subroutine print_mean_leak() - - ! write out information batch and option independent output - write(ou, '(A10)', advance='no') trim(to_str(current_batch)) - write(ou, '(ES24.16)', advance='no') leak - if (n_realizations > 1) write(ou, '(ES24.16)', advance='no') leak_sem - write(ou, *) - - end subroutine print_mean_leak - !=============================================================================== ! PRINT_PLOT displays selected options for plotting !=============================================================================== From 2c23d0ac212c2d62bf8aa5c8ebfc96591f8f9f91 Mon Sep 17 00:00:00 2001 From: walshjon Date: Thu, 13 Aug 2015 23:12:07 -0700 Subject: [PATCH 082/101] reinclude the batch count printout --- src/fixed_source.F90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/fixed_source.F90 b/src/fixed_source.F90 index 1c34c8f2af..9dbd57324f 100644 --- a/src/fixed_source.F90 +++ b/src/fixed_source.F90 @@ -103,6 +103,9 @@ contains subroutine initialize_batch() + call write_message("Simulating batch " // trim(to_str(current_batch)) & + &// "...", 1) + ! Reset total starting particle weight used for normalizing tallies total_weight = ZERO From 4ca33a4a04ee4e70b9fba463e067857027b7d3a8 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 15 Aug 2015 09:45:14 +0700 Subject: [PATCH 083/101] Make tallies of the form (scalar op usertally) derived --- openmc/tallies.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 7837681492..6e418a2be4 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1457,7 +1457,7 @@ class Tally(object): Raises ------ ValueError - When this method is called before the other tally is populated + When this method is called before the other tally is populated with data by the StatePoint.read_results() method. """ @@ -1674,6 +1674,7 @@ class Tally(object): elif isinstance(other, Real): new_tally = Tally(name='derived') + new_tally._derived = True new_tally.with_batch_statistics = True new_tally.name = self.name new_tally._mean = self._mean + other @@ -1743,6 +1744,7 @@ class Tally(object): elif isinstance(other, Real): new_tally = Tally(name='derived') + new_tally._derived = True new_tally.name = self.name new_tally._mean = self._mean - other new_tally._std_dev = self._std_dev @@ -1812,6 +1814,7 @@ class Tally(object): elif isinstance(other, Real): new_tally = Tally(name='derived') + new_tally._derived = True new_tally.name = self.name new_tally._mean = self._mean * other new_tally._std_dev = self._std_dev * np.abs(other) @@ -1881,6 +1884,7 @@ class Tally(object): elif isinstance(other, Real): new_tally = Tally(name='derived') + new_tally._derived = True new_tally.name = self.name new_tally._mean = self._mean / other new_tally._std_dev = self._std_dev * np.abs(1. / other) @@ -1950,6 +1954,7 @@ class Tally(object): elif isinstance(power, Real): new_tally = Tally(name='derived') + new_tally._derived = True new_tally.name = self.name new_tally._mean = self._mean ** power self_rel_err = self.std_dev / self.mean From cfa629e40630a50143d2bcc0480cddd334ddeecb Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 15 Aug 2015 11:00:27 +0700 Subject: [PATCH 084/101] Fix source in tally arithmetic notebook --- .../pythonapi/examples/tally-arithmetic.ipynb | 267 +++++++++--------- 1 file changed, 133 insertions(+), 134 deletions(-) diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index a2930a80bb..2b12052046 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -293,7 +293,7 @@ "settings_file.inactive = inactive\n", "settings_file.particles = particles\n", "settings_file.output = {'tallies': True, 'summary': True}\n", - "source_bounds = [-0.63, -0.63, -10, 0.63, 0.63, 10.]\n", + "source_bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", "settings_file.set_source_space('box', source_bounds)\n", "\n", "# Export to \"settings.xml\"\n", @@ -568,9 +568,8 @@ "\n", " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", - " Version: 0.6.2\n", - " Date/Time: 2015-08-12 08:58:22\n", - " MPI Processes: 4\n", + " Version: 0.7.0\n", + " Date/Time: 2015-08-15 10:52:49\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -596,26 +595,26 @@ "\n", " Bat./Gen. k Average k \n", " ========= ======== ==================== \n", - " 1/1 1.04944 \n", - " 2/1 1.03451 \n", - " 3/1 1.06490 \n", - " 4/1 1.04020 \n", - " 5/1 1.03270 \n", - " 6/1 1.09507 \n", - " 7/1 1.06827 1.08167 +/- 0.01340\n", - " 8/1 1.06089 1.07474 +/- 0.01038\n", - " 9/1 1.03806 1.06557 +/- 0.01175\n", - " 10/1 1.05032 1.06252 +/- 0.00960\n", - " 11/1 1.03259 1.05753 +/- 0.00929\n", - " 12/1 1.02588 1.05301 +/- 0.00906\n", - " 13/1 1.03872 1.05123 +/- 0.00805\n", - " 14/1 1.05396 1.05153 +/- 0.00710\n", - " 15/1 1.03818 1.05019 +/- 0.00649\n", - " 16/1 1.05015 1.05019 +/- 0.00587\n", - " 17/1 1.01418 1.04719 +/- 0.00614\n", - " 18/1 1.07342 1.04921 +/- 0.00600\n", - " 19/1 1.03023 1.04785 +/- 0.00572\n", - " 20/1 1.05405 1.04827 +/- 0.00534\n", + " 1/1 1.00465 \n", + " 2/1 1.05814 \n", + " 3/1 1.05114 \n", + " 4/1 1.09189 \n", + " 5/1 1.03731 \n", + " 6/1 1.03510 \n", + " 7/1 1.09378 1.06444 +/- 0.02934\n", + " 8/1 1.04522 1.05803 +/- 0.01811\n", + " 9/1 1.06557 1.05992 +/- 0.01294\n", + " 10/1 1.05757 1.05945 +/- 0.01004\n", + " 11/1 1.04858 1.05764 +/- 0.00839\n", + " 12/1 1.01832 1.05202 +/- 0.00905\n", + " 13/1 1.05822 1.05279 +/- 0.00787\n", + " 14/1 1.07684 1.05547 +/- 0.00744\n", + " 15/1 1.00349 1.05027 +/- 0.00844\n", + " 16/1 1.06969 1.05203 +/- 0.00784\n", + " 17/1 1.06377 1.05301 +/- 0.00722\n", + " 18/1 1.02897 1.05116 +/- 0.00690\n", + " 19/1 1.00685 1.04800 +/- 0.00713\n", + " 20/1 1.02644 1.04656 +/- 0.00679\n", " Creating state point statepoint.20.h5...\n", "\n", " ===========================================================================\n", @@ -625,27 +624,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 9.7500E-01 seconds\n", - " Reading cross sections = 2.8800E-01 seconds\n", - " Total time in simulation = 8.2720E+00 seconds\n", - " Time in transport only = 7.8820E+00 seconds\n", - " Time in inactive batches = 1.0260E+00 seconds\n", - " Time in active batches = 7.2460E+00 seconds\n", - " Time synchronizing fission bank = 1.9500E-01 seconds\n", + " Total time for initialization = 4.4100E-01 seconds\n", + " Reading cross sections = 1.1300E-01 seconds\n", + " Total time in simulation = 1.8418E+01 seconds\n", + " Time in transport only = 1.8403E+01 seconds\n", + " Time in inactive batches = 2.1070E+00 seconds\n", + " Time in active batches = 1.6311E+01 seconds\n", + " Time synchronizing fission bank = 2.0000E-03 seconds\n", " Sampling source sites = 2.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 = 2.0000E-03 seconds\n", - " Total time elapsed = 9.2580E+00 seconds\n", - " Calculation Rate (inactive) = 12183.2 neutrons/second\n", - " Calculation Rate (active) = 5175.27 neutrons/second\n", + " Total time for finalization = 1.0000E-03 seconds\n", + " Total time elapsed = 1.8861E+01 seconds\n", + " Calculation Rate (inactive) = 5932.61 neutrons/second\n", + " Calculation Rate (active) = 2299.06 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.04399 +/- 0.00515\n", - " k-effective (Track-length) = 1.04827 +/- 0.00534\n", - " k-effective (Absorption) = 1.03932 +/- 0.00588\n", - " Combined k-effective = 1.04364 +/- 0.00533\n", + " k-effective (Collision) = 1.04599 +/- 0.00622\n", + " k-effective (Track-length) = 1.04656 +/- 0.00679\n", + " k-effective (Absorption) = 1.04614 +/- 0.00461\n", + " Combined k-effective = 1.04651 +/- 0.00368\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -666,7 +665,7 @@ "!rm statepoint.*\n", "\n", "# Run OpenMC with MPI!\n", - "executor.run_simulation(mpi_procs=4)" + "executor.run_simulation()" ] }, { @@ -760,8 +759,8 @@ " 0\n", " total\n", " (nu-fission / absorption)\n", - " 1.042035\n", - " 0.006584\n", + " 1.042726\n", + " 0.008661\n", " \n", " \n", "\n", @@ -770,7 +769,7 @@ "text/plain": [ " nuclide score mean std. dev.\n", "bin \n", - "0 total (nu-fission / absorption) 1.042035 0.006584" + "0 total (nu-fission / absorption) 1.042726 0.008661" ] }, "execution_count": 26, @@ -828,8 +827,8 @@ " 0\n", " total\n", " absorption\n", - " 0.959067\n", - " 0.00517\n", + " 0.958874\n", + " 0.007146\n", " \n", " \n", "\n", @@ -838,7 +837,7 @@ "text/plain": [ " nuclide score mean std. dev.\n", "bin \n", - "0 total absorption 0.959067 0.00517" + "0 total absorption 0.958874 0.007146" ] }, "execution_count": 27, @@ -894,8 +893,8 @@ " 0\n", " total\n", " nu-fission\n", - " 1.09144\n", - " 0.008201\n", + " 1.09186\n", + " 0.010424\n", " \n", " \n", "\n", @@ -904,7 +903,7 @@ "text/plain": [ " nuclide score mean std. dev.\n", "bin \n", - "0 total nu-fission 1.09144 0.008201" + "0 total nu-fission 1.09186 0.010424" ] }, "execution_count": 28, @@ -967,8 +966,8 @@ " 10000\n", " total\n", " absorption\n", - " 0.802094\n", - " 0.004432\n", + " 0.802921\n", + " 0.006109\n", " \n", " \n", "\n", @@ -977,7 +976,7 @@ "text/plain": [ " energy [MeV] cell nuclide score mean std. dev.\n", "bin \n", - "0 0.0e+00 - 6.2e-01 10000 total absorption 0.802094 0.004432" + "0 0.0e+00 - 6.2e-01 10000 total absorption 0.802921 0.006109" ] }, "execution_count": 29, @@ -1038,8 +1037,8 @@ " 10000\n", " total\n", " (nu-fission / absorption)\n", - " 1.241103\n", - " 0.008414\n", + " 1.240421\n", + " 0.010978\n", " \n", " \n", "\n", @@ -1048,11 +1047,11 @@ "text/plain": [ " energy [MeV] cell nuclide score mean \\\n", "bin \n", - "0 0.0e+00 - 6.2e-01 10000 total (nu-fission / absorption) 1.241103 \n", + "0 0.0e+00 - 6.2e-01 10000 total (nu-fission / absorption) 1.240421 \n", "\n", " std. dev. \n", "bin \n", - "0 0.008414 " + "0 0.010978 " ] }, "execution_count": 30, @@ -1106,8 +1105,8 @@ " 0\n", " total\n", " (((absorption * nu-fission) * absorption) * (n...\n", - " 1.042035\n", - " 0.013263\n", + " 1.042726\n", + " 0.017538\n", " \n", " \n", "\n", @@ -1116,11 +1115,11 @@ "text/plain": [ " nuclide score mean \\\n", "bin \n", - "0 total (((absorption * nu-fission) * absorption) * (n... 1.042035 \n", + "0 total (((absorption * nu-fission) * absorption) * (n... 1.042726 \n", "\n", " std. dev. \n", "bin \n", - "0 0.013263 " + "0 0.017538 " ] }, "execution_count": 31, @@ -1198,7 +1197,7 @@ " (U-238 / total)\n", " (nu-fission / flux)\n", " 0.000001\n", - " 5.999638e-09\n", + " 6.985151e-09\n", " \n", " \n", " 1\n", @@ -1206,8 +1205,8 @@ " 0.0e+00 - 6.3e-07\n", " (U-238 / total)\n", " (scatter / flux)\n", - " 0.209985\n", - " 1.975043e-03\n", + " 0.209988\n", + " 2.206753e-03\n", " \n", " \n", " 2\n", @@ -1215,8 +1214,8 @@ " 0.0e+00 - 6.3e-07\n", " (U-235 / total)\n", " (nu-fission / flux)\n", - " 0.355600\n", - " 3.196431e-03\n", + " 0.355276\n", + " 3.741612e-03\n", " \n", " \n", " 3\n", @@ -1225,7 +1224,7 @@ " (U-235 / total)\n", " (scatter / flux)\n", " 0.005555\n", - " 5.223274e-05\n", + " 5.842517e-05\n", " \n", " \n", " 4\n", @@ -1233,8 +1232,8 @@ " 6.3e-07 - 2.0e+01\n", " (U-238 / total)\n", " (nu-fission / flux)\n", - " 0.007200\n", - " 7.935962e-05\n", + " 0.007229\n", + " 5.951357e-05\n", " \n", " \n", " 5\n", @@ -1242,8 +1241,8 @@ " 6.3e-07 - 2.0e+01\n", " (U-238 / total)\n", " (scatter / flux)\n", - " 0.227534\n", - " 8.747338e-04\n", + " 0.227642\n", + " 9.496469e-04\n", " \n", " \n", " 6\n", @@ -1251,8 +1250,8 @@ " 6.3e-07 - 2.0e+01\n", " (U-235 / total)\n", " (nu-fission / flux)\n", - " 0.008090\n", - " 4.645182e-05\n", + " 0.008076\n", + " 5.699123e-05\n", " \n", " \n", " 7\n", @@ -1260,8 +1259,8 @@ " 6.3e-07 - 2.0e+01\n", " (U-235 / total)\n", " (scatter / flux)\n", - " 0.003370\n", - " 1.274353e-05\n", + " 0.003369\n", + " 1.369755e-05\n", " \n", " \n", "\n", @@ -1271,24 +1270,24 @@ " cell energy [MeV] nuclide score mean \\\n", "bin \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.209985 \n", - "2 10000 0.0e+00 - 6.3e-07 (U-235 / total) (nu-fission / flux) 0.355600 \n", + "1 10000 0.0e+00 - 6.3e-07 (U-238 / total) (scatter / flux) 0.209988 \n", + "2 10000 0.0e+00 - 6.3e-07 (U-235 / total) (nu-fission / flux) 0.355276 \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.007200 \n", - "5 10000 6.3e-07 - 2.0e+01 (U-238 / total) (scatter / flux) 0.227534 \n", - "6 10000 6.3e-07 - 2.0e+01 (U-235 / total) (nu-fission / flux) 0.008090 \n", - "7 10000 6.3e-07 - 2.0e+01 (U-235 / total) (scatter / flux) 0.003370 \n", + "4 10000 6.3e-07 - 2.0e+01 (U-238 / total) (nu-fission / flux) 0.007229 \n", + "5 10000 6.3e-07 - 2.0e+01 (U-238 / total) (scatter / flux) 0.227642 \n", + "6 10000 6.3e-07 - 2.0e+01 (U-235 / total) (nu-fission / flux) 0.008076 \n", + "7 10000 6.3e-07 - 2.0e+01 (U-235 / total) (scatter / flux) 0.003369 \n", "\n", " std. dev. \n", "bin \n", - "0 5.999638e-09 \n", - "1 1.975043e-03 \n", - "2 3.196431e-03 \n", - "3 5.223274e-05 \n", - "4 7.935962e-05 \n", - "5 8.747338e-04 \n", - "6 4.645182e-05 \n", - "7 1.274353e-05 " + "0 6.985151e-09 \n", + "1 2.206753e-03 \n", + "2 3.741612e-03 \n", + "3 5.842517e-05 \n", + "4 5.951357e-05 \n", + "5 9.496469e-04 \n", + "6 5.699123e-05 \n", + "7 1.369755e-05 " ] }, "execution_count": 33, @@ -1319,11 +1318,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 6.64202005e-07]\n", - " [ 3.55599908e-01]]\n", + "[[[ 6.63809296e-07]\n", + " [ 3.55275544e-01]]\n", "\n", - " [[ 7.20046753e-03]\n", - " [ 8.09041760e-03]]]\n" + " [[ 7.22895528e-03]\n", + " [ 8.07565148e-03]]]\n" ] } ], @@ -1351,9 +1350,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.00555494]]\n", + "[[[ 0.00555505]]\n", "\n", - " [[ 0.00337012]]]\n" + " [[ 0.0033688 ]]]\n" ] } ], @@ -1375,8 +1374,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.22753371]\n", - " [ 0.00337012]]]\n" + "[[[ 0.2276418]\n", + " [ 0.0033688]]]\n" ] } ], @@ -1435,7 +1434,7 @@ " U-238\n", " nu-fission\n", " 0.000002\n", - " 9.952309e-09\n", + " 1.211808e-08\n", " \n", " \n", " 1\n", @@ -1443,8 +1442,8 @@ " 0.0e+00 - 6.3e-07\n", " U-235\n", " nu-fission\n", - " 0.871994\n", - " 5.271360e-03\n", + " 0.870360\n", + " 6.496431e-03\n", " \n", " \n", " 2\n", @@ -1452,8 +1451,8 @@ " 6.3e-07 - 2.0e+01\n", " U-238\n", " nu-fission\n", - " 0.083006\n", - " 8.813292e-04\n", + " 0.083226\n", + " 6.367951e-04\n", " \n", " \n", " 3\n", @@ -1461,8 +1460,8 @@ " 6.3e-07 - 2.0e+01\n", " U-235\n", " nu-fission\n", - " 0.093265\n", - " 4.590785e-04\n", + " 0.092974\n", + " 5.921990e-04\n", " \n", " \n", "\n", @@ -1471,10 +1470,10 @@ "text/plain": [ " cell energy [MeV] nuclide score mean std. dev.\n", "bin \n", - "0 10000 0.0e+00 - 6.3e-07 U-238 nu-fission 0.000002 9.952309e-09\n", - "1 10000 0.0e+00 - 6.3e-07 U-235 nu-fission 0.871994 5.271360e-03\n", - "2 10000 6.3e-07 - 2.0e+01 U-238 nu-fission 0.083006 8.813292e-04\n", - "3 10000 6.3e-07 - 2.0e+01 U-235 nu-fission 0.093265 4.590785e-04" + "0 10000 0.0e+00 - 6.3e-07 U-238 nu-fission 0.000002 1.211808e-08\n", + "1 10000 0.0e+00 - 6.3e-07 U-235 nu-fission 0.870360 6.496431e-03\n", + "2 10000 6.3e-07 - 2.0e+01 U-238 nu-fission 0.083226 6.367951e-04\n", + "3 10000 6.3e-07 - 2.0e+01 U-235 nu-fission 0.092974 5.921990e-04" ] }, "execution_count": 37, @@ -1527,8 +1526,8 @@ " 1.0e-08 - 1.1e-07\n", " H-1\n", " scatter\n", - " 4.669535\n", - " 0.032937\n", + " 4.638428\n", + " 0.034134\n", " \n", " \n", " 1\n", @@ -1536,8 +1535,8 @@ " 1.1e-07 - 1.2e-06\n", " H-1\n", " scatter\n", - " 2.034786\n", - " 0.014311\n", + " 2.050818\n", + " 0.010745\n", " \n", " \n", " 2\n", @@ -1545,8 +1544,8 @@ " 1.2e-06 - 1.3e-05\n", " H-1\n", " scatter\n", - " 1.664440\n", - " 0.014963\n", + " 1.656905\n", + " 0.009480\n", " \n", " \n", " 3\n", @@ -1554,8 +1553,8 @@ " 1.3e-05 - 1.4e-04\n", " H-1\n", " scatter\n", - " 1.875406\n", - " 0.011341\n", + " 1.870808\n", + " 0.011883\n", " \n", " \n", " 4\n", @@ -1563,8 +1562,8 @@ " 1.4e-04 - 1.5e-03\n", " H-1\n", " scatter\n", - " 2.065055\n", - " 0.013958\n", + " 2.045621\n", + " 0.011414\n", " \n", " \n", " 5\n", @@ -1572,8 +1571,8 @@ " 1.5e-03 - 1.6e-02\n", " H-1\n", " scatter\n", - " 2.144462\n", - " 0.011313\n", + " 2.163297\n", + " 0.008725\n", " \n", " \n", " 6\n", @@ -1581,8 +1580,8 @@ " 1.6e-02 - 1.7e-01\n", " H-1\n", " scatter\n", - " 2.206529\n", - " 0.011302\n", + " 2.202045\n", + " 0.013500\n", " \n", " \n", " 7\n", @@ -1590,8 +1589,8 @@ " 1.7e-01 - 1.9e+00\n", " H-1\n", " scatter\n", - " 1.992336\n", - " 0.012023\n", + " 1.996977\n", + " 0.010791\n", " \n", " \n", " 8\n", @@ -1599,8 +1598,8 @@ " 1.9e+00 - 2.0e+01\n", " H-1\n", " scatter\n", - " 0.377400\n", - " 0.004341\n", + " 0.370890\n", + " 0.003597\n", " \n", " \n", "\n", @@ -1609,15 +1608,15 @@ "text/plain": [ " cell energy [MeV] nuclide score mean std. dev.\n", "bin \n", - "0 10002 1.0e-08 - 1.1e-07 H-1 scatter 4.669535 0.032937\n", - "1 10002 1.1e-07 - 1.2e-06 H-1 scatter 2.034786 0.014311\n", - "2 10002 1.2e-06 - 1.3e-05 H-1 scatter 1.664440 0.014963\n", - "3 10002 1.3e-05 - 1.4e-04 H-1 scatter 1.875406 0.011341\n", - "4 10002 1.4e-04 - 1.5e-03 H-1 scatter 2.065055 0.013958\n", - "5 10002 1.5e-03 - 1.6e-02 H-1 scatter 2.144462 0.011313\n", - "6 10002 1.6e-02 - 1.7e-01 H-1 scatter 2.206529 0.011302\n", - "7 10002 1.7e-01 - 1.9e+00 H-1 scatter 1.992336 0.012023\n", - "8 10002 1.9e+00 - 2.0e+01 H-1 scatter 0.377400 0.004341" + "0 10002 1.0e-08 - 1.1e-07 H-1 scatter 4.638428 0.034134\n", + "1 10002 1.1e-07 - 1.2e-06 H-1 scatter 2.050818 0.010745\n", + "2 10002 1.2e-06 - 1.3e-05 H-1 scatter 1.656905 0.009480\n", + "3 10002 1.3e-05 - 1.4e-04 H-1 scatter 1.870808 0.011883\n", + "4 10002 1.4e-04 - 1.5e-03 H-1 scatter 2.045621 0.011414\n", + "5 10002 1.5e-03 - 1.6e-02 H-1 scatter 2.163297 0.008725\n", + "6 10002 1.6e-02 - 1.7e-01 H-1 scatter 2.202045 0.013500\n", + "7 10002 1.7e-01 - 1.9e+00 H-1 scatter 1.996977 0.010791\n", + "8 10002 1.9e+00 - 2.0e+01 H-1 scatter 0.370890 0.003597" ] }, "execution_count": 38, From 3d1af11b6c5783155f1e06ff84cdfcc1806fe535 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 19 Aug 2015 09:36:46 +0700 Subject: [PATCH 085/101] Fix hyperlink in documentation --- docs/source/developers.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/developers.rst b/docs/source/developers.rst index 56ce5e14ad..d82d89744a 100644 --- a/docs/source/developers.rst +++ b/docs/source/developers.rst @@ -11,7 +11,7 @@ Active development of the OpenMC Monte Carlo code is currently led by: * `Nick Horelik `_ * `Adam Nelson `_ * `Jon Walsh `_ -* `Sterling Harper `_ +* `Sterling Harper `_ * `Will Boyd `_ * `Benoit Forget `_ * `Kord Smith `_ From 2c8c771998a37f4746352d3ce0675221d904992d Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 1 Jul 2015 16:34:19 +0700 Subject: [PATCH 086/101] Change fixed source simulations to use source_bank rather than dummy source site. This makes fixed source and eigenvalue modes more similar. --- CMakeLists.txt | 2 +- src/eigenvalue.F90 | 4 +- src/fixed_source.F90 | 50 +++---------------- src/global.F90 | 4 -- src/initialize.F90 | 45 ++++++++--------- src/particle_restart_write.F90 | 7 +-- src/source.F90 | 2 +- tests/test_fixed_source/results_true.dat | 8 +-- .../results_true.dat | 8 +-- .../test_particle_restart_fixed.py | 2 +- 10 files changed, 44 insertions(+), 88 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 45b626324c..b6bafd5469 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -317,7 +317,7 @@ foreach(test ${TESTS}) elseif(${test} MATCHES "test_particle_restart_eigval") set(RESTART_FILE particle_12_616.h5) elseif(${test} MATCHES "test_particle_restart_fixed") - set(RESTART_FILE particle_7_6144.h5) + set(RESTART_FILE particle_7_928.h5) else(${test} MATCHES "test_statepoint_restart") message(FATAL_ERROR "Restart test ${test} not recognized") endif(${test} MATCHES "test_statepoint_restart") diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index c4b9b9a678..6c8825579c 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -16,7 +16,7 @@ module eigenvalue use particle_header, only: Particle use random_lcg, only: prn, set_particle_seed, prn_skip use search, only: binary_search - use source, only: get_source_particle + use source, only: get_source_particle, initialize_source use state_point, only: write_state_point, write_source_point use string, only: to_str use tally, only: synchronize_tallies, setup_active_usertallies, & @@ -44,6 +44,8 @@ contains type(Particle) :: p integer(8) :: i_work + if (.not. restart_run) call initialize_source() + if (master) call header("K EIGENVALUE SIMULATION", level=1) ! Display column titles diff --git a/src/fixed_source.F90 b/src/fixed_source.F90 index 9dbd57324f..c0397fe0b1 100644 --- a/src/fixed_source.F90 +++ b/src/fixed_source.F90 @@ -9,7 +9,7 @@ module fixed_source use output, only: write_message, header use particle_header, only: Particle use random_lcg, only: set_particle_seed - use source, only: sample_external_source, copy_source_attributes + use source, only: initialize_source, get_source_particle use state_point, only: write_state_point use string, only: to_str use tally, only: synchronize_tallies, setup_active_usertallies @@ -22,16 +22,13 @@ contains subroutine run_fixedsource() - integer(8) :: i ! index over histories in single cycle type(Particle) :: p + integer(8) :: i_work ! index over histories in single cycle + + if (.not. restart_run) call initialize_source() if (master) call header("FIXED SOURCE TRANSPORT SIMULATION", level=1) - ! Allocate particle and dummy source site -!$omp parallel - allocate(source_site) -!$omp end parallel - ! Turn timer and tallies on tallies_on = .true. !$omp parallel @@ -50,6 +47,7 @@ contains end if call initialize_batch() + overall_gen = current_batch ! Start timer for transport call time_transport % start() @@ -57,21 +55,11 @@ contains ! ======================================================================= ! LOOP OVER PARTICLES !$omp parallel do schedule(static) firstprivate(p) - PARTICLE_LOOP: do i = 1, work - - ! Set unique particle ID - p % id = (current_batch - 1)*n_particles + work_index(rank) + i - - ! set particle trace - trace = .false. - if (current_batch == trace_batch .and. current_gen == trace_gen .and. & - work_index(rank) + i == trace_particle) trace = .true. - - ! set random number seed - call set_particle_seed(p % id) + PARTICLE_LOOP: do i_work = 1, work + current_work = i_work ! grab source particle from bank - call sample_source_particle(p) + call get_source_particle(p, current_work) ! transport particle call transport(p) @@ -151,26 +139,4 @@ contains end subroutine finalize_batch -!=============================================================================== -! SAMPLE_SOURCE_PARTICLE -!=============================================================================== - - subroutine sample_source_particle(p) - - type(Particle), intent(inout) :: p - - ! Set particle - call p % initialize() - - ! Sample the external source distribution - call sample_external_source(source_site) - - ! Copy source attributes to the particle - call copy_source_attributes(p, source_site) - - ! Determine whether to create track file - if (write_all_tracks) p % write_track = .true. - - end subroutine sample_source_particle - end module fixed_source diff --git a/src/global.F90 b/src/global.F90 index a5ff7453ea..564fcda843 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -283,10 +283,6 @@ module global ! Mode to run in (fixed source, eigenvalue, plotting, etc) integer :: run_mode = NONE - ! Fixed source particle bank - type(Bank), pointer :: source_site => null() -!$omp threadprivate(source_site) - ! Restart run logical :: restart_run = .false. integer :: restart_batch diff --git a/src/initialize.F90 b/src/initialize.F90 index 409d531a38..fd63963bf1 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -20,7 +20,6 @@ module initialize write_message use output_interface use random_lcg, only: initialize_prng - use source, only: initialize_source use state_point, only: load_state_point use string, only: to_str, str_to_int, starts_with, ends_with use tally_header, only: TallyObject, TallyResult, TallyFilter @@ -141,13 +140,9 @@ contains ! Determine how much work each processor should do call calculate_work() - ! Allocate banks and create source particles -- for a fixed source - ! calculation, the external source distribution is sampled during the - ! run, not at initialization - if (run_mode == MODE_EIGENVALUE) then - call allocate_banks() - if (.not. restart_run) call initialize_source() - end if + ! Allocate source bank, and for eigenvalu simulations also allocate the + ! fission bank + call allocate_banks() ! If this is a restart run, load the state point data and binary source ! file @@ -904,31 +899,33 @@ contains call fatal_error("Failed to allocate source bank.") end if + if (run_mode == MODE_EIGENVALUE) then #ifdef _OPENMP - ! If OpenMP is being used, each thread needs its own private fission - ! bank. Since the private fission banks need to be combined at the end of a - ! generation, there is also a 'master_fission_bank' that is used to collect - ! the sites from each thread. + ! If OpenMP is being used, each thread needs its own private fission + ! bank. Since the private fission banks need to be combined at the end of + ! a generation, there is also a 'master_fission_bank' that is used to + ! collect the sites from each thread. - n_threads = omp_get_max_threads() + n_threads = omp_get_max_threads() !$omp parallel - thread_id = omp_get_thread_num() + thread_id = omp_get_thread_num() - if (thread_id == 0) then - allocate(fission_bank(3*work)) - else - allocate(fission_bank(3*work/n_threads)) - end if + if (thread_id == 0) then + allocate(fission_bank(3*work)) + else + allocate(fission_bank(3*work/n_threads)) + end if !$omp end parallel - allocate(master_fission_bank(3*work), STAT=alloc_err) + allocate(master_fission_bank(3*work), STAT=alloc_err) #else - allocate(fission_bank(3*work), STAT=alloc_err) + allocate(fission_bank(3*work), STAT=alloc_err) #endif - ! Check for allocation errors - if (alloc_err /= 0) then - call fatal_error("Failed to allocate fission bank.") + ! Check for allocation errors + if (alloc_err /= 0) then + call fatal_error("Failed to allocate fission bank.") + end if end if end subroutine allocate_banks diff --git a/src/particle_restart_write.F90 b/src/particle_restart_write.F90 index 0ac55bd273..f138a67403 100644 --- a/src/particle_restart_write.F90 +++ b/src/particle_restart_write.F90 @@ -43,12 +43,7 @@ contains call pr % file_create(filename) ! Get information about source particle - select case (run_mode) - case (MODE_EIGENVALUE) - src => source_bank(current_work) - case (MODE_FIXEDSOURCE) - src => source_site - end select + src => source_bank(current_work) ! Write data to file call pr % write_data(FILETYPE_PARTICLE_RESTART, 'filetype') diff --git a/src/source.F90 b/src/source.F90 index 7cfdcf655c..04b5ac760f 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -78,7 +78,7 @@ contains ! Write out initial source if (write_initial_source) then - call write_message('Writing out initial source guess...', 1) + call write_message('Writing out initial source...', 1) #ifdef HDF5 filename = trim(path_output) // 'initial_source.h5' #else diff --git a/tests/test_fixed_source/results_true.dat b/tests/test_fixed_source/results_true.dat index 99eb15e10d..0940301886 100644 --- a/tests/test_fixed_source/results_true.dat +++ b/tests/test_fixed_source/results_true.dat @@ -1,6 +1,6 @@ tally 1: -4.483337E+02 -2.017057E+04 +4.538791E+02 +2.073271E+04 leakage: -9.820000E+00 -9.648000E+00 +9.830000E+00 +9.663900E+00 diff --git a/tests/test_particle_restart_fixed/results_true.dat b/tests/test_particle_restart_fixed/results_true.dat index ffe7d2cae5..81aed707cf 100644 --- a/tests/test_particle_restart_fixed/results_true.dat +++ b/tests/test_particle_restart_fixed/results_true.dat @@ -3,14 +3,14 @@ current batch: current gen: 0.000000E+00 particle id: -6.144000E+03 +9.280000E+02 run mode: 1.000000E+00 particle weight: 1.000000E+00 particle energy: -5.749729E+00 +4.412022E+00 particle xyz: -8.754675E+00 2.551620E+00 4.394350E-01 +5.572639E+00 -9.139472E+00 -1.974824E+00 particle uvw: --5.971721E-01 -4.845709E-01 6.391999E-01 +1.410422E-01 5.330426E-01 -8.342498E-01 diff --git a/tests/test_particle_restart_fixed/test_particle_restart_fixed.py b/tests/test_particle_restart_fixed/test_particle_restart_fixed.py index 05dcf76a68..385a429407 100644 --- a/tests/test_particle_restart_fixed/test_particle_restart_fixed.py +++ b/tests/test_particle_restart_fixed/test_particle_restart_fixed.py @@ -6,5 +6,5 @@ from testing_harness import ParticleRestartTestHarness if __name__ == '__main__': - harness = ParticleRestartTestHarness('particle_7_6144.*') + harness = ParticleRestartTestHarness('particle_7_928.*') harness.main() From 14c62e70b69a2455571cd0bdb03caedfbe4c3f1c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 2 Jul 2015 20:01:24 +0700 Subject: [PATCH 087/101] Combined main batch/particle loop structure for eigenvalue and fixed source simulations in one 'simulation' mode. The fixed_source module is now gone, and the eigenvalue module consists specifically of eigenvalue-related subroutines. --- src/eigenvalue.F90 | 286 +-------------- src/fixed_source.F90 | 142 -------- src/main.F90 | 9 +- src/simulation.F90 | 325 ++++++++++++++++++ .../results_true.dat | 2 +- 5 files changed, 331 insertions(+), 433 deletions(-) delete mode 100644 src/fixed_source.F90 create mode 100644 src/simulation.F90 diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index 6c8825579c..6a4591705c 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -4,275 +4,24 @@ module eigenvalue use message_passing #endif - use cmfd_execute, only: cmfd_init_batch, execute_cmfd use constants, only: ZERO use error, only: fatal_error, warning use global use math, only: t_percentile use mesh, only: count_bank_sites use mesh_header, only: StructuredMesh - use output, only: write_message, header, print_columns, & - print_batch_keff, print_generation use particle_header, only: Particle use random_lcg, only: prn, set_particle_seed, prn_skip use search, only: binary_search - use source, only: get_source_particle, initialize_source - use state_point, only: write_state_point, write_source_point use string, only: to_str - use tally, only: synchronize_tallies, setup_active_usertallies, & - reset_result - use trigger, only: check_triggers - use tracking, only: transport implicit none - private - public :: run_eigenvalue - real(8) :: keff_generation ! Single-generation k on each - ! processor - real(8) :: k_sum(2) = ZERO ! Used to reduce sum and sum_sq + real(8) :: keff_generation ! Single-generation k on each processor + real(8) :: k_sum(2) = ZERO ! Used to reduce sum and sum_sq contains -!=============================================================================== -! RUN_EIGENVALUE encompasses all the main logic where iterations are performed -! over the batches, generations, and histories in a k-eigenvalue calculation. -!=============================================================================== - - subroutine run_eigenvalue() - - type(Particle) :: p - integer(8) :: i_work - - if (.not. restart_run) call initialize_source() - - if (master) call header("K EIGENVALUE SIMULATION", level=1) - - ! Display column titles - if(master) call print_columns() - - ! Turn on inactive timer - call time_inactive % start() - - ! ========================================================================== - ! LOOP OVER BATCHES - BATCH_LOOP: do current_batch = 1, n_max_batches - - call initialize_batch() - - ! Handle restart runs - if (restart_run .and. current_batch <= restart_batch) then - call replay_batch_history() - cycle BATCH_LOOP - end if - - ! ======================================================================= - ! LOOP OVER GENERATIONS - GENERATION_LOOP: do current_gen = 1, gen_per_batch - - call initialize_generation() - - ! Start timer for transport - call time_transport % start() - - ! ==================================================================== - ! LOOP OVER PARTICLES -!$omp parallel do schedule(static) firstprivate(p) - PARTICLE_LOOP: do i_work = 1, work - current_work = i_work - - ! grab source particle from bank - call get_source_particle(p, current_work) - - ! transport particle - call transport(p) - - end do PARTICLE_LOOP -!$omp end parallel do - - ! Accumulate time for transport - call time_transport % stop() - - call finalize_generation() - - end do GENERATION_LOOP - - call finalize_batch() - - if (satisfy_triggers) exit BATCH_LOOP - - end do BATCH_LOOP - - call time_active % stop() - - ! ========================================================================== - ! END OF RUN WRAPUP - - if (master) call header("SIMULATION FINISHED", level=1) - - ! Clear particle - call p % clear() - - end subroutine run_eigenvalue - -!=============================================================================== -! INITIALIZE_BATCH -!=============================================================================== - - subroutine initialize_batch() - - call write_message("Simulating batch " // trim(to_str(current_batch)) & - &// "...", 8) - - ! Reset total starting particle weight used for normalizing tallies - total_weight = ZERO - - if (current_batch == n_inactive + 1) then - ! Switch from inactive batch timer to active batch timer - call time_inactive % stop() - call time_active % start() - - ! Enable active batches (and tallies_on if it hasn't been enabled) - active_batches = .true. - tallies_on = .true. - - ! Add user tallies to active tallies list -!$omp parallel - call setup_active_usertallies() -!$omp end parallel - end if - - ! check CMFD initialize batch - if (cmfd_run) call cmfd_init_batch() - - end subroutine initialize_batch - -!=============================================================================== -! INITIALIZE_GENERATION -!=============================================================================== - - subroutine initialize_generation() - - ! set overall generation number - overall_gen = gen_per_batch*(current_batch - 1) + current_gen - - ! Reset number of fission bank sites - n_bank = 0 - - ! Count source sites if using uniform fission source weighting - if (ufs) call count_source_for_ufs() - - ! Store current value of tracklength k - keff_generation = global_tallies(K_TRACKLENGTH) % value - - end subroutine initialize_generation - -!=============================================================================== -! FINALIZE_GENERATION -!=============================================================================== - - subroutine finalize_generation() - - ! Update global tallies with the omp private accumulation variables -!$omp parallel -!$omp critical - global_tallies(K_TRACKLENGTH) % value = & - global_tallies(K_TRACKLENGTH) % value + global_tally_tracklength - global_tallies(K_COLLISION) % value = & - global_tallies(K_COLLISION) % value + global_tally_collision - global_tallies(LEAKAGE) % value = & - global_tallies(LEAKAGE) % value + global_tally_leakage - global_tallies(K_ABSORPTION) % value = & - global_tallies(K_ABSORPTION) % value + global_tally_absorption -!$omp end critical - - ! reset private tallies - global_tally_tracklength = ZERO - global_tally_collision = ZERO - global_tally_leakage = ZERO - global_tally_absorption = ZERO -!$omp end parallel - -#ifdef _OPENMP - ! Join the fission bank from each thread into one global fission bank - call join_bank_from_threads() -#endif - - ! Distribute fission bank across processors evenly - call time_bank % start() - call synchronize_bank() - call time_bank % stop() - - ! Calculate shannon entropy - if (entropy_on) call shannon_entropy() - - ! Collect results and statistics - call calculate_generation_keff() - call calculate_average_keff() - - ! Write generation output - if (master .and. current_gen /= gen_per_batch) call print_generation() - - end subroutine finalize_generation - -!=============================================================================== -! FINALIZE_BATCH handles synchronization and accumulation of tallies, -! calculation of Shannon entropy, getting single-batch estimate of keff, and -! turning on tallies when appropriate -!=============================================================================== - - subroutine finalize_batch() - - ! Collect tallies - call time_tallies % start() - call synchronize_tallies() - call time_tallies % stop() - - ! Reset global tally results - if (.not. active_batches) then - call reset_result(global_tallies) - n_realizations = 0 - end if - - ! Perform CMFD calculation if on - if (cmfd_on) call execute_cmfd() - - ! Display output - if (master) call print_batch_keff() - - ! Calculate combined estimate of k-effective - if (master) call calculate_combined_keff() - - ! Check_triggers - if (master) call check_triggers() -#ifdef MPI - call MPI_BCAST(satisfy_triggers, 1, MPI_LOGICAL, 0, & - MPI_COMM_WORLD, mpi_err) -#endif - if (satisfy_triggers .or. & - (trigger_on .and. current_batch == n_max_batches)) then - call statepoint_batch % add(current_batch) - end if - - ! Write out state point if it's been specified for this batch - if (statepoint_batch % contains(current_batch)) then - call write_state_point() - end if - - ! Write out source point if it's been specified for this batch - if ((sourcepoint_batch % contains(current_batch) .or. source_latest) .and. & - source_write) then - call write_source_point() - end if - - if (master .and. current_batch == n_max_batches) then - ! Make sure combined estimate of k-effective is calculated at the last - ! batch in case no state point is written - call calculate_combined_keff() - end if - - end subroutine finalize_batch - !=============================================================================== ! SYNCHRONIZE_BANK samples source sites from the fission sites that were ! accumulated during the generation. This routine is what allows this Monte @@ -832,37 +581,6 @@ contains end subroutine count_source_for_ufs -!=============================================================================== -! REPLAY_BATCH_HISTORY displays keff and entropy for each generation within a -! batch using data read from a state point file -!=============================================================================== - - subroutine replay_batch_history - - ! Write message at beginning - if (current_batch == 1) then - call write_message("Replaying history from state point...", 1) - end if - - do current_gen = 1, gen_per_batch - overall_gen = overall_gen + 1 - call calculate_average_keff() - - ! print out batch keff - if (current_gen < gen_per_batch) then - if (master) call print_generation() - else - if (master) call print_batch_keff() - end if - end do - - ! Write message at end - if (current_batch == restart_batch) then - call write_message("Resuming simulation...", 1) - end if - - end subroutine replay_batch_history - #ifdef _OPENMP !=============================================================================== ! JOIN_BANK_FROM_THREADS diff --git a/src/fixed_source.F90 b/src/fixed_source.F90 deleted file mode 100644 index c0397fe0b1..0000000000 --- a/src/fixed_source.F90 +++ /dev/null @@ -1,142 +0,0 @@ -module fixed_source - -#ifdef MPI - use message_passing -#endif - - use constants, only: ZERO, MAX_LINE_LEN - use global - use output, only: write_message, header - use particle_header, only: Particle - use random_lcg, only: set_particle_seed - use source, only: initialize_source, get_source_particle - use state_point, only: write_state_point - use string, only: to_str - use tally, only: synchronize_tallies, setup_active_usertallies - use trigger, only: check_triggers - use tracking, only: transport - - implicit none - -contains - - subroutine run_fixedsource() - - type(Particle) :: p - integer(8) :: i_work ! index over histories in single cycle - - if (.not. restart_run) call initialize_source() - - if (master) call header("FIXED SOURCE TRANSPORT SIMULATION", level=1) - - ! Turn timer and tallies on - tallies_on = .true. -!$omp parallel - call setup_active_usertallies() -!$omp end parallel - call time_active % start() - - ! ========================================================================== - ! LOOP OVER BATCHES - BATCH_LOOP: do current_batch = 1, n_max_batches - - ! In a restart run, skip any batches that have already been simulated - if (restart_run .and. current_batch <= restart_batch) then - if (current_batch > n_inactive) n_realizations = n_realizations + 1 - cycle BATCH_LOOP - end if - - call initialize_batch() - overall_gen = current_batch - - ! Start timer for transport - call time_transport % start() - - ! ======================================================================= - ! LOOP OVER PARTICLES -!$omp parallel do schedule(static) firstprivate(p) - PARTICLE_LOOP: do i_work = 1, work - current_work = i_work - - ! grab source particle from bank - call get_source_particle(p, current_work) - - ! transport particle - call transport(p) - - end do PARTICLE_LOOP -!$omp end parallel do - - ! Accumulate time for transport - call time_transport % stop() - - call finalize_batch() - - if (satisfy_triggers) exit BATCH_LOOP - - end do BATCH_LOOP - - call time_active % stop() - - ! ========================================================================== - ! END OF RUN WRAPUP - - if (master) call header("SIMULATION FINISHED", level=1) - - end subroutine run_fixedsource - -!=============================================================================== -! INITIALIZE_BATCH -!=============================================================================== - - subroutine initialize_batch() - - call write_message("Simulating batch " // trim(to_str(current_batch)) & - &// "...", 1) - - ! Reset total starting particle weight used for normalizing tallies - total_weight = ZERO - - end subroutine initialize_batch - -!=============================================================================== -! FINALIZE_BATCH -!=============================================================================== - - subroutine finalize_batch() - -! Update global tallies with the omp private accumulation variables -!$omp parallel -!$omp critical - global_tallies(LEAKAGE) % value = & - global_tallies(LEAKAGE) % value + global_tally_leakage -!$omp end critical - - ! reset private tallies - global_tally_leakage = ZERO -!$omp end parallel - - ! Collect and accumulate tallies - call time_tallies % start() - call synchronize_tallies() - call time_tallies % stop() - - ! Check_triggers - if (master) call check_triggers() -#ifdef MPI - call MPI_BCAST(satisfy_triggers, 1, MPI_LOGICAL, 0, & - MPI_COMM_WORLD, mpi_err) -#endif - if (satisfy_triggers .or. & - (trigger_on .and. current_batch == n_max_batches)) then - call statepoint_batch % add(current_batch) - end if - - ! Write out state point if it's been specified for this batch - if (statepoint_batch % contains(current_batch)) then - call write_state_point() - end if - - end subroutine finalize_batch - -end module fixed_source diff --git a/src/main.F90 b/src/main.F90 index e4a33f0096..aff1e21146 100644 --- a/src/main.F90 +++ b/src/main.F90 @@ -1,13 +1,12 @@ program main use constants - use eigenvalue, only: run_eigenvalue use finalize, only: finalize_run - use fixed_source, only: run_fixedsource use global use initialize, only: initialize_run use particle_restart, only: run_particle_restart use plot, only: run_plot + use simulation, only: run_simulation implicit none @@ -16,10 +15,8 @@ program main ! start problem based on mode select case (run_mode) - case (MODE_FIXEDSOURCE) - call run_fixedsource() - case (MODE_EIGENVALUE) - call run_eigenvalue() + case (MODE_FIXEDSOURCE, MODE_EIGENVALUE) + call run_simulation() case (MODE_PLOTTING) call run_plot() case (MODE_PARTICLE) diff --git a/src/simulation.F90 b/src/simulation.F90 new file mode 100644 index 0000000000..64459f3fd7 --- /dev/null +++ b/src/simulation.F90 @@ -0,0 +1,325 @@ +module simulation + +#ifdef MPI + use mpi +#endif + + use cmfd_execute, only: cmfd_init_batch, execute_cmfd + use constants, only: ZERO + use eigenvalue, only: count_source_for_ufs, calculate_average_keff, & + calculate_combined_keff, calculate_generation_keff, & + shannon_entropy, synchronize_bank, keff_generation +#ifdef _OPENMP + use eigenvalue, only: join_bank_from_threads +#endif + use global + use output, only: write_message, header, print_columns, & + print_batch_keff, print_generation + use particle_header, only: Particle + use source, only: get_source_particle, initialize_source + use state_point, only: write_state_point, write_source_point + use string, only: to_str + use tally, only: synchronize_tallies, setup_active_usertallies, & + reset_result + use trigger, only: check_triggers + use tracking, only: transport + + implicit none + private + public :: run_simulation + +contains + +!=============================================================================== +! RUN_EIGENVALUE encompasses all the main logic where iterations are performed +! over the batches, generations, and histories in a k-eigenvalue calculation. +!=============================================================================== + + subroutine run_simulation() + + type(Particle) :: p + integer(8) :: i_work + + if (.not. restart_run) call initialize_source() + + ! Display header + if (master) then + if (run_mode == MODE_FIXEDSOURCE) then + call header("FIXED SOURCE TRANSPORT SIMULATION", level=1) + elseif (run_mode == MODE_EIGENVALUE) then + call header("K EIGENVALUE SIMULATION", level=1) + call print_columns() + end if + end if + + ! Turn on inactive timer + call time_inactive % start() + + ! ========================================================================== + ! LOOP OVER BATCHES + BATCH_LOOP: do current_batch = 1, n_max_batches + + call initialize_batch() + + ! Handle restart runs + if (restart_run .and. current_batch <= restart_batch) then + call replay_batch_history() + cycle BATCH_LOOP + end if + + ! ======================================================================= + ! LOOP OVER GENERATIONS + GENERATION_LOOP: do current_gen = 1, gen_per_batch + + call initialize_generation() + + ! Start timer for transport + call time_transport % start() + + ! ==================================================================== + ! LOOP OVER PARTICLES +!$omp parallel do schedule(static) firstprivate(p) + PARTICLE_LOOP: do i_work = 1, work + current_work = i_work + + ! grab source particle from bank + call get_source_particle(p, current_work) + + ! transport particle + call transport(p) + + end do PARTICLE_LOOP +!$omp end parallel do + + ! Accumulate time for transport + call time_transport % stop() + + call finalize_generation() + + end do GENERATION_LOOP + + call finalize_batch() + + if (satisfy_triggers) exit BATCH_LOOP + + end do BATCH_LOOP + + call time_active % stop() + + ! ========================================================================== + ! END OF RUN WRAPUP + + if (master) call header("SIMULATION FINISHED", level=1) + + ! Clear particle + call p % clear() + + end subroutine run_simulation + +!=============================================================================== +! INITIALIZE_BATCH +!=============================================================================== + + subroutine initialize_batch() + + if (run_mode == MODE_FIXEDSOURCE) then + call write_message("Simulating batch " // trim(to_str(current_batch)) & + // "...", 1) + end if + + ! Reset total starting particle weight used for normalizing tallies + total_weight = ZERO + + if (current_batch == n_inactive + 1) then + ! Switch from inactive batch timer to active batch timer + call time_inactive % stop() + call time_active % start() + + ! Enable active batches (and tallies_on if it hasn't been enabled) + active_batches = .true. + tallies_on = .true. + + ! Add user tallies to active tallies list +!$omp parallel + call setup_active_usertallies() +!$omp end parallel + end if + + ! check CMFD initialize batch + if (run_mode == MODE_EIGENVALUE) then + if (cmfd_run) call cmfd_init_batch() + end if + + end subroutine initialize_batch + +!=============================================================================== +! INITIALIZE_GENERATION +!=============================================================================== + + subroutine initialize_generation() + + ! set overall generation number + overall_gen = gen_per_batch*(current_batch - 1) + current_gen + + if (run_mode == MODE_EIGENVALUE) then + ! Reset number of fission bank sites + n_bank = 0 + + ! Count source sites if using uniform fission source weighting + if (ufs) call count_source_for_ufs() + + ! Store current value of tracklength k + keff_generation = global_tallies(K_TRACKLENGTH) % value + end if + + end subroutine initialize_generation + +!=============================================================================== +! FINALIZE_GENERATION +!=============================================================================== + + subroutine finalize_generation() + + ! Update global tallies with the omp private accumulation variables +!$omp parallel +!$omp critical + if (run_mode == MODE_EIGENVALUE) then + global_tallies(K_COLLISION) % value = & + global_tallies(K_COLLISION) % value + global_tally_collision + global_tallies(K_ABSORPTION) % value = & + global_tallies(K_ABSORPTION) % value + global_tally_absorption + global_tallies(K_TRACKLENGTH) % value = & + global_tallies(K_TRACKLENGTH) % value + global_tally_tracklength + end if + global_tallies(LEAKAGE) % value = & + global_tallies(LEAKAGE) % value + global_tally_leakage +!$omp end critical + + ! reset private tallies + if (run_mode == MODE_EIGENVALUE) then + global_tally_collision = 0 + global_tally_absorption = 0 + global_tally_tracklength = 0 + end if + global_tally_leakage = 0 +!$omp end parallel + + if (run_mode == MODE_EIGENVALUE) then +#ifdef _OPENMP + ! Join the fission bank from each thread into one global fission bank + call join_bank_from_threads() +#endif + + ! Distribute fission bank across processors evenly + call time_bank % start() + call synchronize_bank() + call time_bank % stop() + + ! Calculate shannon entropy + if (entropy_on) call shannon_entropy() + + ! Collect results and statistics + call calculate_generation_keff() + call calculate_average_keff() + + ! Write generation output + if (master .and. current_gen /= gen_per_batch) call print_generation() + end if + + end subroutine finalize_generation + +!=============================================================================== +! FINALIZE_BATCH handles synchronization and accumulation of tallies, +! calculation of Shannon entropy, getting single-batch estimate of keff, and +! turning on tallies when appropriate +!=============================================================================== + + subroutine finalize_batch() + + ! Collect tallies + call time_tallies % start() + call synchronize_tallies() + call time_tallies % stop() + + ! Reset global tally results + if (.not. active_batches) then + call reset_result(global_tallies) + n_realizations = 0 + end if + + if (run_mode == MODE_EIGENVALUE) then + ! Perform CMFD calculation if on + if (cmfd_on) call execute_cmfd() + + ! Display output + if (master) call print_batch_keff() + + ! Calculate combined estimate of k-effective + if (master) call calculate_combined_keff() + end if + + ! Check_triggers + if (master) call check_triggers() +#ifdef MPI + call MPI_BCAST(satisfy_triggers, 1, MPI_LOGICAL, 0, & + MPI_COMM_WORLD, mpi_err) +#endif + if (satisfy_triggers .or. & + (trigger_on .and. current_batch == n_max_batches)) then + call statepoint_batch % add(current_batch) + end if + + ! Write out state point if it's been specified for this batch + if (statepoint_batch % contains(current_batch)) then + call write_state_point() + end if + + ! Write out source point if it's been specified for this batch + if ((sourcepoint_batch % contains(current_batch) .or. source_latest) .and. & + source_write) then + call write_source_point() + end if + + if (master .and. current_batch == n_max_batches .and. & + run_mode == MODE_EIGENVALUE) then + ! Make sure combined estimate of k-effective is calculated at the last + ! batch in case no state point is written + call calculate_combined_keff() + end if + + end subroutine finalize_batch + +!=============================================================================== +! REPLAY_BATCH_HISTORY displays keff and entropy for each generation within a +! batch using data read from a state point file +!=============================================================================== + + subroutine replay_batch_history + + ! Write message at beginning + if (current_batch == 1) then + call write_message("Replaying history from state point...", 1) + end if + + if (run_mode == MODE_EIGENVALUE) then + do current_gen = 1, gen_per_batch + overall_gen = overall_gen + 1 + call calculate_average_keff() + + ! print out batch keff + if (current_gen < gen_per_batch) then + if (master) call print_generation() + else + if (master) call print_batch_keff() + end if + end do + end if + + ! Write message at end + if (current_batch == restart_batch) then + call write_message("Resuming simulation...", 1) + end if + + end subroutine replay_batch_history + +end module simulation diff --git a/tests/test_particle_restart_fixed/results_true.dat b/tests/test_particle_restart_fixed/results_true.dat index 81aed707cf..701c3e1333 100644 --- a/tests/test_particle_restart_fixed/results_true.dat +++ b/tests/test_particle_restart_fixed/results_true.dat @@ -1,7 +1,7 @@ current batch: 7.000000E+00 current gen: -0.000000E+00 +1.000000E+00 particle id: 9.280000E+02 run mode: From 6791b43b2b71fc3f7e666e841555726e46b3f4ff Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 2 Jul 2015 20:10:41 +0700 Subject: [PATCH 088/101] Don't show eigenvalue-related timing information for fixed source runs --- src/output.F90 | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/output.F90 b/src/output.F90 index 939451c6fb..d1d4ec72aa 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1547,11 +1547,15 @@ contains write(ou,100) "Total time in simulation", time_inactive % elapsed + & time_active % elapsed write(ou,100) " Time in transport only", time_transport % elapsed - write(ou,100) " Time in inactive batches", time_inactive % elapsed + if (run_mode == MODE_EIGENVALUE) then + write(ou,100) " Time in inactive batches", time_inactive % elapsed + end if write(ou,100) " Time in active batches", time_active % elapsed - write(ou,100) " Time synchronizing fission bank", time_bank % elapsed - write(ou,100) " Sampling source sites", time_bank_sample % elapsed - write(ou,100) " SEND/RECV source sites", time_bank_sendrecv % elapsed + if (run_mode == MODE_EIGENVALUE) then + write(ou,100) " Time synchronizing fission bank", time_bank % elapsed + write(ou,100) " Sampling source sites", time_bank_sample % elapsed + write(ou,100) " SEND/RECV source sites", time_bank_sendrecv % elapsed + end if write(ou,100) " Time accumulating tallies", time_tallies % elapsed if (cmfd_run) write(ou,100) " Time in CMFD", time_cmfd % elapsed if (cmfd_run) write(ou,100) " Building matrices", & From 68dcbab15f073a05693a01b7885bfdf6d445b035 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 15 Jul 2015 14:35:30 +0200 Subject: [PATCH 089/101] Implement secondary particle bank capability --- src/constants.F90 | 3 ++ src/particle_header.F90 | 32 ++++++++++++++++++- src/simulation.F90 | 49 +++++++++++++++++++++++++++-- src/source.F90 | 70 ----------------------------------------- src/tracking.F90 | 39 +++++++++++++---------- 5 files changed, 104 insertions(+), 89 deletions(-) diff --git a/src/constants.F90 b/src/constants.F90 index 3aaf08f0eb..38bedf0224 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -44,6 +44,9 @@ module constants integer, parameter :: MAX_EVENTS = 10000 integer, parameter :: MAX_SAMPLE = 100000 + ! Maximum number of secondary particles created + integer, parameter :: MAX_SECONDARY = 1000 + ! Maximum number of words in a single line, length of line, and length of ! single word integer, parameter :: MAX_WORDS = 500 diff --git a/src/particle_header.F90 b/src/particle_header.F90 index 7c2586c3e2..ba712b1d30 100644 --- a/src/particle_header.F90 +++ b/src/particle_header.F90 @@ -1,6 +1,7 @@ module particle_header - use constants, only: NEUTRON, ONE, NONE, ZERO + use bank_header, only: Bank + use constants, only: NEUTRON, ONE, NONE, ZERO, MAX_SECONDARY use geometry_header, only: BASE_UNIVERSE implicit none @@ -79,9 +80,14 @@ module particle_header ! Track output logical :: write_track = .false. + ! Secondary particles created + integer :: n_secondary = 0 + type(Bank) :: secondary_bank(MAX_SECONDARY) + contains procedure :: initialize => initialize_particle procedure :: clear => clear_particle + procedure :: initialize_from_source => initialize_from_source end type Particle contains @@ -114,6 +120,7 @@ contains this % wgt_bank = ZERO this % n_collision = 0 this % fission = .false. + this % n_secondary = 0 ! Set up base level coordinates this % coord(1) % universe = BASE_UNIVERSE @@ -154,4 +161,27 @@ contains end subroutine reset_coord +!=============================================================================== +! INITIALIZE_FROM_SOURCE +!=============================================================================== + + subroutine initialize_from_source(this, src) + class(Particle), intent(inout) :: this + type(Bank), intent(in) :: src + + ! set defaults + call this % initialize() + + ! copy attributes from source bank site + this % wgt = src % wgt + this % last_wgt = src % wgt + this % coord(1) % xyz = src % xyz + this % coord(1) % uvw = src % uvw + this % last_xyz = src % xyz + this % last_uvw = src % uvw + this % E = src % E + this % last_E = src % E + + end subroutine initialize_from_source + end module particle_header diff --git a/src/simulation.F90 b/src/simulation.F90 index 64459f3fd7..ab9b422480 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -16,7 +16,8 @@ module simulation use output, only: write_message, header, print_columns, & print_batch_keff, print_generation use particle_header, only: Particle - use source, only: get_source_particle, initialize_source + use random_lcg, only: set_particle_seed + use source, only: initialize_source use state_point, only: write_state_point, write_source_point use string, only: to_str use tally, only: synchronize_tallies, setup_active_usertallies, & @@ -83,7 +84,7 @@ contains current_work = i_work ! grab source particle from bank - call get_source_particle(p, current_work) + call initialize_history(p, current_work) ! transport particle call transport(p) @@ -116,6 +117,50 @@ contains end subroutine run_simulation +!=============================================================================== +! INITIALIZE_HISTORY +!=============================================================================== + + subroutine initialize_history(p, index_source) + + type(Particle), intent(inout) :: p + integer(8), intent(in) :: index_source + + integer(8) :: particle_seed ! unique index for particle + integer :: i + + ! set defaults + call p % initialize_from_source(source_bank(index_source)) + + ! set identifier for particle + p % id = work_index(rank) + index_source + + ! set random number seed + particle_seed = (overall_gen - 1)*n_particles + p % id + call set_particle_seed(particle_seed) + + ! set particle trace + trace = .false. + if (current_batch == trace_batch .and. current_gen == trace_gen .and. & + p % id == trace_particle) trace = .true. + + ! Set particle track. + p % write_track = .false. + if (write_all_tracks) then + p % write_track = .true. + else if (allocated(track_identifiers)) then + do i=1, size(track_identifiers(1,:)) + if (current_batch == track_identifiers(1,i) .and. & + ¤t_gen == track_identifiers(2,i) .and. & + &p % id == track_identifiers(3,i)) then + p % write_track = .true. + exit + end if + end do + end if + + end subroutine initialize_history + !=============================================================================== ! INITIALIZE_BATCH !=============================================================================== diff --git a/src/source.F90 b/src/source.F90 index 04b5ac760f..32be6069cd 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -245,74 +245,4 @@ contains end subroutine sample_external_source -!=============================================================================== -! GET_SOURCE_PARTICLE returns the next source particle -!=============================================================================== - - subroutine get_source_particle(p, index_source) - - type(Particle), intent(inout) :: p - integer(8), intent(in) :: index_source - - integer(8) :: particle_seed ! unique index for particle - integer :: i - type(Bank), pointer :: src - - ! set defaults - call p % initialize() - - ! Copy attributes from source to particle - src => source_bank(index_source) - call copy_source_attributes(p, src) - - ! set identifier for particle - p % id = work_index(rank) + index_source - - ! set random number seed - particle_seed = (overall_gen - 1)*n_particles + p % id - call set_particle_seed(particle_seed) - - ! set particle trace - trace = .false. - if (current_batch == trace_batch .and. current_gen == trace_gen .and. & - p % id == trace_particle) trace = .true. - - ! Set particle track. - p % write_track = .false. - if (write_all_tracks) then - p % write_track = .true. - else if (allocated(track_identifiers)) then - do i=1, size(track_identifiers(1,:)) - if (current_batch == track_identifiers(1,i) .and. & - ¤t_gen == track_identifiers(2,i) .and. & - &p % id == track_identifiers(3,i)) then - p % write_track = .true. - exit - end if - end do - end if - - end subroutine get_source_particle - -!=============================================================================== -! COPY_SOURCE_ATTRIBUTES -!=============================================================================== - - subroutine copy_source_attributes(p, src) - - type(Particle), intent(inout) :: p - type(Bank), pointer :: src - - ! copy attributes from source bank site - p % wgt = src % wgt - p % last_wgt = src % wgt - p % coord(1) % xyz = src % xyz - p % coord(1) % uvw = src % uvw - p % last_xyz = src % xyz - p % last_uvw = src % uvw - p % E = src % E - p % last_E = src % E - - end subroutine copy_source_attributes - end module source diff --git a/src/tracking.F90 b/src/tracking.F90 index e5faeb209d..ba452a0141 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -45,20 +45,6 @@ contains call write_message("Simulating Particle " // trim(to_str(p % id))) end if - ! If the cell hasn't been determined based on the particle's location, - ! initiate a search for the current cell - if (p % coord(p % n_coord) % cell == NONE) then - call find_cell(p, found_cell) - - ! Particle couldn't be located - if (.not. found_cell) then - call fatal_error("Could not locate particle " // trim(to_str(p % id))) - end if - - ! set birth cell attribute - p % cell_born = p % coord(p % n_coord) % cell - end if - ! Initialize number of events to zero n_event = 0 @@ -74,7 +60,19 @@ contains call initialize_particle_track() endif - do while (p % alive) + EVENT_LOOP: do + ! If the cell hasn't been determined based on the particle's location, + ! initiate a search for the current cell. This generally happens at the + ! beginning of the history and again for any secondary particles + if (p % coord(p % n_coord) % cell == NONE) then + call find_cell(p, found_cell) + if (.not. found_cell) then + call fatal_error("Could not locate particle " // trim(to_str(p % id))) + end if + + ! set birth cell attribute + if (p % cell_born == NONE) p % cell_born = p % coord(p % n_coord) % cell + end if ! Write particle track. if (p % write_track) call write_particle_track(p) @@ -197,7 +195,16 @@ contains p % alive = .false. end if - end do + ! Check for secondary particles if this particle is dead + if (.not. p % alive) then + if (p % n_secondary > 0) then + call p % initialize_from_source(p % secondary_bank(p % n_secondary)) + p % n_secondary = p % n_secondary - 1 + else + exit EVENT_LOOP + end if + end if + end do EVENT_LOOP ! Finish particle track output. if (p % write_track) then From 3da9bcf32573a263ebca81eb1b0f86e3ddb255f3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 16 Jul 2015 10:56:21 +0200 Subject: [PATCH 090/101] Create secondary neutrons for inelastic reactions with integral multiplicity. --- src/particle_header.F90 | 24 ++++++++++++++++++++-- src/physics.F90 | 44 ++++++++++++++++++++++------------------- 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/particle_header.F90 b/src/particle_header.F90 index ba712b1d30..9164845e80 100644 --- a/src/particle_header.F90 +++ b/src/particle_header.F90 @@ -87,7 +87,8 @@ module particle_header contains procedure :: initialize => initialize_particle procedure :: clear => clear_particle - procedure :: initialize_from_source => initialize_from_source + procedure :: initialize_from_source + procedure :: create_secondary end type Particle contains @@ -120,7 +121,6 @@ contains this % wgt_bank = ZERO this % n_collision = 0 this % fission = .false. - this % n_secondary = 0 ! Set up base level coordinates this % coord(1) % universe = BASE_UNIVERSE @@ -184,4 +184,24 @@ contains end subroutine initialize_from_source +!=============================================================================== +! CREATE_SECONDARY +!=============================================================================== + + subroutine create_secondary(this, uvw, type) + class(Particle), intent(inout) :: this + real(8), intent(in) :: uvw(3) + integer, intent(in) :: type + + integer :: n + + n = this % n_secondary + 1 + this % secondary_bank(n) % wgt = this % wgt + this % secondary_bank(n) % xyz(:) = this % coord(1) % xyz + this % secondary_bank(n) % uvw(:) = uvw + this % secondary_bank(n) % E = this % E + this % n_secondary = n + + end subroutine create_secondary + end module particle_header diff --git a/src/physics.F90 b/src/physics.F90 index 9ca59a9872..11bc3720fe 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -382,8 +382,7 @@ contains end do ! Perform collision physics for inelastic scattering - call inelastic_scatter(nuc, rxn, p % E, p % coord(1) % uvw, & - p % mu, p % wgt) + call inelastic_scatter(nuc, rxn, p) p % event_MT = rxn % MT end if @@ -1268,24 +1267,23 @@ contains ! than fission), i.e. level scattering, (n,np), (n,na), etc. !=============================================================================== - subroutine inelastic_scatter(nuc, rxn, E, uvw, mu, wgt) + subroutine inelastic_scatter(nuc, rxn, p) + type(Nuclide), pointer :: nuc + type(Reaction), pointer :: rxn + type(Particle), intent(inout) :: p - type(Nuclide), pointer :: nuc - type(Reaction), pointer :: rxn - real(8), intent(inout) :: E ! energy in lab (incoming/outgoing) - real(8), intent(inout) :: uvw(3) ! directional cosines - real(8), intent(out) :: mu ! cosine of scattering angle in lab - real(8), intent(inout) :: wgt ! particle weight - - integer :: law ! secondary energy distribution law - real(8) :: A ! atomic weight ratio of nuclide - real(8) :: E_in ! incoming energy - real(8) :: E_cm ! outgoing energy in center-of-mass - real(8) :: Q ! Q-value of reaction - real(8) :: yield ! neutron yield + integer :: i ! loop index + integer :: law ! secondary energy distribution law + real(8) :: E ! energy in lab (incoming/outgoing) + real(8) :: mu ! cosine of scattering angle in lab + real(8) :: A ! atomic weight ratio of nuclide + real(8) :: E_in ! incoming energy + real(8) :: E_cm ! outgoing energy in center-of-mass + real(8) :: Q ! Q-value of reaction + real(8) :: yield ! neutron yield ! copy energy of neutron - E_in = E + E_in = p % E ! determine A and Q A = nuc % awr @@ -1319,16 +1317,22 @@ contains mu = mu * sqrt(E_cm/E) + ONE/(A+ONE) * sqrt(E_in/E) end if + ! Set outgoing energy and scattering angle + p % E = E + p % mu = mu + ! change direction of particle - uvw = rotate_angle(uvw, mu) + p % coord(1) % uvw = rotate_angle(p % coord(1) % uvw, mu) ! change weight of particle based on yield if (rxn % multiplicity_with_E) then yield = interpolate_tab1(rxn % multiplicity_E, E_in) + p % wgt = yield * p % wgt else - yield = rxn % multiplicity + do i = 1, rxn % multiplicity - 1 + call p % create_secondary(p % coord(1) % uvw, NEUTRON) + end do end if - wgt = yield * wgt end subroutine inelastic_scatter From 23481c64384d147388afe684a4d8c269364823e1 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 16 Jul 2015 22:05:41 +0400 Subject: [PATCH 091/101] Update test results since modeling (n,xn) as secondary particles changes answers --- CMakeLists.txt | 4 +- tests/test_basic/results_true.dat | 2 +- tests/test_cmfd_feed/results_true.dat | 500 +- tests/test_cmfd_nofeed/results_true.dat | 502 +- tests/test_density_atombcm/results_true.dat | 2 +- tests/test_density_atomcm3/results_true.dat | 2 +- tests/test_density_kgm3/results_true.dat | 2 +- tests/test_density_sum/results_true.dat | 2 +- .../results_true.dat | 2 +- .../results_true.dat | 2 +- tests/test_energy_grid/results_true.dat | 2 +- tests/test_entropy/results_true.dat | 16 +- tests/test_filter_cell/results_true.dat | 14 +- tests/test_filter_cellborn/results_true.dat | 6 +- tests/test_filter_energy/results_true.dat | 18 +- tests/test_filter_energyout/results_true.dat | 18 +- .../results_true.dat | 66 +- tests/test_filter_material/results_true.dat | 18 +- tests/test_filter_mesh_2d/results_true.dat | 590 +-- tests/test_filter_mesh_3d/results_true.dat | 1634 +++---- tests/test_filter_universe/results_true.dat | 18 +- tests/test_infinite_cell/results_true.dat | 2 +- tests/test_lattice_mixed/results_true.dat | 2 +- tests/test_lattice_multiple/results_true.dat | 2 +- tests/test_many_scores/results_true.dat | 214 +- tests/test_natural_element/results_true.dat | 2 +- tests/test_output/results_true.dat | 2 +- .../results_true.dat | 10 +- .../test_particle_restart_eigval.py | 2 +- tests/test_ptables_off/results_true.dat | 2 +- tests/test_reflective_cone/results_true.dat | 2 +- .../test_reflective_cylinder/results_true.dat | 2 +- tests/test_reflective_plane/results_true.dat | 2 +- tests/test_reflective_sphere/results_true.dat | 2 +- .../results_true.dat | 2 +- tests/test_rotation/results_true.dat | 2 +- tests/test_salphabeta/results_true.dat | 2 +- .../test_salphabeta_multiple/results_true.dat | 2 +- tests/test_score_MT/results_true.dat | 42 +- tests/test_score_absorption/results_true.dat | 22 +- tests/test_score_current/results_true.dat | 2 +- tests/test_score_events/results_true.dat | 18 +- tests/test_score_fission/results_true.dat | 18 +- tests/test_score_flux/results_true.dat | 26 +- tests/test_score_flux_yn/results_true.dat | 890 ++-- .../test_score_kappafission/results_true.dat | 10 +- tests/test_score_nufission/results_true.dat | 10 +- tests/test_score_nuscatter/results_true.dat | 14 +- tests/test_score_nuscatter_n/results_true.dat | 62 +- .../test_score_nuscatter_pn/results_true.dat | 42 +- .../test_score_nuscatter_yn/results_true.dat | 70 +- tests/test_score_scatter/results_true.dat | 14 +- tests/test_score_scatter_n/results_true.dat | 62 +- tests/test_score_scatter_pn/results_true.dat | 42 +- tests/test_score_scatter_yn/results_true.dat | 106 +- tests/test_score_total/results_true.dat | 14 +- tests/test_score_total_yn/results_true.dat | 414 +- tests/test_seed/results_true.dat | 2 +- tests/test_source_angle_mono/results_true.dat | 2 +- .../results_true.dat | 2 +- .../test_source_energy_mono/results_true.dat | 2 +- tests/test_source_file/results_true.dat | 2 +- tests/test_source_point/results_true.dat | 2 +- .../test_sourcepoint_latest/results_true.dat | 2 +- .../test_sourcepoint_restart/results_true.dat | 3960 ++++++++-------- tests/test_statepoint_batch/results_true.dat | 2 +- .../test_statepoint_interval/results_true.dat | 2 +- .../test_statepoint_restart/results_true.dat | 4208 ++++++++--------- .../results_true.dat | 2 +- tests/test_survival_biasing/results_true.dat | 2 +- tests/test_tally_assumesep/results_true.dat | 14 +- tests/test_trace/results_true.dat | 2 +- tests/test_translation/results_true.dat | 2 +- .../results_true.dat | 50 +- .../test_trigger_batch_interval/settings.xml | 6 +- .../test_trigger_batch_interval.py | 2 +- .../results_true.dat | 50 +- .../settings.xml | 6 +- .../test_trigger_no_batch_interval.py | 2 +- tests/test_trigger_no_status/results_true.dat | 50 +- tests/test_trigger_tallies/results_true.dat | 50 +- tests/test_trigger_tallies/settings.xml | 4 +- tests/test_uniform_fs/results_true.dat | 2 +- .../test_union_energy_grids/results_true.dat | 2 +- tests/test_universe/results_true.dat | 2 +- tests/test_void/results_true.dat | 2 +- 86 files changed, 6994 insertions(+), 6994 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b6bafd5469..fd122a14ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -315,7 +315,7 @@ foreach(test ${TESTS}) elseif(${test} MATCHES "test_sourcepoint_restart") set(RESTART_FILE statepoint.07.h5 source.07.h5) elseif(${test} MATCHES "test_particle_restart_eigval") - set(RESTART_FILE particle_12_616.h5) + set(RESTART_FILE particle_9_555.h5) elseif(${test} MATCHES "test_particle_restart_fixed") set(RESTART_FILE particle_7_928.h5) else(${test} MATCHES "test_statepoint_restart") @@ -330,7 +330,7 @@ foreach(test ${TESTS}) elseif(${test} MATCHES "test_sourcepoint_restart") set(RESTART_FILE statepoint.07.binary source.07.binary) elseif(${test} MATCHES "test_particle_restart_eigval") - set(RESTART_FILE particle_12_616.binary) + set(RESTART_FILE particle_9_555.binary) elseif(${test} MATCHES "test_particle_restart_fixed") set(RESTART_FILE particle_7_6144.binary) else(${test} MATCHES "test_statepoint_restart") diff --git a/tests/test_basic/results_true.dat b/tests/test_basic/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_basic/results_true.dat +++ b/tests/test_basic/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_cmfd_feed/results_true.dat b/tests/test_cmfd_feed/results_true.dat index a1dd0d815e..26380d403f 100644 --- a/tests/test_cmfd_feed/results_true.dat +++ b/tests/test_cmfd_feed/results_true.dat @@ -1,128 +1,128 @@ k-combined: -1.177396E+00 4.883437E-03 +1.172666E+00 8.502438E-03 tally 1: -1.107335E+01 -1.235221E+01 -2.002676E+01 -4.017045E+01 -2.844184E+01 -8.111731E+01 -3.428492E+01 -1.177848E+02 -3.735839E+01 -1.397523E+02 -3.894180E+01 -1.517824E+02 -3.528006E+01 -1.246308E+02 -2.863448E+01 -8.222321E+01 -2.125384E+01 -4.535192E+01 -1.112124E+01 -1.241089E+01 +1.170812E+01 +1.376785E+01 +2.179886E+01 +4.765478E+01 +2.945614E+01 +8.709999E+01 +3.527293E+01 +1.245879E+02 +3.829349E+01 +1.470691E+02 +3.709040E+01 +1.379455E+02 +3.380335E+01 +1.145311E+02 +2.801351E+01 +7.871047E+01 +2.029625E+01 +4.131602E+01 +1.084302E+01 +1.180329E+01 tally 2: -2.243113E+01 -2.535057E+01 -1.557550E+01 -1.222813E+01 -2.164704E+00 -2.389690E-01 -4.049814E+01 -8.218116E+01 -2.854669E+01 -4.085264E+01 -3.934452E+00 -7.833208E-01 -5.706024E+01 -1.633739E+02 -4.049737E+01 -8.234850E+01 -5.231368E+00 -1.386110E+00 -6.798682E+01 -2.320807E+02 -4.819178E+01 -1.166820E+02 -6.247056E+00 -1.968990E+00 -7.449317E+01 -2.782374E+02 -5.315156E+01 -1.417287E+02 -6.667584E+00 -2.250879E+00 -7.530107E+01 -2.849330E+02 -5.378916E+01 -1.454619E+02 -7.071012E+00 -2.522919E+00 -6.820303E+01 -2.335083E+02 -4.850330E+01 -1.181013E+02 -6.241747E+00 -1.973368E+00 -5.831373E+01 -1.704779E+02 -4.149124E+01 -8.633656E+01 -5.385636E+00 -1.468642E+00 -4.184350E+01 -8.792430E+01 -2.971699E+01 -4.435896E+01 -3.784806E+00 -7.343249E-01 -2.202673E+01 -2.444732E+01 -1.531988E+01 -1.183160E+01 -2.073873E+00 -2.272561E-01 +2.270565E+01 +2.599927E+01 +1.590852E+01 +1.276260E+01 +2.252857E+00 +2.614120E-01 +4.313167E+01 +9.326539E+01 +3.044479E+01 +4.648169E+01 +4.023051E+00 +8.172006E-01 +5.859113E+01 +1.725665E+02 +4.171599E+01 +8.755981E+01 +5.512216E+00 +1.531207E+00 +6.892516E+01 +2.383198E+02 +4.904413E+01 +1.207096E+02 +6.542718E+00 +2.155749E+00 +7.421495E+01 +2.764539E+02 +5.288881E+01 +1.405388E+02 +6.811354E+00 +2.358827E+00 +7.278191E+01 +2.661597E+02 +5.169924E+01 +1.343999E+02 +6.516967E+00 +2.148745E+00 +6.655238E+01 +2.222812E+02 +4.729758E+01 +1.123214E+02 +6.102046E+00 +1.890147E+00 +5.708495E+01 +1.636585E+02 +4.068603E+01 +8.317681E+01 +5.394757E+00 +1.465413E+00 +4.136562E+01 +8.598520E+01 +2.958591E+01 +4.402226E+01 +3.765802E+00 +7.200302E-01 +2.275517E+01 +2.614738E+01 +1.589295E+01 +1.276624E+01 +2.232715E+00 +2.558645E-01 tally 3: -1.500439E+01 -1.135466E+01 -9.942586E-01 -5.051831E-02 -2.744453E+01 -3.776958E+01 -1.781992E+00 -1.612021E-01 -3.901013E+01 -7.642401E+01 -2.472924E+00 -3.077607E-01 -4.642527E+01 -1.082730E+02 -2.924369E+00 -4.335819E-01 -5.109083E+01 -1.309660E+02 -3.325865E+00 -5.592642E-01 -5.182512E+01 -1.350762E+02 -3.259912E+00 -5.350517E-01 -4.672480E+01 -1.095974E+02 -3.097309E+00 -4.854729E-01 -3.997405E+01 -8.014326E+01 -2.589176E+00 -3.374615E-01 -2.861624E+01 -4.114210E+01 -1.806237E+00 -1.656944E-01 -1.474531E+01 -1.096355E+01 -9.807860E-01 -4.934364E-02 +1.529144E+01 +1.179942E+01 +1.023883E+00 +5.386625E-02 +2.936854E+01 +4.326483E+01 +1.881629E+00 +1.788063E-01 +4.015056E+01 +8.114284E+01 +2.594958E+00 +3.407980E-01 +4.720593E+01 +1.118311E+02 +3.161769E+00 +5.053887E-01 +5.095790E+01 +1.304930E+02 +3.308202E+00 +5.528151E-01 +4.979520E+01 +1.246892E+02 +3.163884E+00 +5.062497E-01 +4.554330E+01 +1.041770E+02 +3.019145E+00 +4.618487E-01 +3.921119E+01 +7.727273E+01 +2.472070E+00 +3.099171E-01 +2.843166E+01 +4.067093E+01 +1.823607E+00 +1.688171E-01 +1.530477E+01 +1.184246E+01 +1.047996E+00 +5.549017E-02 tally 4: 0.000000E+00 0.000000E+00 @@ -160,8 +160,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.050887E+00 -4.698799E-01 +3.111592E+00 +4.883699E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -208,10 +208,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.388951E+00 -1.456464E+00 -2.664528E+00 -3.577345E-01 +5.536088E+00 +1.540676E+00 +2.727975E+00 +3.757452E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -256,10 +256,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.165280E+00 -2.573230E+00 -4.930263E+00 -1.218988E+00 +7.518115E+00 +2.840502E+00 +5.271874E+00 +1.398895E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -304,10 +304,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -8.550278E+00 -3.668687E+00 -6.985934E+00 -2.450395E+00 +8.764240E+00 +3.855378E+00 +7.176540E+00 +2.591613E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -352,10 +352,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -9.236725E+00 -4.281659E+00 -8.429932E+00 -3.565265E+00 +9.381092E+00 +4.414024E+00 +8.597689E+00 +3.710217E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -400,10 +400,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -9.396613E+00 -4.431004E+00 -9.307625E+00 -4.351276E+00 +9.158655E+00 +4.215178E+00 +9.188880E+00 +4.244766E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -448,10 +448,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -8.721885E+00 -3.821463E+00 -9.438995E+00 -4.479948E+00 +8.362511E+00 +3.509173E+00 +9.159213E+00 +4.209143E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -496,10 +496,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.096946E+00 -2.525113E+00 -8.605114E+00 -3.710134E+00 +7.029505E+00 +2.479106E+00 +8.613258E+00 +3.719199E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -544,10 +544,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.222832E+00 -1.373166E+00 -7.480684E+00 -2.804650E+00 +5.119892E+00 +1.320586E+00 +7.401001E+00 +2.749355E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -592,10 +592,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.726690E+00 -3.773397E-01 -5.470375E+00 -1.504111E+00 +2.765680E+00 +3.903229E-01 +5.461998E+00 +1.501206E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -642,8 +642,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.026290E+00 -4.597502E-01 +3.044921E+00 +4.656739E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -662,114 +662,114 @@ k cmfd 0.000000E+00 0.000000E+00 0.000000E+00 -1.150583E+00 -1.159578E+00 -1.162798E+00 -1.171003E+00 -1.162732E+00 -1.165591E+00 -1.166032E+00 -1.165387E+00 -1.165451E+00 -1.170726E+00 -1.170820E+00 -1.167945E+00 -1.166050E+00 -1.165757E+00 -1.167631E+00 -1.168366E+00 +1.177990E+00 +1.160010E+00 +1.155990E+00 +1.160167E+00 +1.162166E+00 +1.161566E+00 +1.164454E+00 +1.166269E+00 +1.168529E+00 +1.168622E+00 +1.170296E+00 +1.168644E+00 +1.172975E+00 +1.176543E+00 +1.173389E+00 +1.178422E+00 cmfd entropy 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.215201E+00 -3.212850E+00 -3.214094E+00 -3.208054E+00 -3.212891E+00 -3.213349E+00 -3.208290E+00 -3.206895E+00 -3.208786E+00 -3.209630E+00 -3.212321E+00 -3.211750E+00 -3.212453E+00 -3.213370E+00 -3.211791E+00 -3.212685E+00 +3.214145E+00 +3.225292E+00 +3.229509E+00 +3.228530E+00 +3.224203E+00 +3.225547E+00 +3.224720E+00 +3.224546E+00 +3.224527E+00 +3.223579E+00 +3.224380E+00 +3.223483E+00 +3.222819E+00 +3.223067E+00 +3.224007E+00 +3.220616E+00 cmfd balance 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -6.348026E-03 -5.102747E-03 -4.043947E-03 -3.952742E-03 -2.533934E-03 -2.215030E-03 -2.945032E-03 -2.597862E-03 -2.300873E-03 -1.991974E-03 -1.679430E-03 -1.636923E-03 -1.581336E-03 -1.431472E-03 -1.419168E-03 -1.256242E-03 +4.801684E-03 +2.802571E-03 +1.828029E-03 +2.220542E-03 +1.709900E-03 +2.008246E-03 +2.578373E-03 +2.000076E-03 +1.645365E-03 +1.462882E-03 +1.208273E-03 +1.146126E-03 +1.214196E-03 +1.082376E-03 +8.967163E-04 +1.154433E-03 cmfd dominance ratio 0.000E+00 0.000E+00 0.000E+00 0.000E+00 - 5.524E-01 - 5.476E-01 + 5.472E-01 + 5.521E-01 + 5.445E-01 + 5.527E-01 + 5.488E-01 + 5.078E-01 5.474E-01 - 5.419E-01 - 5.443E-01 - 5.448E-01 - 5.408E-01 - 5.391E-01 - 5.400E-01 - 5.396E-01 - 5.408E-01 - 5.398E-01 - 5.398E-01 - 5.399E-01 - 5.388E-01 - 5.389E-01 + 5.475E-01 + 5.473E-01 + 5.469E-01 + 5.461E-01 + 5.455E-01 + 5.454E-01 + 5.459E-01 + 5.460E-01 + 5.432E-01 cmfd openmc source comparison 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -8.388554E-03 -7.868057E-03 -6.387209E-03 -6.979018E-03 -5.634468E-03 -5.579466E-03 -5.647779E-03 -5.289856E-03 -4.550547E-03 -4.373716E-03 -4.042350E-03 -3.813510E-03 -3.749151E-03 -3.358126E-03 -3.562360E-03 -3.904942E-03 +9.186654E-03 +6.033650E-03 +3.920380E-03 +4.218939E-03 +4.591972E-03 +4.042772E-03 +4.100500E-03 +3.664495E-03 +3.266803E-03 +3.164213E-03 +3.310474E-03 +3.165822E-03 +3.849586E-03 +2.718170E-03 +2.431480E-03 +3.322902E-03 cmfd source -4.142294E-02 -7.484382E-02 -1.050784E-01 -1.256771E-01 -1.444717E-01 -1.420230E-01 -1.350735E-01 -1.118744E-01 -7.755343E-02 -4.198177E-02 +4.296288E-02 +7.964357E-02 +1.107722E-01 +1.359821E-01 +1.425321E-01 +1.356719E-01 +1.285829E-01 +1.040603E-01 +7.630230E-02 +4.348975E-02 diff --git a/tests/test_cmfd_nofeed/results_true.dat b/tests/test_cmfd_nofeed/results_true.dat index da9b802e7e..e70287bf77 100644 --- a/tests/test_cmfd_nofeed/results_true.dat +++ b/tests/test_cmfd_nofeed/results_true.dat @@ -1,128 +1,128 @@ k-combined: -1.170519E+00 8.422960E-03 +1.171115E+00 6.173328E-03 tally 1: -1.078122E+01 -1.170828E+01 -1.999878E+01 -4.018561E+01 -2.812898E+01 -7.936860E+01 -3.362276E+01 -1.133841E+02 -3.714459E+01 -1.382628E+02 -3.828125E+01 -1.470408E+02 -3.599263E+01 -1.299451E+02 -3.090749E+01 -9.596105E+01 -2.144103E+01 -4.630323E+01 -1.143002E+01 -1.314355E+01 +1.151618E+01 +1.331859E+01 +2.120660E+01 +4.514836E+01 +2.759616E+01 +7.639131E+01 +3.216668E+01 +1.036501E+02 +3.664720E+01 +1.345450E+02 +3.771246E+01 +1.424209E+02 +3.523750E+01 +1.245225E+02 +2.973298E+01 +8.860064E+01 +2.152108E+01 +4.647187E+01 +1.169538E+01 +1.375047E+01 tally 2: -2.247115E+01 -2.548076E+01 -1.574700E+01 -1.251937E+01 -2.119907E+00 -2.284737E-01 -4.160187E+01 -8.733627E+01 -2.945600E+01 -4.383448E+01 -4.027136E+00 -8.279807E-01 -5.722117E+01 -1.643758E+02 -4.057100E+01 -8.267151E+01 -5.388803E+00 -1.465180E+00 -6.769175E+01 -2.300722E+02 -4.800300E+01 -1.157663E+02 -6.213554E+00 -1.946061E+00 -7.376629E+01 -2.729166E+02 -5.253400E+01 -1.385018E+02 -6.438590E+00 -2.103693E+00 -7.454128E+01 -2.790080E+02 -5.311800E+01 -1.417584E+02 -6.784745E+00 -2.328936E+00 -6.907125E+01 -2.397912E+02 -4.912000E+01 -1.213330E+02 -6.405754E+00 -2.075535E+00 -6.012056E+01 -1.815248E+02 -4.280600E+01 -9.207864E+01 -5.534450E+00 -1.555396E+00 -4.229808E+01 -8.999380E+01 -3.003200E+01 -4.541718E+01 -3.844618E+00 -7.537006E-01 -2.272774E+01 -2.597695E+01 -1.577800E+01 -1.252728E+01 -2.221451E+00 -2.528223E-01 +2.274639E+01 +2.606952E+01 +1.588200E+01 +1.270445E+01 +2.140989E+00 +2.357207E-01 +4.205792E+01 +8.880940E+01 +2.970000E+01 +4.427086E+01 +3.919645E+00 +7.773724E-01 +5.560960E+01 +1.559764E+02 +3.947900E+01 +7.872700E+01 +5.238942E+00 +1.400918E+00 +6.492259E+01 +2.117369E+02 +4.612200E+01 +1.069035E+02 +5.989449E+00 +1.813201E+00 +7.217377E+01 +2.608499E+02 +5.148500E+01 +1.327923E+02 +6.607336E+00 +2.205529E+00 +7.305896E+01 +2.681514E+02 +5.187500E+01 +1.352457E+02 +6.722921E+00 +2.290262E+00 +6.884269E+01 +2.380550E+02 +4.904800E+01 +1.208314E+02 +6.177320E+00 +1.927173E+00 +5.902100E+01 +1.748370E+02 +4.201000E+01 +8.858460E+01 +5.542381E+00 +1.549108E+00 +4.268091E+01 +9.151405E+01 +3.029500E+01 +4.614050E+01 +3.822093E+00 +7.420139E-01 +2.362279E+01 +2.812041E+01 +1.653100E+01 +1.377737E+01 +2.336090E+00 +2.851840E-01 tally 3: -1.517200E+01 -1.162361E+01 -9.172562E-01 -4.342120E-02 -2.835000E+01 -4.061736E+01 -1.868192E+00 -1.761390E-01 -3.911800E+01 -7.686442E+01 -2.478956E+00 -3.088180E-01 -4.617600E+01 -1.071239E+02 -2.980518E+00 -4.488545E-01 -5.059100E+01 -1.284662E+02 -3.257651E+00 -5.341674E-01 -5.115000E+01 -1.314866E+02 -3.365441E+00 -5.729274E-01 -4.732100E+01 -1.126317E+02 -3.051596E+00 -4.705140E-01 -4.120700E+01 -8.535705E+01 -2.704451E+00 -3.705800E-01 -2.900900E+01 -4.238065E+01 -1.872660E+00 -1.780668E-01 -1.520000E+01 -1.162785E+01 -1.007084E+00 -5.171907E-02 +1.523800E+01 +1.170551E+01 +1.071050E+00 +5.839198E-02 +2.862100E+01 +4.111143E+01 +1.892774E+00 +1.812712E-01 +3.804200E+01 +7.314552E+01 +2.423654E+00 +2.968521E-01 +4.433500E+01 +9.878201E+01 +2.823929E+00 +4.033633E-01 +4.954300E+01 +1.229796E+02 +3.226029E+00 +5.265680E-01 +4.999000E+01 +1.256279E+02 +3.232464E+00 +5.286388E-01 +4.723500E+01 +1.120638E+02 +3.015553E+00 +4.606928E-01 +4.050800E+01 +8.237529E+01 +2.592073E+00 +3.412174E-01 +2.911800E+01 +4.263022E+01 +1.875109E+00 +1.785438E-01 +1.592800E+01 +1.279461E+01 +1.038638E+00 +5.538157E-02 tally 4: 0.000000E+00 0.000000E+00 @@ -160,8 +160,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.017000E+00 -4.575810E-01 +3.065000E+00 +4.742170E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -208,10 +208,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.447000E+00 -1.491865E+00 -2.697000E+00 -3.709330E-01 +5.420000E+00 +1.474674E+00 +2.693000E+00 +3.667090E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -256,10 +256,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.403000E+00 -2.751813E+00 -5.151000E+00 -1.334701E+00 +7.243000E+00 +2.637431E+00 +5.092000E+00 +1.305200E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -304,10 +304,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -8.635000E+00 -3.741143E+00 -7.048000E+00 -2.495310E+00 +8.280000E+00 +3.445670E+00 +6.765000E+00 +2.307253E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -352,10 +352,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -9.381000E+00 -4.415619E+00 -8.456000E+00 -3.587840E+00 +8.980000E+00 +4.046484E+00 +8.108000E+00 +3.299338E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -400,10 +400,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -9.297000E+00 -4.334551E+00 -9.198000E+00 -4.240540E+00 +9.016000E+00 +4.079320E+00 +8.962000E+00 +4.034032E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -448,10 +448,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -8.737000E+00 -3.843559E+00 -9.508000E+00 -4.553256E+00 +8.465000E+00 +3.595665E+00 +9.296000E+00 +4.340524E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -496,10 +496,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.338000E+00 -2.709162E+00 -8.888000E+00 -3.969398E+00 +7.247000E+00 +2.638527E+00 +8.865000E+00 +3.946315E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -544,10 +544,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.354000E+00 -1.442386E+00 -7.584000E+00 -2.887298E+00 +5.179000E+00 +1.353661E+00 +7.492000E+00 +2.817588E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -592,10 +592,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.707000E+00 -3.709270E-01 -5.507000E+00 -1.522587E+00 +2.821000E+00 +4.067990E-01 +5.617000E+00 +1.587757E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -642,8 +642,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.112000E+00 -4.868600E-01 +3.134000E+00 +4.937920E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -662,114 +662,114 @@ k cmfd 0.000000E+00 0.000000E+00 0.000000E+00 -1.150583E+00 -1.160876E+00 -1.160893E+00 -1.157393E+00 -1.157826E+00 -1.163206E+00 -1.169286E+00 -1.169322E+00 -1.169866E+00 -1.177576E+00 -1.183172E+00 -1.184784E+00 -1.186581E+00 -1.183233E+00 -1.181032E+00 -1.180107E+00 +1.177990E+00 +1.160491E+00 +1.145875E+00 +1.148719E+00 +1.140676E+00 +1.141509E+00 +1.143597E+00 +1.141954E+00 +1.150311E+00 +1.155088E+00 +1.155464E+00 +1.152786E+00 +1.156950E+00 +1.159040E+00 +1.160571E+00 +1.161251E+00 cmfd entropy 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.215201E+00 -3.214833E+00 -3.211409E+00 -3.218241E+00 -3.220068E+00 -3.217667E+00 -3.214425E+00 -3.215427E+00 -3.214339E+00 -3.212343E+00 -3.211075E+00 -3.211281E+00 -3.209704E+00 -3.210597E+00 -3.213481E+00 -3.213943E+00 +3.214145E+00 +3.222082E+00 +3.225870E+00 +3.230292E+00 +3.228784E+00 +3.228863E+00 +3.228331E+00 +3.230222E+00 +3.231212E+00 +3.230979E+00 +3.229831E+00 +3.229258E+00 +3.228559E+00 +3.227915E+00 +3.227427E+00 +3.229561E+00 cmfd balance 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -6.348026E-03 -4.651411E-03 -3.551519E-03 -2.893286E-03 -2.930836E-03 -2.342081E-03 -2.443793E-03 -2.380658E-03 -2.091259E-03 -2.144887E-03 -2.055334E-03 -1.907704E-03 -1.879350E-03 -1.598308E-03 -1.247988E-03 -1.179680E-03 +4.801684E-03 +3.228380E-03 +2.568997E-03 +2.195796E-03 +2.248884E-03 +3.405416E-03 +2.332198E-03 +2.576061E-03 +2.326651E-03 +2.324425E-03 +2.205364E-03 +2.112702E-03 +1.864656E-03 +1.804877E-03 +1.557106E-03 +1.312058E-03 cmfd dominance ratio 0.000E+00 0.000E+00 0.000E+00 0.000E+00 - 5.524E-01 - 5.492E-01 - 5.459E-01 - 5.486E-01 - 5.475E-01 - 5.455E-01 - 5.433E-01 - 5.425E-01 - 5.412E-01 - 5.404E-01 - 5.399E-01 - 5.400E-01 - 5.401E-01 - 5.414E-01 - 5.433E-01 - 5.437E-01 + 5.472E-01 + 5.510E-01 + 5.519E-01 + 5.535E-01 + 5.535E-01 + 5.505E-01 + 5.488E-01 + 5.505E-01 + 5.510E-01 + 5.513E-01 + 5.510E-01 + 5.508E-01 + 5.487E-01 + 5.489E-01 + 5.481E-01 + 5.499E-01 cmfd openmc source comparison 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -8.388554E-03 -6.525044E-03 -5.810856E-03 -3.651620E-03 -3.448625E-03 -3.805838E-03 -4.064235E-03 -3.244723E-03 -3.963513E-03 -4.186768E-03 -3.785555E-03 -2.732731E-03 -2.308430E-03 -2.074797E-03 -1.581512E-03 -1.729988E-03 +9.186654E-03 +5.964812E-03 +4.465905E-03 +4.119425E-03 +4.973577E-03 +4.092492E-03 +4.063342E-03 +2.804589E-03 +3.632667E-03 +5.005042E-03 +3.428575E-03 +3.007070E-03 +3.091465E-03 +3.030625E-03 +2.751739E-03 +1.762364E-03 cmfd source -3.816410E-02 -7.860013E-02 -1.050204E-01 -1.270331E-01 -1.389768E-01 -1.438216E-01 -1.304530E-01 -1.155470E-01 -7.975741E-02 -4.262650E-02 +4.538792E-02 +8.103354E-02 +1.045198E-01 +1.221411E-01 +1.398214E-01 +1.401011E-01 +1.305055E-01 +1.120110E-01 +8.032924E-02 +4.414939E-02 diff --git a/tests/test_density_atombcm/results_true.dat b/tests/test_density_atombcm/results_true.dat index 384fb593eb..2956b53888 100644 --- a/tests/test_density_atombcm/results_true.dat +++ b/tests/test_density_atombcm/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.760126E+00 1.038820E-02 +1.752274E+00 4.032481E-02 diff --git a/tests/test_density_atomcm3/results_true.dat b/tests/test_density_atomcm3/results_true.dat index 3feb35ba1e..0bd16fc4de 100644 --- a/tests/test_density_atomcm3/results_true.dat +++ b/tests/test_density_atomcm3/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.092203E+00 1.990176E-02 +1.092376E+00 1.759788E-02 diff --git a/tests/test_density_kgm3/results_true.dat b/tests/test_density_kgm3/results_true.dat index c5942e1a23..6b008101fb 100644 --- a/tests/test_density_kgm3/results_true.dat +++ b/tests/test_density_kgm3/results_true.dat @@ -1,2 +1,2 @@ k-combined: -8.085745E-01 9.674599E-03 +7.994522E-01 1.065745E-02 diff --git a/tests/test_density_sum/results_true.dat b/tests/test_density_sum/results_true.dat index 418331925d..9b16f2d988 100644 --- a/tests/test_density_sum/results_true.dat +++ b/tests/test_density_sum/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.319139E-01 1.688777E-02 +3.231215E-01 6.421320E-03 diff --git a/tests/test_eigenvalue_genperbatch/results_true.dat b/tests/test_eigenvalue_genperbatch/results_true.dat index d6aac0453a..9e87c901d9 100644 --- a/tests/test_eigenvalue_genperbatch/results_true.dat +++ b/tests/test_eigenvalue_genperbatch/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.012381E-01 1.890480E-03 +3.015627E-01 5.978844E-03 diff --git a/tests/test_eigenvalue_no_inactive/results_true.dat b/tests/test_eigenvalue_no_inactive/results_true.dat index d7575db1fe..fbbe84cc37 100644 --- a/tests/test_eigenvalue_no_inactive/results_true.dat +++ b/tests/test_eigenvalue_no_inactive/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.066374E-01 7.794575E-03 +3.130246E-01 6.960311E-03 diff --git a/tests/test_energy_grid/results_true.dat b/tests/test_energy_grid/results_true.dat index 05cda2e980..9556a981bc 100644 --- a/tests/test_energy_grid/results_true.dat +++ b/tests/test_energy_grid/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.215828E-01 2.966835E-03 +3.155788E-01 7.559348E-03 diff --git a/tests/test_entropy/results_true.dat b/tests/test_entropy/results_true.dat index a3515ba2bb..8b37789c32 100644 --- a/tests/test_entropy/results_true.dat +++ b/tests/test_entropy/results_true.dat @@ -1,13 +1,13 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 entropy: 7.608094E+00 8.167702E+00 8.273634E+00 -8.238974E+00 -8.307173E+00 -8.239618E+00 -8.230443E+00 -8.201657E+00 -8.289158E+00 -8.364683E+00 +8.239452E+00 +8.234598E+00 +8.278421E+00 +8.260773E+00 +8.351860E+00 +8.303719E+00 +8.271058E+00 diff --git a/tests/test_filter_cell/results_true.dat b/tests/test_filter_cell/results_true.dat index 0838e7baed..f3aa5d89b1 100644 --- a/tests/test_filter_cell/results_true.dat +++ b/tests/test_filter_cell/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 -1.517577E+01 -4.747271E+01 -3.151504E+00 -2.051857E+00 -4.536316E+01 -4.258781E+02 +1.423676E+01 +4.330937E+01 +2.914798E+00 +1.831649E+00 +4.088282E+01 +3.662539E+02 diff --git a/tests/test_filter_cellborn/results_true.dat b/tests/test_filter_cellborn/results_true.dat index d2fa7f7004..36dcf40d06 100644 --- a/tests/test_filter_cellborn/results_true.dat +++ b/tests/test_filter_cellborn/results_true.dat @@ -1,10 +1,10 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 -7.449502E+01 -1.145793E+03 +7.007584E+01 +1.050827E+03 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_filter_energy/results_true.dat b/tests/test_filter_energy/results_true.dat index 9e3ab7965b..e3f6cff98d 100644 --- a/tests/test_filter_energy/results_true.dat +++ b/tests/test_filter_energy/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -2.687671E+01 -1.475192E+02 -4.148025E+01 -3.443331E+02 -5.223662E+01 -5.466362E+02 -1.050254E+01 -2.218108E+01 +2.770022E+01 +1.559167E+02 +4.285040E+01 +3.679177E+02 +5.288354E+01 +5.619308E+02 +1.134904E+01 +2.579927E+01 diff --git a/tests/test_filter_energyout/results_true.dat b/tests/test_filter_energyout/results_true.dat index fa0bfa6466..649f4d7259 100644 --- a/tests/test_filter_energyout/results_true.dat +++ b/tests/test_filter_energyout/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -2.740000E+01 -1.516786E+02 -4.163000E+01 -3.469463E+02 -5.041000E+01 -5.097599E+02 -6.990000E+00 -9.850700E+00 +2.835000E+01 +1.631463E+02 +4.252000E+01 +3.622146E+02 +5.192000E+01 +5.401444E+02 +7.390000E+00 +1.097710E+01 diff --git a/tests/test_filter_group_transfer/results_true.dat b/tests/test_filter_group_transfer/results_true.dat index 2222558273..f2d5faa991 100644 --- a/tests/test_filter_group_transfer/results_true.dat +++ b/tests/test_filter_group_transfer/results_true.dat @@ -1,54 +1,54 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -2.470000E+01 -1.233286E+02 +2.571000E+01 +1.344145E+02 0.000000E+00 0.000000E+00 -7.000000E-02 -2.100000E-03 +2.000000E-02 +2.000000E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -8.590851E-01 -1.552999E-01 +8.909862E-01 +1.660072E-01 0.000000E+00 0.000000E+00 -2.474615E+00 -1.227479E+00 -2.700000E+00 -1.469800E+00 +2.269580E+00 +1.046926E+00 +2.640000E+00 +1.397800E+00 0.000000E+00 0.000000E+00 -3.712000E+01 -2.758636E+02 +3.799000E+01 +2.892451E+02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.370712E-01 -2.596756E-02 +3.267964E-01 +2.170374E-02 0.000000E+00 0.000000E+00 -9.771334E-01 -1.963983E-01 +8.811378E-01 +1.642094E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -4.440000E+00 -3.947400E+00 +4.510000E+00 +4.068900E+00 0.000000E+00 0.000000E+00 -4.688000E+01 -4.409726E+02 -2.867366E-02 -2.783031E-04 +4.842000E+01 +4.700146E+02 +6.079426E-02 +8.532151E-04 0.000000E+00 0.000000E+00 -1.080794E-01 -2.580055E-03 +1.182446E-01 +3.979568E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -57,11 +57,11 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.530000E+00 -2.494900E+00 -1.572766E-01 -5.137814E-03 -6.990000E+00 -9.850700E+00 -3.134136E-01 -2.138680E-02 +3.500000E+00 +2.455800E+00 +1.158638E-01 +2.993934E-03 +7.390000E+00 +1.097710E+01 +3.126942E-01 +2.185793E-02 diff --git a/tests/test_filter_material/results_true.dat b/tests/test_filter_material/results_true.dat index 3d15ea4322..86e1e943ce 100644 --- a/tests/test_filter_material/results_true.dat +++ b/tests/test_filter_material/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -2.819256E+01 -1.591068E+02 -6.599750E+00 -8.721650E+00 -5.383171E+01 -5.950793E+02 -4.140672E+01 -3.649396E+02 +2.923791E+01 +1.711686E+02 +6.753642E+00 +9.145065E+00 +4.921142E+01 +5.186991E+02 +4.731999E+01 +4.905260E+02 diff --git a/tests/test_filter_mesh_2d/results_true.dat b/tests/test_filter_mesh_2d/results_true.dat index 01aea5afe2..21946086b9 100644 --- a/tests/test_filter_mesh_2d/results_true.dat +++ b/tests/test_filter_mesh_2d/results_true.dat @@ -1,5 +1,5 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 @@ -45,8 +45,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.751430E-01 -7.658753E-01 +3.228098E-02 +1.042062E-03 +3.222708E-01 +1.038585E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -73,14 +75,26 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +8.182335E-01 +3.748630E-01 +2.711997E-01 +5.338821E-02 +3.359680E-01 +5.168399E-02 0.000000E+00 0.000000E+00 -1.287286E-01 -1.657106E-02 -7.512292E-01 -1.499955E-01 -2.231206E+00 -1.531548E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.706070E-01 +1.373496E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -95,120 +109,106 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -6.855163E-02 -4.699326E-03 -6.967594E-02 -4.854737E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.993440E-02 -9.986884E-03 -1.978123E-01 -3.912972E-02 -8.758664E-02 -7.671419E-03 -4.204632E-01 -7.722514E-02 -2.486465E+00 -1.923132E+00 -1.697091E-01 -1.631523E-02 -0.000000E+00 -0.000000E+00 +3.931419E-01 +9.002841E-02 +1.092722E+00 +3.733055E-01 +2.384227E+00 +1.926937E+00 +9.101131E-01 +3.634496E-01 +3.284661E-01 +1.078900E-01 0.000000E+00 0.000000E+00 6.885295E-02 4.740728E-03 0.000000E+00 0.000000E+00 -6.175782E-01 -2.022672E-01 -1.204200E-02 -8.137904E-05 -2.136417E-01 -1.678274E-02 -2.932366E-01 -4.285227E-02 -6.387464E-01 -1.526040E-01 +2.419633E-02 +5.854622E-04 +9.286912E-02 +7.247209E-03 +5.629729E-01 +9.281109E-02 +7.345786E-01 +1.755550E-01 +1.219449E-01 +1.487057E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.062751E+00 -3.899247E-01 -1.264401E+00 -5.654864E-01 -1.615537E+00 -5.605431E-01 -4.267750E-01 -1.013728E-01 -2.024264E+00 -9.373843E-01 -1.122195E-01 -7.011342E-03 -8.223839E-01 -2.170405E-01 -1.239203E+00 -4.165595E-01 -1.169828E+00 -4.406334E-01 -1.373464E+00 -6.398480E-01 -2.824398E+00 -2.991665E+00 -6.158518E-01 -1.951901E-01 -7.188149E-01 -1.091668E-01 -7.595527E-01 -2.108412E-01 -5.784902E-01 -1.362812E-01 -7.167515E-01 -3.225769E-01 -2.081496E-02 -4.332627E-04 -9.212853E-01 -2.277306E-01 -1.266470E+00 -6.777774E-01 +1.983303E-01 +3.797884E-02 +4.840974E-02 +1.266547E-03 +1.183485E+00 +4.184814E-01 +3.027254E-01 +8.598449E-02 +9.889868E-01 +4.608531E-01 +8.698103E-01 +4.598559E-01 +1.332831E+00 +4.809984E-01 +1.564949E+00 +5.782651E-01 +1.143572E+00 +4.399439E-01 +1.326651E+00 +6.376565E-01 +1.716813E+00 +1.314280E+00 +7.673229E-01 +2.364966E-01 +2.539284E+00 +1.945563E+00 +1.263219E+00 +4.919339E-01 +5.430042E-01 +1.300266E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.553587E-01 +1.738170E-01 +2.048487E+00 +1.239856E+00 3.761862E-01 8.452912E-02 -1.350273E-02 -1.823238E-04 -3.348203E-01 -6.603737E-02 -2.382593E-01 -2.884302E-02 -1.548117E+00 -7.256982E-01 -9.635803E-01 -4.452538E-01 -1.030188E+00 -3.496685E-01 -7.053043E-01 -2.814424E-01 -1.260458E-01 -8.365754E-03 -1.484515E+00 -7.183840E-01 -1.887042E+00 -1.143800E+00 -3.798783E+00 -4.487065E+00 -2.274180E+00 -1.991784E+00 -1.903719E-01 -3.237886E-02 -0.000000E+00 -0.000000E+00 0.000000E+00 0.000000E+00 +9.675232E-02 +9.361012E-03 +2.319594E-01 +2.331698E-02 +1.573495E+00 +6.394722E-01 +4.432570E-01 +1.005943E-01 +9.353148E-01 +3.125416E-01 +8.359366E-01 +2.985072E-01 +1.657665E+00 +9.207020E-01 +3.737550E+00 +3.558505E+00 +1.742376E+00 +8.732217E-01 +5.153816E+00 +6.543973E+00 +1.653035E+00 +1.061068E+00 +9.963191E-01 +3.716347E-01 +2.282805E-01 +2.383414E-02 +8.749983E-01 +2.714666E-01 1.728411E-01 1.190218E-02 9.250054E-02 @@ -219,28 +219,28 @@ tally 1: 1.711154E-02 3.218800E-01 7.906855E-02 -9.721141E-01 -3.463278E-01 -8.364857E-01 -2.612988E-01 -6.317454E-01 -1.837078E-01 -2.134394E-01 -1.710045E-02 -3.743814E-02 -1.401614E-03 -1.314651E+00 -7.700853E-01 -7.389940E-01 -2.322340E-01 -6.147456E-01 -1.001719E-01 -3.157573E+00 -2.794673E+00 -6.671644E-01 -1.996570E-01 -0.000000E+00 -0.000000E+00 +1.057036E+00 +3.778638E-01 +9.231639E-01 +2.991795E-01 +3.375678E-01 +1.041383E-01 +1.181686E-01 +8.023920E-03 +4.912969E-01 +2.073894E-01 +9.395786E-01 +4.653730E-01 +6.998437E-01 +2.917085E-01 +3.074214E+00 +2.819088E+00 +2.570673E+00 +1.358321E+00 +1.108912E+00 +3.843307E-01 +4.950896E-02 +2.451137E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -255,24 +255,24 @@ tally 1: 7.670183E-03 0.000000E+00 0.000000E+00 -9.451595E-01 -2.560533E-01 -2.255990E+00 -1.237092E+00 -9.318430E-01 -2.664794E-01 -5.320317E-01 -2.267827E-01 -9.971891E-01 -5.070904E-01 -7.088786E-02 -5.025089E-03 -3.601108E-02 -1.296798E-03 -3.683352E+00 -3.243246E+00 -3.708141E+00 -3.629996E+00 +6.469411E-01 +1.789549E-01 +7.829878E-01 +2.033989E-01 +8.994770E-01 +2.351438E-01 +4.712797E-01 +7.213659E-02 +2.133532E+00 +9.765422E-01 +4.533607E-01 +1.511497E-01 +1.878729E+00 +2.099266E+00 +4.287190E+00 +4.748691E+00 +1.961229E+00 +1.085868E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -285,28 +285,28 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.238471E-01 -1.533812E-02 -2.580606E+00 -1.878196E+00 -2.843921E+00 -1.997749E+00 -1.145124E+00 -4.571704E-01 -1.135664E+00 -4.319756E-01 +1.061692E-01 +1.127190E-02 +1.912282E-01 +3.656822E-02 +3.289827E-01 +1.075283E-01 +1.750908E+00 +8.092384E-01 +2.156426E+00 +9.498067E-01 +1.480596E+00 +6.002164E-01 +3.249216E-01 +1.005106E-01 8.875810E-02 7.878000E-03 -7.494206E-02 -5.616313E-03 -1.007353E+00 -3.619658E-01 -1.649444E+00 -7.918743E-01 +2.458176E-01 +4.377921E-02 +2.766784E+00 +2.677426E+00 +2.703501E+00 +2.548083E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -319,28 +319,28 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.286351E-01 -1.805028E-01 -1.595058E+00 -6.351621E-01 -1.568755E+00 -6.468874E-01 -2.301331E+00 -1.845232E+00 -4.577930E-01 -1.589685E-01 +1.981880E-01 +3.927848E-02 +2.789456E-01 +5.304261E-02 +3.897689E-01 +9.413685E-02 +9.140885E-01 +2.822974E-01 +1.887726E+00 +7.592780E-01 +1.841624E+00 +1.680236E+00 +4.059938E-01 +1.562853E-01 2.897077E-01 8.393057E-02 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -1.772980E-01 -3.143459E-02 +2.445051E-01 +5.978276E-02 +2.234657E-01 +2.716625E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -353,24 +353,24 @@ tally 1: 0.000000E+00 4.783335E-02 2.288029E-03 -8.744336E-01 -2.611835E-01 -1.754522E+00 -1.459573E+00 -3.549403E-01 -6.365363E-02 -1.843261E+00 -9.517219E-01 -1.009556E+00 -4.611770E-01 -1.540221E+00 -7.611324E-01 -8.030427E-01 -2.255596E-01 +5.606011E-01 +1.607491E-01 +1.908325E+00 +1.505641E+00 +1.255795E-01 +1.541635E-02 +7.395548E-01 +2.274416E-01 +5.986733E-01 +9.576988E-02 +1.095026E+00 +4.872910E-01 +1.043470E+00 +3.153965E-01 1.004973E+00 6.046910E-01 -1.664911E-01 -2.771927E-02 +1.724071E-01 +2.775427E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -385,114 +385,114 @@ tally 1: 0.000000E+00 5.470039E-01 2.992133E-01 -4.902613E-01 -1.163360E-01 +4.313918E-01 +1.128703E-01 1.088037E+00 6.007745E-01 1.013469E+00 5.646900E-01 -5.529904E-01 -2.308161E-01 -3.523818E-01 -1.241729E-01 -2.031343E-01 -4.126355E-02 -2.664927E+00 -2.323850E+00 -2.601166E+00 -1.593528E+00 -1.726764E+00 -6.491827E-01 -7.083106E-02 -3.090181E-03 +4.738741E-01 +2.245567E-01 +6.086518E-02 +3.704570E-03 +1.126662E+00 +4.675322E-01 +1.008459E+00 +4.616352E-01 +1.309592E+00 +5.665211E-01 +1.334050E+00 +5.264819E-01 +7.324996E-01 +2.577124E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +3.227736E-01 +1.041828E-01 +9.218244E-01 +2.000301E-01 +2.119900E+00 +1.123846E+00 +4.366404E-02 +1.015133E-03 0.000000E+00 0.000000E+00 -2.213571E-01 -2.455759E-02 -1.471329E+00 -7.001977E-01 -6.348345E-01 -1.603344E-01 -0.000000E+00 -0.000000E+00 -7.240936E-01 -1.701659E-01 -1.280272E+00 -3.624213E-01 -9.794833E-01 -4.411714E-01 +2.309730E-01 +2.570742E-02 +1.270911E+00 +4.617932E-01 +1.107069E+00 +4.574496E-01 1.269137E-01 1.610709E-02 -1.120245E-01 -1.254949E-02 +2.207099E-01 +4.871286E-02 +9.075694E-02 +8.236821E-03 +1.046380E-01 +7.875036E-03 +2.836364E-01 +3.508209E-02 +4.509177E-01 +7.393615E-02 +1.077505E+00 +3.209541E-01 +1.204982E-02 +1.451982E-04 0.000000E+00 0.000000E+00 -8.072240E-01 -2.272369E-01 -3.032594E-01 -5.076695E-02 -7.265258E-01 -1.893670E-01 -2.902123E-01 -3.514713E-02 +0.000000E+00 +0.000000E+00 +2.502937E-01 +5.035125E-02 +1.367234E+00 +5.128884E-01 +5.563575E-01 +2.510519E-01 +3.174809E-01 +1.007941E-01 +9.152129E-01 +2.609325E-01 +9.040668E-01 +2.263595E-01 +7.868812E-01 +2.436310E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -8.608891E-02 -4.586038E-03 -1.319691E+00 -5.856361E-01 -7.752262E-01 -3.101466E-01 -2.606443E-01 -6.793546E-02 -3.686503E-01 -6.346661E-02 -6.935008E-01 -1.992259E-01 -1.591064E+00 -6.804860E-01 -2.418186E-01 -5.847626E-02 0.000000E+00 0.000000E+00 -5.946272E-02 -3.535814E-03 -3.120645E-02 -9.738427E-04 -7.515014E-02 -5.647544E-03 -8.673868E-01 -3.013632E-01 -2.427216E-01 -2.798481E-02 +3.390904E-01 +4.907887E-02 +6.577001E-01 +2.346964E-01 +1.023735E-01 +8.287220E-03 1.499600E-02 2.248801E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -3.079687E-01 -5.125039E-02 -1.649743E+00 -9.187008E-01 -8.924207E-01 -2.872456E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.137844E-02 -5.984482E-03 +1.395650E-01 +1.947839E-02 +1.040555E+00 +3.043523E-01 +1.426976E+00 +6.218295E-01 +8.342758E-01 +2.539692E-01 +3.101170E-01 +9.617255E-02 +6.319919E-02 +3.629541E-03 +1.292774E-01 +8.674372E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -515,14 +515,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.400001E-01 -3.766524E-01 -2.709865E+00 -1.701203E+00 -2.332406E-01 -4.591958E-02 -9.579949E-02 -9.177542E-03 +9.587357E-01 +4.992769E-01 +1.756477E+00 +7.884472E-01 +2.541705E-01 +4.325743E-02 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -551,10 +551,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.366480E-01 -8.328374E-02 -7.405305E-01 -5.483854E-01 +2.422913E-01 +5.870510E-02 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_filter_mesh_3d/results_true.dat b/tests/test_filter_mesh_3d/results_true.dat index a67c77c034..239a9f01a6 100644 --- a/tests/test_filter_mesh_3d/results_true.dat +++ b/tests/test_filter_mesh_3d/results_true.dat @@ -1,5 +1,5 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 @@ -753,12 +753,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.228098E-02 +1.042062E-03 0.000000E+00 0.000000E+00 -4.083602E-01 -1.667580E-01 -4.667828E-01 -2.178862E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -789,6 +787,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.222708E-01 +1.038585E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1261,14 +1261,18 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.009463E-01 +4.037943E-02 +1.741795E-01 +3.033850E-02 +4.431077E-01 +1.023945E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.287286E-01 -1.657106E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1295,14 +1299,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.269274E-02 -5.149605E-04 -9.624622E-02 -9.263335E-03 -1.387020E-01 -1.620196E-02 -4.935882E-01 -8.865346E-02 +1.699856E-01 +1.749182E-02 +1.012141E-01 +1.024430E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1329,14 +1329,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.467757E+00 -6.282919E-01 -3.159457E-01 -4.516223E-02 -2.050369E-01 -3.908542E-02 -2.424662E-01 -5.878987E-02 +2.427282E-01 +4.346756E-02 +8.576175E-02 +6.594648E-03 +7.478060E-03 +5.592138E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1581,6 +1579,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.645869E-02 +4.416757E-03 +3.041483E-01 +9.250621E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1655,8 +1657,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.855163E-02 -4.699326E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1687,10 +1687,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -4.206687E-02 -1.769622E-03 -2.760907E-02 -7.622607E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1777,8 +1773,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -9.993440E-02 -9.986884E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1809,10 +1803,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.032141E-03 -6.451529E-05 -1.897802E-01 -3.601652E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1843,8 +1833,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.758664E-02 -7.671419E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1855,6 +1843,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.931419E-01 +9.002841E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1875,12 +1865,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.797399E-03 -4.620463E-05 -1.681205E-01 -1.033597E-02 -2.455452E-01 -4.194938E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1891,6 +1875,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.775906E-01 +3.153842E-02 +8.691809E-01 +2.255229E-01 +4.595089E-02 +2.111485E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1907,12 +1897,22 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.983445E-01 -1.408489E-02 -3.095279E-01 -4.471018E-02 -1.669298E+00 -8.584140E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.073032E-01 +5.796376E-03 +6.104378E-01 +1.438907E-01 +1.357192E+00 +7.800106E-01 3.092946E-01 4.828943E-02 0.000000E+00 @@ -1943,14 +1943,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.234167E-01 -1.523167E-02 -4.629242E-02 -1.083563E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +5.051275E-01 +9.608655E-02 +4.049856E-01 +1.640133E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2005,6 +2001,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.816781E-02 +3.300694E-04 +3.102983E-01 +9.628505E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2115,16 +2115,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.728847E-01 -2.988911E-02 -3.848345E-01 -1.480976E-01 -5.985907E-02 -3.583109E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.419633E-02 +5.854622E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2149,8 +2145,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.914572E-03 -1.532387E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2163,12 +2157,18 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.098236E-02 +1.206123E-04 +5.047052E-02 +2.547273E-03 0.000000E+00 0.000000E+00 -8.127433E-03 -6.605517E-05 0.000000E+00 0.000000E+00 +1.065577E-02 +7.244766E-05 +2.076046E-02 +4.309969E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2185,30 +2185,24 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.026040E-02 -4.104838E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.065355E-02 -1.134982E-04 -2.799724E-03 -7.838457E-06 -0.000000E+00 -0.000000E+00 -1.799280E-01 -1.619126E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +1.209931E-01 +7.784762E-03 +1.059137E-01 +1.121770E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.883880E-01 +1.626283E-02 +1.476781E-01 +2.180883E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2231,10 +2225,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +5.464783E-03 +2.986386E-05 +4.827060E-01 +1.236578E-01 +2.938269E-02 +8.633425E-04 1.103939E-01 1.218681E-02 -1.828427E-01 -1.294521E-02 +1.066312E-01 +7.137023E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2265,10 +2265,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.028489E-01 -8.403390E-02 -3.358975E-01 -5.596699E-02 +6.448951E-03 +4.158897E-05 +1.154960E-01 +1.333932E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2353,10 +2353,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.843200E-01 -4.652895E-02 -7.784310E-01 -2.074140E-01 +1.230857E-01 +1.515010E-02 +7.524451E-02 +5.162294E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2387,10 +2387,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.580039E-01 -1.495118E-02 -1.106397E+00 -4.900888E-01 +5.738188E-03 +3.292680E-05 +1.158207E-02 +1.341443E-04 +3.108948E-02 +9.665557E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2419,14 +2421,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +8.670560E-01 +3.010896E-01 +2.777708E-01 +4.851013E-02 +3.865801E-02 +1.326182E-03 0.000000E+00 0.000000E+00 -6.311586E-01 -1.452469E-01 -8.935124E-01 -2.041594E-01 -9.086642E-02 -7.846733E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2453,8 +2455,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.240497E-01 -1.538832E-02 9.205825E-02 8.474722E-03 2.106671E-01 @@ -2487,12 +2487,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.706461E-01 -1.626955E-01 -9.690652E-01 -2.037373E-01 -1.260082E-01 -1.587806E-02 +2.518202E-01 +6.341342E-02 +3.500938E-01 +5.019217E-02 +1.285282E-01 +1.588441E-02 2.585446E-01 6.684532E-02 0.000000E+00 @@ -2523,8 +2523,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.960309E-02 -3.842813E-04 +3.653135E-01 +1.287514E-01 +2.216045E-03 +4.910856E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2543,10 +2545,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -9.261638E-02 -4.454613E-03 +5.022807E-01 +1.147015E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2577,12 +2577,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.905316E-02 -6.249402E-03 -6.679360E-01 -1.650894E-01 -7.539474E-02 -5.684366E-03 +0.000000E+00 +0.000000E+00 +1.172250E+00 +3.690965E-01 +1.605816E-01 +1.294116E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2613,10 +2613,10 @@ tally 1: 0.000000E+00 5.892971E-02 3.472710E-03 -1.107212E+00 -3.413570E-01 -7.306165E-02 -5.338004E-03 +1.338644E+00 +4.668912E-01 +1.673747E-01 +1.423295E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2627,8 +2627,8 @@ tally 1: 0.000000E+00 1.452260E-01 2.109060E-02 -6.184555E-01 -1.333723E-01 +5.921989E-01 +1.326829E-01 3.816328E-02 1.456436E-03 9.153520E-02 @@ -2663,8 +2663,8 @@ tally 1: 6.125553E-04 7.610286E-01 2.001560E-01 -4.985084E-01 -1.084317E-01 +4.516947E-01 +1.062402E-01 8.917764E-02 4.968510E-03 0.000000E+00 @@ -2693,24 +2693,22 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.736533E-01 -3.015548E-02 -1.425017E+00 -8.058899E-01 -9.850395E-01 -5.477477E-01 0.000000E+00 0.000000E+00 +1.101299E+00 +7.922298E-01 +4.529165E-02 +2.051333E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +5.702227E-01 +1.629185E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.406884E-01 -5.793092E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2727,28 +2725,26 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.047508E-02 -4.966737E-03 -7.482142E-02 -5.598244E-03 -1.212516E-02 -1.470196E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.428465E-01 -5.897443E-02 0.000000E+00 0.000000E+00 -2.031988E-01 -4.128976E-02 -1.238475E-02 -1.533819E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.749741E-01 +3.841679E-02 +1.876567E-01 +2.180115E-02 +4.802267E-02 +2.306177E-03 +2.219757E-01 +2.083367E-02 +3.469381E-02 +1.203661E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2763,26 +2759,26 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.198784E-01 -1.437083E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.380516E-01 -4.157334E-02 -7.271496E-02 -5.287466E-03 -1.248706E-01 -9.290399E-03 -6.329934E-02 -4.006806E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +9.220451E-03 +8.501673E-05 +2.421186E-01 +2.296140E-02 +5.301518E-01 +1.266721E-01 +1.676517E+00 +1.032348E+00 +8.127651E-02 +4.329985E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2805,12 +2801,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.932483E-01 -3.411782E-02 -7.125726E-02 -5.077597E-03 -1.721584E-01 -1.580114E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.516265E-01 +6.305270E-02 +3.999873E-02 +1.599899E-03 +5.487047E-01 +1.292105E-01 3.228887E-01 1.042571E-01 0.000000E+00 @@ -2839,12 +2839,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.935296E-02 -3.745370E-04 -4.914514E-02 -2.415245E-03 -3.076980E-01 -3.868177E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.407100E-01 +4.223910E-02 2.022942E-01 4.092294E-02 0.000000E+00 @@ -2875,10 +2875,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.698116E-02 -5.106926E-03 -6.397704E-01 -2.487693E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2901,10 +2897,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.219865E-02 -1.488072E-04 -8.616309E-03 -7.424078E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2931,12 +2923,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.457861E-01 -1.063058E-02 -7.360906E-01 -1.562063E-01 -3.940865E-02 -1.553041E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2947,6 +2933,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +7.553587E-01 +1.738170E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2965,12 +2953,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.452849E-02 -4.309152E-03 -3.655566E-01 -3.753615E-02 -8.473380E-02 -7.179817E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2981,6 +2963,24 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +0.000000E+00 +0.000000E+00 +6.145563E-02 +3.776795E-03 +2.005189E-01 +2.429212E-02 +5.673596E-01 +1.649938E-01 +4.875014E-01 +2.376576E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 7.157679E-01 3.770273E-01 1.588325E-02 @@ -3031,8 +3031,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.350273E-02 -1.823238E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3065,8 +3063,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.380680E-01 -5.667635E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3121,10 +3121,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.227568E-02 -6.769287E-03 -2.170015E-02 -4.708966E-04 +0.000000E+00 +0.000000E+00 +9.767592E-02 +5.284927E-03 1.342835E-01 1.803205E-02 0.000000E+00 @@ -3155,12 +3155,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.298723E-01 -8.434738E-03 -1.192701E+00 -5.059301E-01 -5.555691E-02 -3.086570E-03 +6.575074E-02 +4.323159E-03 +1.123042E+00 +4.745625E-01 +2.147144E-01 +2.841768E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3169,10 +3169,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.271892E-02 -5.288041E-03 -6.134910E-01 -2.517865E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.138141E-01 +1.295364E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3189,12 +3191,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -2.698309E-01 -5.659690E-02 -7.539545E-03 -5.684475E-05 +2.478967E-01 +2.397512E-02 +8.154628E-02 +5.533841E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3203,12 +3203,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.063682E-01 -2.953689E-02 -7.099357E-01 -1.432662E-01 -2.190760E-02 -4.799429E-04 +1.673829E-01 +2.801704E-02 +6.238670E-01 +1.323614E-01 +1.087831E-01 +8.027300E-03 3.528173E-02 1.244801E-03 0.000000E+00 @@ -3221,8 +3221,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.669518E-02 -3.214344E-03 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3239,10 +3239,10 @@ tally 1: 0.000000E+00 3.125593E-03 9.769332E-06 -5.487602E-01 -2.355803E-01 -7.840909E-02 -6.147986E-03 +5.982046E-01 +2.380250E-01 +1.595969E-01 +1.273945E-02 7.500945E-02 5.626417E-03 0.000000E+00 @@ -3273,22 +3273,22 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -4.849728E-02 -2.351986E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.004455E-02 +4.017842E-04 +1.241994E+00 +5.276343E-01 +3.956269E-01 +6.857794E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -6.355630E-02 -4.039404E-03 -1.399218E-02 -1.957812E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3313,18 +3313,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.567716E-02 -2.424343E-03 -3.815100E-01 -7.061468E-02 -1.998464E-01 -3.993860E-02 -2.952749E-01 -4.970731E-02 -3.559995E-01 -4.240327E-02 -4.275883E-02 -1.828318E-03 +2.517820E-01 +4.088147E-02 +5.984204E-01 +1.119676E-01 +1.600304E+00 +1.060307E+00 +6.251595E-01 +1.631053E-01 +5.084364E-01 +8.750385E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3349,18 +3347,22 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.056649E-01 -2.528092E-02 -2.212242E-01 -4.870093E-02 -8.268043E-01 -2.499121E-01 -5.858178E-01 -1.482815E-01 -4.753061E-02 -2.259158E-03 0.000000E+00 0.000000E+00 +1.482851E-01 +2.198847E-02 +8.661057E-02 +3.979426E-03 +5.328694E-01 +1.185445E-01 +9.819716E-02 +6.261752E-03 +1.971175E-01 +3.885531E-02 +5.055466E-01 +1.332461E-01 +1.737497E-01 +3.018896E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3381,22 +3383,24 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.448612E-01 +3.179981E-02 +1.336292E+00 +6.509631E-01 +1.788953E+00 +9.402141E-01 +6.484030E-01 +1.952075E-01 +1.239995E-01 +9.457065E-03 +5.379761E-01 +9.948097E-02 +3.422476E-01 +3.688467E-02 +1.310833E-01 +9.116867E-03 0.000000E+00 0.000000E+00 -1.275494E-01 -1.626884E-02 -8.930936E-01 -4.412573E-01 -1.069465E+00 -3.083849E-01 -5.312952E-01 -1.686403E-01 -3.756270E-01 -7.982176E-02 -6.071797E-01 -1.008227E-01 -1.945731E-01 -2.288397E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3415,24 +3419,20 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -2.147490E-02 -4.611712E-04 -3.020948E-01 -4.980152E-02 -6.199369E-01 -1.339903E-01 -6.953972E-01 -2.667255E-01 -5.032688E-01 -1.089400E-01 -8.876085E-02 -2.663780E-03 +1.452794E-01 +7.962998E-03 +4.950124E-01 +1.019817E-01 +5.154252E-01 +1.349222E-01 +2.369650E-01 +5.615241E-02 +3.458235E-02 +1.195939E-03 1.129905E-02 1.276685E-04 -3.194782E-02 -1.020663E-03 +2.144713E-01 +2.715780E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3453,18 +3453,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -4.936255E-03 -2.436661E-05 -1.854356E-01 -3.062993E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3475,6 +3463,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.439196E-02 +4.146324E-03 +9.319271E-01 +3.289332E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3483,6 +3475,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +8.887911E-02 +4.077886E-03 +1.394014E-01 +1.214028E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3513,6 +3509,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.093347E-01 +4.640925E-02 +5.656636E-01 +1.123158E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3735,10 +3735,10 @@ tally 1: 0.000000E+00 1.203590E-02 1.448628E-04 -9.089783E-01 -3.025426E-01 -4.101062E-02 -1.363081E-03 +8.166865E-01 +2.864876E-01 +2.182247E-01 +3.276791E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3769,10 +3769,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.394140E-02 -5.731908E-04 -2.225881E-01 -4.954545E-02 +3.880416E-02 +7.940924E-04 +2.944035E-01 +5.470290E-02 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3781,8 +3783,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.901226E-02 -3.614661E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3797,10 +3797,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.232218E-03 -2.737611E-05 -2.699331E-01 -7.286389E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3833,8 +3833,8 @@ tally 1: 0.000000E+00 3.625873E-02 1.314696E-03 -9.527085E-02 -9.076535E-03 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3859,14 +3859,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +1.282000E-01 +1.643523E-02 +8.992357E-04 +8.086249E-07 +4.549792E-02 +2.070061E-03 +2.792616E-01 +7.798705E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3891,16 +3891,16 @@ tally 1: 2.325049E-04 0.000000E+00 0.000000E+00 -5.591708E-01 -3.126720E-01 -3.457017E-02 -1.195097E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.186688E-01 +4.781605E-02 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3929,18 +3929,22 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.005099E-01 -4.873543E-02 -2.482142E-01 -4.941861E-02 -1.464043E-02 -2.143420E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.799587E-02 +7.837689E-04 0.000000E+00 0.000000E+00 +2.165781E-01 +4.136640E-02 +1.206583E-01 +1.455843E-02 +3.350979E-02 +1.122906E-03 +1.254721E-01 +1.574324E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3957,6 +3961,24 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.255610E-02 +1.576557E-04 +2.059029E-01 +2.931063E-02 +9.625207E-02 +9.264462E-03 +4.926052E-01 +1.231087E-01 +3.607423E-01 +6.495313E-02 +2.101048E-01 +2.385810E-02 +7.843494E-01 +1.955825E-01 +9.077784E-01 +3.297447E-01 +3.922359E-03 +1.538490E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3965,18 +3987,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.139114E-01 -1.297580E-02 -1.219324E-01 -1.125290E-02 -6.096339E-02 -3.716535E-03 -2.370045E-02 -5.617113E-04 -2.338106E-01 -2.733856E-02 -6.042735E-02 -3.651465E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3987,8 +3997,20 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.913074E-02 +1.799353E-03 +1.249107E-02 +1.560268E-04 0.000000E+00 0.000000E+00 +1.115404E+00 +4.366528E-01 +3.732357E-01 +4.158215E-02 +3.846227E-01 +8.126419E-02 +6.157885E-01 +1.590298E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3997,22 +4019,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.026371E-02 -4.106181E-04 -1.407747E-01 -1.661272E-02 -2.901913E-01 -8.421099E-02 -1.716410E+00 -1.502067E+00 -2.139592E-01 -1.215205E-02 -3.926381E-01 -8.132843E-02 -2.213252E-01 -2.664541E-02 -1.620099E-01 -2.624722E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4031,22 +4037,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.163882E-01 -1.978213E-01 -4.192042E-02 -1.757322E-03 -0.000000E+00 -0.000000E+00 -8.855834E-03 -7.842579E-05 -0.000000E+00 -0.000000E+00 +5.663121E-01 +1.953137E-01 +4.644811E-01 +1.590726E-01 +5.000400E-02 +1.273713E-03 +2.811483E-02 +7.904436E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4055,6 +4053,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +4.950896E-02 +2.451137E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4339,10 +4339,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.248694E-01 -4.178173E-02 -2.015109E-01 -2.180554E-02 +0.000000E+00 +0.000000E+00 +1.281618E-01 +1.642545E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4373,12 +4373,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.775166E-01 -3.538689E-01 -1.077083E+00 -2.861243E-01 -3.389587E-01 -8.732863E-02 +1.429077E-02 +2.042262E-04 +5.105813E-01 +9.939542E-02 +1.956841E-01 +3.829226E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4407,14 +4407,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.278622E-01 -9.618710E-03 -4.878786E-01 -1.035002E-01 -2.623630E-01 -2.385512E-02 -5.373920E-02 -2.887901E-03 +2.524256E-01 +3.390159E-02 +5.341258E-01 +7.612387E-02 +1.129256E-01 +5.367542E-03 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4439,16 +4439,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -7.796193E-03 -6.078062E-05 -2.370024E-01 -5.617015E-02 -2.378547E-01 -5.657486E-02 -0.000000E+00 -0.000000E+00 +1.789538E-02 +3.202447E-04 +1.070161E-01 +1.145246E-02 +2.004171E-01 +4.016700E-02 +9.277615E-02 +4.350522E-03 +3.796585E-03 +1.441406E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4475,10 +4475,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.812701E-02 +7.911289E-04 0.000000E+00 0.000000E+00 -4.102160E-02 -1.682772E-03 +7.255598E-01 +2.637695E-01 +4.236781E-01 +1.206021E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4507,10 +4511,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.088786E-02 -5.025089E-03 0.000000E+00 0.000000E+00 +3.455666E-01 +1.088929E-01 +1.077941E-01 +5.813092E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4535,8 +4541,22 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +8.759532E-03 +7.672939E-05 +3.873698E-01 +1.500554E-01 +3.320720E-02 +5.664804E-04 +9.751133E-01 +4.762440E-01 +3.549373E-01 +1.259805E-01 0.000000E+00 0.000000E+00 +4.558589E-03 +2.078073E-05 +1.147837E-01 +1.317530E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4551,12 +4571,24 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.601108E-02 -1.296798E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.491942E-01 +1.942842E-02 +1.215608E-02 +7.465030E-05 +9.749153E-01 +3.525441E-01 +1.238276E+00 +4.724746E-01 +7.559328E-01 +1.539006E-01 +7.550630E-01 +2.671451E-01 +4.016529E-01 +1.049033E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4577,24 +4609,20 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.772849E-01 -3.142995E-02 -1.629085E+00 -7.553358E-01 -5.130574E-01 -1.026482E-01 -5.456703E-01 -1.139540E-01 -5.551969E-01 -1.452833E-01 -2.630569E-01 -2.654789E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.915923E-01 +1.106962E-02 +1.039274E+00 +3.820648E-01 +6.748249E-01 +1.513006E-01 +5.553735E-02 +3.084397E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4611,18 +4639,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.711181E-02 -7.588468E-03 -2.593229E-01 -4.929782E-02 -2.365670E-01 -1.635697E-02 -1.481640E+00 -5.785514E-01 -1.000401E+00 -2.814448E-01 -6.430985E-01 -1.924484E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4817,6 +4833,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.061692E-01 +1.127190E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4849,6 +4867,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.912282E-01 +3.656822E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4899,6 +4919,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.289827E-01 +1.075283E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4919,10 +4941,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.624881E-02 -2.640238E-04 -1.075983E-01 -1.157740E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4935,6 +4953,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.320797E+00 +4.972727E-01 +4.301105E-01 +6.331514E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4949,16 +4971,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.629487E-02 -3.169112E-03 -8.055202E-02 -6.488629E-03 -1.251664E+00 -7.810326E-01 -1.181564E+00 -3.437055E-01 -1.053167E-02 -1.109161E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4971,6 +4983,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +4.915487E-02 +2.416202E-03 +9.120705E-02 +8.318727E-03 +1.320105E+00 +4.411682E-01 +6.959590E-01 +2.389648E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4983,26 +5003,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.454179E-02 -2.652959E-03 -5.029692E-01 -1.783517E-01 -1.339070E+00 -4.343746E-01 -8.199937E-01 -2.745378E-01 -1.173457E-01 -1.377002E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.736827E-02 -2.243753E-03 5.662623E-02 3.206529E-03 0.000000E+00 @@ -5017,16 +5017,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.166586E-02 +1.360923E-04 +1.891160E-02 +3.576487E-04 +1.256901E+00 +4.792247E-01 +1.364915E-01 +1.696517E-02 0.000000E+00 0.000000E+00 -1.927614E-01 -2.918695E-02 -7.330554E-01 -1.766129E-01 -1.008246E-01 -7.669486E-03 -1.448854E-02 -2.099179E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5055,12 +5055,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.565334E-01 -2.186541E-01 -5.729858E-02 -3.283127E-03 -9.691043E-02 -9.391631E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5123,14 +5123,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.925951E-02 +4.796880E-03 +1.765581E-01 +2.014257E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -7.494206E-02 -5.616313E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5155,18 +5157,18 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.724677E-02 -3.277192E-03 -1.383438E-01 -1.452928E-02 -2.848872E-02 -8.116069E-04 -3.524549E-01 -5.552654E-02 -4.295071E-01 -9.355140E-02 -1.311425E-03 -1.719836E-06 +1.007236E-01 +1.014525E-02 +3.069376E-01 +6.982061E-02 +1.339942E+00 +5.632235E-01 +8.027545E-01 +2.263816E-01 +1.881835E-01 +3.541303E-02 +2.824222E-02 +7.976228E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5189,26 +5191,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.834417E-02 -2.211153E-03 -1.613421E-01 -2.257097E-02 -1.472879E-01 -2.169372E-02 -4.810374E-01 -8.988575E-02 -6.467051E-01 -1.822459E-01 -1.547275E-01 -2.394060E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 0.000000E+00 0.000000E+00 +6.475515E-01 +1.949499E-01 +8.916929E-01 +2.187649E-01 +9.737449E-01 +4.547148E-01 +1.905118E-01 +3.629474E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5419,6 +5411,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.851330E-02 +8.130086E-04 +1.696747E-01 +2.878950E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5449,6 +5445,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.753509E-02 +7.581810E-04 +2.514105E-01 +5.075004E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5495,12 +5495,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.687121E-01 -2.627261E-02 -1.004106E-01 -1.008228E-02 -3.964673E-02 -1.571863E-03 +0.000000E+00 +0.000000E+00 +6.990313E-02 +4.886448E-03 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5527,14 +5527,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.594872E-01 -9.743264E-02 -8.625384E-01 -2.783049E-01 -3.514218E-03 -1.234973E-05 -1.894941E-01 -2.742554E-02 +6.620581E-01 +1.938858E-01 +4.607570E-02 +1.247203E-03 +0.000000E+00 +0.000000E+00 +2.593018E-02 +6.723742E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5545,8 +5545,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.861976E-01 -3.466955E-02 +3.904410E-02 +1.524442E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5561,12 +5561,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.293501E-01 -5.455683E-02 -2.937497E-01 -8.628891E-02 -6.693709E-01 -1.892115E-01 +3.389223E-01 +5.464846E-02 +1.061647E-01 +1.127094E-02 +1.313508E+00 +4.346493E-01 4.161910E-02 1.732150E-03 0.000000E+00 @@ -5579,8 +5579,8 @@ tally 1: 0.000000E+00 4.016283E-01 1.613053E-01 -4.606785E-01 -1.064675E-01 +5.599819E-01 +9.812234E-02 5.139185E-01 1.322866E-01 2.373992E-01 @@ -5597,10 +5597,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.911517E-01 -3.262245E-02 -3.678584E-01 -7.759535E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5631,8 +5631,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.179923E-02 -2.683160E-03 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5735,6 +5735,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.532915E-01 +2.349830E-02 +0.000000E+00 +0.000000E+00 +2.637807E-03 +6.958026E-06 +9.521605E-03 +9.066095E-05 +7.905417E-02 +6.249562E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5763,20 +5773,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.772980E-01 -3.143459E-02 -0.000000E+00 -0.000000E+00 +5.147382E-02 +2.649554E-03 +1.719918E-01 +1.490049E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5989,12 +5989,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.231433E-01 -5.413470E-02 -3.993293E-01 -6.467221E-02 -1.519610E-01 -1.155574E-02 +1.305564E-01 +1.704497E-02 +3.518664E-01 +6.212556E-02 +7.817833E-02 +6.111852E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6025,10 +6025,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.649249E-01 -3.073604E-02 -8.553717E-01 -3.211418E-01 +4.740424E-01 +8.028915E-02 +8.000570E-01 +3.176809E-01 5.666391E-01 2.831913E-01 1.643713E-02 @@ -6073,10 +6073,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.186326E-01 -1.190957E-02 -1.107282E-01 -1.226074E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6095,6 +6091,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +9.873816E-02 +9.749225E-03 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 6.179053E-03 @@ -6105,12 +6105,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.475983E-02 -2.178526E-04 -1.747711E+00 -8.535011E-01 -7.461108E-02 -5.566814E-03 +1.154173E-01 +1.332115E-02 +5.192203E-01 +1.359491E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6123,28 +6121,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.833423E-01 -3.201970E-02 -1.016493E-02 -1.033258E-04 -3.086254E-01 -9.524964E-02 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.668929E-02 -7.417426E-04 -1.031629E-01 -8.133494E-03 -2.133233E-01 -4.550684E-02 +3.643669E-01 +3.773661E-02 +1.333650E-01 +1.778623E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6157,28 +6139,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.950700E-01 -3.542385E-02 -1.821781E-01 -3.288596E-02 -2.994706E-01 -3.126060E-02 -3.853993E-01 -1.485326E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.946618E-02 -3.536227E-03 -6.995394E-02 -4.893554E-03 -3.103240E-01 -5.643704E-02 +3.057922E-02 +4.821714E-04 +2.611439E-02 +4.539126E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6189,16 +6153,52 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.934409E-02 -3.268161E-03 -2.618772E-02 -6.857965E-04 0.000000E+00 0.000000E+00 -1.910915E-01 -1.213214E-02 -5.264194E-01 -1.438040E-01 +0.000000E+00 +0.000000E+00 +4.328371E-01 +6.083581E-02 +3.822069E-02 +1.398374E-03 +1.903328E-01 +2.231214E-02 +3.952764E-01 +1.486302E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.256222E-02 +1.578095E-04 +9.794148E-02 +9.592534E-03 +1.849303E-01 +1.553794E-02 +7.480357E-01 +1.929178E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6529,8 +6529,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.886952E-02 -3.465621E-03 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6653,8 +6653,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.911625E-02 -6.259380E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6669,14 +6667,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.747648E-02 -1.404486E-03 -9.038474E-02 -8.169402E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +6.086518E-02 +3.704570E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6685,10 +6681,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.907522E-01 -3.638640E-02 -3.376837E-02 -1.140303E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6703,10 +6695,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.260430E-02 -1.063040E-03 -4.728569E-02 -2.235937E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6715,14 +6703,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +4.249148E-02 +1.805526E-03 +1.045383E+00 +4.214718E-01 +3.878770E-02 +1.504486E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -8.942084E-02 -7.996086E-03 -3.382348E-02 -1.144027E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6737,10 +6727,20 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.663872E-01 -5.237415E-01 -1.495861E+00 -7.117933E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.784801E-02 +7.755114E-04 +6.779315E-01 +3.352682E-01 3.026790E-01 9.161460E-02 0.000000E+00 @@ -6767,16 +6767,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.127783E-01 -2.689445E-01 -6.677764E-01 -2.034903E-01 +1.879990E-01 +2.203070E-02 0.000000E+00 0.000000E+00 -1.272042E+00 -5.287947E-01 -4.856872E-02 -2.358920E-03 +0.000000E+00 +0.000000E+00 +9.811002E-01 +4.685901E-01 +1.404927E-01 +1.080893E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6801,12 +6801,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.244965E-01 -1.453503E-01 -7.596171E-01 -1.897008E-01 -1.137881E-01 -1.294772E-02 +7.572692E-01 +2.087347E-01 +2.362405E-01 +4.910426E-02 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 1.965530E-01 @@ -6835,12 +6835,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -3.595460E-02 -1.292733E-03 -1.651469E-02 -2.727349E-04 +1.751268E-03 +3.066940E-06 +1.553462E-01 +2.413243E-02 +1.672350E-01 +2.796753E-02 0.000000E+00 0.000000E+00 1.836178E-02 @@ -6941,6 +6941,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.696487E-02 +1.366401E-03 +2.858087E-01 +8.168661E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6969,14 +6973,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.052881E-01 -1.108559E-02 -0.000000E+00 -0.000000E+00 +1.258698E-01 +1.150919E-02 +6.798857E-01 +1.661025E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7007,12 +7007,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.003097E-01 -2.774596E-01 -5.697479E-01 -1.238519E-01 -1.088816E-02 -1.185520E-04 +1.008727E+00 +3.651038E-01 +9.120679E-01 +2.558101E-01 +8.721740E-03 +7.606874E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7039,16 +7039,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.182615E-02 -2.685950E-03 -2.603394E-01 -5.501423E-02 -2.189565E-01 -1.689961E-02 -1.037124E-01 -1.075626E-02 0.000000E+00 0.000000E+00 +2.739345E-02 +7.504010E-04 +1.627060E-02 +2.647323E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7107,12 +7103,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.145166E-01 -1.639307E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.309730E-01 +2.570742E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7141,8 +7137,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.237360E+00 -3.492227E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.115905E+00 +4.082126E-01 2.502204E-02 6.261023E-04 0.000000E+00 @@ -7247,12 +7247,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -9.753553E-02 -9.513180E-03 -1.448897E-02 -2.099304E-04 0.000000E+00 0.000000E+00 +2.207099E-01 +4.871286E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7285,6 +7283,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +9.075694E-02 +8.236821E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7315,10 +7315,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.767451E-02 +3.123882E-04 +8.696348E-02 +7.562648E-03 0.000000E+00 0.000000E+00 -8.072240E-01 -2.272369E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7345,16 +7347,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.679628E-02 -1.915958E-04 -2.060666E-01 -4.246344E-02 -9.954401E-04 -9.909010E-07 -7.940105E-02 -6.304526E-03 0.000000E+00 0.000000E+00 +1.690390E-01 +2.753878E-02 +1.145975E-01 +7.543314E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7379,14 +7377,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.430716E-01 -3.335909E-02 -4.349688E-01 -6.259047E-02 -4.848533E-02 -1.782050E-03 0.000000E+00 0.000000E+00 +2.712297E-01 +3.081804E-02 +1.728614E-01 +2.076746E-02 +6.826625E-03 +4.660281E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7415,10 +7413,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.242016E-02 -5.026638E-04 -2.677921E-01 -2.943321E-02 +2.649622E-02 +7.020499E-04 +4.161446E-01 +8.806248E-02 +6.348647E-01 +9.989011E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7451,6 +7451,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.204982E-02 +1.451982E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7551,12 +7553,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.608891E-02 -4.586038E-03 +2.282300E-01 +4.986445E-02 +2.206365E-02 +4.868048E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7587,10 +7587,10 @@ tally 1: 0.000000E+00 1.875562E-01 3.517735E-02 -5.878488E-01 -1.352380E-01 -5.442859E-01 -1.595781E-01 +7.738485E-01 +2.045432E-01 +4.058292E-01 +8.243188E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7623,16 +7623,18 @@ tally 1: 0.000000E+00 4.994213E-01 2.494217E-01 +2.744213E-02 +7.530707E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.949405E-02 +7.018464E-04 0.000000E+00 0.000000E+00 -2.758048E-01 -6.072497E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7659,14 +7661,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +8.459022E-03 +7.155505E-05 +3.090219E-01 +9.549453E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.606443E-01 -6.793546E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7681,12 +7685,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +7.226097E-01 +1.395661E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.686503E-01 -6.346661E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7715,14 +7719,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.316493E-01 +1.591047E-02 +6.576990E-01 +1.877309E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.533157E-01 -1.071208E-02 -5.401851E-01 -1.739213E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7749,14 +7753,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +4.546941E-01 +7.107193E-02 +3.321871E-01 +6.515778E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.221279E+00 -4.624743E-01 -3.697846E-01 -6.689364E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7787,10 +7791,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.040339E-01 -4.162983E-02 -3.778476E-02 -1.427688E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7861,8 +7861,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.946272E-02 -3.535814E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7895,8 +7893,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.120645E-02 -9.738427E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7931,6 +7927,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +8.249399E-02 +4.667888E-03 +1.814462E-01 +3.292273E-02 7.515014E-02 5.647544E-03 0.000000E+00 @@ -7957,14 +7957,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.638111E-01 -6.959629E-02 +0.000000E+00 +0.000000E+00 3.109046E-01 8.622176E-02 -2.304832E-01 -3.175419E-02 -6.218789E-02 -3.867333E-03 +2.380422E-01 +3.181133E-02 +1.087532E-01 +6.035666E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7995,8 +7995,8 @@ tally 1: 0.000000E+00 5.246408E-03 2.752480E-05 -1.779567E-01 -2.094888E-02 +3.760855E-02 +1.251291E-03 5.951856E-02 3.037461E-03 0.000000E+00 @@ -8141,6 +8141,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.395650E-01 +1.947839E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8163,18 +8165,20 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.822292E-01 +4.829456E-02 +6.080756E-02 +3.418907E-03 0.000000E+00 0.000000E+00 -7.333695E-02 -4.658577E-03 -2.790184E-02 -6.568068E-04 -0.000000E+00 -0.000000E+00 -1.525932E-01 -2.328469E-02 +1.804108E-01 +2.405851E-02 5.413665E-02 2.930777E-03 +4.041026E-01 +8.374291E-02 +5.886833E-02 +3.465481E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8197,20 +8201,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +7.093664E-02 +5.032006E-03 5.703113E-02 3.252549E-03 -8.140441E-01 -2.724079E-01 -5.579561E-01 -2.869147E-01 -2.207115E-01 -4.871356E-02 +7.402747E-01 +2.678271E-01 +2.389658E-02 +5.209213E-04 +5.348373E-01 +8.455667E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8239,10 +8239,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.039206E-01 -1.196352E-01 -3.885001E-01 -7.594576E-02 +5.453284E-01 +1.497004E-01 +1.851055E-01 +1.721223E-02 +1.038418E-01 +1.078313E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8261,6 +8263,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.010211E-02 +3.612264E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8293,6 +8297,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.319919E-02 +3.629541E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8325,14 +8331,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.137844E-02 -5.984482E-03 +1.292774E-01 +8.674372E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8747,14 +8747,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -4.235904E-01 -1.794288E-01 -2.296533E-01 -2.653997E-02 -1.867564E-01 -3.487796E-02 0.000000E+00 0.000000E+00 +4.601224E-01 +1.283387E-01 +4.851011E-01 +1.238875E-01 +1.351214E-02 +1.825779E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8781,12 +8781,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.285152E-02 -5.700776E-03 -1.646014E+00 -6.255979E-01 -9.809995E-01 -3.058040E-01 +7.746478E-03 +6.000792E-05 +1.551243E+00 +5.797918E-01 +1.974875E-01 +1.837196E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8817,10 +8817,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.189281E-01 -4.001687E-02 -1.431247E-02 -2.048469E-04 +2.541705E-01 +4.325743E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8851,8 +8853,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -9.579949E-02 -9.177542E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -9359,12 +9359,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.668786E-02 +2.784846E-04 +2.256035E-01 +5.089693E-02 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 -2.836882E-01 -8.047901E-02 -5.295973E-02 -2.804733E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -9395,8 +9397,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.405305E-01 -5.483854E-01 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_filter_universe/results_true.dat b/tests/test_filter_universe/results_true.dat index c63da0083d..856d97d593 100644 --- a/tests/test_filter_universe/results_true.dat +++ b/tests/test_filter_universe/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -6.369043E+01 -8.385422E+02 -7.330762E+00 -1.137874E+01 -5.011385E+01 -5.251276E+02 -5.132453E+00 -5.801019E+00 +5.803437E+01 +7.324822E+02 +7.168085E+00 +1.101286E+01 +5.815302E+01 +7.373019E+02 +5.778029E+00 +7.558661E+00 diff --git a/tests/test_infinite_cell/results_true.dat b/tests/test_infinite_cell/results_true.dat index 45eaa4f917..0b8d929518 100644 --- a/tests/test_infinite_cell/results_true.dat +++ b/tests/test_infinite_cell/results_true.dat @@ -1,2 +1,2 @@ k-combined: -9.998895E-02 2.846817E-04 +9.788797E-02 1.378250E-03 diff --git a/tests/test_lattice_mixed/results_true.dat b/tests/test_lattice_mixed/results_true.dat index d23feb91f0..7cea76ba00 100644 --- a/tests/test_lattice_mixed/results_true.dat +++ b/tests/test_lattice_mixed/results_true.dat @@ -1,2 +1,2 @@ k-combined: -9.605085E-01 8.180822E-03 +9.922449E-01 1.281824E-02 diff --git a/tests/test_lattice_multiple/results_true.dat b/tests/test_lattice_multiple/results_true.dat index f2e3d93c93..6caffdd953 100644 --- a/tests/test_lattice_multiple/results_true.dat +++ b/tests/test_lattice_multiple/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 diff --git a/tests/test_many_scores/results_true.dat b/tests/test_many_scores/results_true.dat index 191122f13e..ab1c43254f 100644 --- a/tests/test_many_scores/results_true.dat +++ b/tests/test_many_scores/results_true.dat @@ -1,111 +1,111 @@ k-combined: 0.000000E+00 0.000000E+00 tally 1: -2.254760E+01 -1.695439E+02 -1.017400E+01 -3.450623E+01 -8.690000E+00 -2.517771E+01 -8.696000E+00 -2.521248E+01 -5.224881E-01 -9.127522E-02 -8.690000E+00 -2.517771E+01 -9.665236E-01 -3.121401E-01 -5.224881E-01 -9.127522E-02 -5.199964E-01 -9.041516E-02 -8.696000E+00 -2.521248E+01 -9.666447E-01 -3.122176E-01 -5.199964E-01 -9.041516E-02 -9.262308E+00 -2.859762E+01 -8.684000E+00 -2.514296E+01 -1.484000E+00 -7.346160E-01 -1.804688E+00 -1.089100E+00 -1.334833E+02 -5.960573E+03 -2.254760E+01 -1.695439E+02 --6.230152E-02 -1.023784E-02 --2.696818E-01 -8.525477E-02 --1.670294E-01 -4.366614E-02 -1.331953E-02 -8.064039E-05 --2.490295E-01 -2.511425E-02 -8.289978E-02 -2.753446E-03 --1.390686E-01 -1.592673E-02 -1.600203E-01 -1.344513E-02 -1.017400E+01 -3.450623E+01 --6.564301E-02 -2.564587E-03 --1.245391E-01 -1.143479E-02 --5.550309E-02 -9.334547E-03 -4.671277E-02 -1.795787E-03 --9.901000E-02 -4.609654E-03 -2.619012E-02 -3.011793E-04 --7.090362E-02 -2.450750E-03 -4.059073E-02 -8.841300E-04 -8.690000E+00 -2.517771E+01 --2.685052E-02 -2.769798E-04 -4.047919E-03 -3.384947E-03 --1.325869E-01 -8.610169E-03 --1.594962E-02 -5.528670E-04 --1.320550E-02 -1.856248E-04 -1.185337E-02 -3.428536E-04 -2.622196E-02 -3.774884E-04 -2.938463E-02 -6.660370E-04 -8.696000E+00 -2.521248E+01 --2.634867E-02 -2.718345E-04 -4.042613E-03 -3.367272E-03 --1.328903E-01 -8.576852E-03 --1.632965E-02 -5.577169E-04 --1.408565E-02 -1.815109E-04 -1.202519E-02 -3.685250E-04 -2.634054E-02 -3.730853E-04 -2.941341E-02 -6.479457E-04 +2.247257E+01 +1.683779E+02 1.014000E+01 -3.427460E+01 +3.427342E+01 +8.628000E+00 +2.481430E+01 +8.628000E+00 +2.481430E+01 +5.102293E-01 +8.710841E-02 +8.628000E+00 +2.481430E+01 +9.329009E-01 +2.902534E-01 +5.102293E-01 +8.710841E-02 +5.102293E-01 +8.710841E-02 +8.628000E+00 +2.481430E+01 +9.329009E-01 +2.902534E-01 +5.102293E-01 +8.710841E-02 +9.212024E+00 +2.829472E+01 +8.628000E+00 +2.481430E+01 +1.512000E+00 +7.620560E-01 +1.816851E+00 +1.102658E+00 +1.338067E+02 +5.986137E+03 +2.247257E+01 +1.683779E+02 +-1.512960E-01 +2.623972E-02 +-3.775020E-01 +1.055377E-01 +-1.916133E-01 +4.680798E-02 +2.754367E-02 +3.320008E-04 +-2.028374E-02 +1.319357E-02 +8.974271E-03 +1.681081E-03 +-1.658978E-01 +1.520448E-02 +2.878360E-01 +5.645480E-02 +1.014000E+01 +3.427342E+01 +-4.798897E-02 +1.551226E-03 +-1.818770E-01 +1.492633E-02 +-6.340651E-02 +9.011305E-03 +3.395308E-02 +4.612818E-04 +-2.640250E-02 +6.434787E-04 +-8.242639E-03 +9.516540E-04 +-8.378601E-02 +2.645988E-03 +9.567484E-02 +7.262477E-03 +8.628000E+00 +2.481430E+01 +-4.712248E-02 +1.140942E-03 +-6.431930E-02 +4.290580E-03 +-9.251642E-02 +8.134201E-03 +1.020119E-04 +1.154184E-04 +-2.994164E-02 +3.079076E-04 +2.128844E-02 +2.046549E-04 +1.637972E-02 +1.459209E-04 +4.629047E-02 +7.823267E-04 +8.628000E+00 +2.481430E+01 +-4.712248E-02 +1.140942E-03 +-6.431930E-02 +4.290580E-03 +-9.251642E-02 +8.134201E-03 +1.020119E-04 +1.154184E-04 +-2.994164E-02 +3.079076E-04 +2.128844E-02 +2.046549E-04 +1.637972E-02 +1.459209E-04 +4.629047E-02 +7.823267E-04 +1.014000E+01 +3.427342E+01 diff --git a/tests/test_natural_element/results_true.dat b/tests/test_natural_element/results_true.dat index 4b132ea37d..1c8668e128 100644 --- a/tests/test_natural_element/results_true.dat +++ b/tests/test_natural_element/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.053229E+00 9.241274E-02 +1.013112E+00 2.551515E-02 diff --git a/tests/test_output/results_true.dat b/tests/test_output/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_output/results_true.dat +++ b/tests/test_output/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_particle_restart_eigval/results_true.dat b/tests/test_particle_restart_eigval/results_true.dat index a93cbb27b2..bbc23fb6ef 100644 --- a/tests/test_particle_restart_eigval/results_true.dat +++ b/tests/test_particle_restart_eigval/results_true.dat @@ -1,16 +1,16 @@ current batch: -1.200000E+01 +9.000000E+00 current gen: 1.000000E+00 particle id: -6.160000E+02 +5.550000E+02 run mode: 2.000000E+00 particle weight: 1.000000E+00 particle energy: -3.545295E-01 +2.831611E-01 particle xyz: -3.516323E+01 -5.400148E+01 -1.588825E+01 +4.973847E+01 6.971699E+00 -5.201827E+01 particle uvw: -4.129799E-01 7.649720E-01 4.942322E-01 +6.945105E-01 6.295355E-01 -3.483393E-01 diff --git a/tests/test_particle_restart_eigval/test_particle_restart_eigval.py b/tests/test_particle_restart_eigval/test_particle_restart_eigval.py index 64123b2e09..a9f4563d0a 100644 --- a/tests/test_particle_restart_eigval/test_particle_restart_eigval.py +++ b/tests/test_particle_restart_eigval/test_particle_restart_eigval.py @@ -6,5 +6,5 @@ from testing_harness import ParticleRestartTestHarness if __name__ == '__main__': - harness = ParticleRestartTestHarness('particle_12_616.*') + harness = ParticleRestartTestHarness('particle_9_555.*') harness.main() diff --git a/tests/test_ptables_off/results_true.dat b/tests/test_ptables_off/results_true.dat index 17d6e91453..2d6511cd25 100644 --- a/tests/test_ptables_off/results_true.dat +++ b/tests/test_ptables_off/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.984064E-01 3.464413E-03 +2.998034E-01 5.227986E-03 diff --git a/tests/test_reflective_cone/results_true.dat b/tests/test_reflective_cone/results_true.dat index 60b34bf66b..c8b833bff4 100644 --- a/tests/test_reflective_cone/results_true.dat +++ b/tests/test_reflective_cone/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.281477E+00 5.206704E-03 +2.269987E+00 4.469683E-03 diff --git a/tests/test_reflective_cylinder/results_true.dat b/tests/test_reflective_cylinder/results_true.dat index f98c517889..0a11f3ef31 100644 --- a/tests/test_reflective_cylinder/results_true.dat +++ b/tests/test_reflective_cylinder/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.276055E+00 3.186526E-03 +2.272436E+00 7.831006E-04 diff --git a/tests/test_reflective_plane/results_true.dat b/tests/test_reflective_plane/results_true.dat index 049d45606c..c5ba8e63fb 100644 --- a/tests/test_reflective_plane/results_true.dat +++ b/tests/test_reflective_plane/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.281505E+00 3.254688E-03 +2.276127E+00 4.678320E-03 diff --git a/tests/test_reflective_sphere/results_true.dat b/tests/test_reflective_sphere/results_true.dat index 47aa5c763e..f25a72dc95 100644 --- a/tests/test_reflective_sphere/results_true.dat +++ b/tests/test_reflective_sphere/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.280812E+00 5.087968E-03 +2.271012E+00 3.466350E-03 diff --git a/tests/test_resonance_scattering/results_true.dat b/tests/test_resonance_scattering/results_true.dat index 62b0ac2239..0dda991cac 100644 --- a/tests/test_resonance_scattering/results_true.dat +++ b/tests/test_resonance_scattering/results_true.dat @@ -1,2 +1,2 @@ k-combined: -6.452021E-02 1.738736E-03 +6.842112E-02 8.480934E-04 diff --git a/tests/test_rotation/results_true.dat b/tests/test_rotation/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_rotation/results_true.dat +++ b/tests/test_rotation/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_salphabeta/results_true.dat b/tests/test_salphabeta/results_true.dat index c2cd683bed..a04ee8fc89 100644 --- a/tests/test_salphabeta/results_true.dat +++ b/tests/test_salphabeta/results_true.dat @@ -1,2 +1,2 @@ k-combined: -8.418898E-01 5.633536E-03 +8.538165E-01 6.355606E-03 diff --git a/tests/test_salphabeta_multiple/results_true.dat b/tests/test_salphabeta_multiple/results_true.dat index 57e620610a..593c5adc74 100644 --- a/tests/test_salphabeta_multiple/results_true.dat +++ b/tests/test_salphabeta_multiple/results_true.dat @@ -1,2 +1,2 @@ k-combined: -9.686128E-01 5.056987E-02 +9.141547E-01 2.728809E-02 diff --git a/tests/test_score_MT/results_true.dat b/tests/test_score_MT/results_true.dat index 03b91f89fa..248f6657d0 100644 --- a/tests/test_score_MT/results_true.dat +++ b/tests/test_score_MT/results_true.dat @@ -1,5 +1,5 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 @@ -9,27 +9,27 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.107640E-02 -4.232516E-05 -1.107640E-02 -4.232516E-05 -3.509526E-01 -2.565440E-02 -1.171523E+00 -2.824070E-01 -5.592851E-04 -1.423656E-07 -5.592851E-04 -1.423656E-07 -3.027322E-02 -1.983924E-04 -1.477313E-02 -4.495633E-05 +6.261679E-03 +2.310296E-05 +6.261679E-03 +2.310296E-05 +3.434524E-01 +2.482946E-02 +1.059004E+00 +2.432555E-01 +3.828838E-04 +9.365499E-08 +3.828838E-04 +9.365499E-08 +3.226036E-02 +2.229037E-04 +1.450446E-02 +4.382852E-05 8.650696E-08 7.483455E-15 8.650696E-08 7.483455E-15 -1.097403E-04 -3.424171E-09 -6.866942E-02 -9.952916E-04 +7.312640E-05 +2.080857E-09 +6.101318E-02 +8.452067E-04 diff --git a/tests/test_score_absorption/results_true.dat b/tests/test_score_absorption/results_true.dat index dfdadbae7a..bacbf26a37 100644 --- a/tests/test_score_absorption/results_true.dat +++ b/tests/test_score_absorption/results_true.dat @@ -1,20 +1,20 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 -2.267589E+00 -1.054691E+00 -1.476133E-02 -4.485759E-05 -3.306896E-01 -2.302248E-02 +2.006479E+00 +8.808050E-01 +1.444838E-02 +4.349668E-05 +2.926865E-01 +1.944083E-02 tally 2: 0.000000E+00 0.000000E+00 -2.290000E+00 -1.070700E+00 +2.030000E+00 +8.879000E-01 0.000000E+00 0.000000E+00 -3.800000E-01 -3.820000E-02 +4.000000E-01 +4.240000E-02 diff --git a/tests/test_score_current/results_true.dat b/tests/test_score_current/results_true.dat index 09d9a8ecf6..936e2d04bc 100644 --- a/tests/test_score_current/results_true.dat +++ b/tests/test_score_current/results_true.dat @@ -1 +1 @@ -8f7125c9686a94f0fdbd76b1667f84b9dab60c068e23d4f2b0105ce058fa533a8a4a221355614add10d54f3b18c14af41891e0fd0593154c73894e5dcb6fe5c2 \ No newline at end of file +1e6945632c55491d4584f4976cc6f5c7340874703cfaf739dd956b7124b4260955efb5b6ba041b32536f9a74572d071e0293dced55a41ea305223f698b734c2a \ No newline at end of file diff --git a/tests/test_score_events/results_true.dat b/tests/test_score_events/results_true.dat index fd18a5aba1..35ae33eb86 100644 --- a/tests/test_score_events/results_true.dat +++ b/tests/test_score_events/results_true.dat @@ -1,12 +1,12 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -5.627000E+01 -6.565251E+02 -4.892000E+01 -5.009100E+02 +5.328000E+01 +6.082750E+02 +5.594000E+01 +6.836068E+02 tally 2: -1.458000E+01 -4.391620E+01 -1.269000E+01 -3.363670E+01 +1.372000E+01 +4.018980E+01 +1.474000E+01 +4.802520E+01 diff --git a/tests/test_score_fission/results_true.dat b/tests/test_score_fission/results_true.dat index 1a3d333838..904c0d8895 100644 --- a/tests/test_score_fission/results_true.dat +++ b/tests/test_score_fission/results_true.dat @@ -1,20 +1,20 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.089685E+00 -2.438289E-01 +9.432574E-01 +1.970463E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -9.094323E-01 -1.773090E-01 +1.039280E+00 +2.345809E-01 tally 2: -1.081920E+00 -2.404883E-01 +8.953531E-01 +1.798609E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -9.945760E-01 -2.073005E-01 +9.923196E-01 +2.067216E-01 diff --git a/tests/test_score_flux/results_true.dat b/tests/test_score_flux/results_true.dat index 9c21a0f3d8..31e1d92926 100644 --- a/tests/test_score_flux/results_true.dat +++ b/tests/test_score_flux/results_true.dat @@ -1,15 +1,15 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -3.403102E+01 -2.393236E+02 -1.143060E+01 -2.704386E+01 -5.691243E+01 -6.685581E+02 -2.924945E+01 -1.782032E+02 -9.965051E+00 -2.067319E+01 -4.931805E+01 -5.050490E+02 +3.224218E+01 +2.217821E+02 +1.079687E+01 +2.494701E+01 +5.252579E+01 +5.951604E+02 +3.325822E+01 +2.414028E+02 +1.145800E+01 +2.880575E+01 +5.605671E+01 +6.804062E+02 diff --git a/tests/test_score_flux_yn/results_true.dat b/tests/test_score_flux_yn/results_true.dat index 8c04c7c898..2e5df97cf4 100644 --- a/tests/test_score_flux_yn/results_true.dat +++ b/tests/test_score_flux_yn/results_true.dat @@ -1,448 +1,448 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -3.403102E+01 -2.393236E+02 -1.143060E+01 -2.704386E+01 -5.691243E+01 -6.685581E+02 -2.924945E+01 -1.782032E+02 -9.965051E+00 -2.067319E+01 -4.931805E+01 -5.050490E+02 +3.224218E+01 +2.217821E+02 +1.079687E+01 +2.494701E+01 +5.252579E+01 +5.951604E+02 +3.325822E+01 +2.414028E+02 +1.145800E+01 +2.880575E+01 +5.605671E+01 +6.804062E+02 tally 2: -3.403102E+01 -2.393236E+02 --3.055588E-01 -3.594044E-02 -3.171128E-01 -3.805380E-01 --7.374877E-01 -2.391349E-01 --1.621986E-01 -5.578051E-02 -4.710459E-01 -1.850595E-01 --4.839599E-01 -2.440735E-01 -1.124798E-01 -8.640649E-02 --4.976706E-01 -8.943606E-02 -1.323704E-01 -6.713903E-02 --6.954103E-02 -7.876989E-02 -1.343675E-01 -2.569171E-02 --5.205013E-01 -7.985579E-02 -2.037295E-01 -1.501360E-01 --1.290735E-01 -5.069422E-02 --2.045060E-01 -2.197889E-01 -1.307602E-01 -5.938649E-02 --3.317004E-01 -1.359233E-01 --4.347480E-01 -7.528253E-02 -7.685982E-02 -4.559715E-02 --4.668784E-02 -4.065614E-02 -1.447872E-01 -5.538956E-02 --2.027337E-01 -7.095051E-02 --4.673353E-01 -1.235371E-01 --3.321732E-01 -6.905624E-02 --3.028859E-01 -3.382353E-02 --2.320613E-01 -2.845904E-02 -8.038034E-02 -3.466746E-02 -1.766484E-01 -9.996559E-02 -3.385184E-02 -5.510769E-02 -6.952638E-02 -2.741119E-02 -3.630715E-01 -5.336447E-02 -2.876222E-01 -9.938256E-02 --3.473240E-02 -1.031412E-01 -1.280013E-01 -2.331384E-02 -1.550774E-01 -3.881493E-02 -1.143060E+01 -2.704386E+01 --1.955516E-01 -9.789273E-03 -4.070149E-02 -3.530892E-02 --1.446334E-01 -3.374966E-02 --4.072014E-02 -1.407320E-02 -1.056190E-01 -2.144988E-02 --1.491728E-01 -1.699068E-02 -3.130540E-02 -4.945783E-03 --1.706770E-01 -6.943395E-03 -6.278466E-02 -4.522701E-03 --6.491915E-02 -1.218265E-02 --6.226375E-02 -8.920919E-03 --2.647477E-01 -2.028918E-02 --9.179913E-03 -1.186941E-02 --8.959288E-02 -9.826050E-03 --4.800079E-02 -3.500548E-02 -9.919028E-02 -1.278789E-02 --1.274511E-01 -9.357943E-03 --9.037073E-02 -4.686665E-03 --7.895199E-03 -8.526809E-03 --2.071827E-02 -5.844891E-03 --1.422877E-02 -2.008170E-03 --7.787500E-02 -9.642362E-03 --6.105504E-02 -7.600775E-03 --1.249117E-01 -1.314509E-02 --9.183605E-02 -7.513215E-03 --9.171222E-02 -4.220465E-03 -8.798390E-02 -5.037483E-03 -4.366496E-02 -8.411743E-03 -1.605678E-02 -6.994511E-03 --2.179875E-02 -1.352098E-03 -1.116755E-01 -7.354424E-03 -9.995739E-02 -9.710026E-03 -3.010324E-02 -1.179938E-02 -2.175815E-02 -1.281441E-03 -2.374886E-02 -6.943432E-03 -5.691243E+01 -6.685581E+02 --7.130295E-01 -1.971869E-01 -1.138602E+00 -1.071873E+00 --1.436194E+00 -7.200870E-01 --2.384966E-01 -1.129688E-01 -8.003085E-01 -5.809429E-01 --3.499868E-01 -3.310435E-01 -2.580763E-01 -2.238385E-01 --3.576056E-01 -1.437071E-01 -2.560747E-01 -4.492224E-02 --4.006295E-01 -2.456809E-01 -8.176054E-02 -3.924768E-01 --8.105689E-01 -2.397175E-01 -3.777117E-01 -4.811523E-01 --4.932440E-01 -1.789106E-01 --3.705746E-02 -5.517840E-01 -7.049764E-01 -4.243943E-01 --4.833188E-01 -2.014189E-01 --5.420278E-01 -1.201572E-01 -7.606099E-02 -1.451071E-01 -2.244026E-01 -7.628680E-02 -2.495758E-01 -1.882655E-01 --1.373888E-01 -1.958724E-01 --3.799191E-01 -2.258678E-01 --5.909624E-01 -2.940322E-01 --6.336238E-01 -1.272552E-01 --5.544697E-01 -9.027652E-02 -4.161023E-01 -1.084744E-01 -5.550548E-01 -1.838427E-01 -3.060033E-01 -8.542356E-02 -3.623817E-01 -4.245612E-02 -4.779023E-01 -8.081477E-02 -1.089872E-01 -1.402042E-01 --1.107440E-01 -3.140479E-01 -2.333168E-01 -1.035674E-01 --5.959476E-02 -2.482914E-01 -2.924945E+01 -1.782032E+02 -5.986908E-01 -4.163713E-01 -3.376452E-01 -1.744277E-01 -1.272993E-01 -1.526084E-01 --2.551267E-01 -7.284601E-02 -4.755790E-02 -6.832796E-02 --3.425133E-01 -7.756266E-02 -3.823240E-01 -1.789133E-01 --3.767347E-01 -1.676013E-01 -1.655399E-01 -1.153056E-01 -1.432265E-01 -2.956364E-02 --2.989439E-01 -5.066565E-02 --3.226047E-02 -5.960686E-02 --9.968550E-02 -4.039270E-02 --1.235291E-02 -2.805714E-01 --7.494860E-02 -2.838999E-02 -3.042503E-02 -7.425538E-02 --1.849034E-01 -8.599532E-02 --5.209242E-01 -1.174277E-01 --2.314402E-01 -4.065974E-02 --4.179560E-01 -1.382716E-01 -1.026654E-01 -1.611177E-02 --2.270386E-01 -5.157513E-02 -7.884296E-02 -2.677093E-02 -7.284620E-01 -1.871262E-01 -1.360134E-01 -9.437335E-03 --3.088199E-01 -2.292832E-02 --2.543226E-01 -1.264440E-01 -6.256788E-02 -7.604299E-02 --3.478518E-01 -6.632508E-02 -2.842847E-01 -4.906462E-02 -1.546241E-01 -3.362908E-02 --2.247690E-01 -1.912574E-02 --3.459210E-02 -1.248892E-01 --2.204075E-01 -4.281299E-02 -2.145675E-01 -5.593188E-02 -9.965051E+00 -2.067319E+01 -2.381967E-01 -4.786935E-02 --1.924308E-02 -4.029344E-02 -3.179175E-02 -2.098033E-02 --1.652308E-02 -9.391525E-03 --5.733039E-02 -1.788395E-02 -4.942155E-02 -1.206623E-03 -1.874861E-02 -1.917059E-02 --1.179838E-01 -2.185564E-02 --9.270508E-03 -1.659002E-02 -7.496511E-02 -6.849931E-03 --1.004441E-01 -4.570271E-03 --9.899601E-02 -1.027435E-02 --9.963860E-02 -4.686519E-03 --1.740638E-02 -3.936514E-02 -2.520349E-02 -5.900520E-03 -1.227791E-03 -6.173783E-03 --3.068441E-02 -6.867402E-03 --7.765654E-02 -1.399383E-02 -7.333551E-02 -4.139444E-03 --3.508914E-02 -1.421599E-02 -4.334120E-02 -4.918888E-03 --1.106116E-01 -1.143785E-02 -7.254477E-03 -1.337965E-03 -2.365948E-01 -2.473485E-02 -5.176646E-02 -1.514750E-03 --8.723610E-02 -2.395100E-03 --1.010207E-01 -1.081070E-02 --5.113298E-02 -6.053279E-03 --1.601115E-01 -8.304230E-03 --5.105345E-03 -5.079654E-03 --8.894549E-02 -2.505026E-03 --1.023874E-01 -4.311776E-03 -7.972837E-02 -1.178305E-02 --2.560942E-02 -4.101793E-03 -2.312203E-02 -3.036209E-03 -4.931805E+01 -5.050490E+02 -1.513494E+00 -1.676567E+00 -6.650656E-01 -1.400732E+00 -4.934620E-01 -7.673322E-01 --2.964442E-02 -2.262500E-01 --2.225956E-01 -4.872938E-01 -2.498269E-01 -9.442256E-02 --1.454141E-01 -2.683171E-01 --3.720260E-01 -2.266316E-01 -2.473591E-01 -3.624408E-01 -2.096941E-01 -6.664835E-02 --4.700220E-01 -9.789465E-02 --1.626165E-01 -1.315362E-01 -3.519966E-01 -1.140516E-01 --1.185342E-01 -5.708362E-01 --1.333083E-01 -1.352294E-01 -1.375803E-01 -1.572243E-01 --6.099544E-02 -2.042264E-01 --3.664336E-01 -1.762506E-01 --1.717957E-01 -5.864778E-02 --5.153204E-01 -2.484316E-01 --2.258513E-01 -8.839687E-02 --9.307565E-01 -4.802462E-01 -1.108577E-01 -4.451363E-02 -1.118965E+00 -5.173979E-01 -4.314600E-01 -5.176751E-02 --2.864059E-01 -9.159895E-02 --4.471918E-01 -1.743046E-01 --7.850808E-02 -1.317732E-01 --7.445394E-01 -1.479808E-01 -7.480873E-01 -2.696289E-01 -1.731449E-01 -5.301367E-02 --3.663464E-01 -3.430563E-02 -3.553351E-01 -2.051544E-01 --4.312304E-01 -2.164291E-01 -2.436515E-01 -8.025128E-02 +3.224218E+01 +2.217821E+02 +-4.524803E-01 +1.326110E-01 +-2.725152E-01 +4.845463E-01 +-4.030063E-01 +1.825349E-01 +-2.145346E-01 +7.197305E-02 +2.488985E-01 +4.295894E-02 +-6.797085E-01 +2.125889E-01 +1.698034E-01 +3.750580E-02 +-6.596628E-02 +6.507545E-02 +4.519597E-02 +1.432412E-02 +6.227959E-01 +1.066624E-01 +2.328135E-01 +8.583522E-02 +-8.899482E-01 +1.982834E-01 +3.269468E-01 +5.392549E-02 +1.684792E-01 +1.461138E-01 +-2.026161E-01 +1.992812E-01 +2.599678E-01 +7.704699E-02 +-3.329837E-01 +8.761827E-02 +-5.287177E-01 +9.089410E-02 +3.666982E-01 +4.451200E-02 +2.096594E-01 +4.539545E-02 +2.091762E-01 +4.861771E-02 +1.476292E-01 +2.837569E-02 +-4.091772E-01 +1.141307E-01 +-1.652694E-01 +5.552090E-02 +8.207679E-02 +1.659512E-02 +-1.203575E-01 +6.408952E-02 +-8.219791E-03 +9.915873E-02 +-3.768675E-02 +8.535079E-02 +1.305167E-01 +1.917693E-02 +1.823050E-01 +1.945159E-02 +2.999655E-01 +4.587948E-02 +3.687435E-01 +1.382795E-01 +1.220376E-01 +6.297901E-02 +3.899923E-01 +5.894393E-02 +-1.878957E-02 +1.159448E-01 +1.079687E+01 +2.494701E+01 +-1.067271E-01 +9.075462E-03 +-2.571244E-02 +4.402172E-02 +-3.646387E-02 +2.948533E-02 +-1.043828E-01 +1.600528E-02 +4.361032E-02 +3.875958E-03 +-3.096545E-01 +3.184604E-02 +8.723730E-02 +4.599654E-03 +6.541966E-03 +9.605866E-03 +5.837907E-02 +3.026784E-03 +1.523399E-01 +7.846764E-03 +2.778305E-02 +8.106935E-03 +-2.895648E-01 +1.983532E-02 +4.866247E-02 +1.048055E-02 +2.600097E-02 +1.465465E-02 +-6.958338E-02 +3.287519E-02 +1.690742E-01 +1.204714E-02 +-1.127534E-01 +7.881362E-03 +-1.662306E-01 +9.412057E-03 +1.674047E-01 +6.690449E-03 +-4.370664E-02 +5.828314E-03 +9.323095E-02 +4.400433E-03 +1.353164E-02 +1.389416E-03 +-1.062009E-01 +1.297730E-02 +-5.331064E-02 +5.321055E-03 +7.698466E-02 +3.247975E-03 +-2.095250E-02 +4.788058E-03 +-8.861817E-03 +7.657174E-03 +1.769365E-02 +1.144058E-03 +1.788678E-02 +2.746804E-03 +4.403056E-03 +6.918351E-04 +1.059091E-01 +1.394217E-02 +1.442934E-01 +1.318500E-02 +2.199047E-02 +5.838245E-03 +8.175546E-02 +3.242012E-03 +7.359786E-03 +1.673277E-02 +5.252579E+01 +5.951604E+02 +-8.293789E-01 +2.900775E-01 +6.285324E-01 +1.487344E+00 +-4.765860E-01 +8.058451E-01 +-3.101266E-01 +1.597231E-01 +3.333449E-01 +1.162003E-01 +-1.314742E+00 +4.565068E-01 +4.726655E-01 +1.161194E-01 +2.824987E-01 +8.732802E-02 +1.025468E-01 +4.935830E-02 +4.216767E-01 +1.225700E-01 +-4.022783E-02 +1.178843E-01 +-7.967853E-01 +2.698001E-01 +3.741686E-01 +2.849501E-01 +3.377745E-01 +3.722806E-01 +9.234355E-02 +4.498496E-01 +8.019475E-01 +3.404218E-01 +-3.086622E-01 +1.857604E-01 +-8.474654E-01 +1.733363E-01 +8.124627E-01 +1.415201E-01 +-3.075481E-01 +3.345921E-02 +7.126178E-01 +2.478330E-01 +2.983972E-01 +2.913106E-02 +-6.759256E-01 +4.245338E-01 +-3.491214E-01 +1.017784E-01 +1.637602E-01 +7.414687E-02 +-3.344942E-01 +1.165491E-01 +-6.038784E-02 +1.791698E-01 +2.645086E-01 +8.129446E-02 +-2.738265E-01 +6.616303E-02 +1.135151E-02 +4.140154E-02 +4.679883E-01 +1.914750E-01 +2.876984E-01 +1.355086E-01 +-2.741613E-01 +1.060457E-01 +5.972204E-01 +2.144153E-01 +-9.215131E-02 +4.815135E-01 +3.325822E+01 +2.414028E+02 +-3.072951E-02 +3.385901E-01 +9.729550E-01 +3.745599E-01 +-5.237870E-01 +3.101477E-01 +-5.994810E-01 +1.696123E-01 +-3.402784E-01 +1.910685E-01 +-3.779571E-01 +2.598004E-01 +-4.804007E-01 +1.417261E-01 +-5.444032E-01 +1.756801E-01 +-9.921809E-02 +6.889191E-02 +-3.768065E-01 +8.931168E-02 +5.814513E-02 +1.660714E-02 +-1.263664E-01 +2.650287E-01 +1.951860E-01 +2.090892E-01 +3.576168E-01 +2.511782E-01 +-9.547988E-02 +7.900044E-03 +5.460746E-01 +1.319868E-01 +-1.577655E-01 +8.575762E-02 +2.938792E-02 +7.941653E-02 +-7.505627E-01 +2.530444E-01 +-2.399786E-01 +1.105633E-01 +2.035740E-01 +2.442135E-02 +1.190368E-01 +8.652216E-02 +5.753449E-01 +9.353813E-02 +4.911025E-01 +6.795258E-02 +-2.967023E-03 +7.063512E-03 +-2.158307E-01 +4.680921E-02 +-1.811238E-01 +7.008450E-02 +1.809785E-01 +3.414843E-02 +-1.380825E-01 +3.469381E-02 +3.722241E-01 +3.956589E-02 +2.064516E-01 +2.676312E-02 +-3.889056E-01 +6.737109E-02 +1.625815E-01 +1.356347E-02 +-5.278455E-01 +1.297993E-01 +-1.269304E-02 +1.253029E-02 +1.145800E+01 +2.880575E+01 +6.201234E-02 +4.410457E-02 +2.694694E-01 +6.262339E-02 +-1.173739E-01 +4.727885E-02 +-1.785056E-01 +1.745391E-02 +-4.744392E-02 +2.117667E-02 +3.998416E-02 +6.058339E-02 +-1.927536E-01 +1.710512E-02 +-1.800560E-01 +2.420071E-02 +-1.136912E-01 +1.049357E-02 +-1.104415E-01 +1.181394E-02 +3.486245E-02 +3.673104E-03 +-8.343502E-02 +2.270299E-02 +-3.064437E-02 +1.197968E-02 +1.912081E-01 +2.808487E-02 +2.601014E-02 +1.311244E-03 +1.295023E-01 +1.108983E-02 +-1.158397E-01 +1.033182E-02 +8.316701E-02 +2.061897E-02 +-1.136796E-01 +3.133021E-02 +-1.722931E-02 +2.168654E-02 +1.464014E-01 +8.570818E-03 +5.859338E-02 +6.076029E-03 +1.776223E-01 +1.345571E-02 +1.582455E-01 +9.719314E-03 +9.088118E-03 +1.681557E-03 +-6.298727E-02 +5.287397E-03 +5.793395E-03 +6.397495E-03 +-1.835123E-02 +4.506573E-03 +-7.558061E-02 +4.462082E-03 +3.136371E-02 +3.181332E-03 +-2.787527E-02 +1.765822E-03 +-9.878307E-02 +3.381183E-03 +1.279690E-01 +4.386067E-03 +-1.043523E-01 +5.381331E-03 +1.000162E-02 +6.707280E-04 +5.605671E+01 +6.804062E+02 +1.431465E-01 +1.700768E+00 +2.010680E+00 +2.307036E+00 +-5.276592E-01 +1.006050E+00 +-9.123132E-01 +4.824313E-01 +-3.276490E-01 +5.842232E-01 +6.749445E-02 +6.049661E-01 +-1.317515E+00 +4.738014E-01 +-9.470910E-01 +4.937085E-01 +-3.338536E-01 +2.196164E-01 +-3.032729E-01 +1.241029E-01 +-3.285269E-01 +5.276607E-02 +-4.107012E-01 +6.402858E-01 +3.357626E-01 +2.672801E-01 +1.000507E+00 +5.263322E-01 +-1.834202E-01 +9.495434E-02 +8.133484E-01 +3.011488E-01 +-4.083516E-01 +2.428630E-01 +4.032934E-01 +1.825835E-01 +-8.291267E-01 +6.773284E-01 +-2.401557E-01 +2.280331E-01 +4.325658E-01 +1.163540E-01 +6.671759E-02 +2.181769E-01 +6.984462E-01 +1.716985E-01 +7.108347E-01 +1.386394E-01 +1.709795E-01 +5.320122E-02 +-2.354809E-01 +7.105363E-02 +1.600239E-01 +9.179874E-02 +2.802111E-02 +6.149546E-02 +-4.005049E-01 +2.195356E-01 +7.914623E-01 +2.273026E-01 +3.392453E-01 +1.101813E-01 +-7.821576E-01 +1.637944E-01 +4.736782E-01 +1.531480E-01 +-5.253391E-01 +1.093913E-01 +2.235961E-01 +5.449263E-02 diff --git a/tests/test_score_kappafission/results_true.dat b/tests/test_score_kappafission/results_true.dat index f9f4c44b9a..dadcdd281b 100644 --- a/tests/test_score_kappafission/results_true.dat +++ b/tests/test_score_kappafission/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -2.135627E+02 -9.364189E+03 +1.848110E+02 +7.563211E+03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.782510E+02 -6.811324E+03 +2.035912E+02 +8.999693E+03 diff --git a/tests/test_score_nufission/results_true.dat b/tests/test_score_nufission/results_true.dat index 21d6586b68..5d0b44662e 100644 --- a/tests/test_score_nufission/results_true.dat +++ b/tests/test_score_nufission/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -2.879098E+00 -1.700626E+00 +2.486342E+00 +1.368793E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.401881E+00 -1.235627E+00 +2.733038E+00 +1.616903E+00 diff --git a/tests/test_score_nuscatter/results_true.dat b/tests/test_score_nuscatter/results_true.dat index e2be939c75..df695d8a87 100644 --- a/tests/test_score_nuscatter/results_true.dat +++ b/tests/test_score_nuscatter/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 -1.239000E+01 -3.172630E+01 -3.570000E+00 -2.668900E+00 -4.450000E+01 -4.100412E+02 +1.169000E+01 +2.915330E+01 +3.200000E+00 +2.342600E+00 +4.064000E+01 +3.595168E+02 diff --git a/tests/test_score_nuscatter_n/results_true.dat b/tests/test_score_nuscatter_n/results_true.dat index 9b84b70786..b46a1e184d 100644 --- a/tests/test_score_nuscatter_n/results_true.dat +++ b/tests/test_score_nuscatter_n/results_true.dat @@ -1,33 +1,33 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.239000E+01 -3.172630E+01 -1.431689E+00 -4.209133E-01 -6.192790E-01 -1.440589E-01 -4.143123E-01 -5.479770E-02 -2.942906E-01 -3.458523E-02 -3.570000E+00 -2.668900E+00 -3.298388E-01 -4.816449E-02 -3.308381E-01 -3.018261E-02 -5.366444E-02 -7.235974E-03 --7.363858E-02 -7.113489E-03 -4.450000E+01 -4.100412E+02 -2.317316E+01 -1.102855E+02 -8.679054E+00 -1.538963E+01 -7.128469E-01 -1.440027E-01 --1.172445E+00 -3.514659E-01 +1.169000E+01 +2.915330E+01 +1.247253E+00 +3.767436E-01 +5.330812E-01 +1.385083E-01 +2.987823E-01 +5.699361E-02 +2.645512E-01 +2.905381E-02 +3.200000E+00 +2.342600E+00 +3.809941E-01 +2.965326E-02 +4.319242E-01 +3.738822E-02 +9.261909E-02 +6.711328E-03 +-6.052442E-02 +7.087230E-03 +4.064000E+01 +3.595168E+02 +2.096700E+01 +9.516606E+01 +7.560566E+00 +1.248694E+01 +2.093348E-01 +4.278510E-02 +-1.449929E+00 +4.356371E-01 diff --git a/tests/test_score_nuscatter_pn/results_true.dat b/tests/test_score_nuscatter_pn/results_true.dat index 18a93153ed..3c34895d90 100644 --- a/tests/test_score_nuscatter_pn/results_true.dat +++ b/tests/test_score_nuscatter_pn/results_true.dat @@ -1,24 +1,24 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.239000E+01 -3.172630E+01 -1.431689E+00 -4.209133E-01 -6.192790E-01 -1.440589E-01 -4.143123E-01 -5.479770E-02 -2.942906E-01 -3.458523E-02 +1.169000E+01 +2.915330E+01 +1.247253E+00 +3.767436E-01 +5.330812E-01 +1.385083E-01 +2.987823E-01 +5.699361E-02 +2.645512E-01 +2.905381E-02 tally 2: -1.239000E+01 -3.172630E+01 -1.431689E+00 -4.209133E-01 -6.192790E-01 -1.440589E-01 -4.143123E-01 -5.479770E-02 -2.942906E-01 -3.458523E-02 +1.169000E+01 +2.915330E+01 +1.247253E+00 +3.767436E-01 +5.330812E-01 +1.385083E-01 +2.987823E-01 +5.699361E-02 +2.645512E-01 +2.905381E-02 diff --git a/tests/test_score_nuscatter_yn/results_true.dat b/tests/test_score_nuscatter_yn/results_true.dat index e6ca67827c..1e8e143ef4 100644 --- a/tests/test_score_nuscatter_yn/results_true.dat +++ b/tests/test_score_nuscatter_yn/results_true.dat @@ -1,38 +1,38 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.239000E+01 -3.172630E+01 +1.169000E+01 +2.915330E+01 tally 2: -1.239000E+01 -3.172630E+01 --1.558408E-01 -1.069360E-02 --4.768057E-02 -2.298561E-02 -7.015981E-02 -1.366523E-02 --2.449791E-02 -5.899048E-03 -9.535825E-02 -6.335188E-03 --9.915129E-03 -2.116965E-03 --2.535001E-03 -2.410993E-03 -1.030312E-01 -1.128648E-02 --4.471182E-02 -6.335010E-03 -4.744793E-02 -2.215754E-03 -6.507318E-02 -2.747856E-03 --8.724368E-02 -3.500811E-03 -5.479971E-03 -2.059588E-04 --1.345855E-01 -5.547202E-03 -8.586379E-02 -3.537507E-03 +1.169000E+01 +2.915330E+01 +-2.198379E-01 +2.828670E-02 +-1.317276E-01 +9.568596E-03 +8.309792E-02 +1.155410E-02 +-2.288506E-02 +3.710542E-03 +-2.720674E-02 +1.789163E-03 +-1.323964E-02 +1.819112E-04 +8.941597E-02 +4.265616E-03 +1.516805E-01 +1.332526E-02 +-1.832782E-02 +6.611171E-03 +1.311371E-02 +2.840648E-03 +3.728365E-02 +2.866806E-03 +-5.100587E-02 +2.957146E-03 +3.388028E-02 +2.481570E-03 +-7.766921E-02 +3.129377E-03 +1.666131E-02 +3.828290E-03 diff --git a/tests/test_score_scatter/results_true.dat b/tests/test_score_scatter/results_true.dat index 9619e0f49d..5f0ae8b1dd 100644 --- a/tests/test_score_scatter/results_true.dat +++ b/tests/test_score_scatter/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 -1.290818E+01 -3.438677E+01 -3.136743E+00 -2.032819E+00 -4.503247E+01 -4.196453E+02 +1.223028E+01 +3.185078E+01 +2.900350E+00 +1.814004E+00 +4.059013E+01 +3.609499E+02 diff --git a/tests/test_score_scatter_n/results_true.dat b/tests/test_score_scatter_n/results_true.dat index 418eabad78..b46a1e184d 100644 --- a/tests/test_score_scatter_n/results_true.dat +++ b/tests/test_score_scatter_n/results_true.dat @@ -1,33 +1,33 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.238000E+01 -3.168320E+01 -1.437080E+00 -4.234943E-01 -6.199204E-01 -1.441510E-01 -4.101424E-01 -5.414561E-02 -2.977431E-01 -3.433685E-02 -3.570000E+00 -2.668900E+00 -3.298388E-01 -4.816449E-02 -3.308381E-01 -3.018261E-02 -5.366444E-02 -7.235974E-03 --7.363858E-02 -7.113489E-03 -4.450000E+01 -4.100412E+02 -2.317316E+01 -1.102855E+02 -8.679054E+00 -1.538963E+01 -7.128469E-01 -1.440027E-01 --1.172445E+00 -3.514659E-01 +1.169000E+01 +2.915330E+01 +1.247253E+00 +3.767436E-01 +5.330812E-01 +1.385083E-01 +2.987823E-01 +5.699361E-02 +2.645512E-01 +2.905381E-02 +3.200000E+00 +2.342600E+00 +3.809941E-01 +2.965326E-02 +4.319242E-01 +3.738822E-02 +9.261909E-02 +6.711328E-03 +-6.052442E-02 +7.087230E-03 +4.064000E+01 +3.595168E+02 +2.096700E+01 +9.516606E+01 +7.560566E+00 +1.248694E+01 +2.093348E-01 +4.278510E-02 +-1.449929E+00 +4.356371E-01 diff --git a/tests/test_score_scatter_pn/results_true.dat b/tests/test_score_scatter_pn/results_true.dat index d6767ea031..3c34895d90 100644 --- a/tests/test_score_scatter_pn/results_true.dat +++ b/tests/test_score_scatter_pn/results_true.dat @@ -1,24 +1,24 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.238000E+01 -3.168320E+01 -1.437080E+00 -4.234943E-01 -6.199204E-01 -1.441510E-01 -4.101424E-01 -5.414561E-02 -2.977431E-01 -3.433685E-02 +1.169000E+01 +2.915330E+01 +1.247253E+00 +3.767436E-01 +5.330812E-01 +1.385083E-01 +2.987823E-01 +5.699361E-02 +2.645512E-01 +2.905381E-02 tally 2: -1.238000E+01 -3.168320E+01 -1.437080E+00 -4.234943E-01 -6.199204E-01 -1.441510E-01 -4.101424E-01 -5.414561E-02 -2.977431E-01 -3.433685E-02 +1.169000E+01 +2.915330E+01 +1.247253E+00 +3.767436E-01 +5.330812E-01 +1.385083E-01 +2.987823E-01 +5.699361E-02 +2.645512E-01 +2.905381E-02 diff --git a/tests/test_score_scatter_yn/results_true.dat b/tests/test_score_scatter_yn/results_true.dat index 23f56743bd..9df7ea42a7 100644 --- a/tests/test_score_scatter_yn/results_true.dat +++ b/tests/test_score_scatter_yn/results_true.dat @@ -1,56 +1,56 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.238000E+01 -3.168320E+01 +1.169000E+01 +2.915330E+01 tally 2: -1.238000E+01 -3.168320E+01 --1.570048E-01 -1.067590E-02 --4.730723E-02 -2.307294E-02 -6.490976E-02 -1.426908E-02 --2.426427E-02 -5.909294E-03 -9.534163E-02 -6.333588E-03 --1.023123E-02 -2.132217E-03 --2.609941E-03 -2.406916E-03 -1.035322E-01 -1.128320E-02 --4.271935E-02 -6.478440E-03 -4.721270E-02 -2.212864E-03 -6.453502E-02 -2.750693E-03 --8.681394E-02 -3.493602E-03 -3.052598E-03 -1.842182E-04 --1.350899E-01 -5.564227E-03 -8.846033E-02 -3.537258E-03 -5.729362E-02 -2.064207E-03 -1.780469E-02 -2.838072E-03 --4.570340E-02 -2.812380E-03 -2.213430E-02 -5.564728E-04 --3.159434E-03 -3.500419E-03 --1.547339E-02 -1.929157E-03 -6.653362E-02 -1.421509E-03 -1.226039E-02 -1.144939E-03 -5.785933E-03 -4.218074E-04 +1.169000E+01 +2.915330E+01 +-2.198379E-01 +2.828670E-02 +-1.317276E-01 +9.568596E-03 +8.309792E-02 +1.155410E-02 +-2.288506E-02 +3.710542E-03 +-2.720674E-02 +1.789163E-03 +-1.323964E-02 +1.819112E-04 +8.941597E-02 +4.265616E-03 +1.516805E-01 +1.332526E-02 +-1.832782E-02 +6.611171E-03 +1.311371E-02 +2.840648E-03 +3.728365E-02 +2.866806E-03 +-5.100587E-02 +2.957146E-03 +3.388028E-02 +2.481570E-03 +-7.766921E-02 +3.129377E-03 +1.666131E-02 +3.828290E-03 +8.102553E-02 +2.118169E-03 +6.303084E-03 +7.156173E-04 +-2.083478E-03 +2.683340E-03 +6.794806E-03 +3.912783E-04 +1.005390E-01 +2.920205E-03 +-5.332517E-02 +2.205372E-03 +-1.584725E-02 +8.984498E-04 +3.486904E-02 +6.448722E-04 +-2.420912E-02 +6.352276E-04 diff --git a/tests/test_score_total/results_true.dat b/tests/test_score_total/results_true.dat index 0838e7baed..f3aa5d89b1 100644 --- a/tests/test_score_total/results_true.dat +++ b/tests/test_score_total/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 -1.517577E+01 -4.747271E+01 -3.151504E+00 -2.051857E+00 -4.536316E+01 -4.258781E+02 +1.423676E+01 +4.330937E+01 +2.914798E+00 +1.831649E+00 +4.088282E+01 +3.662539E+02 diff --git a/tests/test_score_total_yn/results_true.dat b/tests/test_score_total_yn/results_true.dat index b2dcd39e12..bcfdb9080f 100644 --- a/tests/test_score_total_yn/results_true.dat +++ b/tests/test_score_total_yn/results_true.dat @@ -1,14 +1,14 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 -1.517577E+01 -4.747271E+01 -3.151504E+00 -2.051857E+00 -4.536316E+01 -4.258781E+02 +1.423676E+01 +4.330937E+01 +2.914798E+00 +1.831649E+00 +4.088282E+01 +3.662539E+02 tally 2: 0.000000E+00 0.000000E+00 @@ -110,106 +110,106 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -8.795501E-01 -1.600341E-01 --1.530661E-02 -5.215322E-04 -1.571095E-02 -9.166057E-04 -7.226990E-03 -3.683499E-04 --2.456165E-02 -1.571441E-04 -1.387449E-02 -5.600648E-04 --2.186870E-02 -2.081164E-04 --1.106814E-02 -1.065144E-04 --4.579593E-03 -2.008225E-04 -7.573253E-03 -2.493075E-04 --1.505016E-02 -1.451400E-04 -1.503792E-02 -9.539029E-05 --1.183668E-02 -1.741393E-04 -4.060912E-03 -5.890591E-05 -1.789747E-02 -8.239749E-05 --2.168438E-02 -1.555757E-04 --1.045826E-02 -8.108402E-05 -1.227413E-02 -2.502871E-04 --2.806122E-02 -1.886120E-04 --4.918718E-03 -2.129038E-04 --1.014729E-02 -6.914145E-05 --5.873760E-03 -2.229738E-04 -6.666511E-03 -1.394147E-04 --3.245528E-03 -1.550876E-04 --1.037659E-02 -2.163837E-04 -1.517577E+01 -4.747271E+01 --2.463504E-01 -2.376091E-02 -7.930151E-02 -3.516796E-02 --1.611736E-01 -2.658129E-02 --9.124923E-02 -1.181443E-02 -2.766258E-01 -2.310767E-02 --2.269608E-01 -3.593659E-02 --5.345296E-02 -1.169733E-02 --1.838169E-01 -1.625334E-02 --7.883035E-02 -8.514293E-03 --4.922148E-02 -7.767910E-03 -1.144559E-01 -4.638553E-03 --2.027207E-01 -2.158672E-02 -5.449222E-02 -1.287150E-02 -5.384229E-02 -6.688120E-03 --8.231311E-02 -2.743044E-02 -1.172790E-02 -1.089457E-02 --1.545389E-01 -2.655167E-02 --2.290221E-01 -1.443721E-02 -2.773254E-02 -1.070478E-02 --2.522703E-02 -1.136507E-02 --1.287564E-02 -4.969443E-03 -3.471629E-02 -7.559603E-03 --2.261509E-01 -2.383142E-02 --1.463402E-01 -1.526988E-02 +7.812543E-01 +1.349265E-01 +-7.005988E-03 +2.198486E-04 +3.237937E-02 +7.569491E-04 +-3.865436E-04 +4.048167E-04 +-1.003877E-02 +3.195619E-04 +3.738815E-03 +3.506174E-04 +-2.549288E-02 +3.086810E-04 +1.693002E-02 +1.255885E-04 +3.059341E-03 +1.971678E-04 +9.247344E-03 +2.402855E-04 +6.618469E-04 +1.639025E-04 +1.992953E-02 +1.365376E-04 +3.262256E-03 +1.341040E-05 +2.864166E-03 +4.394787E-05 +1.494351E-03 +1.001007E-04 +-1.091424E-02 +1.221030E-04 +9.875992E-03 +1.141979E-04 +1.263647E-02 +2.400023E-04 +-2.944398E-03 +1.246417E-04 +1.970051E-03 +1.600160E-04 +6.148931E-03 +4.774182E-05 +1.107728E-02 +1.095420E-04 +1.382599E-02 +1.537793E-04 +-1.296297E-02 +1.392028E-04 +-1.479385E-02 +1.650074E-04 +1.423676E+01 +4.330937E+01 +-2.802155E-01 +3.016146E-02 +-8.009314E-02 +4.251899E-02 +-7.383773E-02 +1.547362E-02 +-1.274422E-01 +2.290306E-02 +1.370426E-01 +1.002935E-02 +-2.607280E-01 +3.414307E-02 +1.497421E-02 +2.944540E-03 +-2.866477E-02 +9.113662E-03 +-3.949118E-02 +4.437767E-03 +2.283116E-01 +1.792907E-02 +1.334103E-01 +1.587762E-02 +-3.139096E-01 +2.330713E-02 +1.025884E-03 +5.754195E-03 +1.099489E-01 +1.861634E-02 +-7.863729E-02 +2.276108E-02 +1.219111E-01 +1.363203E-02 +-1.261893E-01 +1.937908E-02 +-1.995428E-01 +1.383344E-02 +8.803472E-02 +3.742219E-03 +1.501143E-01 +1.288322E-02 +4.522115E-02 +8.283014E-03 +1.113588E-01 +8.523967E-03 +-1.820582E-01 +1.648932E-02 +-1.121108E-01 +1.059879E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -260,56 +260,56 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -3.151504E+00 -2.051857E+00 --4.923938E-02 -1.416150E-03 --1.041702E-02 -8.114498E-04 --3.212977E-02 -2.419393E-03 -2.557299E-02 -1.124488E-03 -4.083178E-02 -1.351219E-03 --3.910818E-02 -8.908208E-04 -5.659008E-03 -4.488733E-04 --1.625829E-02 -2.325228E-04 -2.554220E-02 -7.666018E-04 --2.251672E-02 -7.703442E-04 --8.302474E-03 -2.748216E-04 --7.692439E-02 -2.167893E-03 -7.267774E-03 -7.781907E-04 -6.821338E-03 -9.518920E-04 --2.203951E-02 -2.214610E-03 -2.052514E-02 -3.756195E-04 --4.158575E-02 -9.330262E-04 --3.000932E-02 -4.584914E-04 --2.247072E-02 -2.519845E-04 -1.589401E-02 -2.302726E-04 --7.793787E-04 -1.588955E-04 --4.634907E-03 -5.395803E-04 --1.193817E-02 -1.674419E-04 --1.682320E-02 -8.389254E-04 +2.914798E+00 +1.831649E+00 +-3.213884E-02 +1.391026E-03 +-1.124311E-02 +2.059984E-03 +-1.372399E-02 +2.990198E-03 +-6.931800E-03 +1.073303E-03 +-5.448993E-03 +3.542504E-04 +-7.264172E-02 +1.742045E-03 +1.526380E-02 +5.962297E-04 +1.576474E-02 +5.335071E-04 +2.028206E-02 +2.915489E-04 +4.014298E-02 +4.285950E-04 +8.228146E-03 +6.388002E-04 +-8.183952E-02 +2.031634E-03 +1.014523E-02 +1.159653E-03 +9.321030E-03 +7.480844E-04 +-3.156017E-02 +2.064357E-03 +3.606483E-02 +4.060244E-04 +-3.866234E-02 +1.046100E-03 +-5.723297E-02 +1.042437E-03 +2.894838E-02 +2.922848E-04 +-1.529225E-03 +2.472179E-04 +9.484410E-03 +4.172637E-04 +-4.442548E-04 +2.518508E-04 +-3.065480E-02 +3.571846E-04 +-6.519117E-03 +1.779322E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -360,53 +360,53 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -4.536316E+01 -4.258781E+02 --6.747275E-01 -3.006113E-01 -5.302096E-01 -4.167797E-01 --4.347270E-01 -3.702158E-01 --7.344613E-02 -5.940699E-02 -1.081217E+00 -4.070812E-01 --3.172368E-02 -3.124338E-02 -2.656115E-01 -8.561866E-02 --1.286933E-01 -8.347414E-02 -1.258195E-01 -3.329577E-02 --3.751107E-01 -9.007513E-02 -4.283879E-01 -1.067035E-01 --3.467870E-01 -6.788988E-02 -4.218567E-02 -4.465188E-02 -6.876561E-02 -5.655954E-02 --1.116047E-01 -1.073179E-01 -4.077067E-01 -1.148942E-01 --3.218725E-01 -4.739201E-02 --4.297438E-01 -9.739104E-02 -2.199014E-01 -2.328443E-02 -6.007636E-01 -1.194137E-01 --2.194826E-01 -5.017106E-02 -2.266133E-01 -1.131899E-01 -7.161662E-04 -3.345992E-02 --1.987041E-01 -1.381432E-01 +4.088282E+01 +3.662539E+02 +-9.859591E-01 +2.743013E-01 +2.392244E-01 +3.795971E-01 +-3.389717E-01 +7.054539E-01 +-1.673679E-01 +1.081377E-01 +2.918680E-01 +7.161035E-02 +-5.627453E-01 +9.124299E-02 +7.185542E-01 +2.062140E-01 +8.533956E-02 +3.649126E-02 +7.630639E-02 +1.623523E-02 +3.785290E-02 +4.181389E-02 +1.388919E-01 +1.307834E-01 +-2.682812E-01 +6.653584E-02 +7.151084E-02 +3.466772E-02 +6.941393E-02 +2.821800E-02 +2.392050E-02 +1.132504E-01 +3.749985E-01 +8.337209E-02 +-2.998887E-01 +6.767226E-02 +-3.629285E-01 +7.246083E-02 +3.989685E-01 +4.378581E-02 +1.330115E-01 +2.634398E-02 +2.649739E-01 +4.300042E-02 +5.793351E-01 +7.399884E-02 +-2.236528E-01 +3.130205E-02 +-3.695818E-01 +4.703480E-02 diff --git a/tests/test_seed/results_true.dat b/tests/test_seed/results_true.dat index 860e9e9af6..df79ce1ced 100644 --- a/tests/test_seed/results_true.dat +++ b/tests/test_seed/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.984828E-01 5.293550E-03 +2.951164E-01 2.504580E-03 diff --git a/tests/test_source_angle_mono/results_true.dat b/tests/test_source_angle_mono/results_true.dat index 1aca9a5057..42e948758a 100644 --- a/tests/test_source_angle_mono/results_true.dat +++ b/tests/test_source_angle_mono/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.034005E-01 5.499077E-03 +2.964943E-01 1.201478E-02 diff --git a/tests/test_source_energy_maxwell/results_true.dat b/tests/test_source_energy_maxwell/results_true.dat index 349c65ef9c..37b8b36b99 100644 --- a/tests/test_source_energy_maxwell/results_true.dat +++ b/tests/test_source_energy_maxwell/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.008495E-01 6.113736E-03 +2.886671E-01 7.534631E-03 diff --git a/tests/test_source_energy_mono/results_true.dat b/tests/test_source_energy_mono/results_true.dat index b7af42bcae..029376bf37 100644 --- a/tests/test_source_energy_mono/results_true.dat +++ b/tests/test_source_energy_mono/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.964207E-01 7.263112E-03 +3.002731E-01 7.561170E-03 diff --git a/tests/test_source_file/results_true.dat b/tests/test_source_file/results_true.dat index 738a15c584..fee61dda26 100644 --- a/tests/test_source_file/results_true.dat +++ b/tests/test_source_file/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.031470E-01 4.441814E-03 +2.962911E-01 4.073420E-03 diff --git a/tests/test_source_point/results_true.dat b/tests/test_source_point/results_true.dat index 040f4e188f..fe9a0d78d4 100644 --- a/tests/test_source_point/results_true.dat +++ b/tests/test_source_point/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.025384E-01 4.682677E-03 +3.041148E-01 4.558319E-03 diff --git a/tests/test_sourcepoint_latest/results_true.dat b/tests/test_sourcepoint_latest/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_sourcepoint_latest/results_true.dat +++ b/tests/test_sourcepoint_latest/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_sourcepoint_restart/results_true.dat b/tests/test_sourcepoint_restart/results_true.dat index 917fc0cdfb..0e4eef9a9d 100644 --- a/tests/test_sourcepoint_restart/results_true.dat +++ b/tests/test_sourcepoint_restart/results_true.dat @@ -1,16 +1,116 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 tally 1: -1.200000E-02 -4.000000E-05 -8.118392E-03 -1.773579E-05 -3.683496E-03 -4.911153E-06 -1.507354E-03 -2.420229E-06 -6.245016E-03 -9.775028E-06 +7.000000E-03 +2.100000E-05 +1.127639E-03 +7.464355E-07 +-1.264355E-03 +1.192757E-06 +8.769846E-04 +1.117508E-06 +3.359153E-03 +4.366438E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.107648E-04 +3.730336E-07 +1.000000E-03 +1.000000E-06 +6.713061E-04 +4.506518E-07 +1.759778E-04 +3.096817E-08 +-2.506458E-04 +6.282332E-08 +6.069794E-04 +3.684240E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.000000E-03 +1.500000E-05 +4.398928E-03 +8.198908E-06 +1.784486E-03 +3.422315E-06 +8.494423E-04 +9.262242E-07 +4.566637E-03 +5.646039E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.069794E-04 +3.684240E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +3.000000E-06 +-1.419189E-03 +9.791601E-07 +-3.125982E-05 +5.086129E-07 +3.291570E-04 +1.943609E-07 +1.525426E-03 +8.346311E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -23,34 +123,254 @@ tally 1: 0.000000E+00 1.000000E-03 1.000000E-06 --6.834146E-04 -4.670555E-07 -2.005832E-04 -4.023363E-08 -2.271406E-04 -5.159283E-08 -1.822902E-03 -3.322972E-06 -3.000000E-03 -9.000000E-06 -2.089393E-03 -4.365565E-06 -1.135864E-03 -1.290186E-06 -8.092128E-04 -6.548254E-07 +-1.542107E-05 +2.378095E-10 +-4.996433E-04 +2.496434E-07 +2.312244E-05 +5.346472E-10 +3.053824E-04 +9.325841E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +8.600000E-05 +3.995253E-03 +1.648172E-05 +3.349403E-03 +1.166653E-05 +4.208940E-03 +7.077664E-06 +1.033905E-02 +2.197265E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.029991E-04 +1.818050E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.600000E-02 +1.620000E-04 +7.996640E-03 +1.882484E-05 +3.921034E-03 +1.157453E-05 +1.644629E-03 +3.217857E-06 +1.159182E-02 +3.534975E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +2.500000E-05 +4.691861E-03 +7.999548E-06 +1.771537E-03 +3.385525E-06 +7.888659E-04 +1.911759E-06 +4.561602E-03 +4.337486E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.107648E-04 +3.730336E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +-3.878617E-04 +1.504367E-07 +-2.743449E-04 +7.526515E-08 +4.359210E-04 +1.900271E-07 +3.034897E-04 +9.210600E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.600000E-02 +5.600000E-05 +4.563082E-03 +6.119552E-06 +1.839038E-03 +1.089339E-06 +1.944879E-03 +2.372975E-06 +8.524215E-03 +1.874218E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.015373E-04 +3.618471E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 1.300000E-02 -5.100000E-05 -4.806354E-03 -1.638996E-05 -2.497355E-03 -3.759321E-06 -2.012128E-03 -2.901025E-06 -6.823095E-03 -1.298557E-05 +5.300000E-05 +6.763364E-03 +1.445064E-05 +2.970216E-03 +3.071874E-06 +2.622002E-03 +3.547897E-06 +5.177618E-03 +8.040228E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -59,8 +379,688 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.993246E-04 -1.796295E-07 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-03 +1.400000E-05 +1.172941E-04 +1.212454E-06 +4.110442E-04 +5.740547E-06 +1.788140E-03 +9.775061E-07 +3.946448E-03 +3.956113E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.109694E-04 +1.866863E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +9.168648E-04 +8.406410E-07 +7.609615E-04 +5.790624E-07 +5.515881E-04 +3.042494E-07 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-02 +2.020000E-04 +1.305502E-02 +4.343057E-05 +8.214305E-03 +2.001202E-05 +3.511762E-03 +1.412559E-05 +1.401995E-02 +4.269615E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.400000E-02 +1.320000E-04 +5.207205E-03 +9.311400E-06 +3.232372E-03 +3.475980E-06 +2.062884E-03 +4.773104E-06 +1.039066E-02 +2.611825E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.171802E-04 +4.646485E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.221939E-03 +7.467452E-07 +1.000000E-03 +1.000000E-06 +9.910929E-04 +9.822652E-07 +9.733978E-04 +9.475032E-07 +9.471508E-04 +8.970946E-07 +0.000000E+00 +0.000000E+00 +1.200000E-02 +5.000000E-05 +2.602864E-03 +4.471106E-06 +4.677566E-03 +1.033338E-05 +3.640584E-03 +3.605122E-06 +4.845169E-03 +8.244364E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +3.700000E-05 +3.786358E-03 +5.908272E-06 +3.416266E-03 +7.032934E-06 +3.353945E-03 +5.140933E-06 +4.261660E-03 +4.981501E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.136905E-04 +1.883305E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.700000E-02 +2.090000E-04 +7.046302E-03 +1.594429E-05 +6.489218E-03 +1.057182E-05 +5.057204E-03 +8.269888E-06 +1.274541E-02 +3.591083E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.503843E-03 +2.261544E-06 +3.000000E-03 +5.000000E-06 +3.434984E-04 +2.731822E-07 +-1.911976E-04 +2.018778E-08 +-5.635206E-04 +2.075189E-07 +2.764973E-03 +3.917274E-06 +2.000000E-03 +2.000000E-06 +1.802029E-03 +1.623906E-06 +1.435858E-03 +1.032682E-06 +9.559957E-04 +4.622600E-07 +0.000000E+00 +0.000000E+00 +2.600000E-02 +1.540000E-04 +1.210267E-02 +4.180540E-05 +5.431699E-03 +2.284317E-05 +6.108638E-03 +1.136078E-05 +1.309420E-02 +3.810504E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.124312E-04 +1.875678E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.044609E-04 +3.653729E-07 +1.000000E-03 +1.000000E-06 +9.341546E-04 +8.726448E-07 +8.089673E-04 +6.544280E-07 +6.367311E-04 +4.054265E-07 +3.022304E-04 +9.134324E-08 +2.100000E-02 +9.900000E-05 +1.206996E-02 +4.033646E-05 +6.345510E-03 +1.603169E-05 +1.976558E-03 +4.386164E-06 +1.001209E-02 +2.316074E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.815901E-03 +1.829916E-06 +2.000000E-03 +2.000000E-06 +1.977802E-03 +1.955858E-06 +1.933788E-03 +1.869841E-06 +1.868714E-03 +1.746332E-06 +0.000000E+00 +0.000000E+00 +1.100000E-02 +3.900000E-05 +2.604154E-03 +9.668124E-06 +1.503936E-04 +1.170450E-06 +5.645599E-04 +1.841604E-06 +5.455481E-03 +1.116233E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.015373E-04 +3.618471E-07 +1.000000E-03 +1.000000E-06 +9.936377E-04 +9.873159E-07 +9.809739E-04 +9.623097E-07 +9.621293E-04 +9.256927E-07 +0.000000E+00 +0.000000E+00 +4.100000E-02 +3.610000E-04 +1.275568E-02 +3.756672E-05 +7.436840E-03 +1.784918E-05 +6.238119E-03 +1.114039E-05 +1.706095E-02 +6.393171E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.510747E-03 +8.216143E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.500000E-02 +1.570000E-04 +4.743361E-03 +1.500512E-05 +2.243747E-03 +1.216909E-05 +6.504387E-04 +5.012686E-06 +1.369930E-02 +4.220232E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.124312E-04 +1.875678E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.205998E-03 +7.272200E-07 +2.000000E-03 +2.000000E-06 +1.935082E-03 +1.872342E-06 +1.808514E-03 +1.635965E-06 +1.626644E-03 +1.325172E-06 +0.000000E+00 +0.000000E+00 +1.800000E-02 +1.180000E-04 +6.144587E-03 +1.810176E-05 +3.517233E-03 +7.894223E-06 +5.434668E-03 +1.689927E-05 +7.002945E-03 +1.633731E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.111025E-04 +2.767076E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.000000E-03 +1.400000E-05 +2.937841E-03 +3.083257E-06 +1.316488E-03 +1.378720E-06 +1.917209E-03 +1.388887E-06 +2.434865E-03 +1.665821E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.100000E-02 +4.290000E-04 +1.555575E-02 +6.845536E-05 +1.492622E-02 +7.523417E-05 +4.779064E-03 +1.568962E-05 +1.858109E-02 +9.770216E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +1.000000E-03 +1.000000E-06 +-7.961895E-04 +6.339178E-07 +4.508767E-04 +2.032898E-07 +-6.751245E-05 +4.557931E-09 +2.105380E-03 +4.432627E-06 +1.000000E-03 +1.000000E-06 +7.706275E-04 +5.938667E-07 +3.908001E-04 +1.527247E-07 +-1.181620E-05 +1.396226E-10 +0.000000E+00 +0.000000E+00 +2.300000E-02 +1.870000E-04 +8.530317E-03 +2.513821E-05 +2.769866E-03 +1.832987E-06 +3.367000E-03 +3.408158E-06 +1.029151E-02 +3.475479E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.300000E-02 +1.110000E-04 +1.493458E-02 +4.520237E-05 +8.130453E-03 +1.434362E-05 +5.917132E-03 +7.829616E-06 +1.005025E-02 +2.033292E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -83,14 +1083,14 @@ tally 1: 0.000000E+00 7.000000E-03 1.100000E-05 --2.517807E-05 -3.415722E-06 -1.479050E-03 -1.509604E-06 --4.624719E-04 -1.787423E-06 -3.839667E-03 -3.396077E-06 +2.102923E-03 +3.237003E-06 +5.338761E-04 +1.665334E-06 +2.177563E-03 +1.210407E-06 +3.049393E-03 +2.236660E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -99,18 +1099,78 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.038170E-04 -9.230477E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.300000E-02 +2.470000E-04 +1.392809E-02 +4.644694E-05 +6.658849E-03 +2.448402E-05 +2.971606E-03 +4.596585E-06 +1.583003E-02 +5.281056E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.146617E-04 +4.615975E-07 1.000000E-03 1.000000E-06 -2.553692E-04 -6.521341E-08 --4.021799E-04 -1.617487E-07 --3.414200E-04 -1.165676E-07 -2.962222E-04 -8.774759E-08 +5.742336E-04 +3.297442E-07 +-5.383652E-06 +2.898371E-11 +-3.879749E-04 +1.505245E-07 +1.213130E-03 +5.521442E-07 +2.000000E-03 +2.000000E-06 +1.895662E-03 +1.796999E-06 +1.695499E-03 +1.439233E-06 +1.415735E-03 +1.008516E-06 +3.007686E-04 +9.046177E-08 +4.000000E-02 +3.460000E-04 +1.325054E-02 +4.611581E-05 +4.279513E-03 +1.445432E-05 +5.681074E-03 +8.701686E-06 +1.883326E-02 +7.820565E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -119,62 +1179,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.962222E-04 -8.774759E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.200000E-02 -1.140000E-04 -1.358164E-03 -1.242643E-05 -1.986239E-05 -5.467378E-06 -1.233135E-03 -7.603089E-06 -9.455567E-03 -1.937818E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +9.052295E-04 +4.558347E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -183,8 +1189,28 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.525429E-03 +8.388512E-07 +3.000000E-03 +3.000000E-06 +2.694249E-03 +2.442268E-06 +2.163402E-03 +1.718872E-06 +1.541834E-03 +1.227757E-06 0.000000E+00 0.000000E+00 +2.000000E-02 +1.000000E-04 +5.928221E-03 +9.217060E-06 +5.152240E-03 +1.183310E-05 +2.057268E-03 +2.929338E-06 +9.478909E-03 +2.313196E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -193,6 +1219,18 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.057201E-04 +1.834492E-07 +1.000000E-03 +1.000000E-06 +9.405199E-04 +8.845778E-07 +8.268666E-04 +6.837084E-07 +6.691277E-04 +4.477318E-07 +6.124312E-04 +1.875678E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -201,16 +1239,18 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.124312E-04 +1.875678E-07 1.400000E-02 5.200000E-05 -4.571175E-03 -9.190534E-06 -4.041031E-03 -5.995154E-06 -2.577281E-04 -1.101532E-06 -8.329519E-03 -1.844018E-05 +6.537971E-03 +1.724690E-05 +3.839523E-03 +8.693753E-06 +4.048043E-03 +5.450370E-06 +7.581656E-03 +1.459334E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -229,68 +1269,208 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-03 -1.000000E-05 -4.520960E-04 -2.298902E-06 -4.635765E-04 -2.661361E-07 --3.704326E-04 -7.038297E-08 -2.349751E-03 -4.331174E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.215268E-03 -1.476876E-06 +6.069794E-04 +3.684240E-07 1.000000E-03 1.000000E-06 -9.835700E-04 -9.674099E-07 -9.511149E-04 -9.046195E-07 -9.034334E-04 -8.161919E-07 +5.703488E-04 +3.252978E-07 +-1.205336E-05 +1.452836E-10 +-3.916902E-04 +1.534212E-07 0.000000E+00 0.000000E+00 +3.200000E-02 +2.340000E-04 +1.368605E-02 +4.005184E-05 +6.894848E-03 +1.073483E-05 +5.553663E-03 +7.001843E-06 +1.492310E-02 +4.851599E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.224455E-03 +5.613642E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.800000E-02 +1.860000E-04 +1.044511E-02 +6.915901E-05 +6.444951E-03 +3.586496E-05 +5.196826E-03 +1.312451E-05 +1.156517E-02 +3.164422E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.057201E-04 +1.834492E-07 1.000000E-03 1.000000E-06 -9.302087E-04 -8.652883E-07 -7.979324E-04 -6.366961E-07 -6.169336E-04 -3.806071E-07 -5.774597E-04 -3.334597E-07 +-6.535773E-04 +4.271632E-07 +1.407448E-04 +1.980911E-08 +2.824055E-04 +7.975284E-08 +1.822205E-03 +1.106831E-06 +2.000000E-03 +2.000000E-06 +1.954998E-03 +1.911525E-06 +1.867287E-03 +1.747820E-06 +1.741309E-03 +1.532659E-06 +0.000000E+00 +0.000000E+00 +1.900000E-02 +1.010000E-04 +1.062788E-02 +3.182295E-05 +6.707513E-03 +1.259151E-05 +6.889024E-03 +1.429877E-05 +8.202036E-03 +2.430378E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.306024E-04 +8.660208E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.306024E-04 +8.660208E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +1.500000E-02 +4.500000E-05 +3.192578E-03 +7.201112E-06 +4.457942E-03 +6.346144E-06 +3.572536E-03 +4.921318E-06 +7.292620E-03 +1.123722E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.111025E-04 +2.767076E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.069794E-04 +3.684240E-07 +1.000000E-03 +1.000000E-06 +9.537549E-04 +9.096483E-07 +8.644725E-04 +7.473127E-07 +7.383215E-04 +5.451186E-07 +0.000000E+00 +0.000000E+00 +2.300000E-02 +1.310000E-04 +7.696543E-03 +2.602323E-05 +5.553275E-03 +1.677303E-05 +3.110421E-03 +1.605284E-05 +1.157943E-02 +3.065139E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +1.000000E-03 +1.000000E-06 +-1.849356E-05 +3.420117E-10 +-4.994870E-04 +2.494872E-07 +2.772452E-05 +7.686492E-10 +9.104691E-04 +8.289540E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -301,6 +1481,466 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.600000E-02 +1.460000E-04 +1.097600E-02 +2.696995E-05 +8.425033E-03 +2.480653E-05 +3.259803E-03 +4.519527E-06 +1.278442E-02 +3.571130E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.600000E-02 +6.000000E-05 +2.471171E-03 +8.220215E-06 +2.563821E-04 +8.785791E-07 +1.300883E-03 +3.079168E-06 +7.314002E-03 +1.134821E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.022304E-04 +9.134324E-08 +1.000000E-03 +1.000000E-06 +-5.657444E-04 +3.200667E-07 +-1.989995E-05 +3.960081E-10 +3.959267E-04 +1.567580E-07 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-03 +1.800000E-05 +5.436075E-03 +7.868978E-06 +2.425522E-03 +1.963607E-06 +7.168734E-04 +1.273978E-06 +4.589694E-03 +5.548791E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.100000E-02 +1.070000E-04 +7.539735E-03 +2.068189E-05 +3.936810E-03 +7.972494E-06 +2.420366E-04 +1.148364E-06 +9.428594E-03 +2.131421E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.053824E-04 +9.325841E-08 +2.000000E-03 +2.000000E-06 +1.606787E-04 +1.589809E-06 +1.384713E-03 +1.050316E-06 +7.117279E-04 +6.789060E-07 +9.257840E-04 +4.781566E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.600000E-02 +5.100000E-04 +1.468472E-02 +4.705766E-05 +8.285657E-03 +2.501121E-05 +5.066048E-03 +7.892505E-06 +1.769628E-02 +7.226941E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.216485E-03 +5.564829E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.300000E-02 +1.130000E-04 +9.030313E-03 +2.036594E-05 +5.561323E-03 +2.088769E-05 +3.949070E-03 +5.399490E-06 +1.065996E-02 +2.405722E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.124312E-04 +1.875678E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.044609E-04 +3.653729E-07 +1.000000E-03 +1.000000E-06 +9.969425E-04 +9.938944E-07 +9.908416E-04 +9.817670E-07 +9.817251E-04 +9.637842E-07 +0.000000E+00 +0.000000E+00 +1.300000E-02 +4.300000E-05 +1.119189E-03 +4.668647E-06 +-1.976393E-04 +4.632517E-06 +2.358914E-03 +3.047107E-06 +6.688330E-03 +1.125860E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +1.000000E-03 +1.000000E-06 +-3.353539E-04 +1.124622E-07 +-3.313067E-04 +1.097641E-07 +4.087442E-04 +1.670718E-07 +9.161472E-04 +8.393257E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.600000E-02 +1.980000E-04 +1.024848E-02 +3.100622E-05 +-1.145555E-04 +2.521646E-06 +1.453177E-03 +1.505423E-06 +1.124135E-02 +3.412415E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.029991E-04 +1.818050E-07 +1.000000E-03 +1.000000E-06 +-2.499079E-04 +6.245395E-08 +-4.063191E-04 +1.650952E-07 +3.358425E-04 +1.127902E-07 +6.044609E-04 +3.653729E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.900000E-02 +8.700000E-05 +6.743817E-03 +2.313239E-05 +1.353852E-03 +7.358462E-06 +3.054381E-03 +5.051576E-06 +7.932519E-03 +1.438883E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +9.000000E-05 +4.678519E-03 +8.162854E-06 +2.588181E-03 +7.958110E-06 +2.322176E-03 +3.426024E-06 +8.534070E-03 +1.767419E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.029991E-04 +1.818050E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +3.300000E-05 +7.244624E-03 +1.778235E-05 +2.926133E-03 +9.287629E-06 +9.851866E-04 +6.097573E-06 +3.660351E-03 +3.716102E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.034897E-04 +9.210600E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.053824E-04 +9.325841E-08 +1.000000E-03 +1.000000E-06 +1.744930E-04 +3.044781E-08 +-4.543283E-04 +2.064142E-07 +-2.484572E-04 +6.173098E-08 +0.000000E+00 +0.000000E+00 +1.000000E-02 +2.600000E-05 +3.641369E-03 +6.818931E-06 +2.110606E-03 +2.176630E-06 +1.892973E-03 +1.812944E-06 +5.777456E-03 +9.494012E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.034897E-04 +9.210600E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -322,15 +1962,15 @@ tally 1: 0.000000E+00 0.000000E+00 1.300000E-02 -4.700000E-05 -6.197649E-03 -1.101082E-05 -5.066781E-03 -9.709157E-06 -2.134240E-03 -1.351796E-06 -5.604113E-03 -8.598750E-06 +3.900000E-05 +1.682557E-03 +1.846926E-06 +4.172846E-04 +1.892148E-06 +7.276646E-04 +1.085417E-06 +6.092709E-03 +8.907893E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -339,48 +1979,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -1.000000E-05 --9.379228E-05 -1.179295E-06 -1.623379E-03 -1.703479E-06 --8.659077E-05 -7.366687E-07 -2.943759E-03 -2.593311E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.962222E-04 -8.774759E-08 +3.053824E-04 +9.325841E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -403,14 +2003,14 @@ tally 1: 0.000000E+00 5.000000E-03 7.000000E-06 -2.431919E-03 -1.726875E-06 --5.793826E-04 -1.604970E-07 --1.845208E-03 -8.995877E-07 -1.788227E-03 -8.910514E-07 +1.580450E-03 +1.753085E-06 +3.349602E-04 +3.639488E-07 +2.690006E-04 +2.374932E-07 +1.830811E-03 +9.321096E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -419,6 +2019,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.102008E-04 +9.622454E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -447,6 +2049,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.034897E-04 +9.210600E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -477,380 +2081,56 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.900000E-02 +1.250000E-04 +2.138118E-03 +8.791773E-06 +2.868574E-03 +9.339641E-06 +5.807501E-04 +1.660344E-06 +8.165982E-03 +2.226036E-05 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.000000E-02 -1.940000E-04 -9.461264E-03 -1.947969E-05 -3.587007E-03 -6.174074E-06 -4.090547E-03 -7.913444E-06 -1.296390E-02 -3.766012E-05 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +3.102008E-04 +9.622454E-08 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -8.793837E-04 -2.578025E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.044609E-04 +3.653729E-07 1.000000E-03 1.000000E-06 --8.123463E-04 -6.599064E-07 -4.898597E-04 -2.399625E-07 --1.216619E-04 -1.480163E-08 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.500000E-02 -6.500000E-05 -3.611706E-03 -1.040980E-05 -9.737058E-04 -4.485811E-06 --7.198322E-05 -1.665155E-06 -7.644305E-03 -1.681345E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.962222E-04 -8.774759E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.962222E-04 -8.774759E-08 -1.000000E-03 -1.000000E-06 -9.957690E-04 -9.915560E-07 -9.873340E-04 -9.748284E-07 -9.747484E-04 -9.501344E-07 -0.000000E+00 -0.000000E+00 -1.300000E-02 -4.500000E-05 -3.079966E-03 -9.332877E-06 -1.443410E-03 -2.514831E-06 -1.111923E-03 -1.429512E-06 -6.483010E-03 -9.477194E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.937562E-04 -2.663195E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.114510E-04 -8.307430E-07 -1.000000E-03 -1.000000E-06 -8.370200E-04 -7.006024E-07 -5.509036E-04 -3.034948E-07 -2.105156E-04 -4.431682E-08 -3.038170E-04 -9.230477E-08 -9.000000E-03 -1.900000E-05 --2.021899E-04 -8.445484E-06 -2.148061E-03 -2.701015E-06 -1.264629E-03 -5.949953E-07 -4.409634E-03 -5.032698E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.962222E-04 -8.774759E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.076340E-04 -3.692191E-07 -1.000000E-03 -1.000000E-06 -9.987845E-04 -9.975704E-07 -9.963556E-04 -9.927245E-07 -9.927178E-04 -9.854887E-07 -0.000000E+00 -0.000000E+00 -3.300000E-02 -2.270000E-04 -1.837920E-02 -7.801676E-05 -1.150357E-02 -2.715434E-05 -5.741625E-03 -6.838179E-06 -1.540397E-02 -4.998202E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -1.000000E-03 -1.000000E-06 -5.247170E-04 -2.753280E-07 --8.700807E-05 -7.570404E-09 --4.259024E-04 -1.813928E-07 -1.196497E-03 -7.159790E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.500000E-02 -1.430000E-04 -8.404687E-03 -2.505155E-05 -6.898191E-03 -1.367706E-05 -3.899114E-03 -3.607028E-06 -1.271358E-02 -3.382031E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-02 -1.940000E-04 -1.736738E-02 -7.398587E-05 -7.729434E-03 -1.773562E-05 -4.523718E-03 -5.898914E-06 -1.567397E-02 -5.134448E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.993246E-04 -1.796295E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.000000E-03 -2.300000E-05 --7.007722E-04 -2.822943E-06 --5.777080E-04 -9.868563E-07 -1.257117E-03 -3.672741E-07 -5.315767E-03 -6.276521E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.400000E-02 -1.220000E-04 -1.229985E-02 -3.184724E-05 -1.060332E-02 -2.381543E-05 -7.803741E-03 -1.463189E-05 -1.117224E-02 -2.961846E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.480499E-03 -6.139848E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.822902E-03 -3.322972E-06 -2.000000E-03 -4.000000E-06 -1.879286E-03 -3.531714E-06 -1.649674E-03 -2.721425E-06 -1.333434E-03 -1.778047E-06 +2.312419E-04 +5.347280E-08 +-4.197908E-04 +1.762243E-07 +-3.159499E-04 +9.982435E-08 0.000000E+00 0.000000E+00 2.100000E-02 -1.010000E-04 -8.226424E-03 -1.799176E-05 -6.115955E-03 -1.432832E-05 -5.108113E-03 -8.009589E-06 -1.030852E-02 -2.790767E-05 +1.070000E-04 +2.216472E-03 +6.388960E-06 +4.896969E-03 +6.428816E-06 +2.155707E-03 +2.884510E-06 +1.038058E-02 +2.477423E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -859,38 +2139,38 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.861614E-04 -2.617623E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.661896E-04 -7.502844E-07 +3.007686E-04 +9.046177E-08 1.000000E-03 1.000000E-06 -8.824739E-04 -7.787602E-07 -6.681402E-04 -4.464114E-07 -3.943779E-04 -1.555340E-07 -2.887299E-04 -8.336493E-08 -2.400000E-02 -1.340000E-04 -5.157290E-03 -7.361769E-06 -3.873191E-03 -7.075290E-06 -8.178477E-04 -5.349982E-06 -1.151979E-02 -2.707490E-05 +7.019813E-04 +4.927778E-07 +2.391667E-04 +5.720072E-08 +-1.881699E-04 +3.540793E-08 +2.131373E-03 +2.696833E-06 +1.000000E-03 +1.000000E-06 +9.937981E-04 +9.876347E-07 +9.814521E-04 +9.632483E-07 +9.630767E-04 +9.275168E-07 +0.000000E+00 +0.000000E+00 +6.000000E-03 +1.000000E-05 +2.774441E-03 +2.455060E-06 +-4.125360E-04 +1.557128E-06 +-9.369606E-04 +2.349382E-06 +3.666415E-03 +4.871762E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -899,8 +2179,20 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.880544E-04 -2.629944E-07 +6.057201E-04 +1.834492E-07 +1.000000E-03 +1.000000E-06 +8.429685E-04 +7.105959E-07 +5.658938E-04 +3.202358E-07 +2.330721E-04 +5.432261E-08 +6.015373E-04 +3.618471E-07 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -909,28 +2201,18 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.362820E-03 -2.089719E-06 3.000000E-03 -3.000000E-06 -2.788384E-03 -2.594798E-06 -2.392197E-03 -1.932048E-06 -1.861371E-03 -1.235196E-06 +5.000000E-06 +1.596397E-03 +1.275630E-06 +4.822532E-04 +1.627925E-07 +2.983020E-04 +9.401537E-08 +1.221939E-03 +7.467452E-07 0.000000E+00 0.000000E+00 -1.000000E-02 -3.600000E-05 -1.316990E-03 -3.149836E-06 --3.200310E-04 -2.746500E-07 --1.360513E-03 -1.090571E-06 -4.126370E-03 -6.612189E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -939,8 +2221,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.038170E-04 -9.230477E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -961,296 +2241,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.700000E-02 -1.810000E-04 -9.818267E-03 -4.983755E-05 -3.336597E-03 -8.390727E-06 -2.160979E-03 -5.064669E-06 -1.384908E-02 -4.570937E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.925469E-04 -1.756697E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.832949E-04 -7.802099E-07 -1.000000E-03 -1.000000E-06 -2.811985E-04 -7.907261E-08 --3.813911E-04 -1.454592E-07 --3.662100E-04 -1.341098E-07 -0.000000E+00 -0.000000E+00 -3.100000E-02 -2.130000E-04 -1.202681E-02 -3.022795E-05 -7.515466E-03 -1.650504E-05 -5.404032E-03 -1.127927E-05 -1.330371E-02 -4.078117E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -3.000000E-03 -3.000000E-06 -2.638441E-04 -1.166669E-06 -2.500034E-04 -9.610467E-07 -1.533129E-03 -8.706796E-07 -1.174177E-03 -5.193538E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.800000E-02 -2.980000E-04 -1.429526E-02 -5.478450E-05 -1.510549E-03 -2.039833E-05 -5.571300E-03 -7.961775E-06 -1.713980E-02 -6.035252E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.804596E-04 -2.584372E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.774597E-04 -3.334597E-07 -2.000000E-03 -4.000000E-06 -1.885369E-03 -3.554618E-06 -1.668235E-03 -2.783008E-06 -1.371259E-03 -1.880351E-06 -2.887299E-04 -8.336493E-08 -1.800000E-02 -7.600000E-05 -1.188269E-02 -3.305188E-05 -6.397672E-03 -1.039477E-05 -5.195583E-03 -8.228666E-06 -6.541819E-03 -1.138522E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.800000E-02 -1.920000E-04 -9.138883E-03 -2.389639E-05 -8.073407E-03 -1.777984E-05 -4.397066E-03 -1.246700E-05 -1.396848E-02 -4.880190E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.184277E-03 -3.507420E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.888633E-04 -3.467599E-07 -1.000000E-03 -1.000000E-06 -9.872275E-04 -9.746182E-07 -9.619273E-04 -9.253040E-07 -9.245834E-04 -8.548545E-07 -0.000000E+00 -0.000000E+00 -2.800000E-02 -1.960000E-04 -9.225605E-03 -2.308636E-05 -5.671475E-03 -8.733020E-06 -2.978790E-03 -7.550647E-06 -1.623921E-02 -6.654244E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-03 -1.000000E-06 --2.171929E-04 -4.717275E-08 --4.292409E-04 -1.842477E-07 -3.001754E-04 -9.010526E-08 -5.982486E-04 -1.789948E-07 -1.000000E-03 -1.000000E-06 -9.264912E-04 -8.583859E-07 -7.875789E-04 -6.202805E-07 -5.984807E-04 -3.581791E-07 -0.000000E+00 -0.000000E+00 -4.000000E-02 -3.760000E-04 -1.836389E-02 -1.034063E-04 -1.618617E-02 -7.468163E-05 -1.265008E-02 -4.683455E-05 -1.680380E-02 -6.300115E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.481316E-03 -7.904264E-07 -1.000000E-03 -1.000000E-06 --7.356303E-04 -5.411519E-07 -3.117279E-04 -9.717427E-08 -1.082261E-04 -1.171288E-08 -5.888633E-04 -3.467599E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 8.000000E-03 -2.200000E-05 -1.034121E-03 -5.652456E-07 --8.248086E-04 -1.478042E-06 --7.162554E-04 -2.662167E-07 -4.452971E-03 -6.246366E-06 +4.000000E-05 +-7.915490E-05 +1.150292E-07 +2.293529E-03 +2.932682E-06 +1.356149E-03 +9.471925E-07 +4.579650E-03 +7.918475E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1259,8 +2259,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.899392E-04 -1.740147E-07 +3.022304E-04 +9.134324E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1281,296 +2281,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.700000E-02 -1.650000E-04 -1.022719E-02 -3.691933E-05 -8.344427E-03 -2.163687E-05 -2.493470E-03 -3.777443E-06 -1.562097E-02 -5.500554E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.865227E-04 -7.859225E-07 -1.000000E-03 -1.000000E-06 --2.406040E-04 -5.789029E-08 --4.131646E-04 -1.707050E-07 -3.260844E-04 -1.063311E-07 -2.628743E-03 -4.454101E-06 -1.000000E-03 -1.000000E-06 -8.584065E-04 -7.368618E-07 -6.052926E-04 -3.663792E-07 -2.937076E-04 -8.626413E-08 -2.887299E-04 -8.336493E-08 -2.400000E-02 -1.460000E-04 -1.482825E-02 -6.559075E-05 -7.894674E-03 -1.733357E-05 -4.942543E-03 -5.919157E-06 -9.954930E-03 -2.766286E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.887299E-04 -8.336493E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.114510E-04 -8.307430E-07 -1.000000E-03 -1.000000E-06 -9.637579E-04 -9.288293E-07 -8.932439E-04 -7.978848E-07 -7.922796E-04 -6.277069E-07 -0.000000E+00 -0.000000E+00 -2.800000E-02 -2.080000E-04 -9.690534E-03 -3.443096E-05 -4.888498E-03 -1.094678E-05 -2.994444E-03 -6.032009E-06 -1.236682E-02 -3.585861E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.191871E-03 -5.399087E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.832949E-04 -7.802099E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.000000E-03 -3.100000E-05 -6.119200E-03 -1.291899E-05 -5.129096E-03 -1.114323E-05 -4.761296E-03 -9.710486E-06 -3.829174E-03 -6.324914E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.944316E-04 -8.668999E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.774597E-04 -3.334597E-07 -1.000000E-03 -1.000000E-06 -9.885814E-04 -9.772933E-07 -9.659399E-04 -9.330399E-07 -9.324628E-04 -8.694869E-07 -0.000000E+00 -0.000000E+00 -2.300000E-02 -1.270000E-04 -5.315630E-03 -1.185056E-05 -2.837051E-03 -6.724635E-06 -2.570238E-03 -6.855367E-06 -1.266746E-02 -3.785511E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.031416E-04 -4.565438E-07 -1.000000E-03 -1.000000E-06 -9.914618E-04 -9.829965E-07 -9.744947E-04 -9.496400E-07 -9.493160E-04 -9.012008E-07 -0.000000E+00 -0.000000E+00 -9.000000E-03 -2.900000E-05 -2.008698E-03 -7.210242E-06 -1.288698E-03 -6.087002E-07 --5.193923E-04 -4.491465E-07 -3.876462E-03 -4.440238E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.700000E-02 -2.030000E-04 -1.013137E-02 -3.117050E-05 -3.372227E-03 -8.195716E-06 -3.788344E-03 -6.816175E-06 -1.323056E-02 -4.179593E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.183098E-03 -8.764183E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.114510E-04 -8.307430E-07 -1.000000E-03 -1.000000E-06 -8.500688E-04 -7.226169E-07 -5.839254E-04 -3.409689E-07 -2.605821E-04 -6.790302E-08 -0.000000E+00 -0.000000E+00 1.100000E-02 -2.700000E-05 -7.820374E-03 -1.524804E-05 -4.579486E-03 -8.746643E-06 -3.441507E-03 -5.197609E-06 -4.452744E-03 -4.715167E-06 +3.300000E-05 +5.093647E-03 +1.217545E-05 +1.852586E-03 +4.478970E-06 +9.768799E-04 +1.395189E-06 +4.578572E-03 +5.491453E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1579,8 +2299,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.887299E-04 -8.336493E-08 +3.102008E-04 +9.622454E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1589,388 +2309,28 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.774597E-04 -3.334597E-07 +3.053824E-04 +9.325841E-08 1.000000E-03 1.000000E-06 -9.729463E-04 -9.466245E-07 -9.199368E-04 -8.462837E-07 -8.431176E-04 -7.108474E-07 -0.000000E+00 -0.000000E+00 -3.800000E-02 -3.240000E-04 -1.253787E-02 -4.293627E-05 -1.235024E-02 -4.427860E-05 -1.055055E-02 -3.831635E-05 -1.944951E-02 -9.030483E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.944316E-04 -8.668999E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.600000E-02 -1.500000E-04 -5.912427E-03 -8.576381E-06 -6.340156E-03 -2.278116E-05 -1.617551E-03 -6.023906E-06 -1.264835E-02 -3.597963E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.804596E-04 -2.584372E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.300000E-02 -1.230000E-04 -4.119009E-03 -9.246641E-06 -5.235271E-03 -1.144493E-05 --4.185262E-04 -5.960141E-06 -1.208764E-02 -3.425774E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -1.000000E-03 -1.000000E-06 -8.637115E-04 -7.459975E-07 -6.189963E-04 -3.831564E-07 -3.152494E-04 -9.938217E-08 -0.000000E+00 -0.000000E+00 -1.500000E-02 -5.700000E-05 --1.957197E-03 -1.258480E-05 -2.792528E-03 -9.542338E-06 --3.511546E-04 -3.064697E-06 -6.238135E-03 -9.183145E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.200000E-02 -1.080000E-04 -9.763854E-03 -2.367740E-05 -4.590661E-03 -6.936237E-06 -2.901204E-03 -1.887464E-06 -1.005417E-02 -2.274048E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.865227E-04 -7.859225E-07 -1.000000E-03 -1.000000E-06 --2.499079E-04 -6.245395E-08 --4.063191E-04 -1.650952E-07 -3.358425E-04 -1.127902E-07 -1.185094E-03 -7.026788E-07 -1.000000E-03 -1.000000E-06 -9.786988E-04 -9.578514E-07 -9.367771E-04 -8.775513E-07 -8.755719E-04 -7.666261E-07 -3.038170E-04 -9.230477E-08 -2.000000E-02 -9.800000E-05 -7.857549E-03 -1.428798E-05 -5.459113E-03 -9.636925E-06 -1.887884E-03 -1.537243E-06 -1.001700E-02 -2.607271E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.962222E-04 -8.774759E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.800000E-02 -8.200000E-05 -8.495126E-03 -2.651261E-05 -4.998924E-03 -1.299981E-05 -3.448762E-03 -4.943207E-06 -8.610805E-03 -1.917491E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.038562E-04 -4.569667E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -1.200000E-05 -3.227340E-03 -4.394334E-06 -2.414906E-03 -2.934558E-06 -3.208300E-03 -3.506847E-06 -3.262105E-03 -4.123831E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.200000E-02 -5.400000E-05 -4.005144E-03 -5.369960E-06 -4.643787E-03 -9.269182E-06 -2.657135E-03 -3.511892E-06 -4.987572E-03 -8.363876E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +9.817451E-04 +9.638234E-07 +9.457351E-04 +8.944149E-07 +8.929546E-04 +7.973680E-07 0.000000E+00 0.000000E+00 4.000000E-03 -6.000000E-06 -1.406973E-03 -2.042054E-06 -1.350269E-03 -1.571414E-06 -1.514228E-03 -1.025767E-06 -1.776109E-03 -1.051978E-06 +4.000000E-06 +-1.284380E-03 +9.356368E-07 +-5.965448E-04 +6.643272E-07 +3.352677E-04 +2.956621E-07 +1.526686E-03 +6.527074E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2003,374 +2363,14 @@ tally 1: 0.000000E+00 1.000000E-03 1.000000E-06 --9.859558E-04 -9.721088E-07 -9.581632E-04 -9.180766E-07 --9.172070E-04 -8.412686E-07 -1.487277E-03 -7.925940E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.000000E-03 -1.300000E-05 -1.259188E-03 -2.542709E-06 -1.153212E-03 -5.113126E-07 -1.180102E-03 -1.512230E-06 -2.952791E-03 -2.256416E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.000000E-03 -2.900000E-05 -3.658677E-03 -5.084397E-06 -1.342768E-03 -7.844439E-07 -1.434698E-03 -1.591990E-06 -4.727265E-03 -6.802376E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-03 -6.000000E-06 --3.169496E-04 -4.640012E-07 -3.870584E-04 -1.106745E-06 -2.229627E-03 -2.248204E-06 -2.384967E-03 -3.528132E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.887299E-04 -8.336493E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-03 -2.000000E-06 -1.104635E-03 -1.006490E-06 -5.097352E-04 -1.218176E-06 -8.274440E-04 -9.952021E-07 -8.879520E-04 -4.383151E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.400000E-02 -4.200000E-05 -3.129225E-03 -5.993671E-06 -4.628419E-03 -5.138563E-06 -2.799257E-03 -6.824571E-06 -6.214149E-03 -8.661850E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.962222E-04 -8.774759E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.200000E-02 -3.800000E-05 -4.480587E-03 -8.674795E-06 -3.647946E-03 -4.377407E-06 -3.360220E-03 -5.133585E-06 -7.650887E-03 -1.640283E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.000000E-03 -3.100000E-05 -4.975831E-03 -8.184805E-06 -2.183561E-03 -2.575450E-06 -2.014752E-03 -5.318808E-06 -3.529684E-03 -5.223931E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.832949E-04 -7.802099E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +-3.965739E-04 +1.572709E-07 +-2.640937E-04 +6.974547E-08 +4.389371E-04 +1.926657E-07 +3.053824E-04 +9.325841E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2402,11 +2402,11 @@ tally 1: 0.000000E+00 0.000000E+00 tally 2: -5.604521E-01 -6.286639E-02 -6.095321E-01 -7.435628E-02 -3.539776E+00 -2.507806E+00 -3.963740E+01 -3.144698E+02 +5.720364E-01 +6.548043E-02 +6.217988E-01 +7.736906E-02 +3.624477E+00 +2.628737E+00 +4.047526E+01 +3.278231E+02 diff --git a/tests/test_statepoint_batch/results_true.dat b/tests/test_statepoint_batch/results_true.dat index 786fd55461..95b536997e 100644 --- a/tests/test_statepoint_batch/results_true.dat +++ b/tests/test_statepoint_batch/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.109090E-01 5.807935E-03 +3.051173E-01 6.930168E-04 diff --git a/tests/test_statepoint_interval/results_true.dat b/tests/test_statepoint_interval/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_statepoint_interval/results_true.dat +++ b/tests/test_statepoint_interval/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_statepoint_restart/results_true.dat b/tests/test_statepoint_restart/results_true.dat index 378d07639f..7fb39ef0ac 100644 --- a/tests/test_statepoint_restart/results_true.dat +++ b/tests/test_statepoint_restart/results_true.dat @@ -1,16 +1,36 @@ k-combined: 0.000000E+00 0.000000E+00 tally 1: -6.000000E-03 -2.600000E-05 -3.531902E-03 -1.021953E-05 -9.975346E-04 -1.809348E-06 -1.606025E-04 -5.146498E-07 -3.612566E-03 -7.304701E-06 +1.000000E-03 +1.000000E-06 +6.655302E-04 +4.429305E-07 +1.643958E-04 +2.702597E-08 +-2.613362E-04 +6.829663E-08 +9.306024E-04 +8.660208E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -23,2034 +43,174 @@ tally 1: 0.000000E+00 1.000000E-03 1.000000E-06 --6.834146E-04 -4.670555E-07 -2.005832E-04 -4.023363E-08 -2.271406E-04 -5.159283E-08 -1.822902E-03 -3.322972E-06 -3.000000E-03 -9.000000E-06 -2.089393E-03 -4.365565E-06 -1.135864E-03 -1.290186E-06 -8.092128E-04 -6.548254E-07 +3.222834E-05 +1.038666E-09 +-4.984420E-04 +2.484444E-07 +-4.825883E-05 +2.328915E-09 +1.221939E-03 +7.467452E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +-5.510082E-04 +3.036101E-07 +-4.458491E-05 +1.987814E-09 +4.082832E-04 +1.666952E-07 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.000000E-03 +2.000000E-05 +-1.959329E-04 +1.780222E-06 +-1.481510E-03 +1.429609E-06 +2.196341E-04 +1.036368E-06 +3.355616E-03 +5.662237E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 9.000000E-03 4.100000E-05 -5.652386E-03 -1.597604E-05 -2.688047E-03 -3.713200E-06 -2.194373E-03 -2.457094E-06 -4.490780E-03 -1.011172E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.993246E-04 -1.796295E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-03 -5.000000E-06 -2.287185E-05 -1.868964E-06 -1.070450E-03 -8.923889E-07 -6.823621E-04 -7.961600E-07 -1.494157E-03 -1.155142E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.000000E-03 -4.500000E-05 --5.457243E-04 -9.054533E-06 --4.642719E-04 -6.489071E-07 -4.050968E-04 -1.775928E-06 -3.579329E-03 -7.065658E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.000000E-03 -2.500000E-05 -3.948480E-03 -7.932459E-06 -1.825370E-03 -1.929280E-06 -9.348098E-04 -5.448323E-07 -4.195272E-03 -8.801845E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.215268E-03 -1.476876E-06 -1.000000E-03 -1.000000E-06 -9.835700E-04 -9.674099E-07 -9.511149E-04 -9.046195E-07 -9.034334E-04 -8.161919E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -2.000000E-05 -2.837861E-03 -4.029451E-06 -2.881422E-03 -5.264923E-06 -6.079138E-04 -2.481989E-07 -2.380679E-03 -3.512909E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-03 -1.000000E-06 --3.562118E-04 -1.268868E-07 --3.096697E-04 -9.589534E-08 -4.213212E-04 -1.775116E-07 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-03 -5.000000E-06 -1.625863E-03 -1.397973E-06 --7.273518E-05 -2.624738E-08 --9.756535E-04 -5.212160E-07 -9.031416E-04 -4.565438E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -5.200000E-05 -3.200356E-03 -6.305597E-06 -4.448554E-04 -8.305799E-07 --1.337748E-04 -7.137799E-07 -4.794597E-03 -1.149629E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-03 -1.000000E-06 --8.123463E-04 -6.599064E-07 -4.898597E-04 -2.399625E-07 --1.216619E-04 -1.480163E-08 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -3.600000E-05 -2.521971E-03 -6.360336E-06 -2.020703E-03 -4.083242E-06 -4.407398E-04 -1.942515E-07 -2.955076E-03 -8.732472E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.000000E-03 -2.500000E-05 -3.210520E-03 -7.168481E-06 -5.465390E-04 -2.109809E-06 -2.437003E-04 -7.534680E-07 -2.397298E-03 -2.874072E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.993246E-04 -1.796295E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.114510E-04 -8.307430E-07 -1.000000E-03 -1.000000E-06 -8.370200E-04 -7.006024E-07 -5.509036E-04 -3.034948E-07 -2.105156E-04 -4.431682E-08 -3.038170E-04 -9.230477E-08 -3.000000E-03 -5.000000E-06 --5.652293E-04 -2.826536E-07 --4.965795E-04 -1.814108E-07 -4.241721E-04 -1.785027E-07 -1.494157E-03 -1.155142E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.076340E-04 -3.692191E-07 -1.000000E-03 -1.000000E-06 -9.987845E-04 -9.975704E-07 -9.963556E-04 -9.927245E-07 -9.927178E-04 -9.854887E-07 -0.000000E+00 -0.000000E+00 -1.500000E-02 -1.130000E-04 -6.948075E-03 -3.012964E-05 -4.659628E-03 -1.149973E-05 -2.300471E-03 -2.760542E-06 -6.009865E-03 -1.888067E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.076340E-04 -3.692191E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.300000E-02 -8.900000E-05 -3.756467E-03 -7.490548E-06 -3.458886E-03 -8.908312E-06 -1.955536E-03 -1.939721E-06 -5.672810E-03 -1.709769E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.500000E-02 -1.170000E-04 -1.030992E-02 -5.340950E-05 -5.378168E-03 -1.477216E-05 -2.698876E-03 -3.931578E-06 -7.470784E-03 -2.887854E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.993246E-04 -1.796295E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-03 -5.000000E-06 -1.127335E-03 -1.646568E-06 -2.677722E-05 -4.627248E-07 -4.736469E-04 -1.133017E-07 -2.085172E-03 -2.552337E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.000000E-03 -2.500000E-05 -4.643996E-03 -1.123518E-05 -5.365579E-03 -1.452653E-05 -3.188541E-03 -5.332163E-06 -2.397298E-03 -2.874072E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.993246E-04 -1.796295E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.822902E-03 -3.322972E-06 -2.000000E-03 -4.000000E-06 -1.879286E-03 -3.531714E-06 -1.649674E-03 -2.721425E-06 -1.333434E-03 -1.778047E-06 -0.000000E+00 -0.000000E+00 -5.000000E-03 -1.300000E-05 -2.119503E-03 -2.510375E-06 -2.082062E-03 -2.331440E-06 -3.351745E-04 -2.838723E-07 -1.510776E-03 -1.564201E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.100000E-02 -7.300000E-05 -3.488060E-03 -6.088204E-06 -4.865073E-04 -2.426361E-07 --1.552382E-03 -3.383588E-06 -3.899764E-03 -7.666624E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.993246E-04 -1.796295E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.076340E-04 -3.692191E-07 -1.000000E-03 -1.000000E-06 -8.964005E-04 -8.035339E-07 -7.053009E-04 -4.974493E-07 -4.561198E-04 -2.080453E-07 -0.000000E+00 -0.000000E+00 -2.000000E-03 -2.000000E-06 -1.915339E-04 -2.525471E-07 --6.211793E-04 -2.122635E-07 --1.146914E-04 -3.101272E-07 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -2.600000E-05 --4.219550E-04 -1.772971E-07 --5.155325E-04 -1.340113E-07 --6.251664E-04 -1.343175E-06 -3.620876E-03 -8.262609E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.000000E-03 -3.400000E-05 -5.071850E-03 -1.313386E-05 -2.724384E-03 -7.394944E-06 -2.290869E-03 -6.048295E-06 -3.620876E-03 -8.262609E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -1.000000E-03 -1.000000E-06 -9.548992E-04 -9.118325E-07 -8.677487E-04 -7.529878E-07 -7.444215E-04 -5.541633E-07 -5.910151E-04 -3.492989E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.300000E-02 -8.500000E-05 -9.564268E-03 -4.579281E-05 -5.459886E-03 -1.501050E-05 -2.874517E-03 -4.642749E-06 -6.592570E-03 -2.173517E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -2.000000E-05 -4.435015E-03 -1.032581E-05 -2.521759E-03 -3.179660E-06 -1.353941E-03 -9.392372E-07 -2.422227E-03 -4.610259E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.300000E-02 -1.090000E-04 -1.100864E-03 -1.263113E-06 -2.894751E-03 -6.130418E-06 --1.408599E-04 -4.071904E-07 -7.537259E-03 -3.418566E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.993246E-04 -1.796295E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.600000E-02 -1.460000E-04 -4.074270E-03 -1.077055E-05 -2.219886E-03 -2.502730E-06 -1.500629E-03 -1.970345E-06 -8.940012E-03 -4.598689E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-03 -1.000000E-06 --2.171929E-04 -4.717275E-08 --4.292409E-04 -1.842477E-07 -3.001754E-04 -9.010526E-08 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.600000E-02 -1.460000E-04 -4.558047E-03 -2.458088E-05 -4.224970E-03 -1.162419E-05 -3.278961E-03 -7.369638E-06 -7.462474E-03 -2.983182E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.076340E-04 -3.692191E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-03 -4.000000E-06 --7.774760E-05 -6.044689E-09 --9.888880E-04 -9.778994E-07 -1.150490E-04 -1.323627E-08 -1.510776E-03 -1.564201E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -1.800000E-05 -1.830475E-03 -4.175502E-06 -5.295634E-04 -6.803525E-07 --6.336822E-04 -3.621057E-07 -3.883146E-03 -7.896401E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.865227E-04 -7.859225E-07 -1.000000E-03 -1.000000E-06 --2.406040E-04 -5.789029E-08 --4.131646E-04 -1.707050E-07 -3.260844E-04 -1.063311E-07 -6.076340E-04 -3.692191E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.000000E-03 -3.700000E-05 -3.454215E-03 -1.675190E-05 -1.858250E-03 -3.338471E-06 -1.085475E-03 -6.518317E-07 -2.372370E-03 -4.371216E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.114510E-04 -8.307430E-07 -1.000000E-03 -1.000000E-06 -9.637579E-04 -9.288293E-07 -8.932439E-04 -7.978848E-07 -7.922796E-04 -6.277069E-07 -0.000000E+00 -0.000000E+00 -1.000000E-02 -5.000000E-05 -1.718655E-03 -5.820327E-06 -1.009025E-03 -1.093834E-06 -7.699062E-05 -4.576237E-09 -3.587638E-03 -6.586531E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.031416E-04 -4.565438E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-03 -1.000000E-06 -8.821806E-04 -7.782426E-07 -6.673640E-04 -4.453746E-07 -3.931055E-04 -1.545319E-07 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -2.600000E-05 -1.227695E-03 -5.443406E-06 -2.043844E-04 -8.931431E-07 --1.326053E-03 -9.027914E-07 -2.709425E-03 -4.108894E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.031416E-04 -4.565438E-07 -1.000000E-03 -1.000000E-06 -9.914618E-04 -9.829965E-07 -9.744947E-04 -9.496400E-07 -9.493160E-04 -9.012008E-07 -0.000000E+00 -0.000000E+00 -6.000000E-03 -2.600000E-05 -2.958450E-03 -5.562605E-06 -3.172420E-04 -6.855086E-08 -2.704203E-05 -6.951536E-08 -2.413917E-03 -3.672271E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.000000E-03 -1.700000E-05 -1.519186E-03 -1.241308E-06 --2.611610E-04 -2.188069E-06 -3.469316E-04 -8.929955E-07 -3.562710E-03 -9.101691E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.114510E-04 -8.307430E-07 -1.000000E-03 -1.000000E-06 -8.500688E-04 -7.226169E-07 -5.839254E-04 -3.409689E-07 -2.605821E-04 -6.790302E-08 -0.000000E+00 -0.000000E+00 -4.000000E-03 -1.000000E-05 -3.088118E-03 -7.629969E-06 -1.972096E-03 -5.348162E-06 -1.349791E-03 -3.293530E-06 -1.814593E-03 -2.394944E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -5.000000E-05 -5.974452E-03 -2.318079E-05 -3.480849E-03 -1.552533E-05 -3.253745E-03 -8.999790E-06 -4.777978E-03 -1.205544E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.000000E-03 -4.500000E-05 -2.829108E-03 -4.741955E-06 -4.557223E-03 -1.257560E-05 -1.915865E-03 -3.032559E-06 -4.465851E-03 -1.204317E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.000000E-03 -3.400000E-05 -9.777793E-04 -5.838760E-07 -3.108961E-03 -5.045918E-06 -9.790439E-04 -2.045088E-06 -5.377302E-03 -1.508923E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -1.000000E-03 -1.000000E-06 -8.637115E-04 -7.459975E-07 -6.189963E-04 -3.831564E-07 -3.152494E-04 -9.938217E-08 -0.000000E+00 -0.000000E+00 -8.000000E-03 -4.000000E-05 --2.016521E-03 -3.282699E-06 --2.864647E-04 -5.009517E-06 --1.038509E-03 -9.421948E-07 -3.013242E-03 -5.308856E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.000000E-03 -3.400000E-05 -3.498315E-03 -7.919249E-06 -8.129080E-04 -1.259805E-06 -1.181971E-03 -7.715331E-07 -2.996623E-03 -4.490737E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.865227E-04 -7.859225E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.076340E-04 -3.692191E-07 -1.000000E-03 -1.000000E-06 -9.786988E-04 -9.578514E-07 -9.367771E-04 -8.775513E-07 -8.755719E-04 -7.666261E-07 -3.038170E-04 -9.230477E-08 -8.000000E-03 -5.000000E-05 -2.793720E-03 -4.229256E-06 -2.872177E-03 -4.544501E-06 -1.077428E-03 -9.288883E-07 -3.849908E-03 -1.266706E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -5.800000E-05 -4.954781E-03 -1.712892E-05 -4.126960E-03 -1.107068E-05 -2.518231E-03 -4.154059E-06 -4.819525E-03 -1.335200E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.076340E-04 -3.692191E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-03 -2.000000E-06 -6.612504E-04 -8.898055E-07 -3.347082E-04 -7.163327E-07 -8.531489E-04 -3.808616E-07 -1.190340E-03 -8.782273E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-03 -5.000000E-06 -4.625274E-04 -1.150077E-06 -5.123029E-04 -8.692268E-07 -8.248357E-04 -5.505055E-07 -1.198649E-03 -7.185180E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-03 -1.000000E-06 --9.859558E-04 -9.721088E-07 -9.581632E-04 -9.180766E-07 --9.172070E-04 -8.412686E-07 -8.948321E-04 -4.416037E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +5.210818E-03 +1.357783E-05 +1.394382E-03 +9.898987E-07 +2.796067E-04 +6.984712E-07 +3.684681E-03 +7.605759E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2083,14 +243,14 @@ tally 1: 0.000000E+00 4.000000E-03 8.000000E-06 --2.701471E-04 -1.370723E-06 -6.964728E-04 -2.988117E-07 -8.616833E-04 -1.449401E-06 -1.494157E-03 -1.155142E-06 +1.019723E-03 +2.941013E-06 +3.796068E-04 +1.213513E-06 +6.991567E-04 +2.907192E-07 +2.133677E-03 +2.313409E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2121,16 +281,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -4.000000E-03 -1.600000E-05 -6.207788E-04 -3.853663E-07 -1.877009E-04 -3.523162E-08 -9.779406E-04 -9.563678E-07 -2.676187E-03 -4.648130E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2161,16 +311,266 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-03 +3.200000E-05 +7.394988E-04 +4.098659E-07 +4.040769E-04 +3.143715E-07 +1.784935E-04 +3.163907E-07 +2.744646E-03 +3.801137E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.015373E-04 +3.618471E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.000000E-03 +4.500000E-05 +4.871111E-03 +1.225810E-05 +2.381697E-03 +2.840243E-06 +2.498800E-03 +3.161161E-06 +3.656384E-03 +6.838240E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +5.000000E-06 +9.405302E-04 +8.589283E-07 +2.623590E-03 +3.990114E-06 +6.768145E-04 +3.652890E-07 +1.212507E-03 +9.103805E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.109694E-04 +1.866863E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +9.168648E-04 +8.406410E-07 +7.609615E-04 +5.790624E-07 +5.515881E-04 +3.042494E-07 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.200000E-02 +8.000000E-05 +6.636635E-03 +2.425315E-05 +4.338045E-03 +1.464490E-05 +3.621511E-03 +1.385488E-05 +7.040297E-03 +2.530812E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +5.800000E-05 +1.624971E-03 +3.694766E-06 +1.160491E-03 +1.280447E-06 +-8.692024E-05 +3.035696E-06 +4.305083E-03 +1.106984E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.221939E-03 +7.467452E-07 +1.000000E-03 +1.000000E-06 +9.910929E-04 +9.822652E-07 +9.733978E-04 +9.475032E-07 +9.471508E-04 +8.970946E-07 +0.000000E+00 +0.000000E+00 2.000000E-03 4.000000E-06 -4.298228E-04 -1.847476E-07 -9.681780E-04 -9.373686E-07 -1.370924E-03 -1.879433E-06 -6.076340E-04 -3.692191E-07 +3.249184E-04 +1.055720E-07 +9.928009E-04 +9.856536E-07 +1.088489E-03 +1.184808E-06 +9.023059E-04 +8.141559E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2203,14 +603,1294 @@ tally 1: 0.000000E+00 1.000000E-03 1.000000E-06 -9.975034E-04 -9.950130E-07 -9.925195E-04 -9.850950E-07 -9.850671E-04 -9.703571E-07 -2.955076E-04 -8.732472E-08 +9.686373E-04 +9.382582E-07 +9.073874E-04 +8.233518E-07 +8.191239E-04 +6.709640E-07 +6.204016E-04 +3.848982E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.500000E-02 +1.530000E-04 +1.597072E-03 +3.005651E-06 +2.949088E-03 +4.679665E-06 +3.631393E-03 +7.090560E-06 +5.460996E-03 +1.769365E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.503843E-03 +2.261544E-06 +2.000000E-03 +4.000000E-06 +-1.555019E-04 +2.418085E-08 +-6.469952E-05 +4.186027E-09 +-1.256495E-04 +1.578779E-08 +2.462742E-03 +3.825930E-06 +2.000000E-03 +2.000000E-06 +1.802029E-03 +1.623906E-06 +1.435858E-03 +1.032682E-06 +9.559957E-04 +4.622600E-07 +0.000000E+00 +0.000000E+00 +1.400000E-02 +1.060000E-04 +3.845354E-03 +1.771893E-05 +7.969986E-04 +1.251583E-05 +2.663540E-03 +3.580311E-06 +7.322201E-03 +2.693121E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +5.800000E-05 +7.529857E-03 +3.304826E-05 +4.385729E-03 +1.180121E-05 +2.219847E-03 +3.711400E-06 +4.549258E-03 +1.248547E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +5.000000E-06 +1.328181E-03 +8.967072E-07 +-4.616880E-04 +2.148940E-07 +-1.029769E-03 +5.645716E-07 +1.522708E-03 +1.199054E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.015373E-04 +3.618471E-07 +1.000000E-03 +1.000000E-06 +9.936377E-04 +9.873159E-07 +9.809739E-04 +9.623097E-07 +9.621293E-04 +9.256927E-07 +0.000000E+00 +0.000000E+00 +2.000000E-02 +2.000000E-04 +7.111929E-03 +2.528978E-05 +1.084601E-03 +1.073353E-06 +1.275976E-03 +2.215783E-06 +7.350498E-03 +2.790619E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.015373E-04 +3.618471E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.000000E-03 +2.500000E-05 +1.990597E-03 +2.484498E-06 +-4.860874E-04 +2.969876E-07 +6.661989E-04 +2.268944E-07 +4.577555E-03 +1.050456E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.015373E-04 +3.618471E-07 +1.000000E-03 +1.000000E-06 +9.615527E-04 +9.245836E-07 +8.868754E-04 +7.865479E-07 +7.802605E-04 +6.088065E-07 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +-3.730183E-04 +1.391426E-07 +-2.912860E-04 +8.484756E-08 +4.297706E-04 +1.847027E-07 +9.306024E-04 +8.660208E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +5.000000E-06 +2.287183E-03 +2.659902E-06 +1.571504E-03 +1.313687E-06 +1.459898E-03 +1.179754E-06 +9.117381E-04 +4.580716E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.200000E-02 +2.600000E-04 +6.732483E-03 +2.695948E-05 +5.717821E-03 +2.889220E-05 +-2.356418E-04 +7.546819E-07 +8.892069E-03 +4.212262E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +1.000000E-03 +1.000000E-06 +-7.961895E-04 +6.339178E-07 +4.508767E-04 +2.032898E-07 +-6.751245E-05 +4.557931E-09 +2.105380E-03 +4.432627E-06 +1.000000E-03 +1.000000E-06 +7.706275E-04 +5.938667E-07 +3.908001E-04 +1.527247E-07 +-1.181620E-05 +1.396226E-10 +0.000000E+00 +0.000000E+00 +1.300000E-02 +1.450000E-04 +5.254317E-03 +2.007625E-05 +1.153872E-03 +6.667482E-07 +1.643586E-03 +1.926972E-06 +5.733468E-03 +2.652835E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +6.100000E-05 +6.423451E-03 +2.063127E-05 +3.306770E-03 +5.779309E-06 +2.784620E-03 +3.970295E-06 +3.976017E-03 +7.971626E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-03 +8.000000E-06 +6.140550E-04 +1.773047E-06 +-1.620585E-04 +8.222999E-07 +1.423762E-03 +1.013556E-06 +1.832908E-03 +1.680177E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.500000E-02 +1.250000E-04 +4.942916E-03 +1.235885E-05 +1.021964E-03 +5.222106E-07 +9.236822E-04 +1.479238E-06 +7.322201E-03 +2.693121E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +1.000000E-03 +1.000000E-06 +5.742336E-04 +3.297442E-07 +-5.383652E-06 +2.898371E-11 +-3.879749E-04 +1.505245E-07 +3.007686E-04 +9.046177E-08 +1.000000E-03 +1.000000E-06 +9.585989E-04 +9.189118E-07 +8.783677E-04 +7.715298E-07 +7.642712E-04 +5.841105E-07 +3.007686E-04 +9.046177E-08 +1.300000E-02 +8.900000E-05 +5.419508E-03 +1.767227E-05 +2.993901E-03 +4.531596E-06 +2.675067E-03 +3.968688E-06 +5.780629E-03 +1.774150E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.221939E-03 +7.467452E-07 +2.000000E-03 +2.000000E-06 +1.775152E-03 +1.597527E-06 +1.396291E-03 +1.130413E-06 +9.794822E-04 +9.115176E-07 +0.000000E+00 +0.000000E+00 +8.000000E-03 +5.000000E-05 +2.406686E-03 +4.825540E-06 +4.960582E-04 +1.033420E-06 +1.240589E-03 +2.480639E-06 +5.226253E-03 +1.611788E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +9.405199E-04 +8.845778E-07 +8.268666E-04 +6.837084E-07 +6.691277E-04 +4.477318E-07 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +6.000000E-03 +2.600000E-05 +8.982135E-05 +2.560934E-07 +-7.114096E-04 +2.713326E-07 +8.252336E-04 +1.794332E-06 +2.716350E-03 +5.885778E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.300000E-02 +8.900000E-05 +6.195490E-03 +1.953479E-05 +2.111239E-03 +2.311139E-06 +2.268320E-03 +3.353244E-06 +5.808926E-03 +1.694986E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.000000E-03 +4.100000E-05 +-8.217874E-04 +4.663323E-07 +7.383083E-04 +5.193896E-06 +8.200240E-04 +3.424935E-07 +3.976017E-03 +7.971626E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-03 +8.000000E-06 +2.748347E-03 +4.220881E-06 +2.045316E-03 +2.683544E-06 +2.280529E-03 +2.612273E-06 +6.015373E-04 +3.618471E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.306024E-04 +8.660208E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.306024E-04 +8.660208E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +6.000000E-03 +1.800000E-05 +2.626871E-03 +3.665081E-06 +1.681981E-03 +1.510257E-06 +1.862830E-03 +2.103749E-06 +2.735214E-03 +4.122645E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +6.500000E-05 +6.880553E-03 +2.448726E-05 +3.974657E-03 +9.611600E-06 +3.058908E-03 +1.181515E-05 +4.295650E-03 +1.005573E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.200000E-02 +7.200000E-05 +6.025175E-03 +1.856579E-05 +5.884402E-03 +2.141913E-05 +1.752856E-03 +2.842294E-06 +6.401031E-03 +2.082068E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.000000E-03 +1.700000E-05 +3.189581E-03 +6.250530E-06 +1.000837E-03 +5.036982E-07 +-3.117653E-04 +2.901990E-07 +2.754079E-03 +3.853002E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +-5.657444E-04 +3.200667E-07 +-1.989995E-05 +3.960081E-10 +3.959267E-04 +1.567580E-07 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +9.000000E-06 +1.797289E-03 +3.230248E-06 +7.121477E-04 +5.071544E-07 +4.492929E-04 +2.018641E-07 +1.551004E-03 +2.405613E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +6.500000E-05 +6.283851E-03 +1.995229E-05 +1.355416E-03 +1.756870E-06 +-4.317669E-04 +7.579610E-07 +4.267354E-03 +9.253637E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +9.682863E-04 +9.375784E-07 +9.063676E-04 +8.215023E-07 +8.171815E-04 +6.677855E-07 +6.204016E-04 +3.848982E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.800000E-02 +1.640000E-04 +7.069243E-03 +2.506156E-05 +4.321329E-03 +1.796567E-05 +2.557673E-03 +3.894493E-06 +6.438760E-03 +2.205150E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.200000E-02 +7.200000E-05 +4.666186E-03 +1.284828E-05 +2.641891E-03 +1.762435E-05 +9.754238E-04 +2.039232E-06 +5.498725E-03 +1.512159E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-03 +8.000000E-06 +1.714892E-04 +9.981511E-07 +-4.305094E-04 +9.268480E-08 +-2.287903E-04 +5.786188E-08 +2.443878E-03 +2.986981E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +8.500000E-05 +4.472745E-03 +1.447325E-05 +6.072016E-04 +5.846134E-07 +9.336487E-04 +9.381432E-07 +5.169660E-03 +1.440996E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-03 +3.400000E-05 +3.030014E-03 +1.297316E-05 +1.879812E-03 +5.805316E-06 +2.471474E-03 +4.341265E-06 +3.374480E-03 +6.162391E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.000000E-03 +2.900000E-05 +-7.617232E-05 +3.053607E-08 +1.791545E-04 +5.297145E-08 +1.386068E-03 +1.737839E-06 +3.054847E-03 +4.667158E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-03 +4.000000E-06 +1.083160E-03 +1.173236E-06 +-4.570050E-05 +2.088536E-09 +-6.290949E-04 +3.957604E-07 +6.204016E-04 +3.848982E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2243,14 +1923,14 @@ tally 1: 0.000000E+00 6.000000E-03 2.000000E-05 --2.695842E-04 -1.341496E-06 -1.562492E-03 -1.831644E-06 --7.471975E-04 -2.484564E-06 -2.388989E-03 -3.013861E-06 +2.716180E-03 +5.893679E-06 +1.554292E-03 +1.376524E-06 +7.264867E-04 +1.331497E-06 +3.045415E-03 +4.796216E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2281,16 +1961,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.000000E-03 -4.000000E-06 -1.468316E-03 -2.155952E-06 -6.405092E-04 -4.102520E-07 --1.375320E-04 -1.891505E-08 -1.198649E-03 -7.185180E-07 +7.000000E-03 +2.500000E-05 +9.648146E-04 +5.981145E-07 +4.634865E-05 +7.955048E-07 +-1.328560E-04 +3.379815E-07 +3.355616E-03 +5.662237E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2299,8 +1979,328 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.955076E-04 -8.732472E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +5.000000E-06 +1.289998E-03 +8.380263E-07 +-3.762753E-05 +1.288533E-07 +-2.613682E-04 +4.197617E-08 +1.221939E-03 +7.467452E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +8.500000E-05 +3.095504E-03 +7.078598E-06 +-9.175432E-04 +6.837255E-07 +-7.570383E-04 +4.237745E-07 +4.530394E-03 +1.567294E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +7.300000E-05 +3.067467E-03 +5.676919E-06 +2.403624E-03 +2.913670E-06 +1.402382E-03 +1.691430E-06 +5.216821E-03 +1.489979E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +5.000000E-06 +1.008832E-03 +8.754929E-07 +-8.318856E-04 +3.573666E-07 +-9.886180E-04 +7.790297E-07 +1.851773E-03 +2.496075E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +8.429685E-04 +7.105959E-07 +5.658938E-04 +3.202358E-07 +2.330721E-04 +5.432261E-08 +6.015373E-04 +3.618471E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +5.000000E-06 +1.596397E-03 +1.275630E-06 +4.822532E-04 +1.627925E-07 +2.983020E-04 +9.401537E-08 +1.221939E-03 +7.467452E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.204016E-04 +3.848982E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +9.000000E-06 +2.576209E-03 +6.636855E-06 +1.844839E-03 +3.403429E-06 +9.997002E-04 +9.994005E-07 +1.240803E-03 +1.539593E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2323,14 +2323,14 @@ tally 1: 0.000000E+00 1.000000E-03 1.000000E-06 -9.489856E-04 -9.005736E-07 -8.508605E-04 -7.239635E-07 -7.131001E-04 -5.085118E-07 -2.955076E-04 -8.732472E-08 +1.590395E-04 +2.529356E-08 +-4.620597E-04 +2.134991E-07 +-2.285026E-04 +5.221342E-08 +3.102008E-04 +9.622454E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2402,11 +2402,11 @@ tally 1: 0.000000E+00 0.000000E+00 tally 2: -2.181843E-01 -2.381339E-02 -2.370439E-01 -2.810520E-02 -1.375356E+00 -9.460863E-01 -1.543948E+01 -1.192513E+02 +2.288800E-01 +2.621372E-02 +2.489848E-01 +3.102301E-02 +1.451035E+00 +1.053707E+00 +1.618797E+01 +1.311489E+02 diff --git a/tests/test_statepoint_sourcesep/results_true.dat b/tests/test_statepoint_sourcesep/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_statepoint_sourcesep/results_true.dat +++ b/tests/test_statepoint_sourcesep/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_survival_biasing/results_true.dat b/tests/test_survival_biasing/results_true.dat index 0f3509e448..a97654cfa2 100644 --- a/tests/test_survival_biasing/results_true.dat +++ b/tests/test_survival_biasing/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.025211E+00 1.372397E-02 +9.997733E-01 2.995572E-02 diff --git a/tests/test_tally_assumesep/results_true.dat b/tests/test_tally_assumesep/results_true.dat index a2f3586ae4..4835227f24 100644 --- a/tests/test_tally_assumesep/results_true.dat +++ b/tests/test_tally_assumesep/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.517577E+01 -4.747271E+01 +1.423676E+01 +4.330937E+01 tally 2: -3.151504E+00 -2.051857E+00 +2.914798E+00 +1.831649E+00 tally 3: -4.536316E+01 -4.258781E+02 +4.088282E+01 +3.662539E+02 diff --git a/tests/test_trace/results_true.dat b/tests/test_trace/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_trace/results_true.dat +++ b/tests/test_trace/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_translation/results_true.dat b/tests/test_translation/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_translation/results_true.dat +++ b/tests/test_translation/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_trigger_batch_interval/results_true.dat b/tests/test_trigger_batch_interval/results_true.dat index 65fa51bb4f..c901e1e54d 100644 --- a/tests/test_trigger_batch_interval/results_true.dat +++ b/tests/test_trigger_batch_interval/results_true.dat @@ -1,28 +1,28 @@ k-combined: -9.851940E-01 4.283950E-03 +9.875001E-01 3.961945E-03 tally 1: -1.972289E+01 -2.779778E+01 -4.489781E+00 -1.440247E+00 -4.356175E+00 -1.355797E+00 -1.523311E+01 -1.658397E+01 -1.972289E+01 -2.779778E+01 -4.489781E+00 -1.440247E+00 -4.356175E+00 -1.355797E+00 -1.523311E+01 -1.658397E+01 +2.128147E+01 +3.021699E+01 +4.842434E+00 +1.563989E+00 +4.695086E+00 +1.470132E+00 +1.643904E+01 +1.803258E+01 +2.128147E+01 +3.021699E+01 +4.842434E+00 +1.563989E+00 +4.695086E+00 +1.470132E+00 +1.643904E+01 +1.803258E+01 tally 2: -1.972289E+01 -2.779778E+01 -4.489781E+00 -1.440247E+00 -4.356175E+00 -1.355797E+00 -1.523311E+01 -1.658397E+01 +2.128147E+01 +3.021699E+01 +4.842434E+00 +1.563989E+00 +4.695086E+00 +1.470132E+00 +1.643904E+01 +1.803258E+01 diff --git a/tests/test_trigger_batch_interval/settings.xml b/tests/test_trigger_batch_interval/settings.xml index d7afd9231d..b8e1e9c96a 100644 --- a/tests/test_trigger_batch_interval/settings.xml +++ b/tests/test_trigger_batch_interval/settings.xml @@ -1,15 +1,15 @@ - 10 + 15 5 1000 std_dev - 0.00445 + 0.004 - + true 30 diff --git a/tests/test_trigger_batch_interval/test_trigger_batch_interval.py b/tests/test_trigger_batch_interval/test_trigger_batch_interval.py index d5e176fea9..e5c5b54b6b 100644 --- a/tests/test_trigger_batch_interval/test_trigger_batch_interval.py +++ b/tests/test_trigger_batch_interval/test_trigger_batch_interval.py @@ -6,5 +6,5 @@ from testing_harness import TestHarness if __name__ == '__main__': - harness = TestHarness('statepoint.19.*', True) + harness = TestHarness('statepoint.20.*', True) harness.main() diff --git a/tests/test_trigger_no_batch_interval/results_true.dat b/tests/test_trigger_no_batch_interval/results_true.dat index 65fa51bb4f..d06a91646c 100644 --- a/tests/test_trigger_no_batch_interval/results_true.dat +++ b/tests/test_trigger_no_batch_interval/results_true.dat @@ -1,28 +1,28 @@ k-combined: -9.851940E-01 4.283950E-03 +9.853099E-01 3.825057E-03 tally 1: -1.972289E+01 -2.779778E+01 -4.489781E+00 -1.440247E+00 -4.356175E+00 -1.355797E+00 -1.523311E+01 -1.658397E+01 -1.972289E+01 -2.779778E+01 -4.489781E+00 -1.440247E+00 -4.356175E+00 -1.355797E+00 -1.523311E+01 -1.658397E+01 +2.409492E+01 +3.417475E+01 +5.477076E+00 +1.765385E+00 +5.309347E+00 +1.658803E+00 +1.861784E+01 +2.040621E+01 +2.409492E+01 +3.417475E+01 +5.477076E+00 +1.765385E+00 +5.309347E+00 +1.658803E+00 +1.861784E+01 +2.040621E+01 tally 2: -1.972289E+01 -2.779778E+01 -4.489781E+00 -1.440247E+00 -4.356175E+00 -1.355797E+00 -1.523311E+01 -1.658397E+01 +2.409492E+01 +3.417475E+01 +5.477076E+00 +1.765385E+00 +5.309347E+00 +1.658803E+00 +1.861784E+01 +2.040621E+01 diff --git a/tests/test_trigger_no_batch_interval/settings.xml b/tests/test_trigger_no_batch_interval/settings.xml index 5ceff1082b..5412af35f9 100644 --- a/tests/test_trigger_no_batch_interval/settings.xml +++ b/tests/test_trigger_no_batch_interval/settings.xml @@ -1,15 +1,15 @@ - 10 + 15 5 1000 std_dev - 0.00445 + 0.004 - + true 30 diff --git a/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py b/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py index d5e176fea9..ff19e3d08d 100644 --- a/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py +++ b/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py @@ -6,5 +6,5 @@ from testing_harness import TestHarness if __name__ == '__main__': - harness = TestHarness('statepoint.19.*', True) + harness = TestHarness('statepoint.22.*', True) harness.main() diff --git a/tests/test_trigger_no_status/results_true.dat b/tests/test_trigger_no_status/results_true.dat index b9dc78dd03..0b541099b9 100644 --- a/tests/test_trigger_no_status/results_true.dat +++ b/tests/test_trigger_no_status/results_true.dat @@ -1,28 +1,28 @@ k-combined: -9.809303E-01 7.264435E-03 +9.906276E-01 1.800527E-03 tally 1: -7.031241E+00 -9.892232E+00 -1.599216E+00 -5.115987E-01 -1.550710E+00 -4.810241E-01 -5.432025E+00 -5.904811E+00 -7.031241E+00 -9.892232E+00 -1.599216E+00 -5.115987E-01 -1.550710E+00 -4.810241E-01 -5.432025E+00 -5.904811E+00 +7.043320E+00 +9.922203E+00 +1.610208E+00 +5.185662E-01 +1.564118E+00 +4.893096E-01 +5.433111E+00 +5.904259E+00 +7.043320E+00 +9.922203E+00 +1.610208E+00 +5.185662E-01 +1.564118E+00 +4.893096E-01 +5.433111E+00 +5.904259E+00 tally 2: -7.031241E+00 -9.892232E+00 -1.599216E+00 -5.115987E-01 -1.550710E+00 -4.810241E-01 -5.432025E+00 -5.904811E+00 +7.043320E+00 +9.922203E+00 +1.610208E+00 +5.185662E-01 +1.564118E+00 +4.893096E-01 +5.433111E+00 +5.904259E+00 diff --git a/tests/test_trigger_tallies/results_true.dat b/tests/test_trigger_tallies/results_true.dat index 86b1c14d5c..0519260ddc 100644 --- a/tests/test_trigger_tallies/results_true.dat +++ b/tests/test_trigger_tallies/results_true.dat @@ -1,28 +1,28 @@ k-combined: -9.824135E-01 6.844127E-03 +9.875396E-01 4.095985E-03 tally 1: -1.408810E+01 -1.985836E+01 -3.199600E+00 -1.024050E+00 -3.102648E+00 -9.629173E-01 -1.088850E+01 -1.186391E+01 -1.408810E+01 -1.985836E+01 -3.199600E+00 -1.024050E+00 -3.102648E+00 -9.629173E-01 -1.088850E+01 -1.186391E+01 +1.415943E+01 +2.006888E+01 +3.225529E+00 +1.040975E+00 +3.128858E+00 +9.794019E-01 +1.093390E+01 +1.196901E+01 +1.415943E+01 +2.006888E+01 +3.225529E+00 +1.040975E+00 +3.128858E+00 +9.794019E-01 +1.093390E+01 +1.196901E+01 tally 2: -1.408810E+01 -1.985836E+01 -3.199600E+00 -1.024050E+00 -3.102648E+00 -9.629173E-01 -1.088850E+01 -1.186391E+01 +1.415943E+01 +2.006888E+01 +3.225529E+00 +1.040975E+00 +3.128858E+00 +9.794019E-01 +1.093390E+01 +1.196901E+01 diff --git a/tests/test_trigger_tallies/settings.xml b/tests/test_trigger_tallies/settings.xml index c6d986ce85..895c0ee72c 100644 --- a/tests/test_trigger_tallies/settings.xml +++ b/tests/test_trigger_tallies/settings.xml @@ -6,10 +6,10 @@ 1000 std_dev - 0.02 + 0.001 - + true 15 diff --git a/tests/test_uniform_fs/results_true.dat b/tests/test_uniform_fs/results_true.dat index eb3d0e715e..a29a363b25 100644 --- a/tests/test_uniform_fs/results_true.dat +++ b/tests/test_uniform_fs/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.623468E-01 4.795863E-03 +3.546115E-01 2.982307E-03 diff --git a/tests/test_union_energy_grids/results_true.dat b/tests/test_union_energy_grids/results_true.dat index 05cda2e980..9556a981bc 100644 --- a/tests/test_union_energy_grids/results_true.dat +++ b/tests/test_union_energy_grids/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.215828E-01 2.966835E-03 +3.155788E-01 7.559348E-03 diff --git a/tests/test_universe/results_true.dat b/tests/test_universe/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_universe/results_true.dat +++ b/tests/test_universe/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_void/results_true.dat b/tests/test_void/results_true.dat index 921d07692f..4e99b86760 100644 --- a/tests/test_void/results_true.dat +++ b/tests/test_void/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.069802E+00 2.223092E-02 +1.045350E+00 2.750547E-02 From fa02c7eb29735f09f3344392d5ae717b768732d5 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 4 Aug 2015 09:47:29 +1200 Subject: [PATCH 092/101] Update documentation to reflect creation of secondary neutrons --- docs/source/methods/physics.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/source/methods/physics.rst b/docs/source/methods/physics.rst index ed10b32343..d0a6a2c992 100644 --- a/docs/source/methods/physics.rst +++ b/docs/source/methods/physics.rst @@ -187,11 +187,11 @@ secondary photons from nuclear de-excitation are tracked in OpenMC. ------------------------ These types of reactions are just treated as inelastic scattering and as such -are subject to the same procedure as described in -:ref:`inelastic-scatter`. Rather than tracking multiple secondary neutrons, the -weight of the outgoing neutron is multiplied by the number of secondary -neutrons, e.g. for :math:`(n,2n)`, only one outgoing neutron is tracked but its -weight is doubled. +are subject to the same procedure as described in :ref:`inelastic-scatter`. For +reactions with integral multiplicity, e.g., :math:`(n,2n)`, an appropriate +number of secondary neutrons are created. For reactions that have a multiplicity +given as a function of the incoming neutron energy (which occasionally occurs +for MT=5), the weight of the outgoing neutron is multiplied by the multiplcity. .. _fission: From 2ce198257789e65acd9030a3954525953745ca64 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 20 Aug 2015 13:47:13 +0700 Subject: [PATCH 093/101] Extend particle track file format to include tracks from secondary particles --- scripts/openmc-track-to-vtk | 53 ++++++++++++++++--------- src/track_output.F90 | 77 +++++++++++++++++++++++++++++-------- src/tracking.F90 | 5 ++- 3 files changed, 101 insertions(+), 34 deletions(-) diff --git a/scripts/openmc-track-to-vtk b/scripts/openmc-track-to-vtk index 8db57e2a3f..f44b3871ac 100755 --- a/scripts/openmc-track-to-vtk +++ b/scripts/openmc-track-to-vtk @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python """Convert binary particle track to VTK poly data. Usage information can be obtained by running 'track.py --help': @@ -64,26 +64,43 @@ def main(): for fname in args.input: # Write coordinate values to points array. if fname.endswith('.binary'): - track = open(fname, 'rb').read() - coords = [struct.unpack("ddd", track[24*i : 24*(i+1)]) - for i in range(len(track)/24)] - n_points = len(coords) - for triplet in coords: - points.InsertNextPoint(triplet) + track = open(fname, 'rb') + + # Determine number of particles and tracks/particle + n_particles = struct.unpack('i', track.read(4))[0] + n_coords = struct.unpack('i'*n_particles, track.read(4*n_particles)) + + coords = [] + for i in range(n_particles): + # Read coordinates for each particle + coords.append([struct.unpack('ddd', track.read(24)) + for j in range(n_coords[i])]) + + # Add coordinates to points data + for triplet in coords[i]: + points.InsertNextPoint(triplet) + else: - coords = h5py.File(fname).get('coordinates') - n_points = coords.shape[0] - for i in range(n_points): - points.InsertNextPoint(coords[i, :]) + track = h5py.File(fname) + n_particles = track['n_particles'].value[0] + n_coords = track['n_coords'] + coords = [] + for i in range(n_particles): + coords.append(track['coordinates_' + str(i + 1)].value) + for j in range(n_coords[i]): + points.InsertNextPoint(coords[i][j,:]) - # Create VTK line and assign points to line. - line = vtk.vtkPolyLine() - line.GetPointIds().SetNumberOfIds(n_points) - for i in range(n_points): - line.GetPointIds().SetId(i, point_offset+i) + for i in range(n_particles): + # Create VTK line and assign points to line. + line = vtk.vtkPolyLine() + line.GetPointIds().SetNumberOfIds(n_coords[i]) + for j in range(n_coords[i]): + line.GetPointIds().SetId(j, point_offset + j) + + # Add line to cell array + cells.InsertNextCell(line) + point_offset += n_coords[i] - cells.InsertNextCell(line) - point_offset += n_points data = vtk.vtkPolyData() data.SetPoints(points) data.SetLines(cells) diff --git a/src/track_output.F90 b/src/track_output.F90 index fba699e8ef..9143058a2a 100644 --- a/src/track_output.F90 +++ b/src/track_output.F90 @@ -12,9 +12,12 @@ module track_output implicit none - integer, private :: n_tracks ! total number of tracks - real(8), private, allocatable :: coords(:,:) ! track coordinates -!$omp threadprivate(n_tracks, coords) + type, private :: TrackCoordinates + real(8), allocatable :: coords(:,:) + end type TrackCoordinates + + type(TrackCoordinates), private, allocatable :: tracks(:) +!$omp threadprivate(tracks) contains @@ -23,7 +26,7 @@ contains !=============================================================================== subroutine initialize_particle_track() - n_tracks = 0 + allocate(tracks(1)) end subroutine initialize_particle_track !=============================================================================== @@ -32,23 +35,50 @@ contains subroutine write_particle_track(p) type(Particle), intent(in) :: p - real(8), allocatable :: new_coords(:, :) + integer :: i + integer :: n_tracks + ! Add another column to coords - n_tracks = n_tracks + 1 - if (allocated(coords)) then - allocate(new_coords(3, n_tracks)) - new_coords(:, 1:n_tracks-1) = coords - call move_alloc(FROM=new_coords, TO=coords) + i = size(tracks) + if (allocated(tracks(i) % coords)) then + n_tracks = size(tracks(i) % coords, 2) + allocate(new_coords(3, n_tracks + 1)) + new_coords(:, 1:n_tracks) = tracks(i) % coords + call move_alloc(FROM=new_coords, TO=tracks(i) % coords) else - allocate(coords(3,1)) + n_tracks = 0 + allocate(tracks(i) % coords(3, 1)) end if ! Write current coordinates into the newest column. - coords(:, n_tracks) = p % coord(1) % xyz + n_tracks = n_tracks + 1 + tracks(i) % coords(:, n_tracks) = p % coord(1) % xyz end subroutine write_particle_track +!=============================================================================== +! ADD_PARTICLE_TRACK creates a new entry in the track coordinates for a +! secondary particle +!=============================================================================== + + subroutine add_particle_track() + type(TrackCoordinates), allocatable :: new_tracks(:) + + integer :: i + + ! Determine current number of particle tracks + i = size(tracks) + + ! Create array one larger than current + allocate(new_tracks(i + 1)) + + ! Copy memory and move allocation + new_tracks(1:i) = tracks(i) + call move_alloc(FROM=new_tracks, TO=tracks) + + end subroutine add_particle_track + !=============================================================================== ! FINALIZE_PARTICLE_TRACK writes the particle track array to disk. !=============================================================================== @@ -60,6 +90,10 @@ contains character(MAX_FILE_LEN) :: fname type(BinaryOutput) :: binout + integer :: i + integer, allocatable :: n_coords(:) + integer :: n_particle_tracks + #ifdef HDF5 fname = trim(path_output) // 'track_' // trim(to_str(current_batch)) & // '_' // trim(to_str(current_gen)) // '_' // trim(to_str(p % id)) & @@ -69,13 +103,26 @@ contains // '_' // trim(to_str(current_gen)) // '_' // trim(to_str(p % id)) & // '.binary' #endif + + ! Determine total number of particles and number of coordinates for each + n_particle_tracks = size(tracks) + allocate(n_coords(n_particle_tracks)) + do i = 1, n_particle_tracks + n_coords(i) = size(tracks(i) % coords, 2) + end do + !$omp critical (FinalizeParticleTrack) call binout % file_create(fname) - length = [3, n_tracks] - call binout % write_data(coords, 'coordinates', length=length) + call binout % write_data(n_particle_tracks, 'n_particles') + call binout % write_data(n_coords, 'n_coords', length=n_particle_tracks) + do i = 1, n_particle_tracks + length(:) = [3, n_coords(i)] + call binout % write_data(tracks(i) % coords, 'coordinates_' // & + trim(to_str(i)), length=length) + end do call binout % file_close() !$omp end critical (FinalizeParticleTrack) - deallocate(coords) + deallocate(tracks) end subroutine finalize_particle_track end module track_output diff --git a/src/tracking.F90 b/src/tracking.F90 index ba452a0141..173babd2f5 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -15,7 +15,7 @@ module tracking use tally, only: score_analog_tally, score_tracklength_tally, & score_surface_current use track_output, only: initialize_particle_track, write_particle_track, & - finalize_particle_track + add_particle_track, finalize_particle_track implicit none @@ -200,6 +200,9 @@ contains if (p % n_secondary > 0) then call p % initialize_from_source(p % secondary_bank(p % n_secondary)) p % n_secondary = p % n_secondary - 1 + + ! Enter new particle in particle track file + if (p % write_track) call add_particle_track() else exit EVENT_LOOP end if From 56525c01d13859aaa42d107f1f9e56b0e9b7a3fc Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 21 Aug 2015 11:02:05 +0700 Subject: [PATCH 094/101] Add comments describing a number of procedures --- src/eigenvalue.F90 | 4 +++- src/particle_header.F90 | 11 +++++++---- src/source.F90 | 3 ++- src/track_output.F90 | 3 ++- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index 6a4591705c..33d63b7cc9 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -583,7 +583,9 @@ contains #ifdef _OPENMP !=============================================================================== -! JOIN_BANK_FROM_THREADS +! JOIN_BANK_FROM_THREADS joins threadprivate fission banks into a single fission +! bank that can be sampled. Note that this operation is necessarily sequential +! to preserve the order of the bank when using varying numbers of threads. !=============================================================================== subroutine join_bank_from_threads() diff --git a/src/particle_header.F90 b/src/particle_header.F90 index 9164845e80..cf3bb5efa0 100644 --- a/src/particle_header.F90 +++ b/src/particle_header.F90 @@ -129,7 +129,7 @@ contains end subroutine initialize_particle !=============================================================================== -! CLEAR_PARTICLE +! CLEAR_PARTICLE resets all coordinate levels for the particle !=============================================================================== subroutine clear_particle(this) @@ -145,7 +145,7 @@ contains end subroutine clear_particle !=============================================================================== -! RESET_COORD +! RESET_COORD clears data from a single coordinate level !=============================================================================== elemental subroutine reset_coord(this) @@ -162,7 +162,9 @@ contains end subroutine reset_coord !=============================================================================== -! INITIALIZE_FROM_SOURCE +! INITIALIZE_FROM_SOURCE initializes a particle from data stored in a source +! site. The source site may have been produced from an external source, from +! fission, or simply as a secondary particle. !=============================================================================== subroutine initialize_from_source(this, src) @@ -185,7 +187,8 @@ contains end subroutine initialize_from_source !=============================================================================== -! CREATE_SECONDARY +! CREATE_SECONDARY stores the current phase space attributes of the particle in +! the secondary bank and increments the number of sites in the secondary bank. !=============================================================================== subroutine create_secondary(this, uvw, type) diff --git a/src/source.F90 b/src/source.F90 index 32be6069cd..e824829154 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -92,7 +92,8 @@ contains end subroutine initialize_source !=============================================================================== -! SAMPLE_EXTERNAL_SOURCE +! SAMPLE_EXTERNAL_SOURCE samples the user-specified external source and stores +! the position, angle, and energy in a Bank type. !=============================================================================== subroutine sample_external_source(site) diff --git a/src/track_output.F90 b/src/track_output.F90 index 9143058a2a..6ab514cdb8 100644 --- a/src/track_output.F90 +++ b/src/track_output.F90 @@ -22,7 +22,8 @@ module track_output contains !=============================================================================== -! INITIALIZE_PARTICLE_TRACK +! INITIALIZE_PARTICLE_TRACK allocates the array to store particle track +! information !=============================================================================== subroutine initialize_particle_track() From 621601bf90c97538bd149b1efaab8bbbe9f5fe67 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 25 Aug 2015 16:42:39 +0700 Subject: [PATCH 095/101] Fix typo in comment --- src/simulation.F90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/simulation.F90 b/src/simulation.F90 index ab9b422480..cc230d645b 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -32,8 +32,9 @@ module simulation contains !=============================================================================== -! RUN_EIGENVALUE encompasses all the main logic where iterations are performed -! over the batches, generations, and histories in a k-eigenvalue calculation. +! RUN_SIMULATION encompasses all the main logic where iterations are performed +! over the batches, generations, and histories in a fixed source or k-eigenvalue +! calculation. !=============================================================================== subroutine run_simulation() From 48f5de2b41b334db2c1ce0dd930ef6e29bd1f2de Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 25 Aug 2015 16:42:56 +0700 Subject: [PATCH 096/101] Check to make sure limit on secondary particles is not exceeded --- src/particle_header.F90 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/particle_header.F90 b/src/particle_header.F90 index cf3bb5efa0..66df6b6e5d 100644 --- a/src/particle_header.F90 +++ b/src/particle_header.F90 @@ -2,6 +2,7 @@ module particle_header use bank_header, only: Bank use constants, only: NEUTRON, ONE, NONE, ZERO, MAX_SECONDARY + use error, only: fatal_error use geometry_header, only: BASE_UNIVERSE implicit none @@ -198,6 +199,12 @@ contains integer :: n + ! Check to make sure that the hard-limit on secondary particles is not + ! exceeded. + if (this % n_secondary == MAX_SECONDARY) then + call fatal_error("Too many secondary particles created.") + end if + n = this % n_secondary + 1 this % secondary_bank(n) % wgt = this % wgt this % secondary_bank(n) % xyz(:) = this % coord(1) % xyz From c922f35bdcf55433700149cfbf2a919da135bdcd Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 26 Aug 2015 10:02:56 +0700 Subject: [PATCH 097/101] Fix typo in initialize module --- src/initialize.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/initialize.F90 b/src/initialize.F90 index fd63963bf1..b944b6677b 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -140,7 +140,7 @@ contains ! Determine how much work each processor should do call calculate_work() - ! Allocate source bank, and for eigenvalu simulations also allocate the + ! Allocate source bank, and for eigenvalue simulations also allocate the ! fission bank call allocate_banks() From af442677c015fcf48263fde46b402e665585d71d Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 2 Sep 2015 19:50:56 -0700 Subject: [PATCH 098/101] Changed Tally.get_value to Tally.get_values in Python scripts --- scripts/openmc-plot-mesh-tally | 4 ++-- scripts/openmc-statepoint-3d | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/openmc-plot-mesh-tally b/scripts/openmc-plot-mesh-tally index 5c46d927c0..d49c9061d3 100755 --- a/scripts/openmc-plot-mesh-tally +++ b/scripts/openmc-plot-mesh-tally @@ -230,9 +230,9 @@ class MeshPlotter(tk.Frame): meshtuple = (i + 1, axial_level, j + 1) filters, filter_bins = zip(*spec_list + [ (mesh_filter, meshtuple)]) - mean = selectedTally.get_value( + mean = selectedTally.get_values( self.scoreBox.get(), filters, filter_bins) - stdev = selectedTally.get_value( + stdev = selectedTally.get_values( self.scoreBox.get(), filters, filter_bins, value='std_dev') if mbvalue == 'Mean': diff --git a/scripts/openmc-statepoint-3d b/scripts/openmc-statepoint-3d index 30205c7692..e667ad0bbd 100755 --- a/scripts/openmc-statepoint-3d +++ b/scripts/openmc-statepoint-3d @@ -219,7 +219,7 @@ def main(file_, o): for y in range(1,ny+1): for z in range(1,nz+1): filterspec[0][1] = (x,y,z) - val = sp.get_value(tally.id-1, filterspec, sid)[o.valerr] + val = sp.get_values(tally.id-1, filterspec, sid)[o.valerr] if o.vtk: # vtk cells go z, y, x, so we store it now and enter it later i = (z-1)*nx*ny + (y-1)*nx + x-1 From cfd79626bcfa490e02715451a8309e809497e484 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 3 Sep 2015 15:58:33 +0700 Subject: [PATCH 099/101] Fix arguments to Tally.get_values(...) in openmc-plot-mesh-tally --- scripts/openmc-plot-mesh-tally | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/openmc-plot-mesh-tally b/scripts/openmc-plot-mesh-tally index d49c9061d3..d9bca6377c 100755 --- a/scripts/openmc-plot-mesh-tally +++ b/scripts/openmc-plot-mesh-tally @@ -210,7 +210,7 @@ class MeshPlotter(tk.Frame): mesh_filter = f continue index = self.filterBoxes[f.type].current() - spec_list.append((f, index)) + spec_list.append((f.type, (index,))) text = self.basisBox.get() if text == 'xy': @@ -229,11 +229,11 @@ class MeshPlotter(tk.Frame): else: meshtuple = (i + 1, axial_level, j + 1) filters, filter_bins = zip(*spec_list + [ - (mesh_filter, meshtuple)]) + (mesh_filter.type, (meshtuple,))]) mean = selectedTally.get_values( - self.scoreBox.get(), filters, filter_bins) + [self.scoreBox.get()], filters, filter_bins) stdev = selectedTally.get_values( - self.scoreBox.get(), filters, filter_bins, + [self.scoreBox.get()], filters, filter_bins, value='std_dev') if mbvalue == 'Mean': matrix[i, j] = mean From 53edae4c7e8824b4a3a5dbd03f48a01b9dbeb08b Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 3 Sep 2015 07:31:33 -0700 Subject: [PATCH 100/101] Updated openmc-plot-mesh-tally to include if-else for 2D vs. 3D meshes --- scripts/openmc-plot-mesh-tally | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/openmc-plot-mesh-tally b/scripts/openmc-plot-mesh-tally index d9bca6377c..f925b413a3 100755 --- a/scripts/openmc-plot-mesh-tally +++ b/scripts/openmc-plot-mesh-tally @@ -133,7 +133,11 @@ class MeshPlotter(tk.Frame): self.mesh = selectedTally.filters_by_name['mesh'].mesh # Get mesh dimensions - self.nx, self.ny, self.nz = self.mesh.dimension + if len(self.mesh.dimension) == 2: + self.nx, self.ny = self.mesh.dimension + self.nz = 1 + else: + self.nx, self.ny, self.nz = self.mesh.dimension # Repopulate comboboxes baesd on current basis selection text = self.basisBox.get() From 4aec0454a8b6f9c68e8737a8b27ecf2b94ef65c6 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 3 Sep 2015 07:33:33 -0700 Subject: [PATCH 101/101] Updated docstring for Tally.get_values(...) with correct use of Iterable filter bins --- openmc/tallies.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 6e418a2be4..003acd9435 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -823,10 +823,10 @@ class Tally(object): A list of filter type strings (e.g., ['mesh', 'energy']; default is []) - filter_bins : list + filter_bins : list of Iterables A list of the filter bins corresponding to the filter_types - parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in - the list is the integer ID for 'material', 'surface', 'cell', + parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin + in the list is the integer ID for 'material', 'surface', 'cell', 'cellborn', and 'universe' Filters. Each bin is an integer for the cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of floats for 'energy' and 'energyout' filters corresponding to the @@ -2099,10 +2099,10 @@ class Tally(object): A list of filter type strings (e.g., ['mesh', 'energy']; default is []) - filter_bins : list + filter_bins : list of Iterables A list of the filter bins corresponding to the filter_types - parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in - the list is the integer ID for 'material', 'surface', 'cell', + parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin + in the list is the integer ID for 'material', 'surface', 'cell', 'cellborn', and 'universe' Filters. Each bin is an integer for the cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of floats for 'energy' and 'energyout' filters corresponding to the