diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 07e47e0cf6..bc9167dfd1 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -614,7 +614,7 @@ class MultiGroupXS(object): # Sum across all applicable fine energy group filters for i, filter in enumerate(tally.filters): - if 'energy' in filter.type and all(filter.bins == fine_edges): + if 'energy' in filter.type and np.all(filter.bins == fine_edges): filter.bins = coarse_groups.group_edges mean = np.add.reduceat(mean, energy_indices, axis=i) std_dev = np.add.reduceat(std_dev**2, energy_indices, axis=i) @@ -1734,9 +1734,12 @@ class Chi(MultiGroupXS): nu_fission_out = self.tallies['nu-fission-out'] # Remove the coarse energy filter to keep it out of tally arithmetic - nu_fission_in.remove_filter(nu_fission_in.filters[-1]) + energy_filter = nu_fission_in.find_filter('energy') + nu_fission_in.remove_filter(energy_filter) # Compute chi + nu_fission_in.add_filter(energy_filter) + self._xs_tally = nu_fission_out / nu_fission_in super(Chi, self).compute_xs() diff --git a/openmc/tallies.py b/openmc/tallies.py index 87af32c428..d15be79833 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2506,20 +2506,27 @@ class Tally(object): num_score_bins = new_tally.num_score_bins new_shape = (num_filter_bins, num_nuclides, num_score_bins) + diag_factor = self.num_filter_bins / new_filter.num_bins indices = np.arange(0, new_filter.num_bins**2, new_filter.num_bins+1) + diag_indices = np.zeros(self.num_filter_bins, dtype=np.int) + + for i in range(diag_factor): + start = i * new_filter.num_bins + end = (i+1) * new_filter.num_bins + diag_indices[start:end] = indices + (i * new_filter.num_bins**2) if self.sum is not None: new_tally._sum = np.zeros(new_shape, dtype=np.float64) - new_tally._sum[indices, :self.num_nuclides, :self.num_scores] = self.sum + new_tally._sum[diag_indices, :self.num_nuclides, :self.num_scores] = self.sum if self.sum_sq is not None: new_tally._sum_sq = np.zeros(new_shape, dtype=np.float64) - new_tally._sum_sq[indices, :self.num_nuclides, :self.num_scores] = self.sum_sq + new_tally._sum_sq[diag_indices, :self.num_nuclides, :self.num_scores] = self.sum_sq if self.mean is not None: new_tally._mean = np.zeros(new_shape, dtype=np.float64) - new_tally._mean[indices, :self.num_nuclides, :self.num_scores] = self.mean + new_tally._mean[diag_indices, :self.num_nuclides, :self.num_scores] = self.mean if self.std_dev is not None: new_tally._std_dev = np.zeros(new_shape, dtype=np.float64) - new_tally._std_dev[indices, :self.num_nuclides, :self.num_scores] = self.std_dev + new_tally._std_dev[diag_indices, :self.num_nuclides, :self.num_scores] = self.std_dev # Correct each Filter's stride stride = new_tally.num_nuclides * new_tally.num_score_bins