diff --git a/openmc/filter.py b/openmc/filter.py index 91ceb2931a..fef7a25b0f 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -868,15 +868,13 @@ class RealFilter(Filter): return np.allclose(self.bins, other.bins) def get_bin_index(self, filter_bin): - # Use lower energy bound to find index for RealFilters - deltas = np.abs(self.bins - filter_bin[1]) / filter_bin[1] - min_delta = np.min(deltas) - if min_delta < 1E-3: - return deltas.argmin() - 1 - else: + i = np.where(self.bins == filter_bin[1])[0] + if len(i) == 0: msg = 'Unable to get the bin index for Filter since "{0}" ' \ 'is not one of the bins'.format(filter_bin) raise ValueError(msg) + else: + return i[0] - 1 def get_bin(self, bin_index): cv.check_type('bin_index', bin_index, Integral) @@ -907,6 +905,17 @@ class EnergyFilter(RealFilter): """ + def get_bin_index(self, filter_bin): + # Use lower energy bound to find index for RealFilters + deltas = np.abs(self.bins - filter_bin[1]) / filter_bin[1] + min_delta = np.min(deltas) + if min_delta < 1E-3: + return deltas.argmin() - 1 + else: + msg = 'Unable to get the bin index for Filter since "{0}" ' \ + 'is not one of the bins'.format(filter_bin) + raise ValueError(msg) + def check_bins(self, bins): for edge in bins: if not isinstance(edge, Real): diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 96bfa6fab2..46d404e4fd 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -875,13 +875,13 @@ class Library(object): return pickle.load(open(full_filename, 'rb')) def get_xsdata(self, domain, xsdata_name, nuclide='total', xs_type='macro', - order=None, subdomain=None): + subdomain=None): """Generates an openmc.XSdata object describing a multi-group cross section dataset for writing to an openmc.MGXSLibrary object. Note that this method does not build an XSdata object with nested temperature tables. The temperature of each - XSdata object will be left at the default value of 300K. + XSdata object will be left at the default value of 294K. Parameters ---------- @@ -896,10 +896,6 @@ class Library(object): Provide the macro or micro cross section in units of cm^-1 or barns. Defaults to 'macro'. If the Library object is not tallied by nuclide this will be set to 'macro' regardless. - order : int - Scattering order for this data entry. Default is None, - which will set the XSdata object to use the order of the - Library. subdomain : iterable of int This parameter is not used unless using a mesh domain. In that case, the subdomain is an [i,j,k] index (1-based indexing) of the @@ -929,10 +925,6 @@ class Library(object): cv.check_type('xsdata_name', xsdata_name, basestring) cv.check_type('nuclide', nuclide, basestring) cv.check_value('xs_type', xs_type, ['macro', 'micro']) - cv.check_type('order', order, (type(None), Integral)) - if order is not None: - cv.check_greater_than('order', order, 0, equality=True) - cv.check_less_than('order', order, 10, equality=True) if subdomain is not None: cv.check_iterable_type('subdomain', subdomain, Integral, max_depth=3) @@ -953,14 +945,6 @@ class Library(object): name += '_' + nuclide xsdata = openmc.XSdata(name, self.energy_groups) - if order is None: - # Set the order to the Library's order (the default behavior) - xsdata.order = self.legendre_order - else: - # Set the order of the xsdata object to the minimum of - # the provided order or the Library's order. - xsdata.order = min(order, self.legendre_order) - # Right now only isotropic weighting is supported self.representation = 'isotropic' @@ -1033,6 +1017,7 @@ class Library(object): using_multiplicity = False if using_multiplicity: + # import pdb; pdb.set_trace() nuscatt_mgxs = self.get_mgxs(domain, 'nu-scatter matrix') xsdata.set_scatter_matrix_mgxs(nuscatt_mgxs, xs_type=xs_type, nuclide=[nuclide], @@ -1049,10 +1034,17 @@ class Library(object): # accounted for approximately by using an adjusted # absorption cross section. if 'total' in self.mgxs_types or 'transport' in self.mgxs_types: - for i in range(len(xsdata.temperatures)): - xsdata._absorption[i] = \ - np.subtract(xsdata._total[i], np.sum( - xsdata._scatter_matrix[i][0, :, :], axis=1)) + if xsdata.scatter_format == 'legendre': + for i in range(len(xsdata.temperatures)): + xsdata._absorption[i] = \ + np.subtract(xsdata._total[i], np.sum( + xsdata._scatter_matrix[i][0, :, :], axis=1)) + elif xsdata.scatter_format == 'histogram': + for i in range(len(xsdata.temperatures)): + xsdata._absorption[i] = \ + np.subtract(xsdata._total[i], np.sum(np.sum( + xsdata._scatter_matrix[i][:, :, :], axis=0), + axis=1)) return xsdata diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index cafda1ecf4..c30cc87ac6 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -3410,7 +3410,8 @@ class ScatterMatrixXS(MatrixMGXS): else: filters = [[energy], [energy, energyout]] elif self.scatter_format == 'histogram': - bins = np.linspace(-1., 1., num=self.histogram_bins, endpoint=True) + bins = np.linspace(-1., 1., num=self.histogram_bins + 1, + endpoint=True) filters = [[energy], [energy, energyout, openmc.MuFilter(bins)]] return filters @@ -3758,9 +3759,19 @@ class ScatterMatrixXS(MatrixMGXS): else: num_out_groups = len(out_groups) + if self.scatter_format == 'histogram': + num_mu_bins = self.histogram_bins + else: + num_mu_bins = 1 + # Reshape tally data array with separate axes for domain and energy - num_subdomains = int(xs.shape[0] / (num_in_groups * num_out_groups)) - new_shape = (num_subdomains, num_in_groups, num_out_groups) + num_subdomains = int(xs.shape[0] / + (num_mu_bins * num_in_groups * num_out_groups)) + if self.scatter_format == 'histogram': + new_shape = (num_subdomains, num_in_groups, num_out_groups, + num_mu_bins) + else: + new_shape = (num_subdomains, num_in_groups, num_out_groups) new_shape += xs.shape[1:] xs = np.reshape(xs, new_shape) @@ -3771,7 +3782,7 @@ class ScatterMatrixXS(MatrixMGXS): # Reverse data if user requested increasing energy groups since # tally data is stored in order of increasing energies if order_groups == 'increasing': - xs = xs[:, ::-1, ::-1, :] + xs = xs[:, ::-1, ::-1, ...] if squeeze: xs = np.squeeze(xs) diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index 5504b6e7cb..c78b9ff0ce 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -1031,21 +1031,21 @@ class XSdata(object): i = np.where(self.temperatures == temperature)[0][0] if self.representation == 'isotropic': - # Get the scattering orders in the outermost dimension - self._scatter_matrix[i] = np.zeros((self.num_orders, - self.energy_groups.num_groups, - self.energy_groups.num_groups)) if self.scatter_format == 'legendre': + # Get the scattering orders in the outermost dimension + self._scatter_matrix[i] = np.zeros((self.num_orders, + self.energy_groups.num_groups, + self.energy_groups.num_groups)) for moment in range(self.num_orders): self._scatter_matrix[i][moment, :, :] = \ scatter.get_xs(nuclides=nuclide, xs_type=xs_type, moment=moment, subdomains=subdomain) else: - self._scatter_matrix[i][:, :, :] = \ + self._scatter_matrix[i] = \ scatter.get_xs(nuclides=nuclide, xs_type=xs_type, subdomains=subdomain) - import pdb; pdb.set_trace() - + # self._scatter_matrix[i] = \ + # np.swapaxes(self._scatter_matrix[i], 0, 2) elif self.representation == 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' raise ValueError(msg) @@ -1124,6 +1124,10 @@ class XSdata(object): scatt = scatter.get_xs(nuclides=nuclide, xs_type=xs_type, moment=0, subdomains=subdomain) + if scatter.scatter_format == 'histogram': + scatt = np.sum(scatt, axis=4) + if nuscatter.scatter_format == 'histogram': + nuscatt = np.sum(nuscatt, axis=4) self._multiplicity_matrix[i] = np.divide(nuscatt, scatt) elif self.representation == 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented'