diff --git a/openmc/filter.py b/openmc/filter.py index 71b1c2313d..bdb4c35bc3 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -425,7 +425,7 @@ class Filter(object): df = pd.DataFrame() filter_bins = np.repeat(self.bins, self.stride) - tile_factor = data_size / len(filter_bins) + tile_factor = int(data_size / len(filter_bins)) filter_bins = np.tile(filter_bins, tile_factor) df = pd.concat([df, pd.DataFrame( {self.short_name.lower(): filter_bins})]) @@ -613,7 +613,7 @@ class SurfaceFilter(IntegralFilter): df = pd.DataFrame() filter_bins = np.repeat(self.bins, self.stride) - tile_factor = data_size / len(filter_bins) + tile_factor = int(data_size / len(filter_bins)) filter_bins = np.tile(filter_bins, tile_factor) filter_bins = [_CURRENT_NAMES[x] for x in filter_bins] df = pd.concat([df, pd.DataFrame( @@ -781,26 +781,26 @@ class MeshFilter(Filter): nz = 1 # Generate multi-index sub-column for x-axis - filter_bins = np.arange(1, nx+1) + filter_bins = np.arange(1, nx + 1) repeat_factor = ny * nz * self.stride filter_bins = np.repeat(filter_bins, repeat_factor) - tile_factor = data_size / len(filter_bins) + tile_factor = int(data_size / len(filter_bins)) filter_bins = np.tile(filter_bins, tile_factor) filter_dict[(mesh_key, 'x')] = filter_bins # Generate multi-index sub-column for y-axis - filter_bins = np.arange(1, ny+1) + filter_bins = np.arange(1, ny + 1) repeat_factor = nz * self.stride filter_bins = np.repeat(filter_bins, repeat_factor) - tile_factor = data_size / len(filter_bins) + tile_factor = int(data_size / len(filter_bins)) filter_bins = np.tile(filter_bins, tile_factor) filter_dict[(mesh_key, 'y')] = filter_bins # Generate multi-index sub-column for z-axis - filter_bins = np.arange(1, nz+1) + filter_bins = np.arange(1, nz + 1) repeat_factor = self.stride filter_bins = np.repeat(filter_bins, repeat_factor) - tile_factor = data_size / len(filter_bins) + tile_factor = int(data_size / len(filter_bins)) filter_bins = np.tile(filter_bins, tile_factor) filter_dict[(mesh_key, 'z')] = filter_bins @@ -1281,7 +1281,7 @@ class DistribcellFilter(Filter): # Tile the Multi-index columns for level_key, level_bins in level_dict.items(): level_bins = np.repeat(level_bins, self.stride) - tile_factor = data_size / len(level_bins) + tile_factor = int(data_size / len(level_bins)) level_bins = np.tile(level_bins, tile_factor) level_dict[level_key] = level_bins @@ -1297,7 +1297,7 @@ class DistribcellFilter(Filter): # requests Summary geometric information filter_bins = np.arange(self.num_bins) filter_bins = np.repeat(filter_bins, self.stride) - tile_factor = data_size / len(filter_bins) + tile_factor = int(data_size / len(filter_bins)) filter_bins = np.tile(filter_bins, tile_factor) df = pd.DataFrame({self.short_name.lower() : filter_bins}) @@ -1402,7 +1402,7 @@ class MuFilter(RealFilter): # them as necessary to account for other filters. lo_bins = np.repeat(self.bins[:-1], self.stride) hi_bins = np.repeat(self.bins[1:], self.stride) - tile_factor = data_size / len(lo_bins) + tile_factor = int(data_size / len(lo_bins)) lo_bins = np.tile(lo_bins, tile_factor) hi_bins = np.tile(hi_bins, tile_factor) @@ -1505,7 +1505,7 @@ class PolarFilter(RealFilter): # them as necessary to account for other filters. lo_bins = np.repeat(self.bins[:-1], self.stride) hi_bins = np.repeat(self.bins[1:], self.stride) - tile_factor = data_size / len(lo_bins) + tile_factor = int(data_size / len(lo_bins)) lo_bins = np.tile(lo_bins, tile_factor) hi_bins = np.tile(hi_bins, tile_factor) @@ -1608,7 +1608,7 @@ class AzimuthalFilter(RealFilter): # them as necessary to account for other filters. lo_bins = np.repeat(self.bins[:-1], self.stride) hi_bins = np.repeat(self.bins[1:], self.stride) - tile_factor = data_size / len(lo_bins) + tile_factor = int(data_size / len(lo_bins)) lo_bins = np.tile(lo_bins, tile_factor) hi_bins = np.tile(hi_bins, tile_factor) @@ -1871,7 +1871,7 @@ class EnergyFunctionFilter(Filter): out = out[:14] filter_bins = np.repeat(out, self.stride) - tile_factor = data_size / len(filter_bins) + tile_factor = int(data_size / len(filter_bins)) filter_bins = np.tile(filter_bins, tile_factor) df = pd.concat([df, pd.DataFrame( {self.short_name.lower(): filter_bins})]) diff --git a/src/tally.F90 b/src/tally.F90 index c0c68afe38..ebca2bb5dc 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -2524,9 +2524,13 @@ contains if (.not. run_CE .and. eo_filt % matches_transport_groups) then - ! determine outgoing energy from fission bank + ! determine outgoing energy group from fission bank g_out = int(fission_bank(n_bank - p % n_bank + k) % E) + ! modify the value so that g_out = 1 corresponds to the highest + ! energy bin + g_out = size(eo_filt % bins) - g_out + ! change outgoing energy bin matching_bins(i) = g_out diff --git a/tests/test_mg_convert/test_mg_convert.py b/tests/test_mg_convert/test_mg_convert.py index d8a9665d8f..45e703b0e3 100755 --- a/tests/test_mg_convert/test_mg_convert.py +++ b/tests/test_mg_convert/test_mg_convert.py @@ -154,6 +154,11 @@ class MGXSTestHarness(PyAPITestHarness): form = '{0:12.6E} {1:12.6E}\n' outstr += form.format(sp.k_combined[0], sp.k_combined[1]) + # Enforce closing statepoint and summary files so HDF5 + # does not throw an error during the next OpenMC execution + sp._f.close() + sp._summary._f.close() + return outstr def _get_results(self, outstr, hash_output=False): diff --git a/tests/test_mg_tallies/inputs_true.dat b/tests/test_mg_tallies/inputs_true.dat index 244d92b06b..8120c8681e 100644 --- a/tests/test_mg_tallies/inputs_true.dat +++ b/tests/test_mg_tallies/inputs_true.dat @@ -137,43 +137,95 @@ scatter nu-scatter nu-fission + + + total absorption flux fission nu-fission scatter nu-scatter + analog + + + + + total absorption flux fission nu-fission + collision + + + + + total absorption flux fission nu-fission + tracklength + + + + + + scatter nu-scatter nu-fission + + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu total absorption fission nu-fission analog - + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu total absorption fission nu-fission tracklength - + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu total absorption fission nu-fission scatter nu-scatter analog - + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu total absorption fission nu-fission collision - + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu total absorption fission nu-fission tracklength - + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu scatter nu-scatter nu-fission + + + + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission scatter nu-scatter + analog + + + + + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission + collision + + + + + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission + tracklength + + + + + + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + scatter nu-scatter nu-fission + diff --git a/tests/test_mg_tallies/results_true.dat b/tests/test_mg_tallies/results_true.dat index af328ff8aa..db7735cb4e 100644 --- a/tests/test_mg_tallies/results_true.dat +++ b/tests/test_mg_tallies/results_true.dat @@ -1 +1 @@ -1817642a0d20d8ef437c7970cae2e77c265a566ef9843ac1b7cd33f76af09365dc8bd5c045f4297360b38d509864bd629b06dfc4d043b4b1ae7d8a5e2e93fae3 \ No newline at end of file +0a17877c7cf6dbd3e432b1997669a47c588d2a4074a29406deef27332eb7a0f736ea1fdc2037fc02f8ebca39f00332563bbe2172adc26bfaab2d6144d259daee \ No newline at end of file diff --git a/tests/test_mg_tallies/test_mg_tallies.py b/tests/test_mg_tallies/test_mg_tallies.py index 257accb603..580eb60c3f 100644 --- a/tests/test_mg_tallies/test_mg_tallies.py +++ b/tests/test_mg_tallies/test_mg_tallies.py @@ -23,6 +23,12 @@ class MGTalliesTestHarness(HashedPyAPITestHarness): # Instantiate some tally filters energy_filter = openmc.EnergyFilter([0.0, 20.0e6]) energyout_filter = openmc.EnergyoutFilter([0.0, 20.0e6]) + matching_energy_filter = openmc.EnergyFilter([1e-5, 0.0635, 10.0, + 1.0e2, 1.0e3, 0.5e6, + 1.0e6, 20.0e6]) + matching_eout_filter = openmc.EnergyoutFilter([1e-5, 0.0635, 10.0, + 1.0e2, 1.0e3, 0.5e6, + 1.0e6, 20.0e6]) mesh_filter = openmc.MeshFilter(mesh) mat_ids = [mat.id for mat in self._input_set.materials] @@ -34,6 +40,7 @@ class MGTalliesTestHarness(HashedPyAPITestHarness): True: ['total', 'absorption', 'fission', 'nu-fission']} tallies = [] + for do_nuclides in [False, True]: tallies.append(openmc.Tally()) tallies[-1].filters = [mesh_filter] @@ -49,34 +56,43 @@ class MGTalliesTestHarness(HashedPyAPITestHarness): if do_nuclides: tallies[-1].nuclides = nuclides - tallies.append(openmc.Tally()) - tallies[-1].filters = [mat_filter, energy_filter] - tallies[-1].estimator = 'analog' - tallies[-1].scores = scores[do_nuclides] + ['scatter', - 'nu-scatter'] - if do_nuclides: - tallies[-1].nuclides = nuclides + # Impose energy bins that dont match the MG structure and those + # that do + for match_energy_bins in [False, True]: + if match_energy_bins: + e_filter = matching_energy_filter + eout_filter = matching_eout_filter + else: + e_filter = energy_filter + eout_filter = energyout_filter - tallies.append(openmc.Tally()) - tallies[-1].filters = [mat_filter, energy_filter] - tallies[-1].estimator = 'collision' - tallies[-1].scores = scores[do_nuclides] - if do_nuclides: - tallies[-1].nuclides = nuclides + tallies.append(openmc.Tally()) + tallies[-1].filters = [mat_filter, e_filter] + tallies[-1].estimator = 'analog' + tallies[-1].scores = scores[do_nuclides] + ['scatter', + 'nu-scatter'] + if do_nuclides: + tallies[-1].nuclides = nuclides - tallies.append(openmc.Tally()) - tallies[-1].filters = [mat_filter, energy_filter] - tallies[-1].estimator = 'tracklength' - tallies[-1].scores = scores[do_nuclides] - if do_nuclides: - tallies[-1].nuclides = nuclides + tallies.append(openmc.Tally()) + tallies[-1].filters = [mat_filter, e_filter] + tallies[-1].estimator = 'collision' + tallies[-1].scores = scores[do_nuclides] + if do_nuclides: + tallies[-1].nuclides = nuclides - tallies.append(openmc.Tally()) - tallies[-1].filters = [mat_filter, energy_filter, - energyout_filter] - tallies[-1].scores = ['scatter', 'nu-scatter', 'nu-fission'] - if do_nuclides: - tallies[-1].nuclides = nuclides + tallies.append(openmc.Tally()) + tallies[-1].filters = [mat_filter, e_filter] + tallies[-1].estimator = 'tracklength' + tallies[-1].scores = scores[do_nuclides] + if do_nuclides: + tallies[-1].nuclides = nuclides + + tallies.append(openmc.Tally()) + tallies[-1].filters = [mat_filter, e_filter, eout_filter] + tallies[-1].scores = ['scatter', 'nu-scatter', 'nu-fission'] + if do_nuclides: + tallies[-1].nuclides = nuclides self._input_set.tallies = openmc.Tallies(tallies) diff --git a/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py b/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py index f9f9a75097..343a48a833 100644 --- a/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py +++ b/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py @@ -71,6 +71,11 @@ class MGXSTestHarness(PyAPITestHarness): if os.path.exists('./tallies.xml'): os.remove('./tallies.xml') + # Enforce closing statepoint and summary files so HDF5 + # does not throw an error during the next OpenMC execution + sp._f.close() + sp._summary._f.close() + # Re-run MG mode. if self._opts.mpi_exec is not None: mpi_args = [self._opts.mpi_exec, '-n', self._opts.mpi_np]