From c66cb6ab66633b05712cc48b8b43d0cc841ace2c Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 5 Jul 2016 08:45:19 -0400 Subject: [PATCH 01/33] fixed bug in tally.get_slice() method for mesh filters --- openmc/tallies.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openmc/tallies.py b/openmc/tallies.py index af19549a7..9ef514896 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2986,6 +2986,9 @@ class Tally(object): elif filter_type == 'distribcell': bin_indices = [0] num_bins = find_filter.num_bins + elif filter_type == 'mesh': + bin_indices = [0] + num_bins = find_filter.mesh.num_mesh_cells else: bin_indices.append(bin_index) num_bins += 1 From eb553a75ddde66c6833d2b4b9f5793c13c332864 Mon Sep 17 00:00:00 2001 From: samuel shaner Date: Tue, 5 Jul 2016 12:55:54 +0000 Subject: [PATCH 02/33] changed way num_bins for mesh filter are set in tally.get_slice() method --- openmc/tallies.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 9ef514896..4fc19f1e5 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2983,12 +2983,9 @@ class Tally(object): bin_indices.extend([bin_index]) bin_indices.extend([bin_index, bin_index+1]) num_bins += 1 - elif filter_type == 'distribcell': + elif filter_type in ['distribcell', 'mesh']: bin_indices = [0] num_bins = find_filter.num_bins - elif filter_type == 'mesh': - bin_indices = [0] - num_bins = find_filter.mesh.num_mesh_cells else: bin_indices.append(bin_index) num_bins += 1 From a73e7529ab1e01e81a6ac07ee418667fd47ee3d4 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 7 Jul 2016 16:17:50 -0400 Subject: [PATCH 03/33] modified tally slice merge test to get slice of a mesh --- tests/test_tally_slice_merge/inputs_true.dat | 2 +- tests/test_tally_slice_merge/results_true.dat | 86 +++++++++++-------- .../test_tally_slice_merge.py | 45 ++++++++-- 3 files changed, 93 insertions(+), 40 deletions(-) diff --git a/tests/test_tally_slice_merge/inputs_true.dat b/tests/test_tally_slice_merge/inputs_true.dat index be2ec63dc..771a1de8e 100644 --- a/tests/test_tally_slice_merge/inputs_true.dat +++ b/tests/test_tally_slice_merge/inputs_true.dat @@ -1 +1 @@ -bb4ae3b75445846bd5db05a06cc20e7589990154ccef8302f276cd8356630d585c513ebb6bfa99f9fc93dd2d30c42bfbb67dd3454134f4c9fcb3bac128d1f1c5 \ No newline at end of file +8e54df241233bf8d5424afa0a22cc23c614a3541e5d7cc64036b5284edd28fe2353905ffdfebb446a4dd0202dda6a7da6d0110af00b4ca79117ec1dbe0584ba7 \ No newline at end of file diff --git a/tests/test_tally_slice_merge/results_true.dat b/tests/test_tally_slice_merge/results_true.dat index ed04152d4..f986a91de 100644 --- a/tests/test_tally_slice_merge/results_true.dat +++ b/tests/test_tally_slice_merge/results_true.dat @@ -1,36 +1,37 @@ - energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 0.00e+00 6.25e-07 21 U-235 fission 1.08e-01 7.94e-03 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 0.00e+00 6.25e-07 21 U-235 nu-fission 2.64e-01 1.94e-02 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 0.00e+00 6.25e-07 21 U-238 fission 1.51e-07 1.00e-08 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 0.00e+00 6.25e-07 21 U-238 nu-fission 3.76e-07 2.50e-08 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 6.25e-07 2.00e+01 21 U-235 fission 3.12e-02 2.56e-03 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 6.25e-07 2.00e+01 21 U-235 nu-fission 7.65e-02 6.24e-03 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 6.25e-07 2.00e+01 21 U-238 fission 2.00e-02 1.30e-03 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 6.25e-07 2.00e+01 21 U-238 nu-fission 5.56e-02 3.78e-03 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 0.00e+00 6.25e-07 27 U-235 fission 4.43e-02 7.21e-03 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 0.00e+00 6.25e-07 27 U-235 nu-fission 1.08e-01 1.76e-02 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 0.00e+00 6.25e-07 27 U-238 fission 6.14e-08 9.64e-09 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 0.00e+00 6.25e-07 27 U-238 nu-fission 1.53e-07 2.40e-08 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 6.25e-07 2.00e+01 27 U-235 fission 1.39e-02 1.06e-03 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 6.25e-07 2.00e+01 27 U-235 nu-fission 3.40e-02 2.61e-03 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 6.25e-07 2.00e+01 27 U-238 fission 9.72e-03 1.21e-03 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 6.25e-07 2.00e+01 27 U-238 nu-fission 2.71e-02 3.80e-03 energy low [MeV] energy high [MeV] cell nuclide score mean std. dev. -0 0.00e+00 6.25e-07 21 U-235 fission 1.08e-01 7.94e-03 -1 0.00e+00 6.25e-07 21 U-235 nu-fission 2.64e-01 1.94e-02 -2 0.00e+00 6.25e-07 21 U-238 fission 1.51e-07 1.00e-08 -3 0.00e+00 6.25e-07 21 U-238 nu-fission 3.76e-07 2.50e-08 -4 0.00e+00 6.25e-07 27 U-235 fission 4.43e-02 7.21e-03 -5 0.00e+00 6.25e-07 27 U-235 nu-fission 1.08e-01 1.76e-02 -6 0.00e+00 6.25e-07 27 U-238 fission 6.14e-08 9.64e-09 -7 0.00e+00 6.25e-07 27 U-238 nu-fission 1.53e-07 2.40e-08 -8 6.25e-07 2.00e+01 21 U-235 fission 3.12e-02 2.56e-03 -9 6.25e-07 2.00e+01 21 U-235 nu-fission 7.65e-02 6.24e-03 -10 6.25e-07 2.00e+01 21 U-238 fission 2.00e-02 1.30e-03 -11 6.25e-07 2.00e+01 21 U-238 nu-fission 5.56e-02 3.78e-03 -12 6.25e-07 2.00e+01 27 U-235 fission 1.39e-02 1.06e-03 -13 6.25e-07 2.00e+01 27 U-235 nu-fission 3.40e-02 2.61e-03 -14 6.25e-07 2.00e+01 27 U-238 fission 9.72e-03 1.21e-03 -15 6.25e-07 2.00e+01 27 U-238 nu-fission 2.71e-02 3.80e-03 sum(distribcell) energy low [MeV] energy high [MeV] nuclide score mean std. dev. + cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-07 U-235 fission 1.08e-01 7.94e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-07 U-235 nu-fission 2.64e-01 1.94e-02 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-07 U-238 fission 1.51e-07 1.00e-08 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-07 U-238 nu-fission 3.76e-07 2.50e-08 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 6.25e-07 2.00e+01 U-235 fission 3.12e-02 2.56e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 6.25e-07 2.00e+01 U-235 nu-fission 7.65e-02 6.24e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 6.25e-07 2.00e+01 U-238 fission 2.00e-02 1.30e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 6.25e-07 2.00e+01 U-238 nu-fission 5.56e-02 3.78e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-07 U-235 fission 4.43e-02 7.21e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-07 U-235 nu-fission 1.08e-01 1.76e-02 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-07 U-238 fission 6.14e-08 9.64e-09 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-07 U-238 nu-fission 1.53e-07 2.40e-08 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 6.25e-07 2.00e+01 U-235 fission 1.39e-02 1.06e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 6.25e-07 2.00e+01 U-235 nu-fission 3.40e-02 2.61e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 6.25e-07 2.00e+01 U-238 fission 9.72e-03 1.21e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 6.25e-07 2.00e+01 U-238 nu-fission 2.71e-02 3.80e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-07 U-235 fission 1.08e-01 7.94e-03 +1 21 0.00e+00 6.25e-07 U-235 nu-fission 2.64e-01 1.94e-02 +2 21 0.00e+00 6.25e-07 U-238 fission 1.51e-07 1.00e-08 +3 21 0.00e+00 6.25e-07 U-238 nu-fission 3.76e-07 2.50e-08 +4 21 6.25e-07 2.00e+01 U-235 fission 3.12e-02 2.56e-03 +5 21 6.25e-07 2.00e+01 U-235 nu-fission 7.65e-02 6.24e-03 +6 21 6.25e-07 2.00e+01 U-238 fission 2.00e-02 1.30e-03 +7 21 6.25e-07 2.00e+01 U-238 nu-fission 5.56e-02 3.78e-03 +8 27 0.00e+00 6.25e-07 U-235 fission 4.43e-02 7.21e-03 +9 27 0.00e+00 6.25e-07 U-235 nu-fission 1.08e-01 1.76e-02 +10 27 0.00e+00 6.25e-07 U-238 fission 6.14e-08 9.64e-09 +11 27 0.00e+00 6.25e-07 U-238 nu-fission 1.53e-07 2.40e-08 +12 27 6.25e-07 2.00e+01 U-235 fission 1.39e-02 1.06e-03 +13 27 6.25e-07 2.00e+01 U-235 nu-fission 3.40e-02 2.61e-03 +14 27 6.25e-07 2.00e+01 U-238 fission 9.72e-03 1.21e-03 +15 27 6.25e-07 2.00e+01 U-238 nu-fission 2.71e-02 3.80e-03 + sum(distribcell) energy low [MeV] energy high [MeV] nuclide score mean std. dev. 0 (0, 100, 2000, 30000) 0.00e+00 6.25e-07 U-235 fission 0.00e+00 0.00e+00 1 (0, 100, 2000, 30000) 0.00e+00 6.25e-07 U-235 nu-fission 0.00e+00 0.00e+00 2 (0, 100, 2000, 30000) 0.00e+00 6.25e-07 U-238 fission 0.00e+00 0.00e+00 @@ -46,4 +47,21 @@ 12 (500, 5000, 50000) 6.25e-07 2.00e+01 U-235 fission 0.00e+00 0.00e+00 13 (500, 5000, 50000) 6.25e-07 2.00e+01 U-235 nu-fission 0.00e+00 0.00e+00 14 (500, 5000, 50000) 6.25e-07 2.00e+01 U-238 fission 0.00e+00 0.00e+00 -15 (500, 5000, 50000) 6.25e-07 2.00e+01 U-238 nu-fission 0.00e+00 0.00e+00 \ No newline at end of file +15 (500, 5000, 50000) 6.25e-07 2.00e+01 U-238 nu-fission 0.00e+00 0.00e+00 + sum(mesh) energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U-235 fission 9.18e-03 1.62e-03 +1 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U-235 nu-fission 2.24e-02 3.94e-03 +2 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U-238 fission 1.31e-08 2.08e-09 +3 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U-238 nu-fission 3.26e-08 5.19e-09 +4 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U-235 fission 8.40e-04 2.13e-04 +5 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U-235 nu-fission 2.06e-03 5.17e-04 +6 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U-238 fission 7.05e-04 3.42e-04 +7 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U-238 nu-fission 1.99e-03 1.01e-03 +8 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U-235 fission 8.77e-03 1.30e-03 +9 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U-235 nu-fission 2.14e-02 3.18e-03 +10 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U-238 fission 1.24e-08 1.74e-09 +11 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U-238 nu-fission 3.08e-08 4.33e-09 +12 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U-235 fission 2.30e-03 6.20e-04 +13 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U-235 nu-fission 5.63e-03 1.52e-03 +14 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U-238 fission 1.45e-03 7.19e-04 +15 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U-238 nu-fission 3.97e-03 1.98e-03 diff --git a/tests/test_tally_slice_merge/test_tally_slice_merge.py b/tests/test_tally_slice_merge/test_tally_slice_merge.py index 4dbb993d5..0b05c088d 100644 --- a/tests/test_tally_slice_merge/test_tally_slice_merge.py +++ b/tests/test_tally_slice_merge/test_tally_slice_merge.py @@ -33,13 +33,21 @@ class TallySliceMergeTestHarness(PyAPITestHarness): cell_27 = openmc.Filter(type='cell', bins=[27]) distribcell_filter = openmc.Filter(type='distribcell', bins=[21]) + mesh = openmc.Mesh(name='mesh') + mesh.type = 'regular' + mesh.dimension = [2, 2] + mesh.lower_left = [-50., -50.] + mesh.upper_right = [+50., +50.] + mesh_filter = openmc.Filter(type='mesh', bins=[mesh.id]) + mesh_filter.mesh = mesh + self.cell_filters = [cell_21, cell_27] self.energy_filters = [low_energy, high_energy] # Initialize cell tallies with filters, nuclides and scores tallies = [] - for cell_filter in self.energy_filters: - for energy_filter in self.cell_filters: + for energy_filter in self.energy_filters: + for cell_filter in self.cell_filters: for nuclide in self.nuclides: for score in self.scores: tally = openmc.Tally() @@ -69,8 +77,18 @@ class TallySliceMergeTestHarness(PyAPITestHarness): for nuclide in self.nuclides: distribcell_tally.add_nuclide(nuclide) + mesh_tally = openmc.Tally(name='mesh tally') + mesh_tally.estimator = 'tracklength' + mesh_tally.add_filter(mesh_filter) + mesh_tally.add_filter(merged_energies) + for score in self.scores: + mesh_tally.add_score(score) + for nuclide in self.nuclides: + mesh_tally.add_nuclide(nuclide) + # Add tallies to a Tallies object - tallies_file = openmc.Tallies((tallies[0], distribcell_tally)) + tallies_file = openmc.Tallies((tallies[0], distribcell_tally, + mesh_tally)) # Export tallies to file self._input_set.tallies = tallies_file @@ -121,7 +139,7 @@ class TallySliceMergeTestHarness(PyAPITestHarness): # Append merged Tally Pandas DataFrame to output string df = tallies[0].get_pandas_dataframe() - outstr += df.to_string() + outstr += df.to_string() + '\n' # Extract the distribcell tally distribcell_tally = sp.get_tally(name='distribcell tally') @@ -138,7 +156,24 @@ class TallySliceMergeTestHarness(PyAPITestHarness): # Append merged Tally Pandas DataFrame to output string df = merge_tally.get_pandas_dataframe() - outstr += df.to_string() + outstr += df.to_string() + '\n' + + # Extract the mesh tally + mesh_tally = sp.get_tally(name='mesh tally') + + # Sum up a few subdomains from the mesh tally + sum1 = mesh_tally.summation(filter_type='mesh', + filter_bins=[(1,1,1), (1,2,1)]) + # Sum up a few subdomains from the mesh tally + sum2 = mesh_tally.summation(filter_type='mesh', + filter_bins=[(2,1,1), (2,2,1)]) + + # Merge the distribcell tally slices + merge_tally = sum1.merge(sum2) + + # Append merged Tally Pandas DataFrame to output string + df = merge_tally.get_pandas_dataframe() + outstr += df.to_string() + '\n' # Hash the results if necessary if hash_output: From 9d55caf5c0caf3d157ffd8e6070c28a87e877a96 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 7 Jul 2016 16:19:30 -0400 Subject: [PATCH 04/33] fixed typo in tally slice merge test comment --- tests/test_tally_slice_merge/test_tally_slice_merge.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_tally_slice_merge/test_tally_slice_merge.py b/tests/test_tally_slice_merge/test_tally_slice_merge.py index 0b05c088d..1472cc75a 100644 --- a/tests/test_tally_slice_merge/test_tally_slice_merge.py +++ b/tests/test_tally_slice_merge/test_tally_slice_merge.py @@ -168,7 +168,7 @@ class TallySliceMergeTestHarness(PyAPITestHarness): sum2 = mesh_tally.summation(filter_type='mesh', filter_bins=[(2,1,1), (2,2,1)]) - # Merge the distribcell tally slices + # Merge the mesh tally slices merge_tally = sum1.merge(sum2) # Append merged Tally Pandas DataFrame to output string From bc5efa71c77caafdd7ac0fb974dc20f6084549a7 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sun, 10 Jul 2016 15:01:24 -0600 Subject: [PATCH 05/33] updated formatting for tally slice merge test --- tests/test_tally_slice_merge/test_tally_slice_merge.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/tests/test_tally_slice_merge/test_tally_slice_merge.py b/tests/test_tally_slice_merge/test_tally_slice_merge.py index 1472cc75a..78ea4fe9d 100644 --- a/tests/test_tally_slice_merge/test_tally_slice_merge.py +++ b/tests/test_tally_slice_merge/test_tally_slice_merge.py @@ -79,12 +79,9 @@ class TallySliceMergeTestHarness(PyAPITestHarness): mesh_tally = openmc.Tally(name='mesh tally') mesh_tally.estimator = 'tracklength' - mesh_tally.add_filter(mesh_filter) - mesh_tally.add_filter(merged_energies) - for score in self.scores: - mesh_tally.add_score(score) - for nuclide in self.nuclides: - mesh_tally.add_nuclide(nuclide) + mesh_tally.filters = [mesh_filter, merged_energies] + mesh_tally.scores = self.scores + mesh_tally.nuclides = self.nuclides # Add tallies to a Tallies object tallies_file = openmc.Tallies((tallies[0], distribcell_tally, From c9d2d6899af1b35d81e25f8f505f8d09df2b8b50 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 1 Jul 2016 09:22:49 +0700 Subject: [PATCH 06/33] Incremented version number and added release notes --- docs/source/conf.py | 4 +- docs/source/methods/geometry.rst | 2 +- docs/source/releasenotes.rst | 113 ++++++++++++++++--------------- man/man1/openmc.1 | 2 +- setup.py | 2 +- src/constants.F90 | 4 +- 6 files changed, 66 insertions(+), 61 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 38661cdb3..cb43079e3 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -69,9 +69,9 @@ copyright = u'2011-2016, Massachusetts Institute of Technology' # built documents. # # The short X.Y version. -version = "0.7" +version = "0.8" # The full version, including alpha/beta/rc tags. -release = "0.7.1" +release = "0.8.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/source/methods/geometry.rst b/docs/source/methods/geometry.rst index bcd568ca3..c689883d0 100644 --- a/docs/source/methods/geometry.rst +++ b/docs/source/methods/geometry.rst @@ -205,7 +205,7 @@ traveling in its current direction, it will not hit the surface. The complete derivation for different types of surfaces used in OpenMC will be presented in the following sections. -Since :math:f(x,y,z)` in general is quadratic in :math:`x`, :math:`y`, and +Since :math:`f(x,y,z)` in general is quadratic in :math:`x`, :math:`y`, and :math:`z`, this implies that :math:`f(x_0 + du_0, y + dv_0, z + dw_0)` is quadratic in :math:`d`. Thus we expect at most two real solutions to :eq:`dist-to-boundary-1`. If no solutions to :eq:`dist-to-boundary-1` exist or diff --git a/docs/source/releasenotes.rst b/docs/source/releasenotes.rst index 65309fd70..3b96be7f8 100644 --- a/docs/source/releasenotes.rst +++ b/docs/source/releasenotes.rst @@ -1,78 +1,83 @@ .. _releasenotes: ============================== -Release Notes for OpenMC 0.7.1 +Release Notes for OpenMC 0.8.0 ============================== -This release of OpenMC provides some substantial improvements over version -0.7.0. Non-simple cell regions can now be defined through the ``|`` (union) and -``~`` (complement) operators. Similar changes in the Python API also allow -complex cell regions to be defined. A true secondary particle bank now exists; -this is crucial for photon transport (to be added in the next minor release). A -rich API for multi-group cross section generation has been added via the -``openmc.mgxs`` Python module. +This release of OpenMC includes a few new major features including the +capability to perform neutron transport with multi-group cross section data as +well as experimental support for the windowed multipole method being developed +at MIT. Source sampling options have also been expanded significantly, with the +option to supply arbitrary tabular and discrete distributions for energy, angle, +and spatial coordinates. -Various improvements to tallies have also been made. It is now possible to -explicitly specify that a collision estimator be used in a tally. A new -``delayedgroup`` filter and ``delayed-nu-fission`` score allow a user to obtain -delayed fission neutron production rates filtered by delayed group. Finally, the -new ``inverse-velocity`` score may be useful for calculating kinetics -parameters. +The Python API has been significantly restructured in this release compared to +version 0.7.1. Any scripts written based on the version 0.7.1 API will likely +need to be rewritten. Some of the most visible changes include the following: -.. caution:: In previous versions, depending on how OpenMC was compiled binary - output was either given in HDF5 or a flat binary format. With this - version, all binary output is now HDF5 which means you **must** - have HDF5 in order to install OpenMC. Please consult the user's - guide for instructions on how to compile with HDF5. +- ``SettingsFile`` is now ``Settings``, ``MaterialsFile`` is now ``Materials``, + and ``TalliesFile`` is now ``Tallies``. +- The ``GeometryFile`` class no longer exists and is replaced by the + ``Geometry`` class which now has an ``export_to_xml()`` method. +- Source distributions are defined using the ``Source`` class and assigned to + the ``Settings.source`` property. +- The ``Executor`` class no longer exists and is replaced by ``openmc.run()`` + and ``openmc.plot_geometry()`` functions. + +The Python API documentation has also been significantly expanded. ------------------- 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). +release, OpenMC has been tested on a variety of Linux distributions and Mac +OS X. Numerous users have reported working builds on Microsoft Windows, but your +mileage may vary. Memory requirements will vary depending on the size of the +problem at hand (mostly on the number of nuclides and tallies in the problem). ------------ New Features ------------ -- Support for complex cell regions (union and complement operators) -- Generic quadric surface type -- Improved handling of secondary particles -- Binary output is now solely HDF5 -- ``openmc.mgxs`` Python module enabling multi-group cross section generation -- Collision estimator for tallies -- Delayed fission neutron production tallies with ability to filter by delayed - group -- Inverse velocity tally score -- Performance improvements for binary search -- Performance improvements for reaction rate tallies +- Multi-group mode +- Vast improvements to the Python API +- Experimental windowed multipole capability +- Periodic boundary conditions +- Expanded source sampling options +- Distributed materials +- Subcritical multiplication support +- Improved method for reproducible URR table sampling +- Refactor of continuous-energy reaction data +- Improved documentation and new Jupyter notebooks --------- Bug Fixes --------- -- 299322_: Bug with material filter when void material present -- d74840_: Fix triggers on tallies with multiple filters -- c29a81_: Correctly handle maximum transport energy -- 3edc23_: Fixes in the nu-scatter score -- 629e3b_: Assume unspecified surface coefficients are zero in Python API -- 5dbe8b_: Fix energy filters for openmc-plot-mesh-tally -- ff66f4_: Fixes in the openmc-plot-mesh-tally script -- 441fd4_: Fix bug in kappa-fission score -- 7e5974_: Allow fixed source simulations from Python API +- 70daa7_: Make sure MT=3 cross section is not used +- 40b05f_: Ensure source bank is resampled for fixed source runs +- 9586ed_: Fix two hexagonal lattice bugs +- a855e8_: Make sure graphite models don't error out on max events +- 7294a1_: Fix incorrect check on cmfd.xml +- 12f246_: Ensure number of realizations is written to statepoint +- 0227f4_: Fix bug when sampling multiple energy distributions +- 51deaa_: Prevent segfault when user specifies '18' on tally scores +- fed74b_: Prevent duplicate tally scores +- 8467ae_: Better threshold for allowable lost particles +- 493c6f_: Fix type of return argument for h5pget_driver_f -.. _299322: https://github.com/mit-crpg/openmc/commit/299322 -.. _d74840: https://github.com/mit-crpg/openmc/commit/d74840 -.. _c29a81: https://github.com/mit-crpg/openmc/commit/c29a81 -.. _3edc23: https://github.com/mit-crpg/openmc/commit/3edc23 -.. _629e3b: https://github.com/mit-crpg/openmc/commit/629e3b -.. _5dbe8b: https://github.com/mit-crpg/openmc/commit/5dbe8b -.. _ff66f4: https://github.com/mit-crpg/openmc/commit/ff66f4 -.. _441fd4: https://github.com/mit-crpg/openmc/commit/441fd4 -.. _7e5974: https://github.com/mit-crpg/openmc/commit/7e5974 +.. _70daa7: https://github.com/mit-crpg/openmc/commit/70daa7 +.. _40b05f: https://github.com/mit-crpg/openmc/commit/40b05f +.. _9586ed: https://github.com/mit-crpg/openmc/commit/9586ed +.. _a855e8: https://github.com/mit-crpg/openmc/commit/a855e8 +.. _7294a1: https://github.com/mit-crpg/openmc/commit/7294a1 +.. _12f246: https://github.com/mit-crpg/openmc/commit/12f246 +.. _0227f4: https://github.com/mit-crpg/openmc/commit/0227f4 +.. _51deaa: https://github.com/mit-crpg/openmc/commit/51deaa +.. _fed74b: https://github.com/mit-crpg/openmc/commit/fed74b +.. _8467ae: https://github.com/mit-crpg/openmc/commit/8467ae +.. _493c6f: https://github.com/mit-crpg/openmc/commit/493c6f ------------ Contributors @@ -81,11 +86,11 @@ Contributors This release contains new contributions from the following people: - `Will Boyd `_ -- `Sterling Harper `_ -- `Bryan Herman `_ +- `Derek Gaston `_ +- `Sterling Harper `_ - `Colin Josey `_ +- `Jingang Liang `_ - `Adam Nelson `_ - `Paul Romano `_ - `Kelly Rowland `_ - `Sam Shaner `_ -- `Jon Walsh `_ diff --git a/man/man1/openmc.1 b/man/man1/openmc.1 index 102adfbdc..e69360a7c 100644 --- a/man/man1/openmc.1 +++ b/man/man1/openmc.1 @@ -46,7 +46,7 @@ to locate ACE format cross section libraries if the user has not specified the tag in .I settings.xml\fP. .SH LICENSE -Copyright \(co 2011-2015 Massachusetts Institute of Technology. +Copyright \(co 2011-2016 Massachusetts Institute of Technology. .PP Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/setup.py b/setup.py index a842a1c3a..393f40bd3 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ except ImportError: have_setuptools = False kwargs = {'name': 'openmc', - 'version': '0.7.1', + 'version': '0.8.0', 'packages': ['openmc', 'openmc.data', 'openmc.mgxs', 'openmc.model', 'openmc.stats'], 'scripts': glob.glob('scripts/openmc-*'), diff --git a/src/constants.F90 b/src/constants.F90 index b3e5ed89b..127b4507f 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 = 7 - integer, parameter :: VERSION_RELEASE = 1 + integer, parameter :: VERSION_MINOR = 8 + integer, parameter :: VERSION_RELEASE = 0 ! Revision numbers for binary files integer, parameter :: REVISION_STATEPOINT = 15 From ede81f95e989bcd4f1842e663e7f6526e190e83c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 1 Jul 2016 13:19:39 +0700 Subject: [PATCH 07/33] Ensure line-length is within 160 characters per F2008 standard --- src/multipole_header.F90 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/multipole_header.F90 b/src/multipole_header.F90 index a21677a95..143047b0b 100644 --- a/src/multipole_header.F90 +++ b/src/multipole_header.F90 @@ -45,7 +45,8 @@ module multipole_header logical :: fissionable = .false. ! Is this isotope fissionable? integer :: length ! Number of poles integer, allocatable :: l_value(:) ! The l index of the pole - real(8), allocatable :: pseudo_k0RS(:) ! The value (sqrt(2*mass neutron)/reduced planck constant) * AWR/(AWR + 1) * scattering radius for each l + real(8), allocatable :: pseudo_k0RS(:) ! The value (sqrt(2*mass neutron)/reduced planck constant) + ! * AWR/(AWR + 1) * scattering radius for each l complex(8), allocatable :: data(:,:) ! Contains all of the pole-residue data real(8) :: sqrtAWR ! Square root of the atomic weight ratio From 195f81cacbf5c9bb8ca7b48ffb641d3c4f384180 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 1 Jul 2016 13:20:47 +0700 Subject: [PATCH 08/33] Update Intel compiler flags. Allow CC to be set in run_tests.py --- CMakeLists.txt | 9 ++++----- tests/run_tests.py | 7 +++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 16cf914e5..73f0afccc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,8 +147,7 @@ elseif(CMAKE_Fortran_COMPILER_ID STREQUAL Intel) if(debug) list(APPEND f90flags -g -warn -ftrapuv -fp-stack-check "-check all" -fpe0) - list(APPEND cflags -g -warn -ftrapuv -fp-stack-check - "-check all" -fpe0) + list(APPEND cflags -g -w3 -ftrapuv -fp-stack-check) list(APPEND ldflags -g) endif() if(profile) @@ -161,9 +160,9 @@ elseif(CMAKE_Fortran_COMPILER_ID STREQUAL Intel) list(APPEND cflags -O3) endif() if(openmp) - list(APPEND f90flags -openmp) - list(APPEND cflags -openmp) - list(APPEND ldflags -openmp) + list(APPEND f90flags -qopenmp) + list(APPEND cflags -qopenmp) + list(APPEND ldflags -qopenmp) endif() elseif(CMAKE_Fortran_COMPILER_ID STREQUAL PGI) diff --git a/tests/run_tests.py b/tests/run_tests.py index 5a04f340a..87282055c 100755 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -42,6 +42,7 @@ parser.add_option("-s", "--script", action="store_true", dest="script", # Default compiler paths FC='gfortran' +CC='gcc' MPI_DIR='/opt/mpich/3.2-gnu' HDF5_DIR='/opt/hdf5/1.8.16-gnu' PHDF5_DIR='/opt/phdf5/1.8.16-gnu' @@ -52,6 +53,8 @@ script_mode = False # Override default compiler paths if environmental vars are found if 'FC' in os.environ: FC = os.environ['FC'] +if 'CC' in os.environ: + CC = os.environ['CC'] if 'MPI_DIR' in os.environ: MPI_DIR = os.environ['MPI_DIR'] if 'HDF5_DIR' in os.environ: @@ -158,8 +161,10 @@ class Test(object): self.fc = os.path.join(MPI_DIR, 'bin', 'mpifort') else: self.fc = os.path.join(MPI_DIR, 'bin', 'mpif90') + self.cc = os.path.join(MPI_DIR, 'bin', 'mpicc') else: self.fc = FC + self.cc = CC # Sets the build name that will show up on the CDash def get_build_name(self): @@ -189,6 +194,7 @@ class Test(object): # Runs the ctest script which performs all the cmake/ctest/cdash def run_ctest_script(self): os.environ['FC'] = self.fc + os.environ['CC'] = self.cc if self.mpi: os.environ['MPI_DIR'] = MPI_DIR if self.phdf5: @@ -203,6 +209,7 @@ class Test(object): # Runs cmake when in non-script mode def run_cmake(self): os.environ['FC'] = self.fc + os.environ['CC'] = self.cc if self.mpi: os.environ['MPI_DIR'] = MPI_DIR if self.phdf5: From 68e5a093aa37fdc18132e278ad9a965a1665364b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 13 May 2016 15:57:39 -0500 Subject: [PATCH 09/33] Added full openmc.data package and hooks in code --- .travis.yml | 8 +- data/convert_hdf5.py | 96 + data/get_nndc_data.py | 2 +- docs/source/_static/theme_overrides.css | 8 + docs/source/conf.py | 3 +- docs/source/io_formats/index.rst | 18 +- docs/source/io_formats/nuclear_data.rst | 353 +++ docs/source/pythonapi/index.rst | 81 +- examples/python/basic/build-xml.py | 8 +- examples/python/boxes/build-xml.py | 10 +- .../python/lattice/hexagonal/build-xml.py | 10 +- examples/python/lattice/nested/build-xml.py | 8 +- examples/python/lattice/simple/build-xml.py | 8 +- examples/python/pincell/build-xml.py | 68 +- examples/python/reflective/build-xml.py | 2 +- examples/xml/basic/materials.xml | 8 +- examples/xml/boxes/materials.xml | 10 +- examples/xml/lattice/nested/materials.xml | 8 +- examples/xml/lattice/simple/materials.xml | 8 +- examples/xml/pincell/materials.xml | 78 +- examples/xml/reflective/materials.xml | 2 +- openmc/ace.py | 65 - openmc/data/__init__.py | 12 + openmc/data/ace.py | 2226 +++++++++++++++++ openmc/data/angle_distribution.py | 134 + openmc/data/angle_energy.py | 40 + openmc/data/container.py | 269 ++ openmc/data/correlated.py | 291 +++ openmc/data/data.py | 57 + openmc/data/energy_distribution.py | 850 +++++++ openmc/data/kalbach_mann.py | 253 ++ openmc/data/nbody.py | 118 + openmc/data/product.py | 205 ++ openmc/data/thermal.py | 92 + openmc/data/uncorrelated.py | 95 + openmc/data/urr.py | 171 ++ openmc/settings.py | 11 +- openmc/stats/univariate.py | 154 +- src/ace.F90 | 1738 ------------- src/angle_distribution.F90 | 72 +- src/angleenergy_header.F90 | 9 + src/constants.F90 | 7 + src/endf_header.F90 | 54 +- src/energy_distribution.F90 | 210 +- src/global.F90 | 10 +- src/initialize.F90 | 82 +- src/input_xml.F90 | 2059 ++++++++------- src/material_header.F90 | 4 +- src/mgxs_data.F90 | 33 +- src/mgxs_header.F90 | 44 +- src/nuclide_header.F90 | 289 ++- src/output.F90 | 8 +- src/product_header.F90 | 94 + src/reaction_header.F90 | 42 + src/relaxng/materials.rnc | 6 +- src/relaxng/materials.rng | 42 +- src/sab_header.F90 | 301 ++- src/secondary_correlated.F90 | 160 +- src/secondary_kalbach.F90 | 118 +- src/secondary_nbody.F90 | 13 + src/secondary_uncorrelated.F90 | 61 +- src/state_point.F90 | 17 +- src/stl_vector.F90 | 158 ++ src/summary.F90 | 25 +- src/urr_header.F90 | 53 + tests/input_set.py | 440 ++-- tests/test_asymmetric_lattice/inputs_true.dat | 2 +- tests/test_cmfd_feed/materials.xml | 6 +- tests/test_cmfd_nofeed/materials.xml | 6 +- tests/test_complex_cell/materials.xml | 4 +- tests/test_confidence_intervals/materials.xml | 2 +- tests/test_density/materials.xml | 12 +- tests/test_distribmat/inputs_true.dat | 2 +- tests/test_distribmat/test_distribmat.py | 8 +- .../test_eigenvalue_genperbatch/materials.xml | 2 +- .../test_eigenvalue_no_inactive/materials.xml | 2 +- tests/test_energy_grid/materials.xml | 6 +- tests/test_energy_laws/materials.xml | 8 +- tests/test_entropy/materials.xml | 2 +- .../case-1/materials.xml | 6 +- .../case-2/materials.xml | 6 +- .../case-3/materials.xml | 118 +- .../case-4/materials.xml | 10 +- tests/test_filter_mesh_2d/materials.xml | 412 +-- tests/test_filter_mesh_3d/materials.xml | 412 +-- tests/test_fixed_source/materials.xml | 4 +- tests/test_infinite_cell/materials.xml | 4 +- tests/test_iso_in_lab/inputs_true.dat | 2 +- tests/test_lattice/materials.xml | 158 +- tests/test_lattice_hex/materials.xml | 36 +- tests/test_lattice_mixed/materials.xml | 36 +- tests/test_lattice_multiple/materials.xml | 412 +-- .../inputs_true.dat | 2 +- .../inputs_true.dat | 2 +- .../inputs_true.dat | 2 +- tests/test_mgxs_library_hdf5/inputs_true.dat | 2 +- .../inputs_true.dat | 2 +- .../inputs_true.dat | 2 +- .../results_true.dat | 2 +- tests/test_multipole/inputs_true.dat | 2 +- tests/test_multipole/test_multipole.py | 6 +- tests/test_natural_element/materials.xml | 8 +- tests/test_output/materials.xml | 2 +- .../materials.xml | 2 +- .../test_particle_restart_fixed/materials.xml | 2 +- tests/test_periodic/inputs_true.dat | 2 +- tests/test_periodic/test_periodic.py | 8 +- tests/test_plot/materials.xml | 6 +- tests/test_ptables_off/materials.xml | 2 +- tests/test_quadric_surfaces/materials.xml | 4 +- tests/test_reflective_plane/materials.xml | 2 +- .../test_resonance_scattering/inputs_true.dat | 2 +- .../test_resonance_scattering.py | 17 +- tests/test_rotation/materials.xml | 2 +- tests/test_salphabeta/materials.xml | 42 +- tests/test_score_current/materials.xml | 412 +-- tests/test_seed/materials.xml | 2 +- tests/test_source/inputs_true.dat | 2 +- tests/test_source/test_source.py | 2 +- tests/test_source_file/materials.xml | 2 +- tests/test_sourcepoint_batch/materials.xml | 2 +- tests/test_sourcepoint_interval/materials.xml | 2 +- tests/test_sourcepoint_latest/materials.xml | 2 +- tests/test_sourcepoint_restart/materials.xml | 2 +- tests/test_statepoint_batch/materials.xml | 2 +- tests/test_statepoint_interval/materials.xml | 2 +- tests/test_statepoint_restart/materials.xml | 2 +- tests/test_statepoint_sourcesep/materials.xml | 2 +- tests/test_survival_biasing/materials.xml | 4 +- tests/test_tallies/inputs_true.dat | 2 +- tests/test_tallies/test_tallies.py | 2 +- tests/test_tally_aggregation/inputs_true.dat | 2 +- .../test_tally_aggregation.py | 8 +- tests/test_tally_arithmetic/inputs_true.dat | 2 +- .../test_tally_arithmetic.py | 6 +- tests/test_tally_assumesep/materials.xml | 412 +-- tests/test_tally_nuclides/materials.xml | 2 +- tests/test_tally_nuclides/tallies.xml | 2 +- tests/test_tally_slice_merge/inputs_true.dat | 2 +- tests/test_tally_slice_merge/results_true.dat | 128 +- .../test_tally_slice_merge.py | 6 +- tests/test_trace/materials.xml | 2 +- tests/test_track_output/materials.xml | 132 +- tests/test_translation/materials.xml | 2 +- .../test_trigger_batch_interval/materials.xml | 2 +- tests/test_trigger_batch_interval/tallies.xml | 2 +- .../materials.xml | 2 +- .../tallies.xml | 2 +- tests/test_trigger_no_status/materials.xml | 2 +- tests/test_trigger_no_status/tallies.xml | 2 +- tests/test_trigger_tallies/materials.xml | 2 +- tests/test_trigger_tallies/tallies.xml | 2 +- tests/test_triso/inputs_true.dat | 2 +- tests/test_triso/test_triso.py | 26 +- tests/test_uniform_fs/materials.xml | 2 +- tests/test_union_energy_grids/materials.xml | 6 +- tests/test_universe/materials.xml | 2 +- tests/test_void/materials.xml | 70 +- 158 files changed, 10186 insertions(+), 4878 deletions(-) create mode 100644 data/convert_hdf5.py create mode 100644 docs/source/io_formats/nuclear_data.rst delete mode 100644 openmc/ace.py create mode 100644 openmc/data/ace.py create mode 100644 openmc/data/angle_distribution.py create mode 100644 openmc/data/angle_energy.py create mode 100644 openmc/data/container.py create mode 100644 openmc/data/correlated.py create mode 100644 openmc/data/energy_distribution.py create mode 100644 openmc/data/kalbach_mann.py create mode 100644 openmc/data/nbody.py create mode 100644 openmc/data/product.py create mode 100644 openmc/data/thermal.py create mode 100644 openmc/data/uncorrelated.py create mode 100644 openmc/data/urr.py delete mode 100644 src/ace.F90 diff --git a/.travis.yml b/.travis.yml index 6aed183a0..46f5e91bf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,10 +41,10 @@ install: true before_script: - cd data - - git clone --branch=master git://github.com/bhermanmit/nndc_xs nndc_xs - - cat nndc_xs/nndc.tar.gza* | tar xzvf - - - rm -rf nndc_xs - - export OPENMC_CROSS_SECTIONS=$PWD/nndc/cross_sections.xml + - git clone --branch=master git://github.com/paulromano/nndc-hdf5 + - cat nndc-hdf5/nndc_hdf5.tar.xz? | tar xJvf - + - rm -rf nndc-hdf5 + - export OPENMC_CROSS_SECTIONS=$PWD/nndc_hdf5/cross_sections.xml - git clone --branch=master git://github.com/smharper/windowed_multipole_library.git wmp_lib - tar xzvf wmp_lib/multipole_lib.tar.gz - export OPENMC_MULTIPOLE_LIBRARY=$PWD/multipole_lib diff --git a/data/convert_hdf5.py b/data/convert_hdf5.py new file mode 100644 index 000000000..3f5fcfdb7 --- /dev/null +++ b/data/convert_hdf5.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python + +import glob +import os +from xml.dom.minidom import getDOMImplementation + +import openmc.data.ace + + +if not os.path.isdir('nndc_hdf5'): + os.mkdir('nndc_hdf5') + +nndc_files = glob.glob('nndc/293.6K/*.ace') +nndc_thermal_files = glob.glob('nndc/tsl/*.acer') + +thermal_names = {'al': 'c_Al27', + 'be': 'c_Be', + 'bebeo': 'c_Be_in_BeO', + 'benzine': 'c_Benzine', + 'dd2o': 'c_D_in_D2O', + 'fe': 'c_Fe56', + 'graphite': 'c_Graphite', + 'hch2': 'c_H_in_CH2', + 'hh2o': 'c_H_in_H2O', + 'hzrh': 'c_H_in_ZrH', + 'lch4': 'c_liquid_CH4', + 'obeo': 'c_O_in_BeO', + 'orthod': 'c_ortho_D', + 'orthoh': 'c_ortho_H', + 'ouo2': 'c_O_in_UO2', + 'parad': 'c_para_D', + 'parah': 'c_para_H', + 'sch4': 'c_solid_CH4', + 'uuo2': 'c_U_in_UO2', + 'zrzrh': 'c_Zr_in_ZrH'} + +impl = getDOMImplementation() +doc = impl.createDocument(None, "cross_sections", None) +doc_root = doc.documentElement + +for f in sorted(nndc_files): + print('Converting {}...'.format(f)) + + # Deterine output file name + dirname, basename = os.path.split(f) + root, ext = os.path.splitext(basename) + outfile = os.path.join('nndc_hdf5', root + '.h5') + if os.path.exists(outfile): + os.remove(outfile) + + # Determine elemental symbol, mass number and metastable state + element, mass_number, temp = basename.split('_') + metastable = int(mass_number[-1]) if 'm' in mass_number else 0 + mass_number = int(mass_number[:3]) + + # Parse ACE file, create HDF5 file + t = openmc.data.ace.get_table(f) + t.export_to_hdf5(outfile, element, mass_number, metastable) + xs = t.name.split('.')[1] + if metastable > 0: + name = "{}{}_m{}.{}".format(element, mass_number, metastable, xs) + else: + name = "{}{}.{}".format(element, mass_number, xs) + + # Add entry to XML listing + libraryNode = doc.createElement("library") + libraryNode.setAttribute("path", root + '.h5') + libraryNode.setAttribute("materials", name) + libraryNode.setAttribute("type", "neutron") + doc_root.appendChild(libraryNode) + +for f in sorted(nndc_thermal_files): + print('Converting {}...'.format(f)) + + # Deterine output file name + dirname, basename = os.path.split(f) + root, ext = os.path.splitext(basename) + outfile = os.path.join('nndc_hdf5', root + '.h5') + if os.path.exists(outfile): + os.remove(outfile) + + # Parse ACE file, create HDF5 file + t = openmc.data.ace.get_table(f) + t.export_to_hdf5(outfile, thermal_names[root]) + xs = t.name.split('.')[1] + + # Add entry to XML listing + libraryNode = doc.createElement("library") + libraryNode.setAttribute("path", root + '.h5') + libraryNode.setAttribute("materials", thermal_names[root] + '.' + xs) + libraryNode.setAttribute("type", "thermal") + doc_root.appendChild(libraryNode) + +# Write cross_sections.xml +lines = doc.toprettyxml(indent=' ') +open(os.path.join('nndc_hdf5', 'cross_sections.xml'), 'w').write(lines) diff --git a/data/get_nndc_data.py b/data/get_nndc_data.py index b9b855a81..844abea81 100755 --- a/data/get_nndc_data.py +++ b/data/get_nndc_data.py @@ -22,7 +22,7 @@ except ImportError: cwd = os.getcwd() sys.path.insert(0, os.path.join(cwd, '..')) -from openmc.ace import ascii_to_binary +from openmc.data.ace import ascii_to_binary baseUrl = 'http://www.nndc.bnl.gov/endf/b7.1/aceFiles/' files = ['ENDF-B-VII.1-neutron-293.6K.tar.gz', diff --git a/docs/source/_static/theme_overrides.css b/docs/source/_static/theme_overrides.css index 7c1a52022..bee03f415 100644 --- a/docs/source/_static/theme_overrides.css +++ b/docs/source/_static/theme_overrides.css @@ -8,3 +8,11 @@ max-width: 100%; overflow: visible; } + +.wy-plain-list-disc, .rst-content .section ul, .rst-content .toctree-wrapper ul, article ul { + margin-bottom: 0px; +} + +.wy-table, .rst-content table.docutils, .rst-content table.field-list { + margin-bottom: 0px; +} diff --git a/docs/source/conf.py b/docs/source/conf.py index 38661cdb3..c9299b424 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -24,7 +24,8 @@ except ImportError: from mock import Mock as MagicMock -MOCK_MODULES = ['numpy', 'h5py', 'pandas', 'opencg'] +MOCK_MODULES = ['numpy', 'numpy.polynomial', 'numpy.polynomial.polynomial', + 'h5py', 'pandas', 'opencg'] sys.modules.update((mod_name, MagicMock()) for mod_name in MOCK_MODULES) diff --git a/docs/source/io_formats/index.rst b/docs/source/io_formats/index.rst index 905cd26cc..acab7e893 100644 --- a/docs/source/io_formats/index.rst +++ b/docs/source/io_formats/index.rst @@ -4,12 +4,26 @@ File Format Specifications ========================== +---------- +Data Files +---------- + .. toctree:: :numbered: - :maxdepth: 3 + :maxdepth: 2 - data_wmp + nuclear_data mgxs_library + data_wmp + +------------ +Output Files +------------ + +.. toctree:: + :numbered: + :maxdepth: 2 + statepoint source summary diff --git a/docs/source/io_formats/nuclear_data.rst b/docs/source/io_formats/nuclear_data.rst new file mode 100644 index 000000000..e7d4f2d32 --- /dev/null +++ b/docs/source/io_formats/nuclear_data.rst @@ -0,0 +1,353 @@ +.. _usersguide_nuclear_data: + +======================== +Nuclear Data File Format +======================== + +--------------------- +Incident Neutron Data +--------------------- + + +**//** + +:Attributes: - **Z** (*int*) -- Atomic number + - **A** (*int*) -- Mass number + - **metastable** (*int*) -- Metastable state + - **atomic_weight_ratio** (*double*) -- Mass in units of neutron masses + - **temperature** (*double*) -- Temperature in MeV + - **n_reaction** (*int*) -- Number of reactions + +:Datasets: - **energy** (*double[]*) -- Energy points at which cross sections are tabulated + +**//reaction_/** + +:Attributes: - **mt** (*int*) -- ENDF MT reaction number + - **label** (*char[]*) -- Name of the reaction + - **Q_value** (*double*) -- Q value in MeV + - **threshold_idx** (*int*) -- Index on the energy grid that the + reaction threshold corresponds to + - **center_of_mass** (*int*) -- Whether the reference frame for + scattering is center-of-mass (1) or laboratory (0) + - **n_product** (*int*) -- Number of reaction products + +:Datasets: - **xs** (*double[]*) -- Cross section values tabulated against the nuclide energy grid + +**//reaction_/product_/** + + Reaction product data is described in :ref:`product`. + +**//urr** + +:Attributes: - **interpolation** (*int*) -- interpolation scheme + - **inelastic** (*int*) -- flag indicating inelastic scattering + - **other_absorb** (*int*) -- flag indicating other absorption + - **factors** (*int*) -- flag indicating whether tables are + absolute or multipliers + +:Datasets: - **energy** (*double[]*) -- Energy at which probability tables exist + - **table** (*double[][][]*) -- Probability tables + +**//total_nu/** + + This special product is used to define the total number of neutrons produced + from fission. It is formatted as a reaction product, described in + :ref:`product`. + +------------------------------- +Thermal Neutron Scattering Data +------------------------------- + +**//** + +:Attributes: - **atomic_weight_ratio** (*double*) -- Mass in units of neutron masses + - **temperature** (*double*) -- Temperature in MeV + - **zaids** (*int[]*) -- ZAID identifiers for which the thermal + scattering data applies to + +**//elastic/** + +:Datasets: - **xs** (:ref:`tabulated <1d_tabulated>`) -- Thermal inelastic + scattering cross section + - **mu_out** (*double[][]*) -- Distribution of outgoing energies + and angles for coherent elastic scattering + +**//inelastic/** + +:Attributes: + - **secondary_mode** (*char[]*) -- Indicates how the inelastic + outgoing angle-energy distributions are represented ('equal', + 'skewed', or 'continuous'). + +:Datasets: - **xs** (:ref:`tabulated <1d_tabulated>`) -- Thermal inelastic + scattering cross section + - **energy_out** (*double[][]*) -- Distribution of outgoing + energies for each incoming energy. Only present if secondary mode + is not continuous. + - **mu_out** (*double[][][]*) -- Distribution of scattering cosines + for each pair of incoming and outgoing energies. Only present if + secondary mode is not continuous. + +If the secondary mode is continuous, the outgoing energy-angle distribution is +given as a :ref:`correlated angle-energy distribution +`. + +.. _product: + +----------------- +Reaction Products +----------------- + +:Object type: Group +:Attributes: - **particle** (*char[]*) -- Type of particle + - **emission_mode** (*char[]*) -- Emission mode (prompt, delayed, + total) + - **decay_rate** (*double*) -- Rate of decay in inverse seconds + - **n_distribution** (*int*) -- Number of angle/energy + distributions +:Datasets: + - **yield** (:ref:`function <1d_functions>`) -- Energy-dependent + yield of the product. + +:Groups: + - **distribution_** -- Formats for angle-energy distributions are + detailed in :ref:`angle_energy`. When multiple angle-energy + distributions occur, one dataset also may appear for each + distribution: + + :Datasets: + - **applicability** (:ref:`function <1d_functions>`) -- + Probability of selecting this distribution as a function + of incident energy + +.. _1d_functions: + +------------------------- +One-dimensional Functions +------------------------- + +Scalar +------ + +:Object type: Dataset +:Datatype: *double* +:Attributes: - **type** (*char[]*) -- 'constant' + +.. _1d_tabulated: + +Tabulated +--------- + +:Object type: Dataset +:Datatype: *double[2][]* +:Description: x-values are listed first followed by corresponding y-values +:Attributes: - **type** (*char[]*) -- 'tabulated' + - **breakpoints** (*int[]*) -- Region breakpoints + - **interpolation** (*int[]*) -- Region interpolation codes + +Polynomial +---------- + +:Object type: Dataset +:Datatype: *double[]* +:Description: Polynomial coefficients listed in order of increasing power +:Attributes: - **type** (*char[]*) -- 'polynomial' + +Coherent elastic scattering +--------------------------- + +:Object type: Dataset +:Datatype: *double[2][]* +:Description: The first row lists Bragg edges and the second row lists structure + factor cumulative sums. +:Attributes: - **type** (*char[]*) -- 'bragg' + +.. _angle_energy: + +-------------------------- +Angle-Energy Distributions +-------------------------- + +Uncorrelated Angle-Energy +------------------------- + +:Object type: Group +:Attributes: - **type** (*char[]*) -- 'uncorrelated' +:Datasets: - **angle/energy** (*double[]*) -- energies at which angle distributions exist + - **angle/mu** (*double[3][]*) -- tabulated angular distributions for + each energy. The first row gives :math:`\mu` values, the second row + gives the probability density, and the third row gives the + cumulative distribution. + + :Attributes: - **offsets** (*int[]*) -- indices indicating where + each angular distribution starts + - **interpolation** (*int[]*) -- interpolation code + for each angular distribution + +:Groups: - **energy/** (:ref:`energy distribution `) + +.. _correlated_angle_energy: + +Correlated Angle-Energy +----------------------- + +:Object type: Group +:Attributes: - **type** (*char[]*) -- 'correlated' +:Datasets: - **energy** (*double[]*) -- Incoming energies at which distributions exist + + :Attributes: + - **interpolation** (*double[2][]*) -- Breakpoints and + interpolation codes for incoming energy regions + + - **energy_out** (*double[5][]*) -- Distribution of outgoing energies + corresponding to each incoming energy. The distributions are + flattened into a single array; the start of a given distribution + can be determined using the ``offsets`` attribute. The first row + gives outgoing energies, the second row gives the probability + density, the third row gives the cumulative distribution, the + fourth row gives interpolation codes for angular distributions, and + the fifth row gives offsets for angular distributions. + + :Attributes: - **offsets** (*double[]*) -- Offset for each + distribution + - **interpolation** (*int[]*) -- Interpolation code + for each distribution + - **n_discrete_lines** (*int[]*) -- Number of discrete + lines in each distribution + + - **mu** (*double[3][]*) -- Distribution of angular cosines + corresponding to each pair of incoming and outgoing energies. The + distributions are flattened into a single array; the start of a + given distribution can be determined using offsets in the fifth row + of the ``energy_out`` dataset. The first row gives angular cosines, + the second row gives the probability density, and the third row + gives the cumulative distribution. + +Kalbach-Mann +------------ + +:Object type: Group +:Attributes: - **type** (*char[]*) -- 'kalbach-mann' +:Datasets: - **energy** (*double[]*) -- Incoming energies at which distributions exist + + :Attributes: + - **interpolation** (*double[2][]*) -- Breakpoints and + interpolation codes for incoming energy regions + + - **distribution** (*double[5][]*) -- Distribution of outgoing + energies and angles corresponding to each incoming energy. The + distributions are flattened into a single array; the start of a + given distribution can be determined using the ``offsets`` + attribute. The first row gives outgoing energies, the second row + gives the probability density, the third row gives the cumulative + distribution, the fourth row gives Kalbach-Mann precompound + factors, and the fifth row gives Kalbach-Mann angular distribution + slopes. + + :Attributes: - **offsets** (*double[]*) -- Offset for each + distribution + - **interpolation** (*int[]*) -- Interpolation code + for each distribution + - **n_discrete_lines** (*int[]*) -- Number of discrete + lines in each distribution + +N-Body Phase Space +------------------ + +:Object type: Group +:Attributes: - **type** (*char[]*) -- 'nbody' + - **total_mass** (*double*) -- Total mass of product particles + - **n_particles** (*int*) -- Number of product particles + - **atomic_weight_ratio** (*double*) -- Atomic weight ratio of the + target nuclide in neutron masses + - **q_value** (*double*) -- Q value for the reaction in MeV + +.. _energy_distribution: + +-------------------- +Energy Distributions +-------------------- + +Maxwell +------- + +:Object type: Group +:Attributes: - **type** (*char[]*) -- 'maxwell' + - **u** (*double*) -- Restriction energy in MeV +:Datasets: + - **theta** (:ref:`tabulated <1d_tabulated>`) -- Maxwellian + temperature as a function of energy + +Evaporation +----------- + +:Object type: Group +:Attributes: - **type** (*char[]*) -- 'evaporation' + - **u** (*double*) -- Restriction energy in MeV +:Datasets: + - **theta** (:ref:`tabulated <1d_tabulated>`) -- Evaporation + temperature as a function of energy + +Watt Fission Spectrum +--------------------- + +:Object type: Group +:Attributes: - **type** (*char[]*) -- 'watt' + - **u** (*double*) -- Restriction energy in MeV +:Datasets: - **a** (:ref:`tabulated <1d_tabulated>`) -- Watt parameter :math:`a` + as a function of incident energy + - **b** (:ref:`tabulated <1d_tabulated>`) -- Watt parameter :math:`b` + as a function of incident energy + +Madland-Nix +----------- + +:Object type: Group +:Attributes: - **type** (*char[]*) -- 'watt' + - **efl** (*double*) -- Average energy of light fragment in eV + - **efh** (*double*) -- Average energy of heavy fragment in eV + +Discrete Photon +--------------- + +:Object type: Group +:Attributes: - **type** (*char[]*) -- 'discrete_photon' + - **primary_flag** (*int*) -- Whether photon is a primary + - **energy** (*double*) -- Photon energy in MeV + - **atomic_weight_ratio** (*double*) -- Atomic weight ratio of + target nuclide in neutron masses + +Level Inelastic +--------------- + +:Object type: Group +:Attributes: - **type** (*char[]*) -- 'level' + - **threshold** (*double*) -- Energy threshold in the laboratory + system in MeV + - **mass_ratio** (*double*) -- :math:`(A/(A + 1))^2` + +Continuous Tabular +------------------ + +:Object type: Group +:Attributes: - **type** (*char[]*) -- 'continuous' +:Datasets: - **energy** (*double[]*) -- Incoming energies at which distributions exist + + :Attributes: + - **interpolation** (*double[2][]*) -- Breakpoints and + interpolation codes for incoming energy regions + + - **distribution** (*double[3][]*) -- Distribution of outgoing + energies corresponding to each incoming energy. The distributions + are flattened into a single array; the start of a given + distribution can be determined using the ``offsets`` attribute. The + first row gives outgoing energies, the second row gives the + probability density, and the third row gives the cumulative + distribution. + + :Attributes: - **offsets** (*double[]*) -- Offset for each + distribution + - **interpolation** (*int[]*) -- Interpolation code + for each distribution + - **n_discrete_lines** (*int[]*) -- Number of discrete + lines in each distribution diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 09b3d5135..a17af8ac6 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -35,9 +35,6 @@ Example Jupyter Notebooks Handling nuclear data --------------------- -Classes -+++++++ - .. autosummary:: :toctree: generated :nosignatures: @@ -46,14 +43,6 @@ Classes openmc.XSdata openmc.MGXSLibrary -Functions -+++++++++ - -.. autosummary:: - :toctree: generated - :nosignatures: - - openmc.ace.ascii_to_binary Simulation Settings ------------------- @@ -224,6 +213,8 @@ Univariate Probability Distributions openmc.stats.Maxwell openmc.stats.Watt openmc.stats.Tabular + openmc.stats.Legendre + openmc.stats.Mixture Angular Distributions --------------------- @@ -325,6 +316,74 @@ Functions openmc.model.create_triso_lattice +-------------------------------------------- +:mod:`openmc.data` -- Nuclear Data Interface +-------------------------------------------- + +Core Classes +------------ + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: myclass.rst + + openmc.data.Product + openmc.data.Tabulated1D + openmc.data.CoherentElastic + +Angle-Energy Distributions +-------------------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: myclass.rst + + openmc.data.AngleEnergy + openmc.data.KalbachMann + openmc.data.CorrelatedAngleEnergy + openmc.data.UncorrelatedAngleEnergy + openmc.data.NBodyPhaseSpace + openmc.data.AngleDistribution + openmc.data.EnergyDistribution + openmc.data.ArbitraryTabulated + openmc.data.GeneralEvaporation + openmc.data.MaxwellEnergy + openmc.data.Evaporation + openmc.data.WattEnergy + openmc.data.MadlandNix + openmc.data.DiscretePhoton + openmc.data.LevelInelastic + openmc.data.ContinuousTabular + +ACE Format +---------- + +Classes ++++++++ + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: myclass.rst + + openmc.data.ace.Library + openmc.data.ace.Table + openmc.data.ace.NeutronTable + openmc.data.ace.SabTable + openmc.data.ace.PhotoatomicTable + openmc.data.ace.PhotonuclearTable + openmc.data.ace.Reaction + +Functions ++++++++++ + +.. autosummary:: + :toctree: generated + :nosignatures: + + openmc.data.ace.ascii_to_binary .. _Jupyter: https://jupyter.org/ .. _NumPy: http://www.numpy.org/ diff --git a/examples/python/basic/build-xml.py b/examples/python/basic/build-xml.py index 81aecc9f9..1bfe50b2e 100644 --- a/examples/python/basic/build-xml.py +++ b/examples/python/basic/build-xml.py @@ -16,16 +16,16 @@ particles = 10000 ############################################################################### # Instantiate some Nuclides -h1 = openmc.Nuclide('H-1') -o16 = openmc.Nuclide('O-16') -u235 = openmc.Nuclide('U-235') +h1 = openmc.Nuclide('H1') +o16 = openmc.Nuclide('O16') +u235 = openmc.Nuclide('U235') # Instantiate some Materials and register the appropriate Nuclides moderator = openmc.Material(material_id=41, name='moderator') moderator.set_density('g/cc', 1.0) moderator.add_nuclide(h1, 2.) moderator.add_nuclide(o16, 1.) -moderator.add_s_alpha_beta('HH2O', '71t') +moderator.add_s_alpha_beta('c_H_in_H2O', '71t') fuel = openmc.Material(material_id=40, name='fuel') fuel.set_density('g/cc', 4.5) diff --git a/examples/python/boxes/build-xml.py b/examples/python/boxes/build-xml.py index 4be33dcf1..3eed4059c 100644 --- a/examples/python/boxes/build-xml.py +++ b/examples/python/boxes/build-xml.py @@ -16,10 +16,10 @@ particles = 10000 ############################################################################### # Instantiate some Nuclides -h1 = openmc.Nuclide('H-1') -o16 = openmc.Nuclide('O-16') -u235 = openmc.Nuclide('U-235') -u238 = openmc.Nuclide('U-238') +h1 = openmc.Nuclide('H1') +o16 = openmc.Nuclide('O16') +u235 = openmc.Nuclide('U235') +u238 = openmc.Nuclide('U238') # Instantiate some Materials and register the appropriate Nuclides fuel1 = openmc.Material(material_id=1, name='fuel') @@ -34,7 +34,7 @@ moderator = openmc.Material(material_id=3, name='moderator') moderator.set_density('g/cc', 1.0) moderator.add_nuclide(h1, 2.) moderator.add_nuclide(o16, 1.) -moderator.add_s_alpha_beta('HH2O', '71t') +moderator.add_s_alpha_beta('c_H_in_H2O', '71t') # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([fuel1, fuel2, moderator]) diff --git a/examples/python/lattice/hexagonal/build-xml.py b/examples/python/lattice/hexagonal/build-xml.py index 05cb2cb01..ba2cac367 100644 --- a/examples/python/lattice/hexagonal/build-xml.py +++ b/examples/python/lattice/hexagonal/build-xml.py @@ -15,10 +15,10 @@ particles = 10000 ############################################################################### # Instantiate some Nuclides -h1 = openmc.Nuclide('H-1') -o16 = openmc.Nuclide('O-16') -u235 = openmc.Nuclide('U-235') -fe56 = openmc.Nuclide('Fe-56') +h1 = openmc.Nuclide('H1') +o16 = openmc.Nuclide('O16') +u235 = openmc.Nuclide('U235') +fe56 = openmc.Nuclide('Fe56') # Instantiate some Materials and register the appropriate Nuclides fuel = openmc.Material(material_id=1, name='fuel') @@ -29,7 +29,7 @@ moderator = openmc.Material(material_id=2, name='moderator') moderator.set_density('g/cc', 1.0) moderator.add_nuclide(h1, 2.) moderator.add_nuclide(o16, 1.) -moderator.add_s_alpha_beta('HH2O', '71t') +moderator.add_s_alpha_beta('c_H_in_H2O', '71t') iron = openmc.Material(material_id=3, name='iron') iron.set_density('g/cc', 7.9) diff --git a/examples/python/lattice/nested/build-xml.py b/examples/python/lattice/nested/build-xml.py index 03cede9dc..edf3ad7b1 100644 --- a/examples/python/lattice/nested/build-xml.py +++ b/examples/python/lattice/nested/build-xml.py @@ -15,9 +15,9 @@ particles = 10000 ############################################################################### # Instantiate some Nuclides -h1 = openmc.Nuclide('H-1') -o16 = openmc.Nuclide('O-16') -u235 = openmc.Nuclide('U-235') +h1 = openmc.Nuclide('H1') +o16 = openmc.Nuclide('O16') +u235 = openmc.Nuclide('U235') # Instantiate some Materials and register the appropriate Nuclides fuel = openmc.Material(material_id=1, name='fuel') @@ -28,7 +28,7 @@ moderator = openmc.Material(material_id=2, name='moderator') moderator.set_density('g/cc', 1.0) moderator.add_nuclide(h1, 2.) moderator.add_nuclide(o16, 1.) -moderator.add_s_alpha_beta('HH2O', '71t') +moderator.add_s_alpha_beta('c_H_in_H2O', '71t') # Instantiate a Materials collection and export to XML materials_file = openmc.Materials((moderator, fuel)) diff --git a/examples/python/lattice/simple/build-xml.py b/examples/python/lattice/simple/build-xml.py index 5a642d308..5ec1b7ee9 100644 --- a/examples/python/lattice/simple/build-xml.py +++ b/examples/python/lattice/simple/build-xml.py @@ -15,9 +15,9 @@ particles = 10000 ############################################################################### # Instantiate some Nuclides -h1 = openmc.Nuclide('H-1') -o16 = openmc.Nuclide('O-16') -u235 = openmc.Nuclide('U-235') +h1 = openmc.Nuclide('H1') +o16 = openmc.Nuclide('O16') +u235 = openmc.Nuclide('U235') # Instantiate some Materials and register the appropriate Nuclides fuel = openmc.Material(material_id=1, name='fuel') @@ -28,7 +28,7 @@ moderator = openmc.Material(material_id=2, name='moderator') moderator.set_density('g/cc', 1.0) moderator.add_nuclide(h1, 2.) moderator.add_nuclide(o16, 1.) -moderator.add_s_alpha_beta('HH2O', '71t') +moderator.add_s_alpha_beta('c_H_in_H2O', '71t') # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([moderator, fuel]) diff --git a/examples/python/pincell/build-xml.py b/examples/python/pincell/build-xml.py index 0afb2527f..3bda05027 100644 --- a/examples/python/pincell/build-xml.py +++ b/examples/python/pincell/build-xml.py @@ -15,39 +15,39 @@ particles = 1000 ############################################################################### # Instantiate some Nuclides -h1 = openmc.Nuclide('H-1') -h2 = openmc.Nuclide('H-2') -he4 = openmc.Nuclide('He-4') -b10 = openmc.Nuclide('B-10') -b11 = openmc.Nuclide('B-11') -o16 = openmc.Nuclide('O-16') -o17 = openmc.Nuclide('O-17') -cr50 = openmc.Nuclide('Cr-50') -cr52 = openmc.Nuclide('Cr-52') -cr53 = openmc.Nuclide('Cr-53') -cr54 = openmc.Nuclide('Cr-54') -fe54 = openmc.Nuclide('Fe-54') -fe56 = openmc.Nuclide('Fe-56') -fe57 = openmc.Nuclide('Fe-57') -fe58 = openmc.Nuclide('Fe-58') -zr90 = openmc.Nuclide('Zr-90') -zr91 = openmc.Nuclide('Zr-91') -zr92 = openmc.Nuclide('Zr-92') -zr94 = openmc.Nuclide('Zr-94') -zr96 = openmc.Nuclide('Zr-96') -sn112 = openmc.Nuclide('Sn-112') -sn114 = openmc.Nuclide('Sn-114') -sn115 = openmc.Nuclide('Sn-115') -sn116 = openmc.Nuclide('Sn-116') -sn117 = openmc.Nuclide('Sn-117') -sn118 = openmc.Nuclide('Sn-118') -sn119 = openmc.Nuclide('Sn-119') -sn120 = openmc.Nuclide('Sn-120') -sn122 = openmc.Nuclide('Sn-122') -sn124 = openmc.Nuclide('Sn-124') -u234 = openmc.Nuclide('U-234') -u235 = openmc.Nuclide('U-235') -u238 = openmc.Nuclide('U-238') +h1 = openmc.Nuclide('H1') +h2 = openmc.Nuclide('H2') +he4 = openmc.Nuclide('He4') +b10 = openmc.Nuclide('B10') +b11 = openmc.Nuclide('B11') +o16 = openmc.Nuclide('O16') +o17 = openmc.Nuclide('O17') +cr50 = openmc.Nuclide('Cr50') +cr52 = openmc.Nuclide('Cr52') +cr53 = openmc.Nuclide('Cr53') +cr54 = openmc.Nuclide('Cr54') +fe54 = openmc.Nuclide('Fe54') +fe56 = openmc.Nuclide('Fe56') +fe57 = openmc.Nuclide('Fe57') +fe58 = openmc.Nuclide('Fe58') +zr90 = openmc.Nuclide('Zr90') +zr91 = openmc.Nuclide('Zr91') +zr92 = openmc.Nuclide('Zr92') +zr94 = openmc.Nuclide('Zr94') +zr96 = openmc.Nuclide('Zr96') +sn112 = openmc.Nuclide('Sn112') +sn114 = openmc.Nuclide('Sn114') +sn115 = openmc.Nuclide('Sn115') +sn116 = openmc.Nuclide('Sn116') +sn117 = openmc.Nuclide('Sn117') +sn118 = openmc.Nuclide('Sn118') +sn119 = openmc.Nuclide('Sn119') +sn120 = openmc.Nuclide('Sn120') +sn122 = openmc.Nuclide('Sn122') +sn124 = openmc.Nuclide('Sn124') +u234 = openmc.Nuclide('U234') +u235 = openmc.Nuclide('U235') +u238 = openmc.Nuclide('U238') # Instantiate some Materials and register the appropriate Nuclides uo2 = openmc.Material(material_id=1, name='UO2 fuel at 2.4% wt enrichment') @@ -98,7 +98,7 @@ borated_water.add_nuclide(h1, 4.9457e-2) borated_water.add_nuclide(h2, 7.4196e-6) borated_water.add_nuclide(o16, 2.4672e-2) borated_water.add_nuclide(o17, 6.0099e-5) -borated_water.add_s_alpha_beta('HH2O', '71t') +borated_water.add_s_alpha_beta('c_H_in_H2O', '71t') # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([uo2, helium, zircaloy, borated_water]) diff --git a/examples/python/reflective/build-xml.py b/examples/python/reflective/build-xml.py index 949e57c8c..0e064ab61 100644 --- a/examples/python/reflective/build-xml.py +++ b/examples/python/reflective/build-xml.py @@ -16,7 +16,7 @@ particles = 10000 ############################################################################### # Instantiate a Nuclides -u235 = openmc.Nuclide('U-235') +u235 = openmc.Nuclide('U235') # Instantiate a Material and register the Nuclide fuel = openmc.Material(material_id=1, name='fuel') diff --git a/examples/xml/basic/materials.xml b/examples/xml/basic/materials.xml index 75ab74dbb..2f88731ff 100644 --- a/examples/xml/basic/materials.xml +++ b/examples/xml/basic/materials.xml @@ -5,14 +5,14 @@ - + - - - + + + diff --git a/examples/xml/boxes/materials.xml b/examples/xml/boxes/materials.xml index 6f6114a7d..c74714a08 100644 --- a/examples/xml/boxes/materials.xml +++ b/examples/xml/boxes/materials.xml @@ -5,19 +5,19 @@ - + - + - - - + + + diff --git a/examples/xml/lattice/nested/materials.xml b/examples/xml/lattice/nested/materials.xml index b64922136..7f8b06bb1 100644 --- a/examples/xml/lattice/nested/materials.xml +++ b/examples/xml/lattice/nested/materials.xml @@ -6,14 +6,14 @@ - + - - - + + + diff --git a/examples/xml/lattice/simple/materials.xml b/examples/xml/lattice/simple/materials.xml index b64922136..7f8b06bb1 100644 --- a/examples/xml/lattice/simple/materials.xml +++ b/examples/xml/lattice/simple/materials.xml @@ -6,14 +6,14 @@ - + - - - + + + diff --git a/examples/xml/pincell/materials.xml b/examples/xml/pincell/materials.xml index 427fc175d..b6af486d1 100644 --- a/examples/xml/pincell/materials.xml +++ b/examples/xml/pincell/materials.xml @@ -12,59 +12,59 @@ - - - - - + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - + + + + + + + diff --git a/examples/xml/reflective/materials.xml b/examples/xml/reflective/materials.xml index 6da53a9b6..13cbf070e 100644 --- a/examples/xml/reflective/materials.xml +++ b/examples/xml/reflective/materials.xml @@ -5,7 +5,7 @@ - + diff --git a/openmc/ace.py b/openmc/ace.py deleted file mode 100644 index 3606b1e94..000000000 --- a/openmc/ace.py +++ /dev/null @@ -1,65 +0,0 @@ -from __future__ import division -from struct import pack - - -def ascii_to_binary(ascii_file, binary_file): - """Convert an ACE file in ASCII format (type 1) to binary format (type 2). - - Parameters - ---------- - ascii_file : str - Filename of ASCII ACE file - binary_file : str - Filename of binary ACE file to be written - - """ - - # Open ASCII file - ascii = open(ascii_file, 'r') - - # Set default record length - record_length = 4096 - - # Read data from ASCII file - lines = ascii.readlines() - ascii.close() - - # Open binary file - binary = open(binary_file, 'wb') - - idx = 0 - while idx < len(lines): - # Read/write header block - hz = lines[idx][:10].encode('UTF-8') - aw0 = float(lines[idx][10:22]) - tz = float(lines[idx][22:34]) - hd = lines[idx][35:45].encode('UTF-8') - hk = lines[idx + 1][:70].encode('UTF-8') - hm = lines[idx + 1][70:80].encode('UTF-8') - binary.write(pack('=10sdd10s70s10s', hz, aw0, tz, hd, hk, hm)) - - # Read/write IZ/AW pairs - data = ' '.join(lines[idx + 2:idx + 6]).split() - iz = list(map(int, data[::2])) - aw = list(map(float, data[1::2])) - izaw = [item for sublist in zip(iz, aw) for item in sublist] - binary.write(pack('=' + 16*'id', *izaw)) - - # Read/write NXS and JXS arrays. Null bytes are added at the end so - # 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))) - - # 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)) - - # Advance to next table in file - idx += 12 + n_lines - - # Close binary file - binary.close() diff --git a/openmc/data/__init__.py b/openmc/data/__init__.py index df22d8bbb..32de3b598 100644 --- a/openmc/data/__init__.py +++ b/openmc/data/__init__.py @@ -1 +1,13 @@ from .data import * +from .ace import * +from .angle_distribution import * +from .container import * +from .energy_distribution import * +from .product import * +from .angle_energy import * +from .uncorrelated import * +from .correlated import * +from .kalbach_mann import * +from .nbody import * +from .thermal import * +from .urr import * diff --git a/openmc/data/ace.py b/openmc/data/ace.py new file mode 100644 index 000000000..16c18dfb4 --- /dev/null +++ b/openmc/data/ace.py @@ -0,0 +1,2226 @@ +"""This module is for reading ACE-format cross sections. ACE stands for "A +Compact ENDF" format and originated from work on MCNP_. It is used in a number +of other Monte Carlo particle transport codes. + +ACE-format cross sections are typically generated from ENDF_ files through a +cross section processing program like NJOY_. The ENDF data consists of tabulated +thermal data, ENDF/B resonance parameters, distribution parameters in the +unresolved resonance region, and tabulated data in the fast region. After the +ENDF data has been reconstructed and Doppler-broadened, the ACER module +generates ACE-format cross sections. + +.. _MCNP: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/ +.. _NJOY: http://t2.lanl.gov/codes.shtml +.. _ENDF: http://www.nndc.bnl.gov/endf + +""" + +from __future__ import division, unicode_literals +import io +from os import SEEK_CUR +import struct +import sys +from warnings import warn +from collections import OrderedDict +from copy import deepcopy + +import numpy as np +from numpy.polynomial import Polynomial +import h5py + +from . import atomic_number, atomic_symbol, reaction_name +from .container import Tabulated1D, interpolation_scheme +from .angle_distribution import AngleDistribution +from .energy_distribution import * +from .product import Product +from .angle_energy import AngleEnergy +from .kalbach_mann import KalbachMann +from .uncorrelated import UncorrelatedAngleEnergy +from .correlated import CorrelatedAngleEnergy +from .nbody import NBodyPhaseSpace +from .thermal import CoherentElastic +from .urr import ProbabilityTables +from openmc.stats import Tabular, Discrete, Uniform, Mixture + +if sys.version_info[0] >= 3: + basestring = str + + +def ascii_to_binary(ascii_file, binary_file): + """Convert an ACE file in ASCII format (type 1) to binary format (type 2). + + Parameters + ---------- + ascii_file : str + Filename of ASCII ACE file + binary_file : str + Filename of binary ACE file to be written + + """ + + # Open ASCII file + ascii = open(ascii_file, 'r') + + # Set default record length + record_length = 4096 + + # Read data from ASCII file + lines = ascii.readlines() + ascii.close() + + # Open binary file + binary = open(binary_file, 'wb') + + idx = 0 + + while idx < len(lines): + # check if it's a > 2.0.0 version header + if lines[idx].split()[0][1] == '.': + if lines[idx + 1].split()[3] == '3': + idx = idx + 3 + else: + raise NotImplementedError('Only backwards compatible ACE' + 'headers currently supported') + # Read/write header block + hz = lines[idx][:10].encode('UTF-8') + aw0 = float(lines[idx][10:22]) + tz = float(lines[idx][22:34]) + hd = lines[idx][35:45].encode('UTF-8') + hk = lines[idx + 1][:70].encode('UTF-8') + hm = lines[idx + 1][70:80].encode('UTF-8') + binary.write(struct.pack(str('=10sdd10s70s10s'), hz, aw0, tz, hd, hk, hm)) + + # Read/write IZ/AW pairs + data = ' '.join(lines[idx + 2:idx + 6]).split() + iz = list(map(int, data[::2])) + aw = list(map(float, data[1::2])) + izaw = [item for sublist in zip(iz, aw) for item in sublist] + binary.write(struct.pack(str('=' + 16*'id'), *izaw)) + + # Read/write NXS and JXS arrays. Null bytes are added at the end so + # 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(struct.pack(str('=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(struct.pack(str('={0}d{1}x'.format(nxs[0], extra_bytes)), + *xss)) + + # Advance to next table in file + idx += 12 + n_lines + + # Close binary file + binary.close() + + +def _get_tabulated_1d(array, idx=0): + """Create a Tabulated1D object from array. + + Parameters + ---------- + array : numpy.ndarray + Array is formed as a 1 dimensional array as follows: [number of regions, + final pair for each region, interpolation parameters, number of pairs, + x-values, y-values] + idx : int, optional + Offset to read from in array (default of zero) + + Returns + ------- + openmc.data.Tabulated1D + Tabulated data object + + """ + + # Get number of regions and pairs + n_regions = int(array[idx]) + n_pairs = int(array[idx + 1 + 2*n_regions]) + + # Get interpolation information + idx += 1 + if n_regions > 0: + nbt = np.asarray(array[idx:idx + n_regions], dtype=int) + interp = np.asarray(array[idx + n_regions:idx + 2*n_regions], dtype=int) + else: + # NR=0 regions implies linear-linear interpolation by default + nbt = np.array([n_pairs]) + interp = np.array([2]) + + # Get (x,y) pairs + idx += 2*n_regions + 1 + x = array[idx:idx + n_pairs] + y = array[idx + n_pairs:idx + 2*n_pairs] + + return Tabulated1D(x, y, nbt, interp) + + +def get_table(filename, name=None): + """Read a single table from an ACE file + + Parameters + ---------- + filename : str + Path of the ACE library to load table from + name : str, optional + Name of table to load, e.g. '92235.71c' + + Returns + ------- + openmc.data.ace.Table + ACE table with specified name. If no name is specified, the first table + in the file is returned. + + """ + + lib = Library(filename) + if name is None: + return list(lib.tables.values())[0] + else: + return lib.tables[name] + + +def get_all_tables(filename): + """Read all tables from an ACE file + + Parameters + ---------- + filename : str + Path of the ACE library to load table from + name : str, optional + Name of table to load, e.g. '92235.71c' + + Returns + ------- + list of openmc.data.ace.Table + ACE tables read from the file + + """ + + lib = Library(filename) + return list(lib.tables.values()) + + +class Library(object): + """A Library objects represents an ACE-formatted file which may contain + multiple tables with data. + + Parameters + ---------- + filename : str + Path of the ACE library file to load. + table_names : None, str, or iterable, optional + Tables from the file to read in. If None, reads in all of the + tables. If str, reads in only the single table of a matching name. + verbose : bool, optional + Determines whether output is printed to the stdout when reading a + Library + + Attributes + ---------- + tables : dict + Dictionary whose keys are the names of the ACE tables and whose values + are the instances of subclasses of :class:`Table` + (e.g. :class:`NeutronTable`) + + """ + + def __init__(self, filename, table_names=None, verbose=False): + if isinstance(table_names, basestring): + table_names = [table_names] + if table_names is not None: + table_names = set(table_names) + + self.tables = {} + + # Determine whether file is ASCII or binary + try: + fh = io.open(filename, 'rb') + # Grab 10 lines of the library + sb = b''.join([fh.readline() for i in range(10)]) + + # Try to decode it with ascii + sd = sb.decode('ascii') + + # No exception so proceed with ASCII - reopen in non-binary + fh.close() + fh = io.open(filename, 'r') + fh.seek(0) + self._read_ascii(fh, table_names, verbose) + except UnicodeDecodeError: + fh.close() + fh = open(filename, 'rb') + self._read_binary(fh, table_names, verbose) + + def _read_binary(self, fh, table_names, verbose=False, + recl_length=4096, entries=512): + """Read a binary (Type 2) ACE table. + + Parameters + ---------- + fh : file + Open ACE file + table_names : None, str, or iterable + Tables from the file to read in. If None, reads in all of the + tables. If str, reads in only the single table of a matching name. + verbose : str, optional + Whether to display what tables are being read. Defaults to False. + recl_length : int, optional + Fortran record length in binary file. Default value is 4096 bytes. + entries : int, optional + Number of entries per record. The default is 512 corresponding to a + record length of 4096 bytes with double precision data. + + """ + + while True: + start_position = fh.tell() + + # Check for end-of-file + if len(fh.read(1)) == 0: + return + fh.seek(start_position) + + # Read name, atomic mass ratio, temperature, date, comment, and + # material + name, atomic_weight_ratio, temperature, date, comment, mat = \ + struct.unpack(str('=10sdd10s70s10s'), fh.read(116)) + name = name.strip() + + # Read ZAID/awr combinations + izaw_pairs = struct.unpack(str('=' + 16*'id'), fh.read(192)) + + # Read NXS + nxs = list(struct.unpack(str('=16i'), fh.read(64))) + + # Determine length of XSS and number of records + length = nxs[0] + n_records = (length + entries - 1)//entries + + # name is bytes, make it a string + name = name.decode() + # verify that we are supposed to read this table in + if (table_names is not None) and (name not in table_names): + fh.seek(start_position + recl_length*(n_records + 1)) + continue + + # ensure we have a valid table type + if len(name) == 0 or name[-1] not in table_types: + warn("Unsupported table: " + name, RuntimeWarning) + fh.seek(start_position + recl_length*(n_records + 1)) + continue + + # get the table + table = table_types[name[-1]](name, atomic_weight_ratio, temperature) + + if verbose: + temperature_in_K = round(temperature * 1e6 / 8.617342e-5) + print("Loading nuclide {0} at {1} K".format(name, temperature_in_K)) + self.tables[name] = table + + # If table is S(a,b), add zaids + zaids = np.array(izaw_pairs[::2]) + table.zaids = zaids[np.nonzero(zaids)] + + # Read JXS + jxs = list(struct.unpack(str('=32i'), fh.read(128))) + + # Read XSS + fh.seek(start_position + recl_length) + xss = list(struct.unpack(str('={0}d'.format(length)), + fh.read(length*8))) + + # Insert empty object at beginning of NXS, JXS, and XSS arrays so + # that the indexing will be the same as Fortran. This makes it + # easier to follow the ACE format specification. + nxs.insert(0, 0) + table._nxs = np.array(nxs, dtype=int) + + jxs.insert(0, 0) + table._jxs = np.array(jxs, dtype=int) + + xss.insert(0, 0.0) + table._xss = np.array(xss) + + # Read all data blocks + table._read_all() + + # Advance to next record + fh.seek(start_position + recl_length*(n_records + 1)) + + def _read_ascii(self, fh, table_names, verbose=False): + """Read an ASCII (Type 1) ACE table. + + Parameters + ---------- + fh : file + Open ACE file + table_names : None, str, or iterable + Tables from the file to read in. If None, reads in all of the + tables. If str, reads in only the single table of a matching name. + verbose : str, optional + Whether to display what tables are being read. Defaults to False. + + """ + + tables_seen = set() + + lines = [fh.readline() for i in range(13)] + + while (0 != len(lines)) and (lines[0] != ''): + # Read name of table, atomic mass ratio, and temperature. If first + # line is empty, we are at end of file + + # check if it's a 2.0 style header + if lines[0].split()[0][1] == '.': + words = lines[0].split() + version = words[0] + name = words[1] + if len(words) == 3: + source = words[2] + words = lines[1].split() + atomic_weight_ratio = float(words[0]) + temperature = float(words[1]) + commentlines = int(words[3]) + for i in range(commentlines): + lines.pop(0) + lines.append(fh.readline()) + else: + words = lines[0].split() + name = words[0] + atomic_weight_ratio = float(words[1]) + temperature = float(words[2]) + + izaw_pairs = (' '.join(lines[2:6])).split() + + datastr = '0 ' + ' '.join(lines[6:8]) + nxs = np.fromstring(datastr, sep=' ', dtype=int) + + n_lines = (nxs[1] + 3)//4 + n_bytes = len(lines[-1]) * (n_lines - 2) + 1 + + # Ensure that we have more tables to read in + if (table_names is not None) and (table_names < tables_seen): + break + tables_seen.add(name) + + # verify that we are suppossed to read this table in + if (table_names is not None) and (name not in table_names): + fh.seek(n_bytes, SEEK_CUR) + fh.readline() + lines = [fh.readline() for i in range(13)] + continue + + # ensure we have a valid table type + if len(name) == 0 or name[-1] not in table_types: + warn("Unsupported table: " + name, RuntimeWarning) + fh.seek(n_bytes, SEEK_CUR) + fh.readline() + lines = [fh.readline() for i in range(13)] + continue + + # read and fix over-shoot + lines += fh.readlines(n_bytes) + if 12 + n_lines < len(lines): + goback = sum([len(line) for line in lines[12+n_lines:]]) + lines = lines[:12+n_lines] + fh.seek(-goback, SEEK_CUR) + + # get the table + table = table_types[name[-1]](name, atomic_weight_ratio, temperature) + + if verbose: + temperature_in_K = round(temperature * 1e6 / 8.617342e-5) + print("Loading nuclide {0} at {1} K".format(name, temperature_in_K)) + self.tables[name] = table + + # Read comment + table.comment = lines[1].strip() + + # If table is S(a,b), add zaids + if isinstance(table, SabTable): + zaids = np.fromiter(map(int, izaw_pairs[::2]), int) + table.zaids = zaids[np.nonzero(zaids)] + + # Add NXS, JXS, and XSS arrays to table Insert empty object at + # beginning of NXS, JXS, and XSS arrays so that the indexing will be + # the same as Fortran. This makes it easier to follow the ACE format + # specification. + table._nxs = nxs + + datastr = '0 ' + ' '.join(lines[8:12]) + table._jxs = np.fromstring(datastr, dtype=int, sep=' ') + + datastr = '0.0 ' + ''.join(lines[12:12+n_lines]) + table._xss = np.fromstring(datastr, sep=' ') + + # Read all data blocks + table._read_all() + lines = [fh.readline() for i in range(13)] + + +class Table(object): + """Abstract superclass of all other classes for cross section tables. + + Parameters + ---------- + name : str + ZAID identifier of the table, e.g. '92235.70c'. + atomic_weight_ratio : float + Atomic mass ratio of the target nuclide. + temperature : float + Temperature of the target nuclide in eV. + + Attributes + ---------- + name : str + ZAID identifier of the table, e.g. '92235.70c'. + atomic_weight_ratio : float + Atomic mass ratio of the target nuclide. + temperature : float + Temperature of the target nuclide in eV. + + """ + + def __init__(self, name, atomic_weight_ratio, temperature): + self.name = name + self.atomic_weight_ratio = atomic_weight_ratio + self.temperature = temperature + + def _read_all(self): + raise NotImplementedError + + def _get_continuous_tabular(self, idx, ldis): + """Get continuous tabular energy distribution (ACE law 4) starting at specified + index in the XSS array. + + Parameters + ---------- + idx : int + Index in XSS array of the start of the energy distribution data + (LDIS + LOCC - 1) + ldis : int + Index in XSS array of the start of the energy distribution block + (e.g. JXS[11]) + + Returns + ------- + openmc.data.energy_distribution.ContinuousTabular + Continuous tabular energy distribution + + """ + + # Read number of interpolation regions and incoming energies + n_regions = int(self._xss[idx]) + n_energy_in = int(self._xss[idx + 1 + 2*n_regions]) + + # Get interpolation information + idx += 1 + if n_regions > 0: + breakpoints = np.asarray(self._xss[idx:idx + n_regions], dtype=int) + interpolation = np.asarray(self._xss[idx + n_regions: + idx + 2*n_regions], dtype=int) + else: + breakpoints = np.array([n_energy_in]) + interpolation = np.array([2]) + + # Incoming energies at which distributions exist + idx += 2 * n_regions + 1 + energy = self._xss[idx:idx + n_energy_in] + + # Location of distributions + idx += n_energy_in + loc_dist = np.asarray(self._xss[idx:idx + n_energy_in], dtype=int) + + # Initialize variables + energy_out = [] + + # Read each outgoing energy distribution + for i in range(n_energy_in): + idx = ldis + loc_dist[i] - 1 + + # intt = interpolation scheme (1=hist, 2=lin-lin) + INTTp = int(self._xss[idx]) + intt = INTTp % 10 + n_discrete_lines = (INTTp - intt)//10 + if intt not in (1, 2): + warn("Interpolation scheme for continuous tabular distribution " + "is not histogram or linear-linear.") + intt = 2 + + n_energy_out = int(self._xss[idx + 1]) + data = self._xss[idx + 2:idx + 2 + 3*n_energy_out] + data.shape = (3, n_energy_out) + + # Create continuous distribution + eout_continuous = Tabular(data[0][n_discrete_lines:], + data[1][n_discrete_lines:], + interpolation_scheme[intt]) + eout_continuous.c = data[2][n_discrete_lines:] + + # If discrete lines are present, create a mixture distribution + if n_discrete_lines > 0: + eout_discrete = Discrete(data[0][:n_discrete_lines], + data[1][:n_discrete_lines]) + eout_discrete.c = data[2][:n_discrete_lines] + if n_discrete_lines == n_energy_out: + eout_i = eout_discrete + else: + p_discrete = min(sum(eout_discrete.p), 1.0) + eout_i = Mixture([p_discrete, 1. - p_discrete], + [eout_discrete, eout_continuous]) + else: + eout_i = eout_continuous + + energy_out.append(eout_i) + + return ContinuousTabular(breakpoints, interpolation, energy, + energy_out) + + def _get_general_evaporation(self, idx): + # Read nuclear temperature as Tabulated1D + theta = _get_tabulated_1d(array, idx) + + # X-function + nr = int(array[idx]) + ne = int(array[idx + 1 + 2*nr]) + idx += 2 + 2*nr + 2*ne + net = int(array[idx]) + x = array[idx + 1:idx + 1 + net] + + raise NotImplementedError("Where'd you get this ACE file from?") + + def _get_maxwell_energy(self, idx): + # Read nuclear temperature as Tabulated1D + theta = _get_tabulated_1d(self._xss, idx) + + # Restriction energy + nr = int(self._xss[idx]) + ne = int(self._xss[idx + 1 + 2*nr]) + u = self._xss[idx + 2 + 2*nr + 2*ne] + + return MaxwellEnergy(theta, u) + + def _get_evaporation(self, idx): + # Read nuclear temperature as Tabulated1D + theta = _get_tabulated_1d(self._xss, idx) + + # Restriction energy + nr = int(self._xss[idx]) + ne = int(self._xss[idx + 1 + 2*nr]) + u = self._xss[idx + 2 + 2*nr + 2*ne] + + return Evaporation(theta, u) + + def _get_watt_energy(self, idx): + # Energy-dependent a parameter + a = _get_tabulated_1d(self._xss, idx) + + # Advance index + nr = int(self._xss[idx]) + ne = int(self._xss[idx + 1 + 2*nr]) + idx += 2 + 2*nr + 2*ne + + # Energy-dependent b parameter + b = _get_tabulated_1d(self._xss, idx) + + # Advance index + nr = int(self._xss[idx]) + ne = int(self._xss[idx + 1 + 2*nr]) + idx += 2 + 2*nr + 2*ne + + # Restriction energy + u = self._xss[idx] + + return WattEnergy(a, b, u) + + def _get_kalbach_mann(self, idx, ldis): + # Read number of interpolation regions and incoming energies + n_regions = int(self._xss[idx]) + n_energy_in = int(self._xss[idx + 1 + 2*n_regions]) + + # Get interpolation information + idx += 1 + if n_regions > 0: + breakpoints = np.asarray(self._xss[idx:idx + n_regions], dtype=int) + interpolation = np.asarray(self._xss[idx + n_regions: + idx + 2*n_regions], dtype=int) + else: + breakpoints = np.array([n_energy_in]) + interpolation = np.array([2]) + + # Incoming energies at which distributions exist + idx += 2 * n_regions + 1 + energy = self._xss[idx:idx + n_energy_in] + + # Location of distributions + idx += n_energy_in + loc_dist = np.asarray(self._xss[idx:idx + n_energy_in], dtype=int) + + # Initialize variables + energy_out = [] + km_r = [] + km_a = [] + + # Read each outgoing energy distribution + for i in range(n_energy_in): + idx = ldis + loc_dist[i] - 1 + + # intt = interpolation scheme (1=hist, 2=lin-lin) + INTTp = int(self._xss[idx]) + intt = INTTp % 10 + n_discrete_lines = (INTTp - intt)//10 + if intt not in (1, 2): + warn("Interpolation scheme for continuous tabular distribution " + "is not histogram or linear-linear.") + intt = 2 + + n_energy_out = int(self._xss[idx + 1]) + data = self._xss[idx + 2:idx + 2 + 5*n_energy_out] + data.shape = (5, n_energy_out) + + # Create continuous distribution + eout_continuous = Tabular(data[0][n_discrete_lines:], + data[1][n_discrete_lines:], + interpolation_scheme[intt]) + eout_continuous.c = data[2][n_discrete_lines:] + + # If discrete lines are present, create a mixture distribution + if n_discrete_lines > 0: + eout_discrete = Discrete(data[0][:n_discrete_lines], + data[1][:n_discrete_lines]) + eout_discrete.c = data[2][:n_discrete_lines] + if n_discrete_lines == n_energy_out: + eout_i = eout_discrete + else: + p_discrete = min(sum(eout_discrete.p), 1.0) + eout_i = Mixture([p_discrete, 1. - p_discrete], + [eout_discrete, eout_continuous]) + else: + eout_i = eout_continuous + + energy_out.append(eout_i) + km_r.append(Tabulated1D(data[0], data[3])) + km_a.append(Tabulated1D(data[0], data[4])) + + return KalbachMann(breakpoints, interpolation, energy, energy_out, + km_r, km_a) + + def _get_correlated(self, idx, ldis): + # Read number of interpolation regions and incoming energies + n_regions = int(self._xss[idx]) + n_energy_in = int(self._xss[idx + 1 + 2*n_regions]) + + # Get interpolation information + idx += 1 + if n_regions > 0: + breakpoints = np.asarray(self._xss[idx:idx + n_regions], dtype=int) + interpolation = np.asarray(self._xss[idx + n_regions: + idx + 2*n_regions], dtype=int) + else: + breakpoints = np.array([n_energy_in]) + interpolation = np.array([2]) + + # Incoming energies at which distributions exist + idx += 2 * n_regions + 1 + energy = self._xss[idx:idx + n_energy_in] + + # Location of distributions + idx += n_energy_in + loc_dist = np.asarray(self._xss[idx:idx + n_energy_in], dtype=int) + + # Initialize list of distributions + energy_out = [] + mu = [] + + # Read each outgoing energy distribution + for i in range(n_energy_in): + idx = ldis + loc_dist[i] - 1 + + # intt = interpolation scheme (1=hist, 2=lin-lin) + INTTp = int(self._xss[idx]) + intt = INTTp % 10 + n_discrete_lines = (INTTp - intt)//10 + if intt not in (1, 2): + warn("Interpolation scheme for continuous tabular distribution " + "is not histogram or linear-linear.") + intt = 2 + + # Secondary energy distribution + n_energy_out = int(self._xss[idx + 1]) + data = self._xss[idx + 2:idx + 2 + 4*n_energy_out] + data.shape = (4, n_energy_out) + + # Create continuous distribution + eout_continuous = Tabular(data[0][n_discrete_lines:], + data[1][n_discrete_lines:], + interpolation_scheme[intt], + ignore_negative=True) + eout_continuous.c = data[2][n_discrete_lines:] + + # If discrete lines are present, create a mixture distribution + if n_discrete_lines > 0: + eout_discrete = Discrete(data[0][:n_discrete_lines], + data[1][:n_discrete_lines]) + eout_discrete.c = data[2][:n_discrete_lines] + if n_discrete_lines == n_energy_out: + eout_i = eout_discrete + else: + p_discrete = min(sum(eout_discrete.p), 1.0) + eout_i = Mixture([p_discrete, 1. - p_discrete], + [eout_discrete, eout_continuous]) + else: + eout_i = eout_continuous + + energy_out.append(eout_i) + + lc = np.asarray(data[3], dtype=int) + + # Secondary angular distributions + mu_i = [] + for j in range(n_energy_out): + if lc[j] > 0: + idx = ldis + abs(lc[j]) - 1 + + intt = int(self._xss[idx]) + n_cosine = int(self._xss[idx + 1]) + data = self._xss[idx + 2:idx + 2 + 3*n_cosine] + data.shape = (3, n_cosine) + + mu_ij = Tabular(data[0], data[1], interpolation_scheme[intt]) + mu_ij.c = data[2] + else: + # Isotropic distribution + mu_ij = Uniform(-1., 1.) + + mu_i.append(mu_ij) + + # Add cosine distributions for this incoming energy to list + mu.append(mu_i) + + return CorrelatedAngleEnergy(breakpoints, interpolation, energy, + energy_out, mu) + + def _get_energy_distribution(self, location_dist, location_start, rx=None): + """Returns an EnergyDistribution object from data read in starting at + location_start. + + Parameters + ---------- + location_dist : int + Index in the XSS array corresponding to the start of a block, + e.g. JXS(11) for the the DLW block. + location_start : int + Index in the XSS array corresponding to the start of an energy + distribution array + rx : Reaction + Reaction this energy distribution will be associated with + + Returns + ------- + distribution : openmc.data.AngleEnergy + Secondary angle-energy distribution + + """ + + # Set starting index for energy distribution + idx = location_dist + location_start - 1 + + law = int(self._xss[idx + 1]) + location_data = int(self._xss[idx + 2]) + + # Position index for reading law data + idx = location_dist + location_data - 1 + + # Parse energy distribution data + if law == 2: + primary_flag = int(self._xss[idx]) + energy = self._xss[idx + 1] + distribution = UncorrelatedAngleEnergy() + distribution.energy = DiscretePhoton(primary_flag, energy, + self.atomic_weight_ratio) + elif law in (3, 33): + threshold, mass_ratio = self._xss[idx:idx + 2] + distribution = UncorrelatedAngleEnergy() + distribution.energy = LevelInelastic(threshold, mass_ratio) + elif law == 4: + distribution = UncorrelatedAngleEnergy() + distribution.energy = self._get_continuous_tabular(idx, location_dist) + elif law == 5: + distribution = UncorrelatedAngleEnergy() + distribution.energy = self._get_general_evaporation(idx) + elif law == 7: + distribution = UncorrelatedAngleEnergy() + distribution.energy = self._get_maxwell_energy(idx) + elif law == 9: + distribution = UncorrelatedAngleEnergy() + distribution.energy = self._get_evaporation(idx) + elif law == 11: + distribution = UncorrelatedAngleEnergy() + distribution.energy = self._get_watt_energy(idx) + elif law == 44: + distribution = self._get_kalbach_mann(idx, location_dist) + elif law == 61: + distribution = self._get_correlated(idx, location_dist) + elif law == 66: + n_particles = int(self._xss[idx]) + total_mass = self._xss[idx + 1] + distribution = NBodyPhaseSpace(total_mass, n_particles, + self.atomic_weight_ratio, rx.Q_value) + else: + raise IOError("Unsupported ACE secondary energy " + "distribution law {0}".format(law)) + + return distribution + + +class NeutronTable(Table): + """A NeutronTable object contains continuous-energy neutron interaction data + read from an ACE-formatted table. These objects are not normally + instantiated by the user but rather created when reading data using a + Library object and stored within the :attr:`Library.tables` attribute. + + Parameters + ---------- + name : str + ZAID identifier of the table, e.g. '92235.70c'. + atomic_weight_ratio : float + Atomic mass ratio of the target nuclide. + temperature : float + Temperature of the target nuclide in eV. + + Attributes + ---------- + absorption_xs : numpy.ndarray + The microscopic absorption cross section for each value on the energy + grid. + atomic_weight_ratio : float + Atomic weight ratio of the target nuclide. + energy : numpy.ndarray + The energy values (MeV) at which reaction cross-sections are tabulated. + heating_number : numpy.ndarray + The total heating number for each value on the energy grid in MeV-b. + name : str + ZAID identifier of the table, e.g. 92235.70c. + reactions : collections.OrderedDict + Contains the cross sections, secondary angle and energy distributions, + and other associated data for each reaction. The keys are the MT values + and the values are Reaction objects. + temperature : float + Temperature of the target nuclide in eV. + total_xs : numpy.ndarray + The microscopic total cross section for each value on the energy grid in b. + urr : None or openmc.data.ProbabilityTables + Unresolved resonance region probability tables + + """ + + def __init__(self, name, atomic_weight_ratio, temperature): + super(NeutronTable, self).__init__(name, atomic_weight_ratio, temperature) + self.absorption_xs = None + self.energy = None + self.heating_number = None + self.total_xs = None + self.reactions = OrderedDict() + self.urr = None + + def __repr__(self): + if hasattr(self, 'name'): + return "".format(self.name) + else: + return "" + + def __iter__(self): + return iter(self.reactions.values()) + + def _read_all(self): + self._read_cross_sections() + self._read_nu() + self._read_secondaries() + self._read_photon_production_data() + self._read_unr() + + def _read_cross_sections(self): + """Read reaction cross sections and other data. + + Reads and parses the ESZ, MTR, LQR, TRY, LSIG, and SIG blocks. These + blocks contain the energy grid, all reaction cross sections, the total + cross section, average heating numbers, and a list of reactions with + their Q-values and multiplicites. + """ + + # Determine number of energies on nuclide grid and number of reactions + # excluding elastic scattering + n_energies = self._nxs[3] + n_reactions = self._nxs[4] + + # Read energy grid and total, absorption, elastic scattering, and + # heating cross sections -- note that this appear separate from the rest + # of the reaction cross sections + arr = self._xss[self._jxs[1]:self._jxs[1] + 5*n_energies] + arr.shape = (5, n_energies) + self.energy, self.total_xs, self.absorption_xs, \ + elastic_xs, self.heating_number = arr + + # Create elastic scattering reaction + elastic_scatter = Reaction(2, self) + elastic_scatter.products.append(Product('neutron')) + elastic_scatter.xs = Tabulated1D(self.energy, elastic_xs) + self.reactions[2] = elastic_scatter + + # Create all other reactions with MT values + mts = np.asarray(self._xss[self._jxs[3]:self._jxs[3] + n_reactions], dtype=int) + qvalues = np.asarray(self._xss[self._jxs[4]:self._jxs[4] + + n_reactions], dtype=float) + tys = np.asarray(self._xss[self._jxs[5]:self._jxs[5] + n_reactions], dtype=int) + + # Create all reactions other than elastic scatter + reactions = [(mt, Reaction(mt, self)) for mt in mts] + self.reactions.update(reactions) + + # Loop over all reactions other than elastic scattering + for i, rx in enumerate(list(self.reactions.values())[1:]): + # Copy Q values determine if scattering should be treated in the + # center-of-mass or lab system + rx.Q_value = qvalues[i] + rx.center_of_mass = (tys[i] < 0) + + # For neutron-producing reactions, get yield + if rx.MT < 100: + if tys[i] != 19: + if abs(tys[i]) > 100: + # Energy-dependent neutron yield + idx = self._jxs[11] + abs(tys[i]) - 101 + yield_ = _get_tabulated_1d(self._xss, idx) + else: + yield_ = abs(tys[i]) + + neutron = Product('neutron') + neutron.yield_ = yield_ + rx.products.append(neutron) + + # Get locator for cross-section data + loc = int(self._xss[self._jxs[6] + i]) + + # Determine starting index on energy grid + rx.threshold_idx = int(self._xss[self._jxs[7] + loc - 1]) - 1 + + # Determine number of energies in reaction + n_energies = int(self._xss[self._jxs[7] + loc]) + energy = self.energy[rx.threshold_idx:rx.threshold_idx + n_energies] + + # Read reaction cross section + xs = self._xss[self._jxs[7] + loc + 1:self._jxs[7] + loc + 1 + n_energies] + rx.xs = Tabulated1D(energy, xs) + + def _read_nu(self): + """Read the NU block -- this contains information on the prompt and delayed + neutron precursor yields, decay constants, etc + + """ + # No NU block + if self._jxs[2] == 0: + return + + products = [] + derived_products = [] + + # Either prompt nu or total nu is given + if self._xss[self._jxs[2]] > 0: + whichnu = 'prompt' if self._jxs[24] > 0 else 'total' + + neutron = Product('neutron') + neutron.emission_mode = whichnu + + idx = self._jxs[2] + LNU = int(self._xss[idx]) + if LNU == 1: + # Polynomial function form of nu + NC = int(self._xss[idx+1]) + coefficients = self._xss[idx+2 : idx+2+NC] + neutron.yield_ = Polynomial(coefficients) + elif LNU == 2: + # Tabular data form of nu + neutron.yield_ = _get_tabulated_1d(self._xss, idx + 1) + + products.append(neutron) + + # Both prompt nu and total nu + elif self._xss[self._jxs[2]] < 0: + # Read prompt neutron yield + prompt_neutron = Product('neutron') + prompt_neutron.emission_mode = 'prompt' + + idx = self._jxs[2] + 1 + LNU = int(self._xss[idx]) + if LNU == 1: + # Polynomial function form of nu + NC = int(self._xss[idx+1]) + coefficients = self._xss[idx+2 : idx+2+NC] + prompt_neutron.yield_ = Polynomial(coefficients) + elif LNU == 2: + # Tabular data form of nu + prompt_neutron.yield_ = _get_tabulated_1d(self._xss, idx + 1) + + # Read total neutron yield + total_neutron = Product('neutron') + total_neutron.emission_mode = 'total' + + idx = self._jxs[2] + int(abs(self._xss[self._jxs[2]])) + 1 + LNU = int(self._xss[idx]) + + if LNU == 1: + # Polynomial function form of nu + NC = int(self._xss[idx+1]) + coefficients = self._xss[idx+2 : idx+2+NC] + total_neutron.yield_ = Polynomial(coefficients) + elif LNU == 2: + # Tabular data form of nu + total_neutron.yield_ = _get_tabulated_1d(self._xss, idx + 1) + + products.append(prompt_neutron) + derived_products.append(total_neutron) + + # Check for delayed nu data + if self._jxs[24] > 0: + yield_delayed = _get_tabulated_1d(self._xss, self._jxs[24] + 1) + + # Delayed neutron precursor distribution + idx = self._jxs[25] + n_group = self._nxs[8] + total_group_probability = 0. + for i, group in enumerate(range(n_group)): + delayed_neutron = Product('neutron') + delayed_neutron.emission_mode = 'delayed' + delayed_neutron.decay_rate = self._xss[idx] + + group_probability = _get_tabulated_1d(self._xss, idx + 1) + if np.all(group_probability.y == group_probability.y[0]): + delayed_neutron.yield_ = deepcopy(yield_delayed) + delayed_neutron.yield_.y *= group_probability.y[0] + total_group_probability += group_probability.y[0] + else: + raise NotImplementedError( + 'Delayed neutron with energy-dependent ' + 'group probability') + + # Advance position + nr = int(self._xss[idx + 1]) + ne = int(self._xss[idx + 2 + 2*nr]) + idx += 3 + 2*nr + 2*ne + + # Energy distribution for delayed fission neutrons + location_start = int(self._xss[self._jxs[26] + group]) + delayed_neutron.distribution.append( + self._get_energy_distribution(self._jxs[27], location_start)) + + products.append(delayed_neutron) + + # Renormalize delayed neutron yields to reflect fact that in ACE + # file, the sum of the group probabilities is not exactly one + for product in products[1:]: + product.yield_.y /= total_group_probability + + # Copy fission neutrons to reactions + for MT, rx in self.reactions.items(): + if MT in (18, 19, 20, 21, 38): + rx.products = deepcopy(products) + if derived_products: + rx.derived_products = deepcopy(derived_products) + + def _get_angle_distribution(self, location_dist, location_start): + # Set starting index for angle distribution + idx = location_dist + location_start - 1 + + # Number of energies at which angular distributions are tabulated + n_energies = int(self._xss[idx]) + idx += 1 + + # Incoming energy grid + energy = self._xss[idx:idx + n_energies] + idx += n_energies + + # Read locations for angular distributions + lc = np.asarray(self._xss[idx:idx + n_energies], dtype=int) + idx += n_energies + + mu = [] + for i in range(n_energies): + if lc[i] > 0: + # Equiprobable 32 bin distribution + idx = location_dist + abs(lc[i]) - 1 + cos = self._xss[idx:idx + 33] + pdf = np.zeros(33) + pdf[:32] = 1.0/(32.0*np.diff(cos)) + cdf = np.linspace(0.0, 1.0, 33) + + mu_i = Tabular(cos, pdf, 'histogram', ignore_negative=True) + mu_i.c = cdf + elif lc[i] < 0: + # Tabular angular distribution + idx = location_dist + abs(lc[i]) - 1 + intt = int(self._xss[idx]) + n_points = int(self._xss[idx + 1]) + data = self._xss[idx + 2:idx + 2 + 3*n_points] + data.shape = (3, n_points) + + mu_i = Tabular(data[0], data[1], interpolation_scheme[intt]) + mu_i.c = data[2] + else: + # Isotropic angular distribution + mu_i = Uniform(-1., 1.) + + mu.append(mu_i) + + return AngleDistribution(energy, mu) + + def _read_secondaries(self): + """Read angle/energy distributions for each reaction MT + """ + + # Number of reactions with secondary neutrons (including elastic + # scattering) + n_reactions = self._nxs[5] + 1 + + for i, rx in enumerate(list(self.reactions.values())[:n_reactions]): + if rx.MT == 18: + for p in rx.products: + if p.emission_mode == 'prompt': + neutron = p + break + else: + neutron = rx.products[0] + + if i > 0: + # Determine locator for ith energy distribution + lnw = int(self._xss[self._jxs[10] + i - 1]) + + while lnw > 0: + # Applicability of this distribution + neutron.applicability.append(_get_tabulated_1d( + self._xss, self._jxs[11] + lnw + 2)) + + # Read energy distribution data + neutron.distribution.append(self._get_energy_distribution( + self._jxs[11], lnw, rx)) + + lnw = int(self._xss[self._jxs[11] + lnw - 1]) + else: + # No energy distribution for elastic scattering + neutron.distribution.append(UncorrelatedAngleEnergy()) + + # Check if angular distribution data exist + loc = int(self._xss[self._jxs[8] + i]) + if loc == -1: + # Angular distribution data are given as part of product + # angle-energy distribution + continue + elif loc == 0: + # No angular distribution data are given for this + # reaction, isotropic scattering is asssumed + angle_dist = None + else: + angle_dist = self._get_angle_distribution(self._jxs[9], loc) + + # Apply angular distribution to each uncorrelated angle-energy + # distribution + if angle_dist is not None: + for d in neutron.distribution: + d.angle = angle_dist + + def _read_photon_production_data(self): + """Read cross sections for each photon-production reaction""" + + n_photon_reactions = self._nxs[6] + photon_mts = np.asarray(self._xss[self._jxs[13]:self._jxs[13] + + n_photon_reactions], dtype=int) + + for i, rx in enumerate(photon_mts): + # Determine corresponding reaction + mt = photon_mts[i] // 1000 + reactions = [] + if mt not in self.reactions: + # If the photon is assigned to MT=18 but the file splits fission + # into MT=19,20,21,38, assign the photon product to each of the + # individual reactions + if mt == 18: + for mt_fiss in (19, 20, 21, 38): + if mt_fiss in self.reactions: + reactions.append(self.reactions[mt_fiss]) + if not reactions: + reactions.append(Reaction(mt, self)) + else: + reactions.append(self.reactions[mt]) + + # Create photon product and assign to reactions + photon = Product('photon') + for rx in reactions: + rx.products.append(photon) + + # ================================================================== + # Read photon yield / production cross section + + loca = int(self._xss[self._jxs[14] + i]) + idx = self._jxs[15] + loca - 1 + mftype = int(self._xss[idx]) + idx += 1 + + if mftype in (12, 16): + # Yield data taken from ENDF File 12 or 6 + mtmult = int(self._xss[idx]) + assert mtmult == mt + + # Read photon yield as function of energy + photon.yield_ = _get_tabulated_1d(self._xss, idx + 1) + + elif mftype == 13: + # Cross section data from ENDF File 13 + + # Energy grid index at which data starts + threshold_idx = int(self._xss[idx]) - 1 + + # Get photon production cross section + n_energy = int(self._xss[idx + 1]) + photon._xs = self._xss[idx + 2:idx + 2 + n_energy] + + # Determine yield based on ratio of cross sections + energy = self.energy[threshold_idx:threshold_idx + n_energy] + photon.yield_ = Tabulated1D(energy, photon._xs) + + else: + raise ValueError("MFTYPE must be 12, 13, 16. Got {0}".format( + mftype)) + + # ================================================================== + # Read photon energy distribution + + location_start = int(self._xss[self._jxs[18] + i]) + + # Read energy distribution data + distribution = self._get_energy_distribution( + self._jxs[19], location_start) + assert isinstance(distribution, UncorrelatedAngleEnergy) + + # ================================================================== + # Read photon angular distribution + loc = int(self._xss[self._jxs[16] + i]) + + if loc == 0: + # No angular distribution data are given for this reaction, + # isotropic scattering is asssumed in LAB + energy = np.array([photon.yield_.x[0], photon.yield_.x[-1]]) + mu_isotropic = Uniform(-1., 1.) + distribution.angle = AngleDistribution( + energy, [mu_isotropic, mu_isotropic]) + else: + distribution.angle = self._get_angle_distribution(self._jxs[17], loc) + + # Add to list of distributions + photon.distribution.append(distribution) + + def _read_unr(self): + """Read the unresolved resonance range probability tables if present. + """ + + # Check if URR probability tables are present + idx = self._jxs[23] + if idx == 0: + return + + N = int(self._xss[idx]) # Number of incident energies + M = int(self._xss[idx+1]) # Length of probability table + interpolation = int(self._xss[idx+2]) + inelastic_flag = int(self._xss[idx+3]) + absorption_flag = int(self._xss[idx+4]) + multiply_smooth = (int(self._xss[idx+5]) == 1) + idx += 6 + + # Get energies at which tables exist + energy = self._xss[idx : idx+N] + idx += N + + # Get probability tables + table = self._xss[idx:idx+N*6*M] + table.shape = (N, 6, M) + + # Create object + self.urr = ProbabilityTables(energy, table, interpolation, inelastic_flag, + absorption_flag, multiply_smooth) + + def export_to_hdf5(self, path, element=None, mass_number=None, metastable=0): + """Export table to an HDF5 file. + + Parameters + ---------- + path : str + Path to write HDF5 file to + element : str or None + Elemental symbol, e.g. Zr. If not specified, the atomic + number/symbol are inferred from the name of the table. + mass_number : int or None + Mass number of the nuclide. For natural elements, a value of zero + should be given. If not specified, the mass number is inferred from + the name of the table. + metastable : int + Metastable level of the nuclide. Defaults to 0. + + """ + + f = h5py.File(path, 'a') + + # If element and/or mass number haven't been specified, make an educated + # guess + zaid, xs = self.name.split('.') + if element is None: + Z = int(zaid) // 1000 + element = atomic_symbol[Z] + else: + Z = atomic_number[element] + if mass_number is None: + mass_number = int(zaid) % 1000 + + # Write basic data + if metastable > 0: + name = '{}{}_m{}.{}'.format(element, mass_number, metastable, xs) + else: + name = '{}{}.{}'.format(element, mass_number, xs) + g = f.create_group(name) + g.attrs['Z'] = Z + g.attrs['A'] = mass_number + g.attrs['metastable'] = metastable + g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio + g.attrs['temperature'] = self.temperature + g.attrs['n_reaction'] = len(self.reactions) + + # Write energy grid + g.create_dataset('energy', data=self.energy) + + # Write reaction data + for i, rx in enumerate(self.reactions.values()): + rx_group = g.create_group('reaction_{}'.format(i)) + rx.to_hdf5(rx_group) + + # Write total nu data if available + if hasattr(rx, 'derived_products') and 'total_nu' not in g: + tgroup = g.create_group('total_nu') + rx.derived_products[0].to_hdf5(tgroup) + + # Write unresolved resonance probability tables + if self.urr is not None: + urr_group = g.create_group('urr') + self.urr.to_hdf5(urr_group) + + f.close() + + @classmethod + def from_hdf5(self, group): + """Generate continuous-energy neutron interaction data from HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group containing interaction data + + Returns + ------- + openmc.data.ace.NeutronTable + Continuous-energy neutron interaction data + + """ + name = group.name[1:] + atomic_weight_ratio = group.attrs['atomic_weight_ratio'] + temperature = group.attrs['temperature'] + table = NeutronTable(name, atomic_weight_ratio, temperature) + + # Read energy grid + table.energy = group['energy'].value + + # Read reaction data + n_reaction = group.attrs['n_reaction'] + + # Write reaction data + for i in range(n_reaction): + rx_group = group['reaction_{}'.format(i)] + rx = Reaction.from_hdf5(rx_group, table) + table.reactions[rx.MT] = rx + + # Read total nu data if available + if 'total_nu' in rx_group: + tgroup = rx_group['total_nu'] + rx.derived_products = [Product.from_hdf5(tgroup)] + + # Read unresolved resonance probability tables + if 'urr' in group: + urr_group = group['urr'] + table.urr = ProbabilityTables.from_hdf5(urr_group) + + return table + + +class SabTable(Table): + """A SabTable object contains thermal scattering data as represented by + an S(alpha, beta) table. + + Parameters + ---------- + name : str + ZAID identifier of the table, e.g. lwtr.10t. + atomic_weight_ratio : float + Atomic mass ratio of the target nuclide. + temperature : float + Temperature of the target nuclide in eV. + + Attributes + ---------- + atomic_weight_ratio : float + Atomic mass ratio of the target nuclide. + elastic_xs : openmc.data.Tabulated1D or openmc.data.CoherentElastic + Elastic scattering cross section derived in the coherent or incoherent + approximation + inelastic_xs : openmc.data.Tabulated1D + Inelastic scattering cross section derived in the incoherent + approximation + name : str + ZAID identifier of the table, e.g. 92235.70c. + temperature : float + Temperature of the target nuclide in eV. + + """ + + def __init__(self, name, atomic_weight_ratio, temperature): + super(SabTable, self).__init__(name, atomic_weight_ratio, temperature) + self.elastic_xs = None + self.elastic_mu_out = None + + self.inelastic_xs = None + self.inelastic_e_out = None + self.inelastic_mu_out = None + self.secondary_mode = None + + def __repr__(self): + if hasattr(self, 'name'): + return "".format(self.name) + else: + return "" + + def _read_all(self): + self._read_itie() + self._read_itce() + self._read_itxe() + self._read_itca() + + def _read_itie(self): + """Read energy-dependent inelastic scattering cross sections. + """ + idx = self._jxs[1] + n_energies = int(self._xss[idx]) + energy = self._xss[idx+1 : idx+1+n_energies] + xs = self._xss[idx+1+n_energies : idx+1+2*n_energies] + self.inelastic_xs = Tabulated1D(energy, xs) + + def _read_itce(self): + """Read energy-dependent elastic scattering cross sections. + """ + # Determine if ITCE block exists + idx = self._jxs[4] + if idx == 0: + return + + # Read values + n_energies = int(self._xss[idx]) + energy = self._xss[idx+1 : idx+1+n_energies] + P = self._xss[idx+1+n_energies : idx+1+2*n_energies] + + if self._nxs[5] == 4: + self.elastic_xs = CoherentElastic(energy, P) + else: + self.elastic_xs = Tabulated1D(energy, P) + + def _read_itxe(self): + """Read coupled energy/angle distributions for inelastic scattering. + """ + # Determine number of energies and angles + NE_in = len(self.inelastic_xs) + NE_out = self._nxs[4] + + if self._nxs[7] == 0: + self.secondary_mode = 'equal' + elif self._nxs[7] == 1: + self.secondary_mode = 'skewed' + elif self._nxs[7] == 2: + self.secondary_mode = 'continuous' + + if self.secondary_mode in ('equal', 'skewed'): + NMU = self._nxs[3] + idx = self._jxs[3] + self.inelastic_e_out = self._xss[idx:idx+NE_in*NE_out*(NMU+2):NMU+2] + self.inelastic_e_out.shape = (NE_in, NE_out) + + self.inelastic_mu_out = self._xss[idx:idx+NE_in*NE_out*(NMU+2)] + self.inelastic_mu_out.shape = (NE_in, NE_out, NMU+2) + self.inelastic_mu_out = self.inelastic_mu_out[:, :, 1:] + else: + NMU = self._nxs[3] - 1 + idx = self._jxs[3] + locc = self._xss[idx:idx + NE_in].astype(int) + NE_out = self._xss[idx + NE_in:idx + 2*NE_in].astype(int) + energy_out = [] + mu_out = [] + for i in range(NE_in): + idx = locc[i] + + # Outgoing energy distribution for incoming energy i + e = self._xss[idx + 1:idx + 1 + NE_out[i]*(NMU + 3):NMU + 3] + p = self._xss[idx + 2:idx + 2 + NE_out[i]*(NMU + 3):NMU + 3] + c = self._xss[idx + 3:idx + 3 + NE_out[i]*(NMU + 3):NMU + 3] + eout_i = Tabular(e, p, 'linear-linear', ignore_negative=True) + eout_i.c = c + + # Outgoing angle distribution for each (incoming, outgoing) energy pair + mu_i = [] + for j in range(NE_out[i]): + mu = self._xss[idx + 4:idx + 4 + NMU] + p_mu = 1./NMU*np.ones(NMU) + mu_ij = Discrete(mu, p_mu) + mu_ij.c = np.cumsum(p_mu) + mu_i.append(mu_ij) + idx += 3 + NMU + + energy_out.append(eout_i) + mu_out.append(mu_i) + + # Create correlated angle-energy distribution + breakpoints = [NE_in] + interpolation = [2] + energy = self.inelastic_xs.x + self.inelastic_dist = CorrelatedAngleEnergy( + breakpoints, interpolation, energy, energy_out, mu_out) + + def _read_itca(self): + """Read angular distributions for elastic scattering. + """ + NMU = self._nxs[6] + if self._jxs[4] == 0 or NMU == -1: + return + idx = self._jxs[6] + + NE = len(self.elastic_xs) + self.elastic_mu_out = self._xss[idx:idx+NE*NMU] + self.elastic_mu_out.shape = (NE, NMU) + + def export_to_hdf5(self, path, name): + """Export table to an HDF5 file. + + Parameters + ---------- + path : str + Path to write HDF5 file to + name : str + Name of compound (used as first group in HDF5 file) + + """ + + f = h5py.File(path, 'a') + + # Write basic data + g = f.create_group('{}.{}'.format(name, self.name.split('.')[1])) + g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio + g.attrs['temperature'] = self.temperature + g.attrs['zaids'] = self.zaids + + # Write thermal elastic scattering + if self.elastic_xs is not None: + elastic_group = g.create_group('elastic') + self.elastic_xs.to_hdf5(elastic_group, 'xs') + if self.elastic_mu_out is not None: + elastic_group.create_dataset('mu_out', data=self.elastic_mu_out) + + # Write thermal inelastic scattering + if self.inelastic_xs is not None: + inelastic_group = g.create_group('inelastic') + self.inelastic_xs.to_hdf5(inelastic_group, 'xs') + inelastic_group.attrs['secondary_mode'] = np.string_(self.secondary_mode) + if self.secondary_mode in ('equal', 'skewed'): + inelastic_group.create_dataset('energy_out', data=self.inelastic_e_out) + inelastic_group.create_dataset('mu_out', data=self.inelastic_mu_out) + elif self.secondary_mode == 'continuous': + self.inelastic_dist.to_hdf5(inelastic_group) + + @classmethod + def from_hdf5(self, group): + """Generate thermal scattering data from HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.SabTable + Neutron thermal scattering data + + """ + name = group.name[1:] + atomic_weight_ratio = group.attrs['atomic_weight_ratio'] + temperature = group.attrs['temperature'] + table = SabTable(name, atomic_weight_ratio, temperature) + table.zaids = group.attrs['zaids'] + + # Read thermal elastic scattering + if 'elastic' in group: + elastic_group = group['elastic'] + + # Cross section + elastic_xs_type = elastic_group['xs'].attrs['type'].decode() + if elastic_xs_type == 'tab1': + table.elastic_xs = Tabulated1D.from_hdf5(elastic_group['xs']) + elif elastic_xs_type == 'bragg': + table.elastic_xs = CoherentElastic.from_hdf5(elastic_group['xs']) + + # Angular distribution + if 'mu_out' in elastic_group: + table.elastic_mu_out = elastic_group['mu_out'].value + + # Read thermal inelastic scattering + if 'inelastic' in group: + inelastic_group = group['inelastic'] + table.secondary_mode = inelastic_group.attrs['secondary_mode'].decode() + table.inelastic_xs = Tabulated1D.from_hdf5(inelastic_group['xs']) + if table.secondary_mode in ('equal', 'skewed'): + table.inelastic_e_out = inelastic_group['energy_out'] + table.inelastic_mu_out = inelastic_group['mu_out'] + elif table.secondary_mode == 'continuous': + table.inelastic_dist = AngleEnergy.from_hdf5(inelastic_group) + + return table + + +class Reaction(object): + """Reaction(MT, table=None) + + A Reaction object represents a single reaction channel for a nuclide with + an associated cross section and, if present, a secondary angle and energy + distribution. These objects are stored within the ``reactions`` attribute on + subclasses of Table, e.g. NeutronTable. + + Parameters + ---------- + MT : int + The ENDF MT number for this reaction. On occasion, MCNP uses MT numbers + that don't correspond exactly to the ENDF specification. + table : openmc.data.ace.Table + The ACE table which contains this reaction. This is useful if data on + the parent nuclide is needed (for instance, the energy grid at which + cross sections are tabulated) + + Attributes + ---------- + center_of_mass : bool + Indicates whether scattering kinematics should be performed in the + center-of-mass or laboratory reference frame. + grid above the threshold value in barns. + MT : int + The ENDF MT number for this reaction. + Q_value : float + The Q-value of this reaction in MeV. + table : openmc.data.ace.Table + The ACE table which contains this reaction. + threshold : float + Threshold of the reaction in MeV + threshold_idx : int + The index on the energy grid corresponding to the threshold of this + reaction. + xs : openmc.data.Tabulated1D + Microscopic cross section for this reaction as a function of incident + energy + products : Iterable of openmc.data.Product + Reaction products + + """ + + def __init__(self, MT, table=None): + self.center_of_mass = True + self.table = table + self.MT = MT + self.Q_value = 0. + self.threshold_idx = 0 + self._xs = None + self.products = [] + + def __repr__(self): + if self.MT in reaction_name: + return "".format(self.MT, reaction_name[self.MT]) + else: + return "".format(self.MT) + + @property + def center_of_mass(self): + return self._center_of_mass + + @property + def products(self): + return self._products + + @property + def threshold(self): + return self.xs.x[0] + + @property + def xs(self): + return self._xs + + @center_of_mass.setter + def center_of_mass(self, center_of_mass): + cv.check_type('center of mass', center_of_mass, (bool, np.bool_)) + self._center_of_mass = center_of_mass + + @products.setter + def products(self, products): + cv.check_type('reaction products', products, Iterable, Product) + self._products = products + + @xs.setter + def xs(self, xs): + cv.check_type('reaction cross section', xs, Tabulated1D) + for y in xs.y: + cv.check_greater_than('reaction cross section', y, 0.0, True) + self._xs = xs + + def to_hdf5(self, group): + """Write reaction to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + + group.attrs['MT'] = self.MT + if self.MT in reaction_name: + group.attrs['label'] = np.string_(reaction_name[self.MT]) + else: + group.attrs['label'] = np.string_(self.MT) + group.attrs['Q_value'] = self.Q_value + group.attrs['threshold_idx'] = self.threshold_idx + 1 + group.attrs['center_of_mass'] = 1 if self.center_of_mass else 0 + group.attrs['n_product'] = len(self.products) + if self.xs is not None: + group.create_dataset('xs', data=self.xs.y) + for i, p in enumerate(self.products): + pgroup = group.create_group('product_{}'.format(i)) + p.to_hdf5(pgroup) + + @classmethod + def from_hdf5(cls, group, table): + """Generate reaction from an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + Returns + ------- + openmc.data.ace.Reaction + Reaction data + + """ + MT = group.attrs['MT'] + rxn = cls(MT) + rxn.table = table + rxn.Q_value = group.attrs['Q_value'] + rxn.threshold_idx = group.attrs['threshold_idx'] - 1 + rxn.center_of_mass = bool(group.attrs['center_of_mass']) + + # Read cross section + if 'xs' in group: + xs = group['xs'].value + rxn.xs = Tabulated1D(table.energy, xs) + + # Read reaction products + n_product = group.attrs['n_product'] + products = [] + for i in range(n_product): + pgroup = group['product_{}'.format(i)] + products.append(Product.from_hdf5(pgroup)) + rxn.products = products + + return rxn + + +class DosimetryTable(Table): + def __init__(self, name, atomic_weight_ratio, temperature): + super(DosimetryTable, self).__init__( + name, atomic_weight_ratio, temperature) + + def __repr__(self): + if hasattr(self, 'name'): + return "".format(self.name) + else: + return "" + + +class NeutronDiscreteTable(Table): + + def __init__(self, name, atomic_weight_ratio, temperature): + super(NeutronDiscreteTable, self).__init__( + name, atomic_weight_ratio, temperature) + + def __repr__(self): + if hasattr(self, 'name'): + return "".format(self.name) + else: + return "" + + +class NeutronMGTable(Table): + + def __init__(self, name, atomic_weight_ratio, temperature): + super(NeutronMGTable, self).__init__( + name, atomic_weight_ratio, temperature) + + def __repr__(self): + if hasattr(self, 'name'): + return "".format(self.name) + else: + return "" + + +class PhotoatomicTable(Table): + + def __init__(self, name, atomic_weight_ratio, temperature): + super(PhotoatomicTable, self).__init__( + name, atomic_weight_ratio, temperature) + + def __repr__(self): + if hasattr(self, 'name'): + return "".format(self.name) + else: + return "" + + def _read_all(self): + self._read_eszg() + self._read_jinc() + self._read_jcoh() + self._read_heating() + self._read_compton_data() + + def _read_eszg(self): + # Determine number of energies on common energy grid + n_energies = self._nxs[3] + + # Read cross sections + idx = self._jxs[1] + data = np.asarray(self._xss[idx:idx + 5*n_energies]) + data.shape = (5, n_energies) + self.energy = data[0] + self.incoherent = data[1] + self.coherent = data[2] + self.photoelectric = data[3] + self.pairproduction = data[4] + + def _read_jinc(self): + # Read incoherent scattering function + idx = self._jxs[2] + self.incoherent_scattering = self._xss[idx:idx + 21] + + def _read_jcoh(self): + # Read coherent form factors and integrated coherent form factors + idx = self._jxs[3] + self.int_coherent_form_factors = self._xss[idx:idx + 55] + self.coherent_form_factors = self._xss[idx + 55:idx + 2*55] + + def _read_jflo(self): + raise NotImplementedError + + def _read_heating(self): + idx = self._jxs[5] + self.avg_heating = self._xss[idx:idx + self._nxs[3]] + + def _read_compton_data(self): + # Determine number of Compton profiles + n_shells = self._nxs[5] + + if n_shells > 0: + # Number of electrons per shell + idx = self._jxs[6] + self.electrons_per_shell = np.asarray( + self._xss[idx:idx + n_shells], dtype=int) + + # Binding energy per shell + idx = self._jxs[7] + self.binding_energy_per_shell = self._xss[idx:idx + n_shells] + + # Probability of interaction per shell + idx = self._jxs[8] + self.probability_per_shell = self._xss[idx:idx + n_shells] + + # Initialize arrays for Compton profile data + self.compton_profile_interp = np.zeros(n_shells) + self.compton_profile_momentum = [] + self.compton_profile_pdf = [] + self.compton_profile_cdf = [] + + for i in range(n_shells): + # Get locator for SWD block + loca = int(self._xss[self._jxs[9] + i]) + idx = self._jxs[10] + loca - 1 + + # Get interpolation parameter and number of momentum entries + self.compton_profile_interp[i] = int(self._xss[idx]) + n_momentum = int(self._xss[idx + 1]) + idx += 2 + + # Get momentum entries, PDF, and CDF + data = self._xss[idx:idx + 3*n_momentum] + data.shape = (3, n_momentum) + self.compton_profile_momentum.append(data[0]) + self.compton_profile_pdf.append(data[1]) + self.compton_profile_cdf.append(data[2]) + + +class PhotoatomicMGTable(Table): + + def __init__(self, name, atomic_weight_ratio, temperature): + super(PhotoatomicMGTable, self).__init__( + name, atomic_weight_ratio, temperature) + + def __repr__(self): + if hasattr(self, 'name'): + return "".format(self.name) + else: + return "" + + +class ElectronTable(Table): + + def __init__(self, name, atomic_weight_ratio, temperature): + super(ElectronTable, self).__init__( + name, atomic_weight_ratio, temperature) + + def __repr__(self): + if hasattr(self, 'name'): + return "".format(self.name) + else: + return "" + + +class PhotonuclearTable(Table): + + def __init__(self, name, atomic_weight_ratio, temperature): + super(PhotonuclearTable, self).__init__( + name, atomic_weight_ratio, temperature) + self.reactions = OrderedDict() + + def __repr__(self): + if hasattr(self, 'name'): + return "".format(self.name) + else: + return "" + + def _read_all(self): + self._read_basic() + self._read_cross_sections() + self._read_secondaries() + self._read_angular_distributions() + self._read_energy_distributions() + + def _read_basic(self): + n_energies = self._nxs[3] + + # Read energy mesh + idx = self._jxs[1] + self.energy = self._xss[idx:idx + n_energies] + + # Read total cross section + idx = self._jxs[2] + self.total_xs = self._xss[idx:idx + n_energies] + + # Read non-elastic and elastic cross section + if self._jxs[4] > 0: + idx = self._jxs[3] + self.non_elastic_xs = self._xss[idx:idx + n_energies] + idx = self._jxs[4] + self.elastic_xs = self._xss[idx:idx + n_energies] + else: + self.non_elastic_xs = self.total_xs.copy() + self.elastic_xs = np.zeros(n_energies) + + # Read heating numbers + idx = self._jxs[5] + if idx > 0: + self.heating_number = self._xss[idx:idx + n_energies] + else: + self.heating_number = np.zeros(n_energies) + + def _read_cross_sections(self): + # Determine number of reactions + n_reactions = self._nxs[4] + + # Read list of MT numbers and Q values + mts = np.asarray(self._xss[self._jxs[6]:self._jxs[6] + + n_reactions], dtype=int) + qvalues = np.asarray(self._xss[self._jxs[7]:self._jxs[7] + + n_reactions]) + + # Create reactions in dictionary + reactions = [(mt, Reaction(mt, self)) for mt in mts] + self.reactions.update(reactions) + + for i, rx in enumerate(self.reactions.values()): + # Copy Q values + rx.Q_value = qvalues[i] + + # Determine starting index on energy grid and number of energies + idx = self._jxs[9] + int(self._xss[self._jxs[8] + i]) - 1 + rx.threshold_idx = int(self._xss[idx]) + n_energies = int(self._xss[idx + 1]) + energy = self.energy[rx.threshold_idx:rx.threshold_idx + n_energies] + idx += 2 + + # Read reaction cross setion + xs = self._xss[idx:idx + n_energies] + rx.xs = Tabulated1D(energy, xs, [], []) + + def _read_secondaries(self): + names = {1: 'neutron', 2: 'photon', 3: 'electron', + 9: 'proton', 31: 'deuteron', 32: 'triton', + 33: 'helium3', 34: 'alpha'} + + n_particles = self._nxs[5] + n_entries = self._nxs[7] + + idx = self._jxs[10] + ixs = np.asarray(self._xss[idx:idx + n_particles*n_entries], dtype=int) + ixs.shape = (n_particles, n_entries) + self.ixs = ixs.transpose() + + self.particles = [] + + for j in range(n_particles): + # Create dictionary for particle + particle = {} + self.particles.append(particle) + + # Get secondary particle type/name + particle['ipt'] = self.ixs[0, j] + particle['name'] = names[particle['ipt']] + + # Number of reactions that produce secondary particle + n_producing = self.ixs[1, j] + + # Particle-production cross section + idx = self.ixs[2, j] + particle['ie_production'] = int(self._xss[idx]) + ne = int(self._xss[idx + 1]) + idx += 2 + particle['production'] = self._xss[idx:idx + ne] + + # Average heating numbers + idx = self.ixs[3, j] + particle['ie_heating'] = int(self._xss[idx]) + ne = int(self._xss[idx + 1]) + idx += 2 + particle['heating_number'] = self._xss[idx:idx + ne] + + # MTs of particle production reactions + idx = self.ixs[4, j] + particle['mt_producing'] = np.asarray( + self._xss[idx:idx + n_producing], dtype=int) + + # Coordinate system of reaction producing secondary particle + idx = self.ixs[5, j] + particle['center_of_mass'] = [i < 0 for i in + self._xss[idx:idx + n_producing]] + + # Reaction yields + particle['yield'] = {} + for k in range(n_producing): + # Create dictionary for yield data + yieldData = {} + + # Read reaction yield data for a single MT + idx = self.ixs[7, j] + int(self._xss[self.ixs[6, j] + k]) - 1 + + yieldData['mftype'] = int(self._xss[idx]) + idx += 1 + + if yieldData['mftype'] in (6, 12, 16): + # Yield data from ENDF File 6 or 12 + mtmult = int(self._xss[idx]) + assert mtmult == particle['mt_producing'][k] + + # Read yield as function of energy + yieldData['multiplicity'] = _get_tabulated_1d( + self._xss, idx + 1) + + elif yieldData['mftype'] == 13: + # Production cross section for corresponding MT + yieldData['ie'] = int(self._xss[idx]) + ne = int(self._xss[idx + 1]) + idx += 2 + yieldData['cross_section'] = self._xss[idx:idx + ne] + + # Add reaction yield data to dictionary + mt = particle['mt_producing'][k] + particle['yield'][mt] = yieldData + + def _read_angular_distributions(self): + for j, particle in enumerate(self.particles): + # Create dictionary for angular distributions + angular_dists = {} + particle['angular_distribution'] = angular_dists + + for k, mt in enumerate(particle['mt_producing']): + landp = int(self._xss[self.ixs[8, j] + k]) + + # check if angular distribution data exists + if landp == -1: + # Angular distribution data are specified through the + # DLWP block + continue + elif landp == 0: + # No angular distribution data are given for this + # reaction, isotropic scattering is assumed + ie = self.reactions[mt].threshold_idx + ne = len(self.reactions[mt].sigma) + angular_dists[mt] = AngularDistribution.isotropic( + np.array([self.energy[ie], self.energy[ie + ne - 1]])) + continue + + idx = self.ixs[9, j] + landp - 1 + + angular_dists[mt] = AngularDistribution() + angular_dists[mt].read(self._xss, idx, self.ixs[9, j]) + + def _read_energy_distributions(self): + for j, particle in enumerate(self.particles): + # Create dictionary for energy distributions + energy_dists = {} + particle['energy_distribution'] = energy_dists + + for k, mt in enumerate(particle['mt_producing']): + # Determine locator for kth energy distribution + ldlwp = int(self._xss[self.ixs[10, j] + k]) + + # Read energy distribution data + energy_dists[mt] = self._get_energy_distribution( + self.ixs[11, j], ldlwp) +table_types = { + "c": NeutronTable, + "t": SabTable, + "y": DosimetryTable, + "d": NeutronDiscreteTable, + "p": PhotoatomicTable, + "m": NeutronMGTable, + "g": PhotoatomicMGTable, + "e": ElectronTable, + "u": PhotonuclearTable} diff --git a/openmc/data/angle_distribution.py b/openmc/data/angle_distribution.py new file mode 100644 index 000000000..5f19450bc --- /dev/null +++ b/openmc/data/angle_distribution.py @@ -0,0 +1,134 @@ +from collections import Iterable +from numbers import Real + +import numpy as np + +import openmc.checkvalue as cv +from openmc.stats import Univariate, Tabular +from .container import interpolation_scheme + + +class AngleDistribution(object): + """Angle distribution as a function of incoming energy + + Parameters + ---------- + energy : Iterable of float + Incoming energies at which distributions exist + mu : Iterable of openmc.stats.Univariate + Distribution of scattering cosines corresponding to each incoming energy + + Attributes + ---------- + energy : Iterable of float + Incoming energies at which distributions exist + mu : Iterable of openmc.stats.Univariate + Distribution of scattering cosines corresponding to each incoming energy + + """ + + def __init__(self, energy, mu): + super(AngleDistribution, self).__init__() + self.energy = energy + self.mu = mu + + @property + def energy(self): + return self._energy + + @property + def mu(self): + return self._mu + + @energy.setter + def energy(self, energy): + cv.check_type('angle distribution incoming energy', energy, + Iterable, Real) + self._energy = energy + + @mu.setter + def mu(self, mu): + cv.check_type('angle distribution scattering cosines', mu, + Iterable, Univariate) + self._mu = mu + + def to_hdf5(self, group): + """Write angle distribution to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + + dset = group.create_dataset('energy', data=self.energy) + + # Make sure all data is tabular + mu_tabular = [mu_i if isinstance(mu_i, Tabular) else + mu_i.to_tabular() for mu_i in self.mu] + + # Determine total number of (mu,p) pairs and create array + n_pairs = sum([len(mu_i.x) for mu_i in mu_tabular]) + pairs = np.empty((3, n_pairs)) + + # Create array for offsets + offsets = np.empty(len(mu_tabular), dtype=int) + interpolation = np.empty(len(mu_tabular), dtype=int) + j = 0 + + # Populate offsets and pairs array + for i, mu_i in enumerate(mu_tabular): + n = len(mu_i.x) + offsets[i] = j + interpolation[i] = 1 if mu_i.interpolation == 'histogram' else 2 + pairs[0, j:j+n] = mu_i.x + pairs[1, j:j+n] = mu_i.p + pairs[2, j:j+n] = mu_i.c + j += n + + # Create dataset for distributions + dset = group.create_dataset('mu', data=pairs) + + # Write interpolation as attribute + dset.attrs['offsets'] = offsets + dset.attrs['interpolation'] = interpolation + + @classmethod + def from_hdf5(cls, group): + """Generate angular distribution from HDF5 data + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.AngleDistribution + Angular distribution + + """ + energy = group['energy'].value + data = group['mu'] + offsets = data.attrs['offsets'] + interpolation = data.attrs['interpolation'] + + mu = [] + n_energy = len(energy) + for i in range(n_energy): + # Determine length of outgoing energy distribution and number of + # discrete lines + j = offsets[i] + if i < n_energy - 1: + n = offsets[i+1] - j + else: + n = data.shape[1] - j + + interp = interpolation_scheme[interpolation[i]] + mu_i = Tabular(data[0, j:j+n], data[1, j:j+n], interp) + mu_i.c = data[2, j:j+n] + + mu.append(mu_i) + + return cls(energy, mu) diff --git a/openmc/data/angle_energy.py b/openmc/data/angle_energy.py new file mode 100644 index 000000000..fc17d7bec --- /dev/null +++ b/openmc/data/angle_energy.py @@ -0,0 +1,40 @@ +from abc import ABCMeta, abstractmethod + +import numpy as np + +import openmc.data + + +class AngleEnergy(object): + """Distribution in angle and energy of a secondary particle.""" + + __metaclass = ABCMeta + + @abstractmethod + def to_hdf5(self, group): + pass + + @staticmethod + def from_hdf5(group): + """Generate angle-energy distribution from HDF5 data + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.AngleEnergy + Angle-energy distribution + + """ + dist_type = group.attrs['type'].decode() + if dist_type == 'uncorrelated': + return openmc.data.UncorrelatedAngleEnergy.from_hdf5(group) + elif dist_type == 'correlated': + return openmc.data.CorrelatedAngleEnergy.from_hdf5(group) + elif dist_type == 'kalbach-mann': + return openmc.data.KalbachMann.from_hdf5(group) + elif dist_type == 'nbody': + return openmc.data.NBodyPhaseSpace.from_hdf5(group) diff --git a/openmc/data/container.py b/openmc/data/container.py new file mode 100644 index 000000000..4bd293c36 --- /dev/null +++ b/openmc/data/container.py @@ -0,0 +1,269 @@ +from collections import Iterable +from numbers import Real, Integral + +import numpy as np + +import openmc.checkvalue as cv + +interpolation_scheme = {1: 'histogram', 2: 'linear-linear', 3: 'linear-log', + 4: 'log-linear', 5: 'log-log'} + + +class Tabulated1D(object): + """A one-dimensional tabulated function. + + This class mirrors the TAB1 type from the ENDF-6 format. A tabulated + function is specified by tabulated (x,y) pairs along with interpolation + rules that determine the values between tabulated pairs. + + Once an object has been created, it can be used as though it were an actual + function, e.g.: + + >>> f = Tabulated1D([0, 10], [4, 5]) + >>> [f(xi) for xi in numpy.linspace(0, 10, 5)] + [4.0, 4.25, 4.5, 4.75, 5.0] + + Parameters + ---------- + x : Iterable of float + Independent variable + y : Iterable of float + Dependent variable + breakpoints : Iterable of int + Breakpoints for interpolation regions + interpolation : Iterable of int + Interpolation scheme identification number, e.g., 3 means y is linear in + ln(x). + + Attributes + ---------- + x : Iterable of float + Independent variable + y : Iterable of float + Dependent variable + breakpoints : Iterable of int + Breakpoints for interpolation regions + interpolation : Iterable of int + Interpolation scheme identification number, e.g., 3 means y is linear in + ln(x). + n_regions : int + Number of interpolation regions + n_pairs : int + Number of tabulated (x,y) pairs + + """ + + def __init__(self, x, y, breakpoints=None, interpolation=None): + if breakpoints is None or interpolation is None: + # Single linear-linear interpolation region by default + self.breakpoints = np.array([len(x)]) + self.interpolation = np.array([2]) + else: + self.breakpoints = np.asarray(breakpoints, dtype=int) + self.interpolation = np.asarray(interpolation, dtype=int) + + self.x = np.asarray(x) + self.y = np.asarray(y) + + def __call__(self, x): + # Check if input is array or scalar + if isinstance(x, Iterable): + iterable = True + x = np.array(x) + else: + iterable = False + x = np.array([x], dtype=float) + + # Create output array + y = np.zeros_like(x) + + # Get indices for interpolation + idx = np.searchsorted(self.x, x, side='right') - 1 + + # Find lowest valid index + i_low = np.searchsorted(idx, 0) + + for k in range(len(self.breakpoints)): + # Determine which x values are within this interpolation range + i_high = np.searchsorted(idx, self.breakpoints[k] - 1) + + # Get x values and bounding (x,y) pairs + xk = x[i_low:i_high] + xi = self.x[idx[i_low:i_high]] + xi1 = self.x[idx[i_low:i_high] + 1] + yi = self.y[idx[i_low:i_high]] + yi1 = self.y[idx[i_low:i_high] + 1] + + if self.interpolation[k] == 1: + # Histogram + y[i_low:i_high] = yi + + elif self.interpolation[k] == 2: + # Linear-linear + y[i_low:i_high] = yi + (xk - xi)/(xi1 - xi)*(yi1 - yi) + + elif self.interpolation[k] == 3: + # Linear-log + y[i_low:i_high] = yi + np.log(xk/xi)/np.log(xi1/xi)*(yi1 - yi) + + elif self.interpolation[k] == 4: + # Log-linear + y[i_low:i_high] = yi*np.exp((xk - xi)/(xi1 - xi)*np.log(yi1/yi)) + + elif self.interpolation[k] == 5: + # Log-log + y[i_low:i_high] = yi*np.exp(np.log(xk/xi)/np.log(xi1/xi)*np.log(yi1/yi)) + + i_low = i_high + + # In some cases, the first/last point of x may be less than the first + # value of self.x due only to precision, so we check if they're close + # and set them equal if so. Otherwise, the interpolated value might be + # out of range (and thus zero) + if np.isclose(x[0], self.x[0], 1e-8): + y[0] = self.y[0] + if np.isclose(x[-1], self.x[-1], 1e-8): + y[-1] = self.y[-1] + + return y if iterable else y[0] + + def __len__(self): + return len(self.x) + + @property + def x(self): + return self._x + + @property + def y(self): + return self._y + + @property + def breakpoints(self): + return self._breakpoints + + @property + def interpolation(self): + return self._interpolation + + @property + def n_pairs(self): + return len(self.x) + + @property + def n_regions(self): + return len(self.breakpoints) + + @x.setter + def x(self, x): + cv.check_type('x values', x, Iterable, Real) + self._x = x + + @y.setter + def y(self, y): + cv.check_type('y values', y, Iterable, Real) + self._y = y + + @breakpoints.setter + def breakpoints(self, breakpoints): + cv.check_type('breakpoints', breakpoints, Iterable, Integral) + self._breakpoints = breakpoints + + @interpolation.setter + def interpolation(self, interpolation): + cv.check_type('interpolation', interpolation, Iterable, Integral) + self._interpolation = interpolation + + def integral(self): + """Integral of the tabulated function over its tabulated range. + + Returns + ------- + numpy.ndarray + Array of same length as the tabulated data that represents partial + integrals from the bottom of the range to each tabulated point. + + """ + + # Create output array + partial_sum = np.zeros(len(self.x) - 1) + + i_low = 0 + for k in range(len(self.breakpoints)): + # Determine which x values are within this interpolation range + i_high = self.breakpoints[k] - 1 + + # Get x values and bounding (x,y) pairs + x0 = self.x[i_low:i_high] + x1 = self.x[i_low + 1:i_high + 1] + y0 = self.y[i_low:i_high] + y1 = self.y[i_low + 1:i_high + 1] + + if self.interpolation[k] == 1: + # Histogram + partial_sum[i_low:i_high] = y0*(x1 - x0) + + elif self.interpolation[k] == 2: + # Linear-linear + m = (y1 - y0)/(x1 - x0) + partial_sum[i_low:i_high] = (y0 - m*x0)*(x1 - x0) + \ + m*(x1**2 - x0**2)/2 + + elif self.interpolation[k] == 3: + # Linear-log + logx = np.log(x1/x0) + m = (y1 - y0)/logx + partial_sum[i_low:i_high] = y0 + m*(x1*(logx - 1) + x0) + + elif self.interpolation[k] == 4: + # Log-linear + m = np.log(y1/y0)/(x1 - x0) + partial_sum[i_low:i_high] = y0/m*(np.exp(m*(x1 - x0)) - 1) + + elif self.interpolation[k] == 5: + # Log-log + m = np.log(y1/y0)/np.log(x1/x0) + partial_sum[i_low:i_high] = y0/((m + 1)*x0**m)*( + x1**(m + 1) - x0**(m + 1)) + + i_low = i_high + + return np.concatenate(([0.], np.cumsum(partial_sum))) + + def to_hdf5(self, group, name='xy'): + """Write tabulated function to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + name : str + Name of the dataset to create + + """ + dataset = group.create_dataset(name, data=np.vstack( + [self.x, self.y])) + dataset.attrs['type'] = np.string_('tab1') + dataset.attrs['breakpoints'] = self.breakpoints + dataset.attrs['interpolation'] = self.interpolation + + @classmethod + def from_hdf5(cls, dataset): + """Generate tabulated function from an HDF5 dataset + + Parameters + ---------- + dataset : h5py.Dataset + Dataset to read from + + Returns + ------- + openmc.data.Tabulated1D + Function read from dataset + + """ + x = dataset.value[0,:] + y = dataset.value[1,:] + breakpoints = dataset.attrs['breakpoints'] + interpolation = dataset.attrs['interpolation'] + return cls(x, y, breakpoints, interpolation) diff --git a/openmc/data/correlated.py b/openmc/data/correlated.py new file mode 100644 index 000000000..58a90da9d --- /dev/null +++ b/openmc/data/correlated.py @@ -0,0 +1,291 @@ +from collections import Iterable +from numbers import Real, Integral + +import numpy as np + +import openmc.checkvalue as cv +from openmc.stats import Tabular, Univariate, Discrete, Mixture +from .container import interpolation_scheme +from .angle_energy import AngleEnergy + + +class CorrelatedAngleEnergy(AngleEnergy): + """Correlated angle-energy distribution + + Parameters + ---------- + breakpoints : Iterable of int + Breakpoints defining interpolation regions + interpolation : Iterable of int + Interpolation codes + energy : Iterable of float + Incoming energies at which distributions exist + energy_out : Iterable of openmc.stats.Univariate + Distribution of outgoing energies corresponding to each incoming energy + mu : Iterable of Iterable of openmc.stats.Univariate + Distribution of scattering cosine for each incoming/outgoing energy + + Attributes + ---------- + breakpoints : Iterable of int + Breakpoints defining interpolation regions + interpolation : Iterable of int + Interpolation codes + energy : Iterable of float + Incoming energies at which distributions exist + energy_out : Iterable of openmc.stats.Univariate + Distribution of outgoing energies corresponding to each incoming energy + mu : Iterable of Iterable of openmc.stats.Univariate + Distribution of scattering cosine for each incoming/outgoing energy + + """ + + def __init__(self, breakpoints, interpolation, energy, energy_out, mu): + super(CorrelatedAngleEnergy, self).__init__() + self.breakpoints = breakpoints + self.interpolation = interpolation + self.energy = energy + self.energy_out = energy_out + self.mu = mu + + @property + def breakpoints(self): + return self._breakpoints + + @property + def interpolation(self): + return self._interpolation + @property + def energy(self): + return self._energy + + @property + def energy_out(self): + return self._energy_out + + @property + def mu(self): + return self._mu + + @breakpoints.setter + def breakpoints(self, breakpoints): + cv.check_type('correlated angle-energy breakpoints', breakpoints, + Iterable, Integral) + self._breakpoints = breakpoints + + @interpolation.setter + def interpolation(self, interpolation): + cv.check_type('correlated angle-energy interpolation', interpolation, + Iterable, Integral) + self._interpolation = interpolation + + @energy.setter + def energy(self, energy): + cv.check_type('correlated angle-energy incoming energy', energy, + Iterable, Real) + self._energy = energy + + @energy_out.setter + def energy_out(self, energy_out): + cv.check_type('correlated angle-energy outgoing energy', energy_out, + Iterable, Univariate) + self._energy_out = energy_out + + @mu.setter + def mu(self, mu): + cv.check_iterable_type('correlated angle-energy outgoing cosine', + mu, Univariate, 2, 2) + self._mu = mu + + def to_hdf5(self, group): + """Write distribution to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + group.attrs['type'] = np.string_('correlated') + + dset = group.create_dataset('energy', data=self.energy) + dset.attrs['interpolation'] = np.vstack((self.breakpoints, + self.interpolation)) + + # Determine total number of (E,p) pairs and create array + n_tuple = sum(len(d.x) for d in self.energy_out) + eout = np.empty((5, n_tuple)) + + # Make sure all mu data is tabular + mu_tabular = [] + for i, mu_i in enumerate(self.mu): + mu_tabular.append([mu_ij if isinstance(mu_ij, (Tabular, Discrete)) else + mu_ij.to_tabular() for mu_ij in mu_i]) + + # Determine total number of (mu,p) points and create array + n_tuple = sum(sum(len(mu_ij.x) for mu_ij in mu_i) + for mu_i in mu_tabular) + mu = np.empty((3, n_tuple)) + + # Create array for offsets + offsets = np.empty(len(self.energy_out), dtype=int) + interpolation = np.empty(len(self.energy_out), dtype=int) + n_discrete_lines = np.empty(len(self.energy_out), dtype=int) + offset_e = 0 + offset_mu = 0 + + # Populate offsets and eout array + for i, d in enumerate(self.energy_out): + n = len(d) + offsets[i] = offset_e + + if isinstance(d, Mixture): + discrete, continuous = d.distribution + n_discrete_lines[i] = m = len(discrete) + interpolation[i] = 1 if continuous.interpolation == 'histogram' else 2 + eout[0, offset_e:offset_e+m] = discrete.x + eout[1, offset_e:offset_e+m] = discrete.p + eout[2, offset_e:offset_e+m] = discrete.c + eout[0, offset_e+m:offset_e+n] = continuous.x + eout[1, offset_e+m:offset_e+n] = continuous.p + eout[2, offset_e+m:offset_e+n] = continuous.c + else: + if isinstance(d, Tabular): + n_discrete_lines[i] = 0 + interpolation[i] = 1 if d.interpolation == 'histogram' else 2 + elif isinstance(d, Discrete): + n_discrete_lines[i] = n + interpolation[i] = 1 + eout[0, offset_e:offset_e+n] = d.x + eout[1, offset_e:offset_e+n] = d.p + eout[2, offset_e:offset_e+n] = d.c + + for j, mu_ij in enumerate(mu_tabular[i]): + if isinstance(mu_ij, Discrete): + eout[3, offset_e+j] = 0 + else: + eout[3, offset_e+j] = 1 if mu_ij.interpolation == 'histogram' else 2 + eout[4, offset_e+j] = offset_mu + + n_mu = len(mu_ij) + mu[0, offset_mu:offset_mu+n_mu] = mu_ij.x + mu[1, offset_mu:offset_mu+n_mu] = mu_ij.p + mu[2, offset_mu:offset_mu+n_mu] = mu_ij.c + + offset_mu += n_mu + + offset_e += n + + # Create dataset for outgoing energy distributions + dset = group.create_dataset('energy_out', data=eout) + + # Write interpolation on outgoing energy as attribute + dset.attrs['offsets'] = offsets + dset.attrs['interpolation'] = interpolation + dset.attrs['n_discrete_lines'] = n_discrete_lines + + # Create dataset for outgoing angle distributions + group.create_dataset('mu', data=mu) + + @classmethod + def from_hdf5(cls, group): + """Generate correlated angle-energy distribution from HDF5 data + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.CorrelatedAngleEnergy + Correlated angle-energy distribution + + """ + interp_data = group['energy'].attrs['interpolation'] + energy_breakpoints = interp_data[0,:] + energy_interpolation = interp_data[1,:] + energy = group['energy'].value + + offsets = group['energy_out'].attrs['offsets'] + interpolation = group['energy_out'].attrs['interpolation'] + n_discrete_lines = group['energy_out'].attrs['n_discrete_lines'] + dset_eout = group['energy_out'].value + energy_out = [] + + dset_mu = group['mu'].value + mu = [] + + n_energy = len(energy) + for i in range(n_energy): + # Determine length of outgoing energy distribution and number of + # discrete lines + offset_e = offsets[i] + if i < n_energy - 1: + n = offsets[i+1] - offset_e + else: + n = dset_eout.shape[1] - offset_e + m = n_discrete_lines[i] + + # Create discrete distribution if lines are present + if m > 0: + x = dset_eout[0, offset_e:offset_e+m] + p = dset_eout[1, offset_e:offset_e+m] + eout_discrete = Discrete(x, p) + eout_discrete.c = dset_eout[2, offset_e:offset_e+m] + p_discrete = eout_discrete.c[-1] + + # Create continuous distribution + if m < n: + interp = interpolation_scheme[interpolation[i]] + + x = dset_eout[0, offset_e+m:offset_e+n] + p = dset_eout[1, offset_e+m:offset_e+n] + eout_continuous = Tabular(x, p, interp, ignore_negative=True) + eout_continuous.c = dset_eout[2, offset_e+m:offset_e+n] + + # If both continuous and discrete are present, create a mixture + # distribution + if m == 0: + eout_i = eout_continuous + elif m == n: + eout_i = eout_discrete + else: + eout_i = Mixture([p_discrete, 1. - p_discrete], + [eout_discrete, eout_continuous]) + + # Read angular distributions + mu_i = [] + for j in range(n): + # Determine interpolation scheme + interp_code = int(dset_eout[3, offsets[i] + j]) + + # Determine offset and length + offset_mu = int(dset_eout[4, offsets[i] + j]) + if offsets[i] + j < dset_eout.shape[1] - 1: + n_mu = int(dset_eout[4, offsets[i] + j + 1]) - offset_mu + else: + n_mu = dset_mu.shape[1] - offset_mu + + # Get data + x = dset_mu[0, offset_mu:offset_mu+n_mu] + p = dset_mu[1, offset_mu:offset_mu+n_mu] + c = dset_mu[2, offset_mu:offset_mu+n_mu] + + if interp_code == 0: + mu_ij = Discrete(x, p) + else: + mu_ij = Tabular(x, p, interpolation_scheme[interp_code], + ignore_negative=True) + mu_ij.c = c + mu_i.append(mu_ij) + + offset_mu += n_mu + + energy_out.append(eout_i) + mu.append(mu_i) + + j += n + + return cls(energy_breakpoints, energy_interpolation, + energy, energy_out, mu) diff --git a/openmc/data/data.py b/openmc/data/data.py index c6dd81ba6..e5aa55285 100644 --- a/openmc/data/data.py +++ b/openmc/data/data.py @@ -99,3 +99,60 @@ natural_abundance = { 'Bi-209': 1.0, 'Th-232': 1.0, 'Pa-231': 1.0, 'U-234': 5.4e-05, 'U-235': 0.007204, 'U-238': 0.992742 } + +atomic_symbol = {1: 'H', 2: 'He', 3: 'Li', 4: 'Be', 5: 'B', 6: 'C', 7: 'N', + 8: 'O', 9: 'F', 10: 'Ne', 11: 'Na', 12: 'Mg', 13: 'Al', + 14: 'Si', 15: 'P', 16: 'S', 17: 'Cl', 18: 'Ar', 19: 'K', + 20: 'Ca', 21: 'Sc', 22: 'Ti', 23: 'V', 24: 'Cr', 25: 'Mn', + 26: 'Fe', 27: 'Co', 28: 'Ni', 29: 'Cu', 30: 'Zn', 31: 'Ga', + 32: 'Ge', 33: 'As', 34: 'Se', 35: 'Br', 36: 'Kr', 37: 'Rb', + 38: 'Sr', 39: 'Y', 40: 'Zr', 41: 'Nb', 42: 'Mo', 43: 'Tc', + 44: 'Ru', 45: 'Rh', 46: 'Pd', 47: 'Ag', 48: 'Cd', 49: 'In', + 50: 'Sn', 51: 'Sb', 52: 'Te', 53: 'I', 54: 'Xe', 55: 'Cs', + 56: 'Ba', 57: 'La', 58: 'Ce', 59: 'Pr', 60: 'Nd', 61: 'Pm', + 62: 'Sm', 63: 'Eu', 64: 'Gd', 65: 'Tb', 66: 'Dy', 67: 'Ho', + 68: 'Er', 69: 'Tm', 70: 'Yb', 71: 'Lu', 72: 'Hf', 73: 'Ta', + 74: 'W', 75: 'Re', 76: 'Os', 77: 'Ir', 78: 'Pt', 79: 'Au', + 80: 'Hg', 81: 'Tl', 82: 'Pb', 83: 'Bi', 84: 'Po', 85: 'At', + 86: 'Rn', 87: 'Fr', 88: 'Ra', 89: 'Ac', 90: 'Th', 91: 'Pa', + 92: 'U', 93: 'Np', 94: 'Pu', 95: 'Am', 96: 'Cm', 97: 'Bk', + 98: 'Cf', 99: 'Es', 100: 'Fm', 101: 'Md', 102: 'No', + 103: 'Lr', 104: 'Rf', 105: 'Db', 106: 'Sg', 107: 'Bh', + 108: 'Hs', 109: 'Mt', 110: 'Ds', 111: 'Rg', 112: 'Cn', + 114: 'Fl', 116: 'Lv'} +atomic_number = {value: key for key, value in atomic_symbol.items()} + +reaction_name = {1: '(n,total)', 2: '(n,elastic)', 4: '(n,level)', 5: '(n,misc)', 11: '(n,2nd)', + 16: '(n,2n)', 17: '(n,3n)', 18: '(n,fission)', 19: '(n,f)', + 20: '(n,nf)', 21: '(n,2nf)', 22: '(n,na)', 23: '(n,n3a)', + 24: '(n,2na)', 25: '(n,3na)', 28: '(n,np)', 29: '(n,n2a)', + 30: '(n,2n2a)', 32: '(n,nd)', 33: '(n,nt)', 34: '(n,nHe-3)', + 35: '(n,nd2a)', 36: '(n,nt2a)', 37: '(n,4n)', 38: '(n,3nf)', + 41: '(n,2np)', 42: '(n,3np)', 44: '(n,n2p)', 45: '(n,npa)', + 91: '(n,nc)', 101: '(n,disappear)', 102: '(n,gamma)', + 103: '(n,p)', 104: '(n,d)', 105: '(n,t)', 106: '(n,3He)', + 107: '(n,a)', 108: '(n,2a)', 109: '(n,3a)', 111: '(n,2p)', + 112: '(n,pa)', 113: '(n,t2a)', 114: '(n,d2a)', 115: '(n,pd)', + 116: '(n,pt)', 117: '(n,da)', 152: '(n,5n)', 153: '(n,6n)', + 154: '(n,2nt)', 155: '(n,ta)', 156: '(n,4np)', 157: '(n,3nd)', + 158: '(n,nda)', 159: '(n,2npa)', 160: '(n,7n)', 161: '(n,8n)', + 162: '(n,5np)', 163: '(n,6np)', 164: '(n,7np)', 165: '(n,4na)', + 166: '(n,5na)', 167: '(n,6na)', 168: '(n,7na)', 169: '(n,4nd)', + 170: '(n,5nd)', 171: '(n,6nd)', 172: '(n,3nt)', 173: '(n,4nt)', + 174: '(n,5nt)', 175: '(n,6nt)', 176: '(n,2n3He)', + 177: '(n,3n3He)', 178: '(n,4n3He)', 179: '(n,3n2p)', + 180: '(n,3n3a)', 181: '(n,3npa)', 182: '(n,dt)', + 183: '(n,npd)', 184: '(n,npt)', 185: '(n,ndt)', + 186: '(n,np3He)', 187: '(n,nd3He)', 188: '(n,nt3He)', + 189: '(n,nta)', 190: '(n,2n2p)', 191: '(n,p3He)', + 192: '(n,d3He)', 193: '(n,3Hea)', 194: '(n,4n2p)', + 195: '(n,4n2a)', 196: '(n,4npa)', 197: '(n,3p)', + 198: '(n,n3p)', 199: '(n,3n2pa)', 200: '(n,5n2p)', 444: '(n,damage)', + 649: '(n,pc)', 699: '(n,dc)', 749: '(n,tc)', 799: '(n,3Hec)', + 849: '(n,ac)'} +reaction_name.update({i: '(n,n{})'.format(i-50) for i in range(50,91)}) +reaction_name.update({i: '(n,p{})'.format(i-600) for i in range(600,649)}) +reaction_name.update({i: '(n,d{})'.format(i-650) for i in range(650,699)}) +reaction_name.update({i: '(n,t{})'.format(i-700) for i in range(700,749)}) +reaction_name.update({i: '(n,3He{})'.format(i-750) for i in range(750,799)}) +reaction_name.update({i: '(n,a{})'.format(i-800) for i in range(800,849)}) diff --git a/openmc/data/energy_distribution.py b/openmc/data/energy_distribution.py new file mode 100644 index 000000000..afbc39014 --- /dev/null +++ b/openmc/data/energy_distribution.py @@ -0,0 +1,850 @@ +from abc import ABCMeta, abstractmethod +from collections import Iterable +from numbers import Integral, Real + +import h5py +import numpy as np + +from openmc.data.container import Tabulated1D, interpolation_scheme +from openmc.stats.univariate import Univariate, Tabular, Discrete, Mixture +import openmc.checkvalue as cv + + +class EnergyDistribution(object): + """Abstract superclass for all energy distributions.""" + + __metaclass__ = ABCMeta + + def __init__(self): + pass + + @abstractmethod + def to_hdf5(self, group): + pass + + @staticmethod + def from_hdf5(group): + """Generate energy distribution from HDF5 data + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.EnergyDistribution + Energy distribution + + """ + energy_type = group.attrs['type'].decode() + if energy_type == 'maxwell': + return MaxwellEnergy.from_hdf5(group) + elif energy_type == 'evaporation': + return Evaporation.from_hdf5(group) + elif energy_type == 'watt': + return WattEnergy.from_hdf5(group) + elif energy_type == 'madland-nix': + return MadlandNix.from_hdf5(group) + elif energy_type == 'discrete_photon': + return DiscretePhoton.from_hdf5(group) + elif energy_type == 'level': + return LevelInelastic.from_hdf5(group) + elif energy_type == 'continuous': + return ContinuousTabular.from_hdf5(group) + + +class ArbitraryTabulated(EnergyDistribution): + r"""Arbitrary tabulated function given in ENDF MF=5, LF=1 represented as + + .. math:: + f(E \rightarrow E') = g(E \rightarrow E') + + Parameters + ---------- + energy : numpy.ndarray + Array of incident neutron energies + pdf : list of openmc.data.Tabulated1D + Tabulated outgoing energy distribution probability density functions + + Attributes + ---------- + energy : numpy.ndarray + Array of incident neutron energies + pdf : list of openmc.data.Tabulated1D + Tabulated outgoing energy distribution probability density functions + + """ + + def __init__(self, energy, pdf): + self.energy = energy + self.pdf = pdf + + def to_hdf5(self, group): + NotImplementedError + + +class GeneralEvaporation(EnergyDistribution): + r"""General evaporation spectrum given in ENDF MF=5, LF=5 represented as + + .. math:: + f(E \rightarrow E') = g(E'/\theta(E)) + + Parameters + ---------- + theta : openmc.data.Tabulated1D + Tabulated function of incident neutron energy :math:`E` + g : openmc.data.Tabulated1D + Tabulated function of :math:`x = E'/\theta(E)` + u : float + Constant introduced to define the proper upper limit for the final + particle energy such that :math:`0 \le E' \le E - U` + + Attributes + ---------- + theta : openmc.data.Tabulated1D + Tabulated function of incident neutron energy :math:`E` + g : openmc.data.Tabulated1D + Tabulated function of :math:`x = E'/\theta(E)` + u : float + Constant introduced to define the proper upper limit for the final + particle energy such that :math:`0 \le E' \le E - U` + + """ + + def __init__(self, theta, g, u): + self.theta = theta + self.g = g + self.u = u + + def to_hdf5(self, group): + raise NotImplementedError + + +class MaxwellEnergy(EnergyDistribution): + r"""Simple Maxwellian fission spectrum represented as + + .. math:: + f(E \rightarrow E') = \frac{\sqrt{E'}}{I} e^{-E'/\theta(E)} + + Parameters + ---------- + theta : openmc.data.Tabulated1D + Tabulated function of incident neutron energy + u : float + Constant introduced to define the proper upper limit for the final + particle energy such that :math:`0 \le E' \le E - U` + + Attributes + ---------- + theta : openmc.data.Tabulated1D + Tabulated function of incident neutron energy + u : float + Constant introduced to define the proper upper limit for the final + particle energy such that :math:`0 \le E' \le E - U` + + """ + + def __init__(self, theta, u): + self.theta = theta + self.u = u + + @property + def theta(self): + return self._theta + + @property + def u(self): + return self._u + + @theta.setter + def theta(self, theta): + cv.check_type('Maxwell theta', theta, Tabulated1D) + self._theta = theta + + @u.setter + def u(self, u): + cv.check_type('Maxwell restriction energy', u, Real) + self._u = u + + def to_hdf5(self, group): + """Write distribution to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + + group.attrs['type'] = np.string_('maxwell') + group.attrs['u'] = self.u + self.theta.to_hdf5(group, 'theta') + + @classmethod + def from_hdf5(cls, group): + """Generate Maxwell distribution from HDF5 data + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.MaxwellEnergy + Maxwell distribution + + """ + theta = Tabulated1D.from_hdf5(group['theta']) + u = group.attrs['u'] + return cls(theta, u) + + +class Evaporation(EnergyDistribution): + r"""Evaporation spectrum represented as + + .. math:: + f(E \rightarrow E') = \frac{E'}{I} e^{-E'/\theta(E)} + + Parameters + ---------- + theta : openmc.data.Tabulated1D + Tabulated function of incident neutron energy + u : float + Constant introduced to define the proper upper limit for the final + particle energy such that :math:`0 \le E' \le E - U` + + Attributes + ---------- + theta : openmc.data.Tabulated1D + Tabulated function of incident neutron energy + u : float + Constant introduced to define the proper upper limit for the final + particle energy such that :math:`0 \le E' \le E - U` + + """ + + def __init__(self, theta, u): + self.theta = theta + self.u = u + + @property + def theta(self): + return self._theta + + @property + def u(self): + return self._u + + @theta.setter + def theta(self, theta): + cv.check_type('Evaporation theta', theta, Tabulated1D) + self._theta = theta + + @u.setter + def u(self, u): + cv.check_type('Evaporation restriction energy', u, Real) + self._u = u + + def to_hdf5(self, group): + """Write distribution to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + + group.attrs['type'] = np.string_('evaporation') + group.attrs['u'] = self.u + self.theta.to_hdf5(group, 'theta') + + @classmethod + def from_hdf5(cls, group): + """Generate evaporation spectrum from HDF5 data + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.Evaporation + Evaporation spectrum distribution + + """ + theta = Tabulated1D.from_hdf5(group['theta']) + u = group.attrs['u'] + return cls(theta, u) + + +class WattEnergy(EnergyDistribution): + r"""Energy-dependent Watt spectrum represented as + + .. math:: + f(E \rightarrow E') = \frac{e^{-E'/a}}{I} \sinh \left ( \sqrt{bE'} + \right ) + + Parameters + ---------- + a, b : openmc.data.Tabulated1D + Energy-dependent parameters tabulated as function of incident neutron + energy + u : float + Constant introduced to define the proper upper limit for the final + particle energy such that :math:`0 \le E' \le E - U` + + Attributes + ---------- + a, b : openmc.data.Tabulated1D + Energy-dependent parameters tabulated as function of incident neutron + energy + u : float + Constant introduced to define the proper upper limit for the final + particle energy such that :math:`0 \le E' \le E - U` + + """ + + def __init__(self, a, b, u): + self.a = a + self.b = b + self.u = u + + @property + def a(self): + return self._a + + @property + def b(self): + return self._b + + @property + def u(self): + return self._u + + @a.setter + def a(self, a): + cv.check_type('Watt a', a, Tabulated1D) + self._a = a + + @b.setter + def b(self, b): + cv.check_type('Watt b', b, Tabulated1D) + self._b = b + + @u.setter + def u(self, u): + cv.check_type('Watt restriction energy', u, Real) + self._u = u + + def to_hdf5(self, group): + """Write distribution to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + + group.attrs['type'] = np.string_('watt') + group.attrs['u'] = self.u + self.a.to_hdf5(group, 'a') + self.b.to_hdf5(group, 'b') + + @classmethod + def from_hdf5(cls, group): + """Generate Watt fission spectrum from HDF5 data + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.WattEnergy + Watt fission spectrum + + """ + a = Tabulated1D.from_hdf5(group['a']) + b = Tabulated1D.from_hdf5(group['b']) + u = group.attrs['u'] + return cls(a, b, u) + +class MadlandNix(EnergyDistribution): + r"""Energy-dependent fission neutron spectrum (Madland and Nix) given in + ENDF MF=5, LF=12 represented as + + .. math:: + f(E \rightarrow E') = \frac{1}{2} [ g(E', E_F(L)) + g(E', E_F(H))] + + where + + .. math:: + g(E',E_F) = \frac{1}{3\sqrt{E_F T_M}} \left [ u_2^{3/2} E_1 (u_2) - + u_1^{3/2} E_1 (u_1) + \gamma \left ( \frac{3}{2}, u_2 \right ) - \gamma + \left ( \frac{3}{2}, u_1 \right ) \right ] \\ u_1 = \left ( \sqrt{E'} - + \sqrt{E_F} \right )^2 / T_M \\ u_2 = \left ( \sqrt{E'} + \sqrt{E_F} + \right )^2 / T_M. + + Parameters + ---------- + efl, efh : float + Constants which represent the average kinetic energy per nucleon of the + fission fragment (efl = light, efh = heavy) + tm : openmc.data.Tabulated1D + Parameter tabulated as a function of incident neutron energy + + Attributes + ---------- + efl, efh : float + Constants which represent the average kinetic energy per nucleon of the + fission fragment (efl = light, efh = heavy) + tm : openmc.data.Tabulated1D + Parameter tabulated as a function of incident neutron energy + + """ + + def __init__(self, efl, efh, tm): + self.efl = efl + self.efh = efh + self.tm = tm + + @property + def efl(self): + return self._efl + + @property + def efh(self): + return self._efh + + @property + def tm(self): + return self._tm + + @efl.setter + def efl(self, efl): + name = 'Madland-Nix light fragment energy' + cv.check_type(name, efl, Real) + cv.check_greater_than(name, efl, 0.) + self._efl = efl + + @efh.setter + def efh(self, efh): + name = 'Madland-Nix heavy fragment energy' + cv.check_type(name, efh, Real) + cv.check_greater_than(name, efh, 0.) + self._efh = efh + + @tm.setter + def tm(self, tm): + cv.check_type('Madland-Nix maximum temperature', tm, Tabulated1D) + self._tm = tm + + def to_hdf5(self, group): + """Write distribution to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + + group.attrs['type'] = np.string_('madland-nix') + group.attrs['efl'] = self.efl + group.attrs['efh'] = self.efh + self.tm.to_hdf5(group) + + @classmethod + def from_hdf5(cls, group): + """Generate Madland-Nix fission spectrum from HDF5 data + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.MadlandNix + Madland-Nix fission spectrum + + """ + efl = group.attrs['efl'] + efh = group.attrs['efh'] + tm = Tabulated1D.from_hdf5(group['tm']) + return cls(efl, efh, tm) + + +class DiscretePhoton(EnergyDistribution): + """Discrete photon energy distribution + + Parameters + ---------- + primary_flag : int + Indicator of whether the photon is a primary or non-primary photon. + energy : float + Photon energy (if lp==0 or lp==1) or binding energy (if lp==2). + atomic_weight_ratio : float + Atomic weight ratio of the target nuclide responsible for the emitted + particle + + Attributes + ---------- + primary_flag : int + Indicator of whether the photon is a primary or non-primary photon. + energy : float + Photon energy (if lp==0 or lp==1) or binding energy (if lp==2). + atomic_weight_ratio : float + Atomic weight ratio of the target nuclide responsible for the emitted + particle + + """ + + def __init__(self, primary_flag, energy, atomic_weight_ratio): + super(DiscretePhoton, self).__init__() + self.primary_flag = primary_flag + self.energy = energy + self.atomic_weight_ratio = atomic_weight_ratio + + @property + def primary_flag(self): + return self._primary_flag + + @property + def energy(self): + return self._energy + + @property + def atomic_weight_ratio(self): + return self._atomic_weight_ratio + + @primary_flag.setter + def primary_flag(self, primary_flag): + cv.check_type('discrete photon primary_flag', primary_flag, Integral) + self._primary_flag = primary_flag + + @energy.setter + def energy(self, energy): + cv.check_type('discrete photon energy', energy, Real) + self._energy = energy + + @atomic_weight_ratio.setter + def atomic_weight_ratio(self, atomic_weight_ratio): + cv.check_type('atomic weight ratio', atomic_weight_ratio, Real) + self._atomic_weight_ratio = atomic_weight_ratio + + def to_hdf5(self, group): + """Write distribution to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + + group.attrs['type'] = np.string_('discrete_photon') + group.attrs['primary_flag'] = self.primary_flag + group.attrs['energy'] = self.energy + group.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio + + @classmethod + def from_hdf5(cls, group): + """Generate discrete photon energy distribution from HDF5 data + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.DiscretePhoton + Discrete photon energy distribution + + """ + primary_flag = group.attrs['primary_flag'] + energy = group.attrs['energy'] + awr = group.attrs['atomic_weight_ratio'] + return cls(primary_flag, energy, awr) + + +class LevelInelastic(EnergyDistribution): + r"""Level inelastic scattering + + Parameters + ---------- + threshold : float + Energy threshold in the laboratory system, :math:`(A + 1)/A * |Q|` + mass_ratio : float + :math:`(A/(A + 1))^2` + + Attributes + ---------- + threshold : float + Energy threshold in the laboratory system, :math:`(A + 1)/A * |Q|` + mass_ratio : float + :math:`(A/(A + 1))^2` + + """ + + def __init__(self, threshold, mass_ratio): + super(LevelInelastic, self).__init__() + self.threshold = threshold + self.mass_ratio = mass_ratio + + @property + def threshold(self): + return self._threshold + + @property + def mass_ratio(self): + return self._mass_ratio + + @threshold.setter + def threshold(self, threshold): + cv.check_type('level inelastic threhsold', threshold, Real) + self._threshold = threshold + + @mass_ratio.setter + def mass_ratio(self, mass_ratio): + cv.check_type('level inelastic mass ratio', mass_ratio, Real) + self._mass_ratio = mass_ratio + + def to_hdf5(self, group): + """Write distribution to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + + group.attrs['type'] = np.string_('level') + group.attrs['threshold'] = self.threshold + group.attrs['mass_ratio'] = self.mass_ratio + + @classmethod + def from_hdf5(cls, group): + """Generate level inelastic distribution from HDF5 data + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.LevelInelastic + Level inelastic scattering distribution + + """ + threshold = group.attrs['threshold'] + mass_ratio = group.attrs['mass_ratio'] + return cls(threshold, mass_ratio) + + +class ContinuousTabular(EnergyDistribution): + """Continuous tabular distribution + + Parameters + ---------- + breakpoints : Iterable of int + Breakpoints defining interpolation regions + interpolation : Iterable of int + Interpolation codes + energy : Iterable of float + Incoming energies at which distributions exist + energy_out : Iterable of openmc.stats.Univariate + Distribution of outgoing energies corresponding to each incoming energy + + Attributes + ---------- + breakpoints : Iterable of int + Breakpoints defining interpolation regions + interpolation : Iterable of int + Interpolation codes + energy : Iterable of float + Incoming energies at which distributions exist + energy_out : Iterable of openmc.stats.Univariate + Distribution of outgoing energies corresponding to each incoming energy + + """ + + def __init__(self, breakpoints, interpolation, energy, energy_out): + super(ContinuousTabular, self).__init__() + self.breakpoints = breakpoints + self.interpolation = interpolation + self.energy = energy + self.energy_out = energy_out + + @property + def breakpoints(self): + return self._breakpoints + + @property + def interpolation(self): + return self._interpolation + + @property + def energy(self): + return self._energy + + @property + def energy_out(self): + return self._energy_out + + @breakpoints.setter + def breakpoints(self, breakpoints): + cv.check_type('continuous tabular breakpoints', breakpoints, + Iterable, Integral) + self._breakpoints = breakpoints + + @interpolation.setter + def interpolation(self, interpolation): + cv.check_type('continuous tabular interpolation', interpolation, + Iterable, Integral) + self._interpolation = interpolation + + @energy.setter + def energy(self, energy): + cv.check_type('continuous tabular incoming energy', energy, + Iterable, Real) + self._energy = energy + + @energy_out.setter + def energy_out(self, energy_out): + cv.check_type('continuous tabular outgoing energy', energy_out, + Iterable, Univariate) + self._energy_out = energy_out + + def to_hdf5(self, group): + """Write distribution to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + + group.attrs['type'] = np.string_('continuous') + + dset = group.create_dataset('energy', data=self.energy) + dset.attrs['interpolation'] = np.vstack((self.breakpoints, + self.interpolation)) + + # Determine total number of (E,p) pairs and create array + n_pairs = sum(len(d) for d in self.energy_out) + pairs = np.empty((3, n_pairs)) + + # Create array for offsets + offsets = np.empty(len(self.energy_out), dtype=int) + interpolation = np.empty(len(self.energy_out), dtype=int) + n_discrete_lines = np.empty(len(self.energy_out), dtype=int) + j = 0 + + # Populate offsets and pairs array + for i, eout in enumerate(self.energy_out): + n = len(eout) + offsets[i] = j + + if isinstance(eout, Mixture): + discrete, continuous = eout.distribution + n_discrete_lines[i] = m = len(discrete) + interpolation[i] = 1 if continuous.interpolation == 'histogram' else 2 + pairs[0, j:j+m] = discrete.x + pairs[1, j:j+m] = discrete.p + pairs[2, j:j+m] = discrete.c + pairs[0, j+m:j+n] = continuous.x + pairs[1, j+m:j+n] = continuous.p + pairs[2, j+m:j+n] = continuous.c + else: + if isinstance(eout, Tabular): + n_discrete_lines[i] = 0 + interpolation[i] = 1 if eout.interpolation == 'histogram' else 2 + elif isinstance(eout, Discrete): + n_discrete_lines[i] = n + interpolation[i] = 1 + pairs[0, j:j+n] = eout.x + pairs[1, j:j+n] = eout.p + pairs[2, j:j+n] = eout.c + j += n + + # Create dataset for distributions + dset = group.create_dataset('distribution', data=pairs) + + # Write interpolation as attribute + dset.attrs['offsets'] = offsets + dset.attrs['interpolation'] = interpolation + dset.attrs['n_discrete_lines'] = n_discrete_lines + + @classmethod + def from_hdf5(cls, group): + """Generate continuous tabular distribution from HDF5 data + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.ContinuousTabular + Continuous tabular energy distribution + + """ + interp_data = group['energy'].attrs['interpolation'] + energy_breakpoints = interp_data[0,:] + energy_interpolation = interp_data[1,:] + energy = group['energy'].value + + data = group['distribution'] + offsets = data.attrs['offsets'] + interpolation = data.attrs['interpolation'] + n_discrete_lines = data.attrs['n_discrete_lines'] + + energy_out = [] + n_energy = len(energy) + for i in range(n_energy): + # Determine length of outgoing energy distribution and number of + # discrete lines + j = offsets[i] + if i < n_energy - 1: + n = offsets[i+1] - j + else: + n = data.shape[1] - j + m = n_discrete_lines[i] + + # Create discrete distribution if lines are present + if m > 0: + eout_discrete = Discrete(data[0, j:j+m], data[1, j:j+m]) + eout_discrete.c = data[2, j:j+m] + p_discrete = eout_discrete.c[-1] + + # Create continuous distribution + if m < n: + interp = interpolation_scheme[interpolation[i]] + eout_continuous = Tabular(data[0, j+m:j+n], data[1, j+m:j+n], interp) + eout_continuous.c = data[2, j+m:j+n] + + # If both continuous and discrete are present, create a mixture + # distribution + if m == 0: + eout_i = eout_continuous + elif m == n: + eout_i = eout_discrete + else: + eout_i = Mixture([p_discrete, 1. - p_discrete], + [eout_discrete, eout_continuous]) + energy_out.append(eout_i) + + return cls(energy_breakpoints, energy_interpolation, + energy, energy_out) diff --git a/openmc/data/kalbach_mann.py b/openmc/data/kalbach_mann.py new file mode 100644 index 000000000..a8fc8d4c6 --- /dev/null +++ b/openmc/data/kalbach_mann.py @@ -0,0 +1,253 @@ +from collections import Iterable +from numbers import Real, Integral + +import numpy as np + +import openmc.checkvalue as cv +from openmc.stats import Tabular, Univariate, Discrete, Mixture +from .container import Tabulated1D, interpolation_scheme +from .angle_energy import AngleEnergy + + +class KalbachMann(AngleEnergy): + """Kalbach-Mann distribution + + Parameters + ---------- + breakpoints : Iterable of int + Breakpoints defining interpolation regions + interpolation : Iterable of int + Interpolation codes + energy : Iterable of float + Incoming energies at which distributions exist + energy_out : Iterable of openmc.stats.Univariate + Distribution of outgoing energies corresponding to each incoming energy + precompound : Iterable of openmc.data.Tabulated1D + Precompound factor 'r' as a function of outgoing energy for each + incoming energy + slope : Iterable of openmc.data.Tabulated1D + Kalbach-Chadwick angular distribution slope value 'a' as a function of + outgoing energy for each incoming energy + + Attributes + ---------- + breakpoints : Iterable of int + Breakpoints defining interpolation regions + interpolation : Iterable of int + Interpolation codes + energy : Iterable of float + Incoming energies at which distributions exist + energy_out : Iterable of openmc.stats.Univariate + Distribution of outgoing energies corresponding to each incoming energy + precompound : Iterable of openmc.data.Tabulated1D + Precompound factor 'r' as a function of outgoing energy for each + incoming energy + slope : Iterable of openmc.data.Tabulated1D + Kalbach-Chadwick angular distribution slope value 'a' as a function of + outgoing energy for each incoming energy + + """ + + def __init__(self, breakpoints, interpolation, energy, energy_out, + precompound, slope): + super(KalbachMann, self).__init__() + self.breakpoints = breakpoints + self.interpolation = interpolation + self.energy = energy + self.energy_out = energy_out + self.precompound = precompound + self.slope = slope + + @property + def breakpoints(self): + return self._breakpoints + + @property + def interpolation(self): + return self._interpolation + + @property + def energy(self): + return self._energy + + @property + def energy_out(self): + return self._energy_out + + @property + def precompound(self): + return self._precompound + + @property + def slope(self): + return self._slope + + @breakpoints.setter + def breakpoints(self, breakpoints): + cv.check_type('Kalbach-Mann breakpoints', breakpoints, + Iterable, Integral) + self._breakpoints = breakpoints + + @interpolation.setter + def interpolation(self, interpolation): + cv.check_type('Kalbach-Mann interpolation', interpolation, + Iterable, Integral) + self._interpolation = interpolation + + @energy.setter + def energy(self, energy): + cv.check_type('Kalbach-Mann incoming energy', energy, + Iterable, Real) + self._energy = energy + + @energy_out.setter + def energy_out(self, energy_out): + cv.check_type('Kalbach-Mann distributions', energy_out, + Iterable, Univariate) + self._energy_out = energy_out + + @precompound.setter + def precompound(self, precompound): + cv.check_type('Kalbach-Mann precompound factor', precompound, + Iterable, Tabulated1D) + self._precompound = precompound + + @slope.setter + def slope(self, slope): + cv.check_type('Kalbach-Mann slope', slope, Iterable, Tabulated1D) + self._slope = slope + + def to_hdf5(self, group): + """Write distribution to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + group.attrs['type'] = np.string_('kalbach-mann') + + dset = group.create_dataset('energy', data=self.energy) + dset.attrs['interpolation'] = np.vstack((self.breakpoints, + self.interpolation)) + + # Determine total number of (E,p,r,a) tuples and create array + n_tuple = sum(len(d) for d in self.energy_out) + distribution = np.empty((5, n_tuple)) + + # Create array for offsets + offsets = np.empty(len(self.energy_out), dtype=int) + interpolation = np.empty(len(self.energy_out), dtype=int) + n_discrete_lines = np.empty(len(self.energy_out), dtype=int) + j = 0 + + # Populate offsets and distribution array + for i, (eout, km_r, km_a) in enumerate(zip( + self.energy_out, self.precompound, self.slope)): + n = len(eout) + offsets[i] = j + + if isinstance(eout, Mixture): + discrete, continuous = eout.distribution + n_discrete_lines[i] = m = len(discrete) + interpolation[i] = 1 if continuous.interpolation == 'histogram' else 2 + distribution[0, j:j+m] = discrete.x + distribution[1, j:j+m] = discrete.p + distribution[2, j:j+m] = discrete.c + distribution[0, j+m:j+n] = continuous.x + distribution[1, j+m:j+n] = continuous.p + distribution[2, j+m:j+n] = continuous.c + else: + if isinstance(eout, Tabular): + n_discrete_lines[i] = 0 + interpolation[i] = 1 if eout.interpolation == 'histogram' else 2 + elif isinstance(eout, Discrete): + n_discrete_lines[i] = n + interpolation[i] = 1 + distribution[0, j:j+n] = eout.x + distribution[1, j:j+n] = eout.p + distribution[2, j:j+n] = eout.c + + distribution[3, j:j+n] = km_r.y + distribution[4, j:j+n] = km_a.y + j += n + + # Create dataset for distributions + dset = group.create_dataset('distribution', data=distribution) + + # Write interpolation as attribute + dset.attrs['offsets'] = offsets + dset.attrs['interpolation'] = interpolation + dset.attrs['n_discrete_lines'] = n_discrete_lines + + @classmethod + def from_hdf5(cls, group): + """Generate Kalbach-Mann distribution from HDF5 data + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.KalbachMann + Kalbach-Mann energy distribution + + """ + interp_data = group['energy'].attrs['interpolation'] + energy_breakpoints = interp_data[0,:] + energy_interpolation = interp_data[1,:] + energy = group['energy'].value + + data = group['distribution'] + offsets = data.attrs['offsets'] + interpolation = data.attrs['interpolation'] + n_discrete_lines = data.attrs['n_discrete_lines'] + + energy_out = [] + precompound = [] + slope = [] + n_energy = len(energy) + for i in range(n_energy): + # Determine length of outgoing energy distribution and number of + # discrete lines + j = offsets[i] + if i < n_energy - 1: + n = offsets[i+1] - j + else: + n = data.shape[1] - j + m = n_discrete_lines[i] + + # Create discrete distribution if lines are present + if m > 0: + eout_discrete = Discrete(data[0, j:j+m], data[1, j:j+m]) + eout_discrete.c = data[2, j:j+m] + p_discrete = eout_discrete.c[-1] + + # Create continuous distribution + if m < n: + interp = interpolation_scheme[interpolation[i]] + eout_continuous = Tabular(data[0, j+m:j+n], data[1, j+m:j+n], interp) + eout_continuous.c = data[2, j+m:j+n] + + # If both continuous and discrete are present, create a mixture + # distribution + if m == 0: + eout_i = eout_continuous + elif m == n: + eout_i = eout_discrete + else: + eout_i = Mixture([p_discrete, 1. - p_discrete], + [eout_discrete, eout_continuous]) + + km_r = Tabulated1D(data[0, j:j+n], data[3, j:j+n]) + km_a = Tabulated1D(data[0, j:j+n], data[4, j:j+n]) + + energy_out.append(eout_i) + precompound.append(km_r) + slope.append(km_a) + + return cls(energy_breakpoints, energy_interpolation, + energy, energy_out, precompound, slope) diff --git a/openmc/data/nbody.py b/openmc/data/nbody.py new file mode 100644 index 000000000..4fa3d05b2 --- /dev/null +++ b/openmc/data/nbody.py @@ -0,0 +1,118 @@ +from numbers import Real, Integral + +import numpy as np + +import openmc.checkvalue as cv +from .angle_energy import AngleEnergy + +class NBodyPhaseSpace(AngleEnergy): + """N-body phase space distribution + + Parameters + ---------- + total_mass : float + Total mass of product particles + n_particles : int + Number of product particles + atomic_weight_ratio : float + Atomic weight ratio of target nuclide + q_value : float + Q value for reaction in MeV + + Attributes + ---------- + total_mass : float + Total mass of product particles + n_particles : int + Number of product particles + atomic_weight_ratio : float + Atomic weight ratio of target nuclide + q_value : float + Q value for reaction in MeV + + """ + + def __init__(self, total_mass, n_particles, atomic_weight_ratio, q_value): + self.total_mass = total_mass + self.n_particles = n_particles + self.atomic_weight_ratio = atomic_weight_ratio + self.q_value = q_value + + @property + def total_mass(self): + return self._total_mass + + @property + def n_particles(self): + return self._n_particles + + @property + def atomic_weight_ratio(self): + return self._atomic_weight_ratio + + @property + def q_value(self): + return self._q_value + + @total_mass.setter + def total_mass(self, total_mass): + name = 'N-body phase space total mass' + cv.check_type(name, total_mass, Real) + cv.check_greater_than(name, total_mass, 0.) + self._total_mass = total_mass + + @n_particles.setter + def n_particles(self, n_particles): + name = 'N-body phase space number of particles' + cv.check_type(name, n_particles, Integral) + cv.check_greater_than(name, n_particles, 0) + self._n_particles = n_particles + + @atomic_weight_ratio.setter + def atomic_weight_ratio(self, atomic_weight_ratio): + name = 'N-body phase space atomic weight ratio' + cv.check_type(name, atomic_weight_ratio, Real) + cv.check_greater_than(name, atomic_weight_ratio, 0.0) + self._atomic_weight_ratio = atomic_weight_ratio + + @q_value.setter + def q_value(self, q_value): + name = 'N-body phase space Q value' + cv.check_type(name, q_value, Real) + self._q_value = q_value + + def to_hdf5(self, group): + """Write distribution to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + group.attrs['type'] = np.string_('nbody') + group.attrs['total_mass'] = self.total_mass + group.attrs['n_particles'] = self.n_particles + group.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio + group.attrs['q_value'] = self.q_value + + @classmethod + def from_hdf5(cls, group): + """Generate N-body phase space distribution from HDF5 data + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.NBodyPhaseSpace + N-body phase space distribution + + """ + total_mass = group.attrs['total_mass'] + n_particles = group.attrs['n_particles'] + awr = group.attrs['atomic_weight_ratio'] + q_value = group.attrs['q_value'] + return cls(total_mass, n_particles, awr, q_value) diff --git a/openmc/data/product.py b/openmc/data/product.py new file mode 100644 index 000000000..6a331dc24 --- /dev/null +++ b/openmc/data/product.py @@ -0,0 +1,205 @@ +from collections import Iterable +from numbers import Real +import sys + +import numpy as np +from numpy.polynomial.polynomial import Polynomial + +import openmc.checkvalue as cv +from .container import Tabulated1D +from .angle_energy import AngleEnergy + +if sys.version_info[0] >= 3: + basestring = str + + +class Product(object): + """Secondary particle emitted in a nuclear reaction + + Parameters + ---------- + particle : str, optional + What particle the reaction product is. Defaults to 'neutron'. + + Attributes + ---------- + applicability : Iterable of openmc.data.Tabulated1D + Probability of sampling a given distribution for this product. + decay_rate : float + Decay rate in inverse seconds + distribution : Iterable of openmc.data.AngleEnergy + Distributions of energy and angle of product. + emission_mode : {'prompt', 'delayed', 'total'} + Indicate whether the particle is emitted immediately or whether it + results from the decay of reaction product (e.g., neutron emitted from a + delayed neutron precursor). A special value of 'total' is used when the + yield represents particles from prompt and delayed sources. + particle : str + What particle the reaction product is. + yield_ : float or openmc.data.Tabulated1D or numpy.polynomial.Polynomial + Yield of secondary particle in the reaction. + + """ + + def __init__(self, particle='neutron'): + self.particle = particle + self.decay_rate = 0.0 + self.emission_mode = 'prompt' + self.distribution = [] + self.applicability = [] + self.yield_ = 1 + + def __repr__(self): + if isinstance(self.yield_, Real): + return "".format( + self.particle, self.emission_mode, self.yield_) + elif isinstance(self.yield_, Tabulated1D): + if np.all(self.yield_.y == self.yield_.y[0]): + return "".format( + self.particle, self.emission_mode, self.yield_.y[0]) + else: + return "".format( + self.particle, self.emission_mode) + else: + return "".format( + self.particle, self.emission_mode) + + @property + def applicability(self): + return self._applicability + + @property + def decay_rate(self): + return self._decay_rate + + @property + def distribution(self): + return self._distribution + + @property + def emission_mode(self): + return self._emission_mode + + @property + def particle(self): + return self._particle + + @property + def yield_(self): + return self._yield + + @applicability.setter + def applicability(self, applicability): + cv.check_type('product distribution applicability', applicability, + Iterable, Tabulated1D) + self._applicability = applicability + + @decay_rate.setter + def decay_rate(self, decay_rate): + cv.check_type('product decay rate', decay_rate, Real) + cv.check_greater_than('product decay rate', decay_rate, 0.0, True) + self._decay_rate = decay_rate + + @distribution.setter + def distribution(self, distribution): + cv.check_type('product angle-energy distribution', distribution, + Iterable, AngleEnergy) + self._distribution = distribution + + @emission_mode.setter + def emission_mode(self, emission_mode): + cv.check_value('product emission mode', emission_mode, + ('prompt', 'delayed', 'total')) + self._emission_mode = emission_mode + + @particle.setter + def particle(self, particle): + cv.check_type('product particle type', particle, basestring) + self._particle = particle + + @yield_.setter + def yield_(self, yield_): + cv.check_type('product yield', yield_, + (Real, Tabulated1D, Polynomial)) + self._yield = yield_ + + def to_hdf5(self, group): + """Write product to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + group.attrs['particle'] = np.string_(self.particle) + group.attrs['emission_mode'] = np.string_(self.emission_mode) + if self.decay_rate > 0.0: + group.attrs['decay_rate'] = self.decay_rate + + # Write yield + if isinstance(self.yield_, Tabulated1D): + self.yield_.to_hdf5(group, 'yield') + dset = group['yield'] + dset.attrs['type'] = np.string_('tabulated') + elif isinstance(self.yield_, Polynomial): + dset = group.create_dataset('yield', data=self.yield_.coef) + dset.attrs['type'] = np.string_('polynomial') + else: + dset = group.create_dataset('yield', data=float(self.yield_)) + dset.attrs['type'] = np.string_('constant') + + # Write applicability/distribution + group.attrs['n_distribution'] = len(self.distribution) + for i, d in enumerate(self.distribution): + dgroup = group.create_group('distribution_{}'.format(i)) + if self.applicability: + self.applicability[i].to_hdf5(dgroup, 'applicability') + d.to_hdf5(dgroup) + + @classmethod + def from_hdf5(cls, group): + """Generate reaction product from HDF5 data + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.Product + Reaction product + + """ + particle = group.attrs['particle'].decode() + p = cls(particle) + + p.emission_mode = group.attrs['emission_mode'].decode() + if 'decay_rate' in group.attrs: + p.decay_rate = group.attrs['decay_rate'] + + # Read yield + yield_type = group['yield'].attrs['type'].decode() + if yield_type == 'constant': + p.yield_ = group['yield'].value + elif yield_type == 'polynomial': + p.yield_ = Polynomial(group['yield'].value) + elif yield_type == 'tabulated': + p.yield_ = Tabulated1D.from_hdf5(group['yield']) + + # Read applicability/distribution + n_distribution = group.attrs['n_distribution'] + distribution = [] + applicability = [] + for i in range(n_distribution): + dgroup = group['distribution_{}'.format(i)] + if 'applicability' in dgroup: + applicability.append(Tabulated1D.from_hdf5( + dgroup['applicability'])) + distribution.append(AngleEnergy.from_hdf5(dgroup)) + + p.distribution = distribution + p.applicability = applicability + + return p diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py new file mode 100644 index 000000000..663b6472c --- /dev/null +++ b/openmc/data/thermal.py @@ -0,0 +1,92 @@ +from collections import Iterable +from numbers import Real + +import numpy as np + +import openmc.checkvalue as cv + + +class CoherentElastic(object): + """Coherent elastic scattering data from a crystalline material + + Parameters + ---------- + bragg_edges : Iterable of float + Bragg edge energies in MeV + factors : Iterable of float + Partial sum of structure factors, :math:`\sum\limits_{i=1}^{E_i= 3: basestring = str +_INTERPOLATION_SCHEMES = ['histogram', 'linear-linear', 'linear-log', + 'log-linear', 'log-log'] + class Univariate(object): """Probability distribution of a single random variable. @@ -27,6 +32,10 @@ class Univariate(object): def to_xml(self, element_name): return '' + @abstractmethod + def __len__(self): + return 0 + class Discrete(Univariate): """Distribution characterized by a probability mass function. @@ -56,6 +65,9 @@ class Discrete(Univariate): self.x = x self.p = p + def __len__(self): + return len(self.x) + @property def x(self): return self._x @@ -114,6 +126,9 @@ class Uniform(Univariate): self.a = a self.b = b + def __len__(self): + return 2 + @property def a(self): return self._a @@ -132,6 +147,12 @@ class Uniform(Univariate): cv.check_type('Uniform b', b, Real) self._b = b + def to_tabular(self): + prob = 1./(self.b - self.a) + t = Tabular([self.a, self.b], [prob, prob], 'histogram') + t.c = [0., 1.] + return t + def to_xml(self, element_name): element = ET.Element(element_name) element.set("type", "uniform") @@ -162,6 +183,9 @@ class Maxwell(Univariate): super(Maxwell, self).__init__() self.theta = theta + def __len__(self): + return 1 + @property def theta(self): return self._theta @@ -207,6 +231,9 @@ class Watt(Univariate): self.a = a self.b = b + def __len__(self): + return 2 + @property def a(self): return self._a @@ -238,8 +265,8 @@ class Tabular(Univariate): """Piecewise continuous probability distribution. This class is used to represent a probability distribution whose density - function is tabulated at specific values and is either histogram or linearly - interpolated between points. + function is tabulated at specific values with a specified interpolation + scheme. Parameters ---------- @@ -247,9 +274,11 @@ class Tabular(Univariate): Tabulated values of the random variable p : Iterable of float Tabulated probabilities - interpolation : {'histogram', 'linear-linear'}, optional + interpolation : {'histogram', 'linear-linear', 'linear-log', 'log-linear', 'log-log'}, optional Indicate whether the density function is constant between tabulated - points or linearly-interpolated. + points or linearly-interpolated. Defaults to 'linear-linear'. + ignore_negative : bool + Ignore negative probabilities Attributes ---------- @@ -257,18 +286,23 @@ class Tabular(Univariate): Tabulated values of the random variable p : Iterable of float Tabulated probabilities - interpolation : {'histogram', 'linear-linear'}, optional + interpolation : {'histogram', 'linear-linear', 'linear-log', 'log-linear', 'log-log'}, optional Indicate whether the density function is constant between tabulated points or linearly-interpolated. """ - def __init__(self, x, p, interpolation='linear-linear'): + def __init__(self, x, p, interpolation='linear-linear', + ignore_negative=False): super(Tabular, self).__init__() + self._ignore_negative = ignore_negative self.x = x self.p = p self.interpolation = interpolation + def __len__(self): + return len(self.x) + @property def x(self): return self._x @@ -289,14 +323,14 @@ class Tabular(Univariate): @p.setter def p(self, p): cv.check_type('tabulated probabilities', p, Iterable, Real) - for pk in p: - cv.check_greater_than('tabulated probability', pk, 0.0, True) + if not self._ignore_negative: + for pk in p: + cv.check_greater_than('tabulated probability', pk, 0.0, True) self._p = p @interpolation.setter def interpolation(self, interpolation): - cv.check_value('interpolation', interpolation, - ['linear-linear', 'histogram']) + cv.check_value('interpolation', interpolation, _INTERPOLATION_SCHEMES) self._interpolation = interpolation def to_xml(self, element_name): @@ -308,3 +342,103 @@ class Tabular(Univariate): params.text = ' '.join(map(str, self.x)) + ' ' + ' '.join(map(str, self.p)) return element + + +class Legendre(Univariate): + r"""Probability density given by a Legendre polynomial expansion + :math:`\sum\limits_{\ell=0}^N \frac{2\ell + 1}{2} a_\ell P_\ell(\mu)`. + + Parameters + ---------- + coefficients : Iterable of Real + Expansion coefficients :math:`a_\ell`. Note that the :math:`(2\ell + + 1)/2` factor should not be included. + + Attributes + ---------- + coefficients : Iterable of Real + Expansion coefficients :math:`a_\ell`. Note that the :math:`(2\ell + + 1)/2` factor should not be included. + + """ + + def __init__(self, coefficients): + self.coefficients = coefficients + + def __call__(self, x): + return self._legendre_polynomial(x) + + def __len__(self): + return len(self._legendre_polynomial.coef) + + @property + def coefficients(self): + poly = self._legendre_polynomial + l = np.arange(poly.degree() + 1) + return 2./(2.*l + 1.) * poly.coef + + @coefficients.setter + def coefficients(self, coefficients): + cv.check_type('Legendre expansion coefficients', coefficients, + Iterable, Real) + for l in range(len(coefficients)): + coefficients[l] *= (2.*l + 1.)/2. + self._legendre_polynomial = np.polynomial.legendre.Legendre( + coefficients) + + def to_xml(self, element_name): + raise NotImplementedError + + +class Mixture(Univariate): + """Probability distribution characterized by a mixture of random variables. + + Parameters + ---------- + probability : Iterable of Real + Probability of selecting a particular distribution + distribution : Iterable of Univariate + List of distributions with corresponding probabilities + + Attributes + ---------- + probability : Iterable of Real + Probability of selecting a particular distribution + distribution : Iterable of Univariate + List of distributions with corresponding probabilities + + """ + + def __init__(self, probability, distribution): + super(Mixture, self).__init__() + self.probability = probability + self.distribution = distribution + + def __len__(self): + return sum(len(d) for d in self.distribution) + + @property + def probability(self): + return self._probability + + @property + def distribution(self): + return self._distribution + + @probability.setter + def probability(self, probability): + cv.check_type('mixture distribution probabilities', probability, + Iterable, Real) + for p in probability: + cv.check_greater_than('mixture distribution probabilities', + p, 0.0, True) + self._probability = probability + + @distribution.setter + def distribution(self, distribution): + cv.check_type('mixture distribution components', distribution, + Iterable, Univariate) + self._distribution = distribution + + def to_xml(self, element_name): + raise NotImplementedError diff --git a/src/ace.F90 b/src/ace.F90 deleted file mode 100644 index 170c885f0..000000000 --- a/src/ace.F90 +++ /dev/null @@ -1,1738 +0,0 @@ -module ace - - use angleenergy_header, only: AngleEnergy - use constants - use distribution_univariate, only: Uniform, Equiprobable, Tabular - use endf, only: is_fission, is_disappearance - use endf_header, only: Constant1D, Tabulated1D, Polynomial - use energy_distribution, only: TabularEquiprobable, LevelInelastic, & - ContinuousTabular, MaxwellEnergy, Evaporation, WattEnergy - use error, only: fatal_error, warning - use global - use list_header, only: ListInt - use material_header, only: Material - use multipole, only: multipole_read - use nuclide_header - use output, only: write_message - use product_header, only: ReactionProduct - use sab_header - use set_header, only: SetChar - use secondary_correlated, only: CorrelatedAngleEnergy - use secondary_kalbach, only: KalbachMann - use secondary_nbody, only: NBodyPhaseSpace - use secondary_uncorrelated, only: UncorrelatedAngleEnergy - use string, only: to_str, to_lower - - implicit none - - integer :: JXS(32) ! Pointers into ACE XSS tables - integer :: NXS(16) ! Descriptors for ACE XSS tables - real(8), allocatable :: XSS(:) ! Cross section data - integer :: XSS_index ! Current index in XSS data - - private :: JXS - private :: NXS - private :: XSS - -contains - -!=============================================================================== -! READ_ACE_XS reads all the cross sections for the problem and stores them in -! nuclides and sab_tables arrays -!=============================================================================== - - subroutine read_ace_xs() - - integer :: i ! index in materials array - integer :: j ! index over nuclides in material - integer :: k ! index over S(a,b) tables in material - integer :: n ! index over resonant scatterers - integer :: i_listing ! index in xs_listings array - integer :: i_nuclide ! index in nuclides - integer :: i_sab ! index in sab_tables - integer :: m ! position for sorting - integer :: temp_nuclide ! temporary value for sorting - integer :: temp_table ! temporary value for sorting - character(12) :: name ! name of isotope, e.g. 92235.03c - character(12) :: alias ! alias of nuclide, e.g. U-235.03c - logical :: mp_found ! if windowed multipole libraries were found - type(Material), pointer :: mat - type(Nuclide), pointer :: nuc - type(SAlphaBeta), pointer :: sab - type(SetChar) :: already_read - - ! allocate arrays for ACE table storage and cross section cache - allocate(nuclides(n_nuclides_total)) - allocate(sab_tables(n_sab_tables)) -!$omp parallel - allocate(micro_xs(n_nuclides_total)) -!$omp end parallel - - ! ========================================================================== - ! READ ALL ACE CROSS SECTION TABLES - - ! Loop over all files - MATERIAL_LOOP: do i = 1, n_materials - mat => materials(i) - - NUCLIDE_LOOP: do j = 1, mat % n_nuclides - name = mat % names(j) - - if (.not. already_read % contains(name)) then - i_listing = xs_listing_dict % get_key(to_lower(name)) - i_nuclide = nuclide_dict % get_key(to_lower(name)) - name = xs_listings(i_listing) % name - alias = xs_listings(i_listing) % alias - - ! Keep track of what listing is associated with this nuclide - nuc => nuclides(i_nuclide) - nuc % listing = i_listing - - ! Read the ACE table into the appropriate entry on the nuclides - ! array - call read_ace_table(i_nuclide, i_listing) - - ! 0K resonant scatterer information, if treating resonance scattering - if (treat_res_scat) then - do n = 1, n_res_scatterers_total - if (name == nuclides_0K(n) % name) then - 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) - nuclides(i_nuclide) % scheme = nuclides_0K(n) % scheme - nuclides(i_nuclide) % scheme = trim(nuclides(i_nuclide) % & - & 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 - i_listing = xs_listing_dict % get_key(nuclides(i_nuclide) % & - & name_0K) - call read_ace_table(i_nuclide, i_listing) - end if - exit - end if - end do - end if - - ! Read multipole file into the appropriate entry on the nuclides array - if (multipole_active) call read_multipole_data(i_nuclide) - - ! Add name and alias to dictionary - call already_read % add(name) - call already_read % add(alias) - end if - end do NUCLIDE_LOOP - - SAB_LOOP: do k = 1, mat % n_sab - ! Get name of S(a,b) table - name = mat % sab_names(k) - - if (.not. already_read % contains(name)) then - i_listing = xs_listing_dict % get_key(to_lower(name)) - i_sab = sab_dict % get_key(to_lower(name)) - - ! Read the ACE table into the appropriate entry on the sab_tables - ! array - call read_ace_table(i_sab, i_listing) - - ! Add name to dictionary - call already_read % add(name) - end if - end do SAB_LOOP - end do MATERIAL_LOOP - - ! ========================================================================== - ! ASSIGN S(A,B) TABLES TO SPECIFIC NUCLIDES WITHIN MATERIALS - - MATERIAL_LOOP2: do i = 1, n_materials - ! Get pointer to material - mat => materials(i) - - ASSIGN_SAB: do k = 1, mat % n_sab - ! In order to know which nuclide the S(a,b) table applies to, we need to - ! search through the list of nuclides for one which has a matching zaid - sab => sab_tables(mat % i_sab_tables(k)) - - ! Loop through nuclides and find match - FIND_NUCLIDE: do j = 1, mat % n_nuclides - if (any(sab % zaid == nuclides(mat % nuclide(j)) % zaid)) then - mat % i_sab_nuclides(k) = j - exit FIND_NUCLIDE - end if - end do FIND_NUCLIDE - - ! Check to make sure S(a,b) table matched a nuclide - if (mat % i_sab_nuclides(k) == NONE) then - call fatal_error("S(a,b) table " // trim(mat % sab_names(k)) & - &// " did not match any nuclide on material " & - &// trim(to_str(mat % id))) - end if - end do ASSIGN_SAB - - ! If there are multiple S(a,b) tables, we need to make sure that the - ! entries in i_sab_nuclides are sorted or else they won't be applied - ! correctly in the cross_section module. The algorithm here is a simple - ! insertion sort -- don't need anything fancy! - - if (mat % n_sab > 1) then - SORT_SAB: do k = 2, mat % n_sab - ! Save value to move - m = k - temp_nuclide = mat % i_sab_nuclides(k) - temp_table = mat % i_sab_tables(k) - - MOVE_OVER: do - ! Check if insertion value is greater than (m-1)th value - if (temp_nuclide >= mat % i_sab_nuclides(m-1)) exit - - ! Move values over until hitting one that's not larger - mat % i_sab_nuclides(m) = mat % i_sab_nuclides(m-1) - mat % i_sab_tables(m) = mat % i_sab_tables(m-1) - m = m - 1 - - ! Exit if we've reached the beginning of the list - if (m == 1) exit - end do MOVE_OVER - - ! Put the original value into its new position - mat % i_sab_nuclides(m) = temp_nuclide - mat % i_sab_tables(m) = temp_table - end do SORT_SAB - end if - - ! Deallocate temporary arrays for names of nuclides and S(a,b) tables - if (allocated(mat % names)) deallocate(mat % names) - - end do MATERIAL_LOOP2 - - ! Avoid some valgrind leak errors - call already_read % clear() - - ! Loop around material - MATERIAL_LOOP3: do i = 1, n_materials - - ! Get material - mat => materials(i) - - ! Loop around nuclides in material - NUCLIDE_LOOP2: do j = 1, mat % n_nuclides - - ! Check for fission in nuclide - if (nuclides(mat % nuclide(j)) % fissionable) then - mat % fissionable = .true. - exit NUCLIDE_LOOP2 - end if - - end do NUCLIDE_LOOP2 - - end do MATERIAL_LOOP3 - - ! Show which nuclide results in lowest energy for neutron transport - do i = 1, n_nuclides_total - if (nuclides(i) % energy(nuclides(i) % n_grid) == energy_max_neutron) then - call write_message("Maximum neutron transport energy: " // & - trim(to_str(energy_max_neutron)) // " MeV for " // & - trim(adjustl(nuclides(i) % name)), 6) - exit - end if - end do - - ! If the user wants multipole, make sure we found a multipole library. - if (multipole_active) then - mp_found = .false. - do i = 1, n_nuclides_total - if (nuclides(i) % mp_present) then - mp_found = .true. - exit - end if - end do - if (.not. mp_found) call warning("Windowed multipole functionality is & - &turned on, but no multipole libraries were found. Set the & - & element in settings.xml or the & - &OPENMC_MULTIPOLE_LIBRARY environment variable.") - end if - - end subroutine read_ace_xs - -!=============================================================================== -! READ_ACE_TABLE reads a single cross section table in either ASCII or binary -! format. This routine reads the header data for each table and then calls -! appropriate subroutines to parse the actual data. -!=============================================================================== - - subroutine read_ace_table(i_table, i_listing) - integer, intent(in) :: i_table ! index in nuclides/sab_tables - integer, intent(in) :: i_listing ! index in xs_listings - - integer :: i ! loop index for XSS records - integer :: j, j1, j2 ! indices in XSS - integer :: record_length ! Fortran record length - integer :: location ! location of ACE table - integer :: entries ! number of entries on each record - integer :: length ! length of ACE table - integer :: unit_ace ! file unit - integer :: zaids(16) ! list of ZAIDs (only used for S(a,b)) - integer :: filetype ! filetype (ASCII or BINARY) - real(8) :: kT ! temperature of table - real(8) :: awrs(16) ! list of atomic weight ratios (not used) - real(8) :: awr ! atomic weight ratio for table - logical :: file_exists ! does ACE library exist? - logical :: data_0K ! are we reading 0K data? - character(7) :: readable ! is ACE library readable? - character(10) :: name ! name of ACE table - character(10) :: date_ ! date ACE library was processed - character(10) :: mat ! material identifier - character(70) :: comment ! comment for ACE table - character(MAX_FILE_LEN) :: filename ! path to ACE cross section library - type(Nuclide), pointer :: nuc - type(SAlphaBeta), pointer :: sab - type(XsListing), pointer :: listing - - ! determine path, record length, and location of table - listing => xs_listings(i_listing) - filename = listing % path - record_length = listing % recl - location = listing % location - entries = listing % entries - filetype = listing % filetype - - ! Check if ACE library exists and is readable - inquire(FILE=filename, EXIST=file_exists, READ=readable) - if (.not. file_exists) then - call fatal_error("ACE library '" // trim(filename) // "' does not exist!") - elseif (readable(1:3) == 'NO') then - call fatal_error("ACE library '" // trim(filename) // "' is not readable!& - & Change file permissions with chmod command.") - end if - - ! display message - call write_message("Loading ACE cross section table: " // listing % name, 6) - - if (filetype == ASCII) then - ! ======================================================================= - ! READ ACE TABLE IN ASCII FORMAT - - ! Find location of table - open(NEWUNIT=unit_ace, FILE=filename, STATUS='old', ACTION='read') - rewind(UNIT=unit_ace) - do i = 1, location - 1 - read(UNIT=unit_ace, FMT=*) - end do - - ! Read first line of header - read(UNIT=unit_ace, FMT='(A10,2G12.0,1X,A10)') name, awr, kT, date_ - - ! Check that correct xs was found -- if cross_sections.xml is broken, the - ! location of the table may be wrong - if(adjustl(name) /= adjustl(listing % name)) then - call fatal_error("XS listing entry " // trim(listing % name) // " did & - ¬ match ACE data, " // trim(name) // " found instead.") - end if - - ! Read more header and NXS and JXS - read(UNIT=unit_ace, FMT=100) comment, mat, & - (zaids(i), awrs(i), i=1,16), NXS, JXS -100 format(A70,A10/4(I7,F11.0)/4(I7,F11.0)/4(I7,F11.0)/4(I7,F11.0)/& - ,8I9/8I9/8I9/8I9/8I9/8I9) - - ! determine table length - length = NXS(1) - allocate(XSS(length)) - - ! Read XSS array - read(UNIT=unit_ace, FMT='(4G20.0)') XSS - - ! Close ACE file - close(UNIT=unit_ace) - - elseif (filetype == BINARY) then - ! ======================================================================= - ! READ ACE TABLE IN BINARY FORMAT - - ! Open ACE file - open(NEWUNIT=unit_ace, FILE=filename, STATUS='old', ACTION='read', & - ACCESS='direct', RECL=record_length) - - ! Read all header information - read(UNIT=unit_ace, REC=location) name, awr, kT, date_, & - comment, mat, (zaids(i), awrs(i), i=1,16), NXS, JXS - - ! determine table length - length = NXS(1) - allocate(XSS(length)) - - ! Read remaining records with XSS - do i = 1, (length + entries - 1)/entries - j1 = 1 + (i-1)*entries - j2 = min(length, j1 + entries - 1) - read(UNIT=UNIT_ACE, REC=location + i) (XSS(j), j=j1,j2) - end do - - ! Close ACE file - close(UNIT=unit_ace) - end if - - ! ========================================================================== - ! PARSE DATA BASED ON NXS, JXS, AND XSS ARRAYS - - select case(listing % type) - case (ACE_NEUTRON) - - ! only read in a resonant scatterers info once - nuc => nuclides(i_table) - data_0K = .false. - if (trim(adjustl(name)) == nuc % name_0K) then - data_0K = .true. - else - nuc % name = name - nuc % awr = awr - nuc % kT = kT - nuc % zaid = listing % zaid - end if - - ! read all blocks - call read_esz(nuc, data_0K) - - ! don't read unnecessary 0K data for resonant scatterers - if (data_0K) then - continue - else - call read_reactions(nuc) - call read_nu_data(nuc) - call read_energy_dist(nuc) - call read_angular_dist(nuc) - call read_unr_res(nuc) - end if - - ! for fissionable nuclides, precalculate microscopic nu-fission cross - ! sections so that we don't need to call the nu_total function during - ! cross section lookups (except if we're dealing w/ 0K data for resonant - ! scatterers) - - if (nuc % fissionable .and. .not. data_0K) then - call generate_nu_fission(nuc) - end if - - case (ACE_THERMAL) - sab => sab_tables(i_table) - sab % name = name - sab % awr = awr - sab % kT = kT - ! Find sab % n_zaid - do i = 1, 16 - if (zaids(i) == 0) then - sab % n_zaid = i - 1 - exit - end if - end do - allocate(sab % zaid(sab % n_zaid)) - sab % zaid = zaids(1: sab % n_zaid) - - call read_thermal_data(sab) - end select - - deallocate(XSS) - - end subroutine read_ace_table - -!=============================================================================== -! READ_MULTIPOLE_DATA checks for the existence of a multipole library in the -! directory and loads it using multipole_read -!=============================================================================== - - subroutine read_multipole_data(i_table) - - integer, intent(in) :: i_table ! index in nuclides/sab_tables - - logical :: file_exists ! Does multipole library exist? - character(7) :: readable ! Is multipole library readable? - character(6) :: zaid_string ! String of the ZAID - character(MAX_FILE_LEN+9) :: filename ! Path to multipole xs library - - ! For the time being, and I know this is a bit hacky, we just assume - ! that the file will be zaid.h5. - associate (nuc => nuclides(i_table)) - - write(zaid_string, '(I6.6)') nuc % zaid - filename = trim(path_multipole) // zaid_string // ".h5" - - ! Check if Multipole library exists and is readable - inquire(FILE=filename, EXIST=file_exists, READ=readable) - if (.not. file_exists) then - nuc % mp_present = .false. - return - elseif (readable(1:3) == 'NO') then - call fatal_error("Multipole library '" // trim(filename) // "' is not & - &readable! Change file permissions with chmod command.") - end if - - ! Display message - call write_message("Loading Multipole XS table: " // filename, 6) - - allocate(nuc % multipole) - - ! Call the read routine - call multipole_read(filename, nuc % multipole, i_table) - nuc % mp_present = .true. - - ! Recreate nu-fission tables - if (nuc % fissionable) then - call generate_nu_fission(nuc) - end if - - end associate - - end subroutine read_multipole_data - -!=============================================================================== -! READ_ESZ - reads through the ESZ block. This block contains the energy grid, -! total xs, absorption xs, elastic scattering xs, and heating numbers. -!=============================================================================== - - subroutine read_esz(nuc, data_0K) - type(Nuclide), intent(inout) :: nuc - logical, intent(in) :: data_0K ! are we reading 0K data? - - integer :: NE ! number of energy points for total and elastic cross sections - integer :: i ! index in 0K elastic xs array for this nuclide - - real(8) :: xs_cdf_sum = ZERO ! xs cdf value - - ! determine number of energy points - NE = NXS(3) - - ! allocate storage for energy grid and cross section arrays - - ! read in 0K data if we've already read in non-0K data - if (data_0K) then - nuc % n_grid_0K = NE - allocate(nuc % energy_0K(NE)) - allocate(nuc % elastic_0K(NE)) - allocate(nuc % xs_cdf(NE)) - nuc % elastic_0K = ZERO - nuc % xs_cdf = ZERO - XSS_index = 1 - nuc % energy_0K = get_real(NE) - - ! Skip total and absorption - XSS_index = XSS_index + 2*NE - - ! Continue reading elastic scattering and heating - nuc % elastic_0K = get_real(NE) - - do i = 1, nuc % n_grid_0K - 1 - - ! Negative cross sections result in a CDF that is not monotonically - ! increasing. Set all negative xs values to ZERO. - 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)) - nuc % xs_cdf(i) = xs_cdf_sum - end do - - else ! read in non-0K data - nuc % n_grid = NE - allocate(nuc % energy(NE)) - allocate(nuc % total(NE)) - allocate(nuc % elastic(NE)) - allocate(nuc % fission(NE)) - allocate(nuc % nu_fission(NE)) - allocate(nuc % absorption(NE)) - - ! initialize cross sections - nuc % total = ZERO - nuc % elastic = ZERO - nuc % fission = ZERO - nuc % nu_fission = ZERO - nuc % absorption = ZERO - - ! Read data from XSS -- only the energy grid, elastic scattering and heating - ! cross section values are actually read from here. The total and absorption - ! cross sections are reconstructed from the partial reaction data. - - XSS_index = 1 - nuc % energy = get_real(NE) - - ! Skip total and absorption - XSS_index = XSS_index + 2*NE - - ! Continue reading elastic scattering and heating - nuc % elastic = get_real(NE) - - ! Determine if minimum/maximum energy for this nuclide is greater/less - ! than the previous - energy_min_neutron = max(energy_min_neutron, nuc%energy(1)) - energy_max_neutron = min(energy_max_neutron, nuc%energy(NE)) - end if - - end subroutine read_esz - -!=============================================================================== -! READ_NU_DATA reads data given on the number of neutrons emitted from fission -! as a function of the incoming energy of a neutron. This data may be broken -! down into prompt and delayed neutrons emitted as well. -!=============================================================================== - - subroutine read_nu_data(nuc) - type(Nuclide), intent(inout) :: nuc - - integer :: i, j ! loop index - integer :: idx ! index in XSS - integer :: KNU ! location for nu data - integer :: LNU ! type of nu data (polynomial or tabular) - integer :: NR ! number of interpolation regions - integer :: NE ! number of energies - integer :: NPCR ! number of delayed neutron precursor groups - integer :: LOCC ! location of energy distributions for given MT - integer :: LAW - integer :: IDAT - real(8) :: total_group_probability - type(Tabulated1D) :: yield_delayed - type(Tabulated1D) :: group_probability - - if (JXS(2) == 0) then - ! Nuclide is not fissionable - return - end if - - ! Determine number of delayed neutron precursors - if (JXS(24) > 0) then - NPCR = NXS(8) - else - NPCR = 0 - end if - nuc % n_precursor = NPCR - - ! Check to make sure nuclide does not have more than the maximum number - ! of delayed groups - if (NPCR > MAX_DELAYED_GROUPS) then - call fatal_error("Encountered nuclide with " // trim(to_str(NPCR)) & - // " delayed groups while the maximum number of delayed groups is " & - // trim(to_str(MAX_DELAYED_GROUPS))) - end if - - associate (rx => nuc % reactions(nuc % index_fission(1))) - ! Allocate space for prompt/delayed neutron products - allocate(rx % products(1 + NPCR)) - rx % products(:) % particle = NEUTRON - - if (XSS(JXS(2)) > 0) then - ! ======================================================================= - ! PROMPT OR TOTAL NU DATA - - ! If delayed data is present, then prompt data must be present. Otherwise - ! the product represents 'total' neutron emission - if (JXS(24) > 0) then - rx % products(1) % emission_mode = EMISSION_PROMPT - else - rx % products(1) % emission_mode = EMISSION_TOTAL - end if - - KNU = JXS(2) - LNU = nint(XSS(KNU)) - if (LNU == 1) then - ! Polynomial data - allocate(Polynomial :: rx % products(1) % yield) - - ! determine order of polynomial and read coefficients - select type (yield => rx % products(1) % yield) - type is (Polynomial) - call yield % from_ace(XSS, KNU + 1) - end select - - elseif (LNU == 2) then - ! Tabulated data - allocate(Tabulated1D :: rx % products(1) % yield) - - select type(yield => rx % products(1) % yield) - type is (Tabulated1D) - call yield % from_ace(XSS, KNU + 1) - end select - - end if - - elseif (XSS(JXS(2)) < 0) then - ! ======================================================================= - ! PROMPT AND TOTAL NU DATA - - rx % products(1) % emission_mode = EMISSION_PROMPT - - KNU = JXS(2) + 1 - LNU = nint(XSS(KNU)) - if (LNU == 1) then - ! Polynomial data - allocate(Polynomial :: rx % products(1) % yield) - - ! determine order of polynomial and read coefficients - select type (yield => rx % products(1) % yield) - type is (Polynomial) - call yield % from_ace(XSS, KNU + 1) - end select - - elseif (LNU == 2) then - ! Tabulated data - allocate(Tabulated1D :: rx % products(1) % yield) - - select type(yield => rx % products(1) % yield) - type is (Tabulated1D) - call yield % from_ace(XSS, KNU + 1) - end select - end if - - KNU = JXS(2) + nint(abs(XSS(JXS(2)))) + 1 - LNU = nint(XSS(KNU)) - if (LNU == 1) then - ! Polynomial data - allocate(Polynomial :: nuc % total_nu) - - ! determine order of polynomial and read coefficients - select type (yield => nuc % total_nu) - type is (Polynomial) - call yield % from_ace(XSS, KNU + 1) - end select - - elseif (LNU == 2) then - ! Tabulated data - allocate(Tabulated1D :: nuc % total_nu) - - select type(yield => nuc % total_nu) - type is (Tabulated1D) - call yield % from_ace(XSS, KNU + 1) - end select - end if - end if - - if (JXS(24) > 0) then - ! ======================================================================= - ! DELAYED NU DATA - - ! Read total yield of delayed neutrons - call yield_delayed % from_ace(XSS, JXS(24) + 1) - - idx = JXS(25) - total_group_probability = ZERO - do i = 1, NPCR - ! Set emission mode and decay rate - rx % products(1 + i) % emission_mode = EMISSION_DELAYED - rx % products(1 + i) % decay_rate = XSS(idx) - - ! Read probability for this precursor group - call group_probability % from_ace(XSS, idx + 1) - - ! Set yield based on product of group probability and delayed yield - if (all(group_probability % y == group_probability % y(1))) then - allocate(Tabulated1D :: rx % products(1 + i) % yield) - select type (yield => rx % products(1 + i) % yield) - type is (Tabulated1D) - yield = yield_delayed - yield % y(:) = yield % y(:) * group_probability % y(1) - total_group_probability = total_group_probability + group_probability % y(1) - end select - else - call fatal_error("Delayed neutron with energy-dependent group & - &probability not implemented") - end if - - ! Advance position - NR = nint(XSS(idx + 1)) - NE = nint(XSS(idx + 2 + 2*NR)) - idx = idx + 3 + 2*(NR + NE) - - ! ======================================================================= - ! DELAYED NEUTRON ENERGY DISTRIBUTION - - ! Read energy distribution - LOCC = nint(XSS(JXS(26) + i - 1)) - - ! Determine law and location of data - LAW = nint(XSS(JXS(27) + LOCC)) - IDAT = nint(XSS(JXS(27) + LOCC + 1)) - - ! read energy distribution data - associate(p => rx % products(1 + i)) - allocate(p % applicability(1)) - allocate(p % distribution(1)) - call get_energy_dist(p % distribution(1) % obj, LAW, JXS(27), IDAT, & - ZERO, ZERO) - - select type (aedist => p % distribution(1) % obj) - type is (UncorrelatedAngleEnergy) - aedist % fission = .true. - end select - end associate - end do - - ! Renormalize delayed neutron yields to reflect fact that in ACE file, the - ! sum of the group probabilities is not exactly one - do i = 1, NPCR - select type (yield => rx % products(1 + i) % yield) - type is (Tabulated1D) - yield % y(:) = yield % y(:) / total_group_probability - end select - end do - end if - - ! Assign products to other fission reactions - do i = 2, nuc % n_fission - j = nuc % index_fission(i) - allocate(nuc % reactions(j) % products(1 + NPCR)) - nuc % reactions(j) % products(:) = rx % products(:) - end do - end associate - - end subroutine read_nu_data - -!=============================================================================== -! READ_REACTIONS - Get the list of reaction MTs for this cross-section -! table. The MT values are somewhat arbitrary. Also read in Q-values, neutron -! multiplicities, and cross-sections. -!=============================================================================== - - subroutine read_reactions(nuc) - type(Nuclide), intent(inout) :: nuc - - integer :: i ! loop indices - integer :: i_fission ! index in nuc % index_fission - integer :: LMT ! index of MT list in XSS - integer :: NMT ! Number of reactions - integer :: JXS4 ! index of Q values in XSS - integer :: JXS5 ! index of neutron multiplicities in XSS - integer :: JXS7 ! index of reactions cross-sections in XSS - integer :: LXS ! location of cross-section locators - integer :: LOCA ! location of cross-section for given MT - integer :: IE ! reaction's starting index on energy grid - integer :: NE ! number of energies - real(8) :: y - type(ListInt) :: MTs - - LMT = JXS(3) - JXS4 = JXS(4) - JXS5 = JXS(5) - LXS = JXS(6) - JXS7 = JXS(7) - NMT = NXS(4) - - ! allocate array of reactions. Add one since we need to include an elastic - ! scattering channel - nuc % n_reaction = NMT + 1 - allocate(nuc % reactions(NMT+1)) - - ! Store elastic scattering cross-section on reaction one -- note that the - ! sigma array is not allocated or stored for elastic scattering since it is - ! already stored in nuc % elastic - associate (rxn => nuc % reactions(1)) - rxn % MT = 2 - rxn % Q_value = ZERO - allocate(rxn % products(1)) - rxn % products(1) % particle = NEUTRON - allocate(Constant1D :: rxn % products(1) % yield) - select type(yield => rxn % products(1) % yield) - type is (Constant1D) - yield % y = 1 - end select - rxn % threshold = 1 - rxn % scatter_in_cm = .true. - allocate(rxn % products(1) % distribution(1)) - allocate(UncorrelatedAngleEnergy :: rxn % products(1) % distribution(1) % obj) - end associate - - ! Add contribution of elastic scattering to total cross section - nuc % total = nuc % total + nuc % elastic - - ! By default, set nuclide to not fissionable and then change if fission - ! reactions are encountered - nuc % fissionable = .false. - nuc % has_partial_fission = .false. - nuc % n_fission = 0 - i_fission = 0 - - do i = 1, NMT - associate (rxn => nuc % reactions(i+1)) - ! read MT number, Q-value, and neutrons produced - rxn % MT = int(XSS(LMT + i - 1)) - rxn % Q_value = XSS(JXS4 + i - 1) - rxn % scatter_in_cm = (nint(XSS(JXS5 + i - 1)) < 0) - - if (.not. is_fission(rxn % MT)) then - allocate(rxn % products(1)) - rxn % products(1) % particle = NEUTRON - - y = abs(nint(XSS(JXS5 + i - 1))) - if (y > 100) then - ! Read energy-dependent multiplicities - - ! Set flag and allocate space for Tabulated1D to store yield - allocate(Tabulated1D :: rxn % products(1) % yield) - - ! Read yield function - select type (yield => rxn % products(1) % yield) - type is (Tabulated1D) - XSS_index = JXS(11) + int(y) - 101 - call yield % from_ace(XSS, XSS_index) - end select - else - ! Integral yield - allocate(Constant1D :: rxn % products(1) % yield) - select type (yield => rxn % products(1) % yield) - type is (Constant1D) - yield % y = y - end select - end if - end if - - ! read starting energy index - LOCA = int(XSS(LXS + i - 1)) - IE = int(XSS(JXS7 + LOCA - 1)) - rxn % threshold = IE - - ! read number of energies cross section values - NE = int(XSS(JXS7 + LOCA)) - allocate(rxn % sigma(NE)) - XSS_index = JXS7 + LOCA + 1 - rxn % sigma = get_real(NE) - end associate - end do - - ! Create set of MT values - do i = 1, size(nuc % reactions) - call MTs % append(nuc % reactions(i) % MT) - call nuc%reaction_index%add_key(nuc%reactions(i)%MT, i) - end do - - ! Create total, absorption, and fission cross sections - do i = 2, size(nuc % reactions) - associate (rxn => nuc % reactions(i)) - IE = rxn % threshold - NE = size(rxn % sigma) - - ! Skip total inelastic level scattering, gas production cross sections - ! (MT=200+), etc. - if (rxn % MT == N_LEVEL .or. rxn % MT == N_NONELASTIC) cycle - if (rxn % MT > N_5N2P .and. rxn % MT < N_P0) cycle - - ! Skip level cross sections if total is available - if (rxn % MT >= N_P0 .and. rxn % MT <= N_PC .and. MTs % contains(N_P)) cycle - if (rxn % MT >= N_D0 .and. rxn % MT <= N_DC .and. MTs % contains(N_D)) cycle - if (rxn % MT >= N_T0 .and. rxn % MT <= N_TC .and. MTs % contains(N_T)) cycle - if (rxn % MT >= N_3HE0 .and. rxn % MT <= N_3HEC .and. MTs % contains(N_3HE)) cycle - if (rxn % MT >= N_A0 .and. rxn % MT <= N_AC .and. MTs % contains(N_A)) cycle - if (rxn % MT >= N_2N0 .and. rxn % MT <= N_2NC .and. MTs % contains(N_2N)) cycle - - ! Add contribution to total cross section - nuc % total(IE:IE+NE-1) = nuc % total(IE:IE+NE-1) + rxn % sigma - - ! Add contribution to absorption cross section - if (is_disappearance(rxn % MT)) then - nuc % absorption(IE:IE+NE-1) = nuc % absorption(IE:IE+NE-1) + rxn % sigma - end if - - ! Information about fission reactions - if (rxn % MT == N_FISSION) then - allocate(nuc % index_fission(1)) - elseif (rxn % MT == N_F) then - allocate(nuc % index_fission(PARTIAL_FISSION_MAX)) - nuc % has_partial_fission = .true. - end if - - ! Add contribution to fission cross section - if (is_fission(rxn % MT)) then - nuc % fissionable = .true. - nuc % fission(IE:IE+NE-1) = nuc % fission(IE:IE+NE-1) + rxn % sigma - - ! Also need to add fission cross sections to absorption - nuc % absorption(IE:IE+NE-1) = nuc % absorption(IE:IE+NE-1) + rxn % sigma - - ! If total fission reaction is present, there's no need to store the - ! reaction cross-section since it was copied to nuc % fission - if (rxn % MT == N_FISSION) deallocate(rxn % sigma) - - ! Keep track of this reaction for easy searching later - i_fission = i_fission + 1 - nuc % index_fission(i_fission) = i - nuc % n_fission = nuc % n_fission + 1 - end if - end associate - end do - - ! Clear MTs set - call MTs % clear() - - end subroutine read_reactions - -!=============================================================================== -! READ_ANGULAR_DIST parses the angular distribution for each reaction with -! secondary neutrons -!=============================================================================== - - subroutine read_angular_dist(nuc) - type(Nuclide), intent(inout) :: nuc - - integer :: LOCB ! location of angular distribution for given MT - integer :: NE ! number of incoming energies - integer :: NP ! number of points for cosine distribution - integer :: i ! index in reactions array - integer :: j ! index over incoming energies - integer :: k ! index over energy distributions - integer :: interp - integer, allocatable :: LC(:) ! locator - - ! loop over all reactions with secondary neutrons -- NXS(5) does not include - ! elastic scattering - do i = 1, NXS(5) + 1 - associate (rxn => nuc%reactions(i)) - ! find location of angular distribution - LOCB = int(XSS(JXS(8) + i - 1)) - - ! Angular distribution given as part of a correlated angle-energy distribution - if (LOCB == -1) cycle - - ! No angular distribution data are given for this reaction, isotropic - ! scattering is assumed (in CM if TY < 0 and in LAB if TY > 0) - if (LOCB == 0) cycle - - ! Loop over each separate energy distribution. Even though there is only - ! "one" angular distribution, it is repeated as many times as there are - ! energy distributions for this reaction since the - ! UncorrelatedAngleEnergy type holds one angle and energy distribution. - do k = 1, size(rxn % products(1) % distribution) - select type (aedist => rxn % products(1) % distribution(k) % obj) - type is (UncorrelatedAngleEnergy) - ! allocate space for incoming energies and locations - NE = int(XSS(JXS(9) + LOCB - 1)) - allocate(aedist % angle % energy(NE)) - allocate(aedist % angle % distribution(NE)) - allocate(LC(NE)) - - ! read incoming energy grid and location of nucs - XSS_index = JXS(9) + LOCB - aedist % angle % energy(:) = get_real(NE) - LC(:) = get_int(NE) - - ! determine dize of data block - do j = 1, NE - if (LC(j) == 0) then - ! isotropic - allocate(Uniform :: aedist % angle % distribution(j) % obj) - select type (adist => aedist % angle % distribution(j) % obj) - type is (Uniform) - adist % a = -ONE - adist % b = ONE - end select - - elseif (LC(j) > 0) then - ! 32 equiprobable bins - allocate(Equiprobable :: aedist % angle % distribution(j) % obj) - select type (adist => aedist % angle % distribution(j) % obj) - type is (Equiprobable) - allocate(adist % x(33)) - end select - - elseif (LC(j) < 0) then - ! tabular distribution - allocate(Tabular :: aedist % angle % distribution(j) % obj) - end if - end do - - ! read angular distribution -- currently this does not actually parse the - ! angular distribution tables for each incoming energy, that must be done - ! on-the-fly - do j = 1, NE - XSS_index = JXS(9) + abs(LC(j)) - 1 - select type(adist => aedist % angle % distribution(j) % obj) - type is (Equiprobable) - adist % x(:) = get_real(33) - type is (Tabular) - ! determine interpolation and number of points - interp = nint(XSS(XSS_index)) - NP = nint(XSS(XSS_index + 1)) - - ! Get probability density data - XSS_index = XSS_index + 2 - allocate(adist % x(NP), adist % p(NP), adist % c(NP)) - adist % x(:) = get_real(NP) - adist % p(:) = get_real(NP) - adist % c(:) = get_real(NP) - end select - end do - deallocate(LC) - - end select - end do - end associate - end do - - end subroutine read_angular_dist - -!=============================================================================== -! READ_ENERGY_DIST parses the secondary energy distribution for each reaction -! with seconary neutrons (except elastic scattering) -!=============================================================================== - - subroutine read_energy_dist(nuc) - type(Nuclide), intent(inout) :: nuc - - integer :: i ! loop index - integer :: n - integer :: IDAT ! locator for distribution data - integer :: LNW ! location of next energy law - integer :: LAW ! Type of energy law - - ! Loop over all reactions - do i = 1, NXS(5) - ! Determine how many energy distributions are present for this reaction - LNW = nint(XSS(JXS(10) + i - 1)) - n = 0 - do while (LNW > 0) - n = n + 1 - LNW = nint(XSS(JXS(11) + LNW - 1)) - end do - - ! Allocate space for distributions and probability of validity - associate (p => nuc % reactions(i + 1) % products(1)) - allocate(p % applicability(n)) - allocate(p % distribution(n)) - - LNW = nint(XSS(JXS(10) + i - 1)) - n = 0 - do while (LNW > 0) - n = n + 1 - - ! Determine energy law and location of data - LAW = nint(XSS(JXS(11) + LNW)) - IDAT = nint(XSS(JXS(11) + LNW + 1)) - - ! Read probability of law validity - call p % applicability(n) % from_ace(XSS, JXS(11) + LNW + 2) - - ! Read energy law data - call get_energy_dist(p % distribution(n) % obj, LAW, & - JXS(11), IDAT, nuc % awr, nuc % reactions(i + 1) % Q_value) - - ! <<<<<<<<<<<<<<<<<<<<<<<<<<<< REMOVE THIS <<<<<<<<<<<<<<<<<<<<<<<<<<< - ! Before the secondary distribution refactor, when the angle/energy - ! distribution was uncorrelated, no angle was actually sampled. With - ! the refactor, an angle is always sampled for an uncorrelated - ! distribution even when no angle distribution exists in the ACE file - ! (isotropic is assumed). To preserve the RNG stream, we explicitly - ! mark fission reactions so that we avoid the angle sampling. - if (any(nuc % reactions(i + 1) % MT == & - [N_FISSION, N_F, N_NF, N_2NF, N_3NF])) then - select type (aedist => p % distribution(n) % obj) - type is (UncorrelatedAngleEnergy) - aedist % fission = .true. - end select - end if - ! <<<<<<<<<<<<<<<<<<<<<<<<<<<< REMOVE THIS <<<<<<<<<<<<<<<<<<<<<<<<<<< - - ! Get locator for next distribution - LNW = nint(XSS(JXS(11) + LNW - 1)) - end do - end associate - end do - - end subroutine read_energy_dist - -!=============================================================================== -! GET_ENERGY_DIST reads in data for a single law for an energy distribution and -! calls itself recursively if there are multiple energy distributions for a -! single reaction -!=============================================================================== - - recursive subroutine get_energy_dist(aedist, law, LDIS, IDAT, awr, Q_value) - class(AngleEnergy), allocatable, intent(inout) :: aedist - integer, intent(in) :: law - integer, intent(in) :: LDIS - integer, intent(in) :: IDAT - real(8), intent(in) :: awr - real(8), intent(in) :: Q_value - - integer :: i, j - integer :: NR ! number of interpolation regions - integer :: NE ! number of incoming energies - integer :: NP ! number of outgoing energies/angles - integer :: interp - integer, allocatable :: L(:) ! locations of distributions for each Ein - integer, allocatable :: LC(:) ! locations of distributions for each Ein - - XSS_index = LDIS + IDAT - 1 - - if (law == 44) then - allocate(KalbachMann :: aedist) - elseif (law == 61) then - allocate(CorrelatedAngleEnergy :: aedist) - elseif (law == 66) then - allocate(NBodyPhaseSpace :: aedist) - else - allocate(UncorrelatedAngleEnergy :: aedist) - end if - - select type (aedist) - type is (UncorrelatedAngleEnergy) - ! ======================================================================== - ! UNCORRELATED ENERGY DISTRIBUTIONS - - select case (law) - case (1) - allocate(TabularEquiprobable :: aedist % energy) - select type (edist => aedist % energy) - type is (TabularEquiprobable) - NR = nint(XSS(XSS_index)) - NE = nint(XSS(XSS_index + 1 + 2*NR)) - if (NR > 0) then - call fatal_error("Multiple interpolation regions not yet supported & - &for tabular equiprobable energy distributions.") - end if - edist % n_region = NR - - ! Read incoming energies for which outgoing energies are tabulated - allocate(edist % energy_in(NE)) - XSS_index = XSS_index + 2 + 2*NR - edist % energy_in(:) = get_real(NE) - - ! Read outgoing energy tables - NP = nint(XSS(XSS_index)) - allocate(edist % energy_out(NP, NE)) - XSS_index = XSS_index + 1 - do i = 1, NE - edist % energy_out(:, i) = get_real(NP) - end do - end select - - case (3) - allocate(LevelInelastic :: aedist % energy) - select type (edist => aedist % energy) - type is (LevelInelastic) - edist % threshold = XSS(XSS_index) - edist % mass_ratio = XSS(XSS_index + 1) - end select - - case (4) - allocate(ContinuousTabular :: aedist % energy) - select type (edist => aedist % energy) - type is (ContinuousTabular) - NR = nint(XSS(XSS_index)) - XSS_index = XSS_index + 1 - if (NR > 1) then - call fatal_error("Multiple interpolation regions not yet supported & - &for continuous tabular energy distributions.") - end if - edist % n_region = NR - - ! Read breakpoints and interpolation parameters - if (NR > 0) then - allocate(edist % breakpoints(NR)) - allocate(edist % interpolation(NR)) - edist % breakpoints(:) = get_int(NR) - edist % interpolation(:) = get_int(NR) - end if - - ! Read incoming energies for which outgoing energies are tabulated and - ! locators - NE = nint(XSS(XSS_index)) - XSS_index = XSS_index + 1 - allocate(edist % energy(NE)) - allocate(L(NE)) - edist % energy(:) = get_real(NE) - L(:) = get_int(NE) - - ! Read outgoing energy tables - allocate(edist % distribution(NE)) - do i = 1, NE - ! Determine interpolation and number of discrete points - XSS_index = LDIS + L(i) - 1 - interp = nint(XSS(XSS_index)) - edist % distribution(i) % interpolation = mod(interp, 10) - edist % distribution(i) % n_discrete = (interp - & - edist % distribution(i) % interpolation)/10 - - ! check for discrete lines present - if (edist % distribution(i) % n_discrete > 0) then - call fatal_error("Discrete lines in continuous tabular & - &distribution not yet supported") - end if - - ! Determine number of points and allocate space - NP = nint(XSS(XSS_index + 1)) - allocate(edist % distribution(i) % e_out(NP)) - allocate(edist % distribution(i) % p(NP)) - allocate(edist % distribution(i) % c(NP)) - - ! Read tabular PDF for outgoing energy - XSS_index = XSS_index + 2 - edist % distribution(i) % e_out(:) = get_real(NP) - edist % distribution(i) % p(:) = get_real(NP) - edist % distribution(i) % c(:) = get_real(NP) - end do - - deallocate(L) - end select - - case (7) - allocate(MaxwellEnergy :: aedist % energy) - select type (edist => aedist % energy) - type is (MaxwellEnergy) - call edist % theta % from_ace(XSS, XSS_index) - edist % u = XSS(XSS_index + 2 + 2*edist % theta % n_regions + & - 2*edist % theta % n_pairs) - end select - - case (9) - allocate(Evaporation :: aedist % energy) - select type(edist => aedist % energy) - type is (Evaporation) - call edist % theta % from_ace(XSS, XSS_index) - edist % u = XSS(XSS_index + 2 + 2*edist % theta % n_regions + & - 2*edist % theta % n_pairs) - end select - - case (11) - allocate(WattEnergy :: aedist % energy) - select type(edist => aedist % energy) - type is (WattEnergy) - call edist % a % from_ace(XSS, XSS_index) - XSS_index = XSS_index + 2 + 2*edist % a % n_regions + 2*edist % a % n_pairs - call edist % b % from_ace(XSS, XSS_index) - XSS_index = XSS_index + 2 + 2*edist % b % n_regions + 2*edist % b % n_pairs - edist % u = XSS(XSS_index) - end select - - end select - - type is (KalbachMann) - ! ======================================================================== - ! CORRELATED KALBACH-MANN DISTRIBUTION - - NR = int(XSS(XSS_index)) - NE = int(XSS(XSS_index + 1 + 2*NR)) - if (NR > 0) then - call fatal_error("Multiple interpolation regions not yet supported & - &for Kalbach-Mann energy distributions.") - end if - aedist % n_region = NR - - ! Read incoming energies for which outgoing energies are tabulated and locators - allocate(aedist % energy(NE)) - allocate(L(NE)) - XSS_index = XSS_index + 2 + 2*NR - aedist % energy(:) = get_real(NE) - L(:) = get_int(NE) - - ! Read outgoing energy tables - allocate(aedist % distribution(NE)) - do i = 1, NE - ! Determine interpolation and number of discrete points - XSS_index = LDIS + L(i) - 1 - interp = nint(XSS(XSS_index)) - aedist % distribution(i) % interpolation = mod(interp, 10) - aedist % distribution(i) % n_discrete = (interp - aedist % distribution(i) % interpolation)/10 - - ! check for discrete lines present - if (aedist % distribution(i) % n_discrete > 0) then - call fatal_error("Discrete lines in Kalbach-Mann distribution not & - &yet supported") - end if - - ! Determine number of points and allocate space - NP = nint(XSS(XSS_index + 1)) - allocate(aedist % distribution(i) % e_out(NP)) - allocate(aedist % distribution(i) % p(NP)) - allocate(aedist % distribution(i) % c(NP)) - allocate(aedist % distribution(i) % r(NP)) - allocate(aedist % distribution(i) % a(NP)) - - ! Read tabular PDF for outgoing energy - XSS_index = XSS_index + 2 - aedist % distribution(i) % e_out(:) = get_real(NP) - aedist % distribution(i) % p(:) = get_real(NP) - aedist % distribution(i) % c(:) = get_real(NP) - aedist % distribution(i) % r(:) = get_real(NP) - aedist % distribution(i) % a(:) = get_real(NP) - end do - - deallocate(L) - - type is (CorrelatedAngleEnergy) - ! ======================================================================== - ! CORRELATED ANGLE-ENERGY DISTRIBUTION - - NR = int(XSS(XSS_index)) - NE = int(XSS(XSS_index + 1 + 2*NR)) - if (NR > 0) then - call fatal_error("Multiple interpolation regions not yet supported & - &for correlated angle-energy distributions.") - end if - aedist % n_region = NR - - ! Read incoming energies for which outgoing energies are tabulated and - ! locators - allocate(aedist % energy(NE)) - allocate(L(NE)) - XSS_index = XSS_index + 2 + 2*NR - aedist % energy(:) = get_real(NE) - L(:) = get_int(NE) - - ! Read outgoing energy tables - allocate(aedist % distribution(NE)) - do i = 1, NE - ! Determine interpolation and number of discrete points - XSS_index = LDIS + L(i) - 1 - interp = nint(XSS(XSS_index)) - aedist % distribution(i) % interpolation = mod(interp, 10) - aedist % distribution(i) % n_discrete = (interp - aedist % distribution(i) % interpolation)/10 - - ! check for discrete lines present - if (aedist % distribution(i) % n_discrete > 0) then - call fatal_error("Discrete lines in correlated angle-energy & - &distribution not yet supported") - end if - - ! Determine number of points and allocate space - NP = nint(XSS(XSS_index + 1)) - allocate(aedist % distribution(i) % e_out(NP)) - allocate(aedist % distribution(i) % p(NP)) - allocate(aedist % distribution(i) % c(NP)) - allocate(LC(NP)) - - ! Read tabular PDF for outgoing energy - XSS_index = XSS_index + 2 - aedist % distribution(i) % e_out(:) = get_real(NP) - aedist % distribution(i) % p(:) = get_real(NP) - aedist % distribution(i) % c(:) = get_real(NP) - LC(:) = get_int(NP) - - ! allocate angular distributions for each incoming/outgoing energy - allocate(aedist % distribution(i) % angle(NP)) - do j = 1, NP - if (LC(j) == 0) then - ! isotropic - allocate(Uniform :: aedist % distribution(i) % angle(j) % obj) - select type (adist => aedist % distribution(i) % angle(j) % obj) - type is (Uniform) - adist % a = -ONE - adist % b = ONE - end select - - elseif (LC(j) > 0) then - ! tabular distribution - allocate(Tabular :: aedist % distribution(i) % angle(j) % obj) - end if - end do - - ! read angular distributions - do j = 1, NP - XSS_index = LDIS + abs(LC(j)) - 1 - select type(adist => aedist % distribution(i) % angle(j) % obj) - type is (Tabular) - ! determine interpolation and number of points - interp = nint(XSS(XSS_index)) - NP = nint(XSS(XSS_index + 1)) - - ! Get probability density data - XSS_index = XSS_index + 2 - allocate(adist % x(NP), adist % p(NP), adist % c(NP)) - adist % x(:) = get_real(NP) - adist % p(:) = get_real(NP) - adist % c(:) = get_real(NP) - end select - end do - deallocate(LC) - - end do - - deallocate(L) - - type is (NBodyPhaseSpace) - ! ======================================================================== - ! N-BODY PHASE SPACE DISTRIBUTION - - aedist % n_bodies = int(XSS(XSS_index)) - aedist % mass_ratio = XSS(XSS_index + 1) - aedist % A = awr - aedist % Q = Q_value - end select - - end subroutine get_energy_dist - -!=============================================================================== -! READ_UNR_RES reads in unresolved resonance probability tables if present. -!=============================================================================== - - subroutine read_unr_res(nuc) - type(Nuclide), intent(inout) :: nuc - - integer :: JXS23 ! location of URR data - integer :: lc ! locator - integer :: N ! # of incident energies - integer :: M ! # of probabilities - integer :: i ! index over incoming energies - integer :: j ! index over values - integer :: k ! index over probabilities - - ! determine locator for URR data - JXS23 = JXS(23) - - ! check if URR data is present - if (JXS23 /= 0) then - nuc % urr_present = .true. - allocate(nuc % urr_data) - lc = JXS23 - else - nuc % urr_present = .false. - return - end if - - ! read parameters - nuc % urr_data % n_energy = int(XSS(lc)) - nuc % urr_data % n_prob = int(XSS(lc + 1)) - nuc % urr_data % interp = int(XSS(lc + 2)) - nuc % urr_data % inelastic_flag = int(XSS(lc + 3)) - nuc % urr_data % absorption_flag = int(XSS(lc + 4)) - if (int(XSS(lc + 5)) == 0) then - nuc % urr_data % multiply_smooth = .false. - else - nuc % urr_data % multiply_smooth = .true. - end if - - ! if the inelastic competition flag indicates that the inelastic cross - ! section should be determined from a normal reaction cross section, we need - ! to set up a pointer to that reaction - nuc % urr_inelastic = NONE - if (nuc % urr_data % inelastic_flag > 0) then - do i = 1, nuc % n_reaction - if (nuc % reactions(i) % MT == nuc % urr_data % inelastic_flag) then - nuc % urr_inelastic = i - end if - end do - - ! Abort if no corresponding inelastic reaction was found - if (nuc % urr_inelastic == NONE) then - call fatal_error("Could not find inelastic reaction specified on & - &unresolved resonance probability table.") - end if - end if - - ! allocate incident energies and probability tables - N = nuc % urr_data % n_energy - M = nuc % urr_data % n_prob - allocate(nuc % urr_data % energy(N)) - allocate(nuc % urr_data % prob(N,6,M)) - - ! read incident energies - XSS_index = lc + 6 - nuc % urr_data % energy = get_real(N) - - ! read probability tables - do i = 1, N - do j = 1, 6 - do k = 1, M - nuc % urr_data % prob(i,j,k) = XSS(XSS_index) - XSS_index = XSS_index + 1 - end do - end do - end do - - ! Check for negative values - if (any(nuc % urr_data % prob < ZERO)) then - if (master) call warning("Negative value(s) found on probability table & - &for nuclide " // nuc % name) - end if - - end subroutine read_unr_res -!=============================================================================== -! GENERATE_NU_FISSION precalculates the microscopic nu-fission cross section for -! a given nuclide. This is done so that the nu_total function does not need to -! be called during cross section lookups. -!=============================================================================== - - subroutine generate_nu_fission(nuc) - type(Nuclide), intent(inout) :: nuc - - integer :: i ! index on nuclide energy grid - - do i = 1, size(nuc % energy) - nuc % nu_fission(i) = nuc % nu(nuc % energy(i), EMISSION_TOTAL) * & - nuc % fission(i) - end do - end subroutine generate_nu_fission - -!=============================================================================== -! READ_THERMAL_DATA reads elastic and inelastic cross sections and corresponding -! secondary energy/angle distributions derived from experimental S(a,b) -! data. Namely, this routine reads the ITIE, ITCE, ITXE, and ITCA blocks. -!=============================================================================== - - subroutine read_thermal_data(table) - type(SAlphaBeta), intent(inout) :: table - - integer :: i ! index for incoming energies - integer :: j ! index for outgoing energies - integer :: k ! index for outoging angles - integer :: lc ! location in XSS array - integer :: NE_in ! number of incoming energies - integer :: NE_out ! number of outgoing energies - integer :: NMU ! number of outgoing angles - integer :: JXS4 ! location of elastic energy table - integer(8), allocatable :: LOCC(:) ! Location of inelastic data - - ! read secondary energy mode for inelastic scattering - table % secondary_mode = NXS(7) - - ! read number of inelastic energies and allocate arrays - NE_in = int(XSS(JXS(1))) - table % n_inelastic_e_in = NE_in - allocate(table % inelastic_e_in(NE_in)) - allocate(table % inelastic_sigma(NE_in)) - - ! read inelastic energies and cross-sections - XSS_index = JXS(1) + 1 - table % inelastic_e_in = get_real(NE_in) - table % inelastic_sigma = get_real(NE_in) - - ! set threshold value - table % threshold_inelastic = table % inelastic_e_in(NE_in) - - ! allocate space for outgoing energy/angle for inelastic - ! scattering - if (table % secondary_mode == SAB_SECONDARY_EQUAL .or. & - table % secondary_mode == SAB_SECONDARY_SKEWED) then - NMU = NXS(3) + 1 - table % n_inelastic_mu = NMU - NE_out = NXS(4) - table % n_inelastic_e_out = NE_out - allocate(table % inelastic_e_out(NE_out, NE_in)) - allocate(table % inelastic_mu(NMU, NE_out, NE_in)) - else if (table % secondary_mode == SAB_SECONDARY_CONT) then - NMU = NXS(3) - 1 - table % n_inelastic_mu = NMU - allocate(table % inelastic_data(NE_in)) - allocate(LOCC(NE_in)) - ! NE_out will be determined later - end if - - ! read outgoing energy/angle distribution for inelastic scattering - if (table % secondary_mode == SAB_SECONDARY_EQUAL .or. & - table % secondary_mode == SAB_SECONDARY_SKEWED) then - lc = JXS(3) - 1 - do i = 1, NE_in - do j = 1, NE_out - ! read outgoing energy - table % inelastic_e_out(j,i) = XSS(lc + 1) - - ! read outgoing angles for this outgoing energy - do k = 1, NMU - table % inelastic_mu(k,j,i) = XSS(lc + 1 + k) - end do - - ! advance pointer - lc = lc + 1 + NMU - end do - end do - else if (table % secondary_mode == SAB_SECONDARY_CONT) then - ! Get the location pointers to each Ein's DistEnergySAB data - LOCC = get_int(NE_in) - ! Get the number of outgoing energies and allocate space accordingly - do i = 1, NE_in - NE_out = int(XSS(XSS_index + i - 1)) - table % inelastic_data(i) % n_e_out = NE_out - allocate(table % inelastic_data(i) % e_out (NE_out)) - allocate(table % inelastic_data(i) % e_out_pdf (NE_out)) - allocate(table % inelastic_data(i) % e_out_cdf (NE_out)) - allocate(table % inelastic_data(i) % mu (NMU, NE_out)) - end do - - ! Now we can fill the inelastic_data(i) attributes - do i = 1, NE_in - XSS_index = int(LOCC(i)) - NE_out = table % inelastic_data(i) % n_e_out - do j = 1, NE_out - table % inelastic_data(i) % e_out(j) = XSS(XSS_index + 1) - 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_index = XSS_index + 4 + NMU - 1 - end do - end do - end if - - ! read number of elastic energies and allocate arrays - JXS4 = JXS(4) - if (JXS4 /= 0) then - NE_in = int(XSS(JXS4)) - table % n_elastic_e_in = NE_in - allocate(table % elastic_e_in(NE_in)) - allocate(table % elastic_P(NE_in)) - - ! read elastic energies and P - XSS_index = JXS4 + 1 - table % elastic_e_in = get_real(NE_in) - table % elastic_P = get_real(NE_in) - - ! set threshold - table % threshold_elastic = table % elastic_e_in(NE_in) - - ! determine whether sigma=P or sigma = P/E - table % elastic_mode = NXS(5) - else - table % threshold_elastic = ZERO - table % n_elastic_e_in = 0 - end if - - ! allocate space for outgoing energy/angle for elastic scattering - NMU = NXS(6) + 1 - table % n_elastic_mu = NMU - if (NMU > 0) then - allocate(table % elastic_mu(NMU, NE_in)) - end if - - ! read equiprobable outgoing cosines for elastic scattering each - ! incoming energy - if (JXS4 /= 0 .and. NMU /= 0) then - lc = JXS(6) - 1 - do i = 1, NE_in - do j = 1, NMU - table % elastic_mu(j,i) = XSS(lc + j) - end do - lc = lc + NMU - end do - end if - - end subroutine read_thermal_data - -!=============================================================================== -! GET_INT returns an array of integers read from the current position in the XSS -! array -!=============================================================================== - - function get_int(n_values) result(array) - - integer, intent(in) :: n_values ! number of values to read - integer :: array(n_values) ! array of values - - array = int(XSS(XSS_index:XSS_index + n_values - 1)) - XSS_index = XSS_index + n_values - - end function get_int - -!=============================================================================== -! GET_REAL returns an array of real(8)s read from the current position in the -! XSS array -!=============================================================================== - - function get_real(n_values) result(array) - - integer, intent(in) :: n_values ! number of values to read - real(8) :: array(n_values) ! array of values - - array = XSS(XSS_index:XSS_index + n_values - 1) - XSS_index = XSS_index + n_values - - end function get_real - -end module ace diff --git a/src/angle_distribution.F90 b/src/angle_distribution.F90 index 282d51b73..830ba836c 100644 --- a/src/angle_distribution.F90 +++ b/src/angle_distribution.F90 @@ -1,7 +1,10 @@ module angle_distribution - use constants, only: ZERO, ONE - use distribution_univariate, only: DistributionContainer + use constants, only: ZERO, ONE, HISTOGRAM, LINEAR_LINEAR + use distribution_univariate, only: DistributionContainer, Tabular + use hdf5, only: HID_T, HSIZE_T + use hdf5_interface, only: read_attribute, get_shape, read_dataset, & + open_dataset, close_dataset use random_lcg, only: prn use search, only: binary_search @@ -21,6 +24,7 @@ module angle_distribution type(DistributionContainer), allocatable :: distribution(:) contains procedure :: sample => angle_sample + procedure :: from_hdf5 => angle_from_hdf5 end type AngleDistribution contains @@ -60,4 +64,68 @@ contains if (abs(mu) > ONE) mu = sign(ONE, mu) end function angle_sample + subroutine angle_from_hdf5(this, group_id) + class(AngleDistribution), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + integer :: i, j + integer :: n + integer :: n_energy + integer(HID_T) :: dset_id + integer(HSIZE_T) :: dims(1), dims2(2) + integer, allocatable :: offsets(:) + integer, allocatable :: interp(:) + real(8), allocatable :: temp(:,:) + + ! Get incoming energies + dset_id = open_dataset(group_id, 'energy') + call get_shape(dset_id, dims) + n_energy = int(dims(1), 4) + allocate(this%energy(n_energy)) + allocate(this%distribution(n_energy)) + call read_dataset(this%energy, dset_id) + call close_dataset(dset_id) + + ! Get outgoing energy distribution data + dset_id = open_dataset(group_id, 'mu') + call read_attribute(offsets, dset_id, 'offsets') + call read_attribute(interp, dset_id, 'interpolation') + call get_shape(dset_id, dims2) + allocate(temp(dims2(1), dims2(2))) + call read_dataset(temp, dset_id) + call close_dataset(dset_id) + + do i = 1, n_energy + ! Determine number of outgoing energies + j = offsets(i) + if (i < n_energy) then + n = offsets(i+1) - j + else + n = size(temp, 1) - j + end if + + ! Create and initialize tabular distribution + allocate(Tabular :: this%distribution(i)%obj) + select type (mudist => this%distribution(i)%obj) + type is (Tabular) + mudist % interpolation = interp(i) + allocate(mudist % x(n), mudist % p(n), mudist % c(n)) + mudist % x(:) = temp(j+1:j+n, 1) + mudist % p(:) = temp(j+1:j+n, 2) + + ! To get answers that match ACE data, for now we still use the tabulated + ! CDF values that were passed through to the HDF5 library. At a later + ! time, we can remove the CDF values from the HDF5 library and + ! reconstruct them using the PDF + if (.true.) then + mudist % c(:) = temp(j+1:j+n, 3) + else + call mudist % initialize(temp(j+1:j+n, 1), temp(j+1:j+n, 2), interp(i)) + end if + end select + + j = j + n + end do + end subroutine angle_from_hdf5 + end module angle_distribution diff --git a/src/angleenergy_header.F90 b/src/angleenergy_header.F90 index 483bad856..60d5443c4 100644 --- a/src/angleenergy_header.F90 +++ b/src/angleenergy_header.F90 @@ -1,5 +1,7 @@ module angleenergy_header + use hdf5, only: HID_T + !=============================================================================== ! ANGLEENERGY (abstract) defines a correlated or uncorrelated angle-energy ! distribution that is a function of incoming energy. Each derived type must @@ -10,6 +12,7 @@ module angleenergy_header type, abstract :: AngleEnergy contains procedure(angleenergy_sample_), deferred :: sample + procedure(angleenergy_from_hdf5_), deferred :: from_hdf5 end type AngleEnergy abstract interface @@ -20,6 +23,12 @@ module angleenergy_header real(8), intent(out) :: E_out real(8), intent(out) :: mu end subroutine angleenergy_sample_ + + subroutine angleenergy_from_hdf5_(this, group_id) + import AngleEnergy, HID_T + class(AngleEnergy), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + end subroutine angleenergy_from_hdf5_ end interface type :: AngleEnergyContainer diff --git a/src/constants.F90 b/src/constants.F90 index b3e5ed89b..838830887 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -237,6 +237,13 @@ module constants ASCII = 1, & ! ASCII cross section file BINARY = 2 ! Binary cross section file + ! Library types + integer, parameter :: & + LIBRARY_NEUTRON = 1, & + LIBRARY_THERMAL = 2, & + LIBRARY_PHOTON = 3, & + LIBRARY_MULTIGROUP = 4 + ! Probability table parameters integer, parameter :: & URR_CUM_PROB = 1, & diff --git a/src/endf_header.F90 b/src/endf_header.F90 index e9a073f4e..8b6ad63f1 100644 --- a/src/endf_header.F90 +++ b/src/endf_header.F90 @@ -2,13 +2,16 @@ module endf_header use constants, only: ZERO, HISTOGRAM, LINEAR_LINEAR, LINEAR_LOG, & LOG_LINEAR, LOG_LOG + use hdf5_interface + use hdf5, only: HID_T, HSIZE_T use search, only: binary_search -implicit none + implicit none type, abstract :: Function1D contains procedure(function1d_evaluate_), deferred :: evaluate + procedure(function1d_from_hdf5_), deferred :: from_hdf5 end type Function1D abstract interface @@ -18,6 +21,12 @@ implicit none real(8), intent(in) :: x real(8) :: y end function function1d_evaluate_ + + subroutine function1d_from_hdf5_(this, dset_id) + import Function1D, HID_T + class(Function1D), intent(inout) :: this + integer(HID_T), intent(in) :: dset_id + end subroutine function1d_from_hdf5_ end interface !=============================================================================== @@ -27,6 +36,7 @@ implicit none type, extends(Function1D) :: Constant1D real(8) :: y contains + procedure :: from_hdf5 => constant1d_from_hdf5 procedure :: evaluate => constant1d_evaluate end type Constant1D @@ -37,6 +47,7 @@ implicit none type, extends(Function1D) :: Polynomial real(8), allocatable :: coef(:) ! coefficients contains + procedure :: from_hdf5 => polynomial_from_hdf5 procedure :: evaluate => polynomial_evaluate procedure :: from_ace => polynomial_from_ace end type Polynomial @@ -54,6 +65,7 @@ implicit none real(8), allocatable :: y(:) ! values of ordinate contains procedure :: from_ace => tabulated1d_from_ace + procedure :: from_hdf5 => tabulated1d_from_hdf5 procedure :: evaluate => tabulated1d_evaluate end type Tabulated1D @@ -63,6 +75,13 @@ contains ! Constant1D implementation !=============================================================================== + subroutine constant1d_from_hdf5(this, dset_id) + class(Constant1D), intent(inout) :: this + integer(HID_T), intent(in) :: dset_id + + call read_dataset(this % y, dset_id) + end subroutine constant1d_from_hdf5 + pure function constant1d_evaluate(this, x) result(y) class(Constant1D), intent(in) :: this real(8), intent(in) :: x @@ -93,6 +112,17 @@ contains this % coef(:) = xss(idx + 1 : idx + nc) end subroutine polynomial_from_ace + subroutine polynomial_from_hdf5(this, dset_id) + class(Polynomial), intent(inout) :: this + integer(HID_T), intent(in) :: dset_id + + integer(HSIZE_T) :: dims(1) + + call get_shape(dset_id, dims) + allocate(this % coef(dims(1))) + call read_dataset(this % coef, dset_id) + end subroutine polynomial_from_hdf5 + pure function polynomial_evaluate(this, x) result(y) class(Polynomial), intent(in) :: this real(8), intent(in) :: x @@ -148,6 +178,28 @@ contains this%y(:) = xss(idx + 2*nr + 2 + ne : idx + 2*nr + 1 + 2*ne) end subroutine tabulated1d_from_ace + subroutine tabulated1d_from_hdf5(this, dset_id) + class(Tabulated1D), intent(inout) :: this + integer(HID_T), intent(in) :: dset_id + + real(8), allocatable :: xy(:,:) + integer(HSIZE_T) :: dims(2) + + call read_attribute(this%nbt, dset_id, 'breakpoints') + call read_attribute(this%int, dset_id, 'interpolation') + this%n_regions = size(this%nbt) + + call get_shape(dset_id, dims) + this%n_pairs = int(dims(1), 4) + allocate(this%x(this%n_pairs)) + allocate(this%y(this%n_pairs)) + + allocate(xy(dims(1), dims(2))) + call read_dataset(xy, dset_id) + this%x(:) = xy(:,1) + this%y(:) = xy(:,2) + end subroutine tabulated1d_from_hdf5 + pure function tabulated1d_evaluate(this, x) result(y) class(Tabulated1D), intent(in) :: this real(8), intent(in) :: x ! x value to find y at diff --git a/src/energy_distribution.F90 b/src/energy_distribution.F90 index 3a42bb73d..54ae3f90c 100644 --- a/src/energy_distribution.F90 +++ b/src/energy_distribution.F90 @@ -1,7 +1,9 @@ module energy_distribution - use constants, only: ZERO, ONE, TWO, PI, HISTOGRAM, LINEAR_LINEAR + use constants, only: ZERO, ONE, HALF, TWO, PI, HISTOGRAM, LINEAR_LINEAR use endf_header, only: Tabulated1D + use hdf5_interface + use hdf5 use math, only: maxwell_spectrum, watt_spectrum use random_lcg, only: prn use search, only: binary_search @@ -16,6 +18,7 @@ module energy_distribution type, abstract :: EnergyDistribution contains procedure(energy_distribution_sample_), deferred :: sample + procedure(energy_distribution_from_hdf5_), deferred :: from_hdf5 end type EnergyDistribution abstract interface @@ -25,6 +28,13 @@ module energy_distribution real(8), intent(in) :: E_in real(8) :: E_out end function energy_distribution_sample_ + + subroutine energy_distribution_from_hdf5_(this, group_id) + import EnergyDistribution + import HID_T + class(EnergyDistribution), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + end subroutine energy_distribution_from_hdf5_ end interface type :: EnergyDistributionContainer @@ -50,8 +60,23 @@ module energy_distribution ! each incoming energy contains procedure :: sample => equiprobable_sample + procedure :: from_hdf5 => equiprobable_from_hdf5 end type TabularEquiprobable +!=============================================================================== +! DISCRETEPHOTON gives the energy distribution for a discrete photon (usually +! used for photon production from an incident-neutron reaction) +!=============================================================================== + + type, extends(EnergyDistribution) :: DiscretePhoton + integer :: primary_flag + real(8) :: energy + real(8) :: A + contains + procedure :: sample => discrete_photon_sample + procedure :: from_hdf5 => discrete_photon_from_hdf5 + end type DiscretePhoton + !=============================================================================== ! LEVELINELASTIC gives the energy distribution for level inelastic scattering by ! neutrons as in ENDF MT=51--90. @@ -62,6 +87,7 @@ module energy_distribution real(8) :: mass_ratio contains procedure :: sample => level_inelastic_sample + procedure :: from_hdf5 => level_inelastic_from_hdf5 end type LevelInelastic !=============================================================================== @@ -86,6 +112,7 @@ module energy_distribution type(CTTable), allocatable :: distribution(:) contains procedure :: sample => continuous_sample + procedure :: from_hdf5 => continuous_from_hdf5 end type ContinuousTabular !=============================================================================== @@ -98,6 +125,7 @@ module energy_distribution real(8) :: u ! restriction energy contains procedure :: sample => maxwellenergy_sample + procedure :: from_hdf5 => maxwellenergy_from_hdf5 end type MaxwellEnergy !=============================================================================== @@ -110,6 +138,7 @@ module energy_distribution real(8) :: u contains procedure :: sample => evaporation_sample + procedure :: from_hdf5 => evaporation_from_hdf5 end type Evaporation !=============================================================================== @@ -123,6 +152,7 @@ module energy_distribution real(8) :: u contains procedure :: sample => watt_sample + procedure :: from_hdf5 => watt_from_hdf5 end type WattEnergy contains @@ -186,6 +216,31 @@ contains end if end function equiprobable_sample + subroutine equiprobable_from_hdf5(this, group_id) + class(TabularEquiprobable), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + end subroutine equiprobable_from_hdf5 + + function discrete_photon_sample(this, E_in) result(E_out) + class(DiscretePhoton), intent(in) :: this + real(8), intent(in) :: E_in + real(8) :: E_out + + if (this % primary_flag == 2) then + E_out = this % energy + this % A/(this % A + 1)*E_in + else + E_out = this % energy + end if + end function discrete_photon_sample + + subroutine discrete_photon_from_hdf5(this, group_id) + class(DiscretePhoton), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + call read_attribute(this % primary_flag, group_id, 'primary_flag') + call read_attribute(this % energy, group_id, 'energy') + call read_attribute(this % A, group_id, 'atomic_weight_ratio') + end subroutine discrete_photon_from_hdf5 function level_inelastic_sample(this, E_in) result(E_out) class(LevelInelastic), intent(in) :: this @@ -195,6 +250,13 @@ contains E_out = this%mass_ratio*(E_in - this%threshold) end function level_inelastic_sample + subroutine level_inelastic_from_hdf5(this, group_id) + class(LevelInelastic), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + call read_attribute(this%threshold, group_id, 'threshold') + call read_attribute(this%mass_ratio, group_id, 'mass_ratio') + end subroutine level_inelastic_from_hdf5 function continuous_sample(this, E_in) result(E_out) class(ContinuousTabular), intent(in) :: this @@ -307,6 +369,111 @@ contains end if end function continuous_sample + subroutine continuous_from_hdf5(this, group_id) + class(ContinuousTabular), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + integer :: i, j, k + integer :: n + integer :: n_energy + integer(HID_T) :: dset_id + integer(HSIZE_T) :: dims(1), dims2(2) + integer, allocatable :: temp(:,:) + integer, allocatable :: offsets(:) + integer, allocatable :: interp(:) + integer, allocatable :: n_discrete(:) + real(8), allocatable :: eout(:,:) + + ! Open incoming energy dataset + dset_id = open_dataset(group_id, 'energy') + + ! Get interpolation parameters + call read_attribute(temp, dset_id, 'interpolation') + allocate(this%breakpoints(size(temp, 1))) + allocate(this%interpolation(size(temp, 1))) + this%breakpoints(:) = temp(:, 1) + this%interpolation(:) = temp(:, 2) + this%n_region = size(this%breakpoints) + + ! Get incoming energies + call get_shape(dset_id, dims) + n_energy = int(dims(1), 4) + allocate(this%energy(n_energy)) + allocate(this%distribution(n_energy)) + call read_dataset(this%energy, dset_id) + call close_dataset(dset_id) + + ! Get outgoing energy distribution data + dset_id = open_dataset(group_id, 'distribution') + call read_attribute(offsets, dset_id, 'offsets') + call read_attribute(interp, dset_id, 'interpolation') + call read_attribute(n_discrete, dset_id, 'n_discrete_lines') + call get_shape(dset_id, dims2) + allocate(eout(dims2(1), dims2(2))) + call read_dataset(eout, dset_id) + call close_dataset(dset_id) + + do i = 1, n_energy + ! Determine number of outgoing energies + j = offsets(i) + if (i < n_energy) then + n = offsets(i+1) - j + else + n = size(eout, 1) - j + end if + + associate (d => this % distribution(i)) + ! Assign interpolation scheme and number of discrete lines + d % interpolation = interp(i) + d % n_discrete = n_discrete(i) + + ! Allocate arrays for energies and PDF/CDF + allocate(d % e_out(n)) + allocate(d % p(n)) + allocate(d % c(n)) + + ! Copy data + d % e_out(:) = eout(j+1:j+n, 1) + d % p(:) = eout(j+1:j+n, 2) + + ! To get answers that match ACE data, for now we still use the tabulated + ! CDF values that were passed through to the HDF5 library. At a later + ! time, we can remove the CDF values from the HDF5 library and + ! reconstruct them using the PDF + if (.true.) then + d % c(:) = eout(j+1:j+n, 3) + else + ! Calculate cumulative distribution function -- discrete portion + do k = 1, n_discrete(i) + if (k == 1) then + d % c(k) = d % p(k) + else + d % c(k) = d % c(k-1) + d % p(k) + end if + end do + + ! Continuous portion + do k = d % n_discrete + 1, n + if (k == d % n_discrete + 1) then + d % c(k) = sum(d % p(1:d % n_discrete)) + else + if (d % interpolation == HISTOGRAM) then + d % c(k) = d % c(k-1) + d % p(k-1) * & + (d % e_out(k) - d % e_out(k-1)) + elseif (d % interpolation == LINEAR_LINEAR) then + d % c(k) = d % c(k-1) + HALF*(d % p(k-1) + d % p(k)) * & + (d % e_out(k) - d % e_out(k-1)) + end if + end if + end do + + ! Normalize density and distribution functions + d % p(:) = d % p(:)/d % c(n) + d % c(:) = d % c(:)/d % c(n) + end if + end associate + end do + end subroutine continuous_from_hdf5 function maxwellenergy_sample(this, E_in) result(E_out) class(MaxwellEnergy), intent(in) :: this @@ -327,6 +494,18 @@ contains end do end function maxwellenergy_sample + subroutine maxwellenergy_from_hdf5(this, group_id) + class(MaxwellEnergy), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + integer(HID_T) :: dset_id + + call read_attribute(this%u, group_id, 'u') + dset_id = open_dataset(group_id, 'theta') + call this%theta%from_hdf5(dset_id) + call close_dataset(dset_id) + end subroutine maxwellenergy_from_hdf5 + function evaporation_sample(this, E_in) result(E_out) class(Evaporation), intent(in) :: this real(8), intent(in) :: E_in ! incoming energy @@ -351,6 +530,18 @@ contains E_out = x*theta end function evaporation_sample + subroutine evaporation_from_hdf5(this, group_id) + class(Evaporation), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + integer(HID_T) :: dset_id + + call read_attribute(this%u, group_id, 'u') + dset_id = open_dataset(group_id, 'theta') + call this%theta%from_hdf5(dset_id) + call close_dataset(dset_id) + end subroutine evaporation_from_hdf5 + function watt_sample(this, E_in) result(E_out) class(WattEnergy), intent(in) :: this real(8), intent(in) :: E_in ! incoming energy @@ -373,4 +564,21 @@ contains end do end function watt_sample + subroutine watt_from_hdf5(this, group_id) + class(WattEnergy), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + integer(HID_T) :: dset_id + + call read_attribute(this%u, group_id, 'u') + + dset_id = open_dataset(group_id, 'a') + call this%a%from_hdf5(dset_id) + call close_dataset(dset_id) + + dset_id = open_dataset(group_id, 'b') + call this%b%from_hdf5(dset_id) + call close_dataset(dset_id) + end subroutine watt_from_hdf5 + end module energy_distribution diff --git a/src/global.F90 b/src/global.F90 index 357887199..1b1e5632a 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -65,11 +65,7 @@ module global ! ============================================================================ ! CROSS SECTION RELATED VARIABLES NEEDED REGARDLESS OF CE OR MG - ! Cross section arrays - type(XsListing), allocatable, target :: xs_listings(:) ! cross_sections.xml listings - integer :: n_nuclides_total ! Number of nuclide cross section tables - integer :: n_listings ! Number of listings in cross_sections.xml ! Cross section caches type(NuclideMicroXS), allocatable :: micro_xs(:) ! Cache for each nuclide @@ -77,7 +73,6 @@ module global ! Dictionaries to look up cross sections and listings type(DictCharInt) :: nuclide_dict - type(DictCharInt) :: xs_listing_dict ! Default xs identifier (e.g. 70c or 300K) character(5):: default_xs @@ -107,7 +102,8 @@ module global ! Whether or not windowed multipole cross sections should be used. logical :: multipole_active = .false. - ! Total amount of nuclide ZAID and dictionary of nuclide ZAID and index + ! Total amount of nuclide ZAID and dictionary of nuclide ZAID and index -- + ! this is used when sampling unresolved resonance probability tables integer(8) :: n_nuc_zaid_total type(DictIntInt) :: nuc_zaid_dict @@ -498,7 +494,6 @@ contains end if if (allocated(sab_tables)) deallocate(sab_tables) - if (allocated(xs_listings)) deallocate(xs_listings) if (allocated(micro_xs)) deallocate(micro_xs) ! Deallocate external source @@ -553,7 +548,6 @@ contains call plot_dict % clear() call nuclide_dict % clear() call sab_dict % clear() - call xs_listing_dict % clear() ! Clear statepoint and sourcepoint batch set call statepoint_batch % clear() diff --git a/src/initialize.F90 b/src/initialize.F90 index 48b3ee61a..37eeb1f3e 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -1,6 +1,5 @@ module initialize - use ace, only: read_ace_xs use bank_header, only: Bank use constants use dict_header, only: DictIntInt, ElemKeyValueII @@ -109,19 +108,6 @@ contains end if if (run_mode /= MODE_PLOTTING) then - ! With the AWRs from the xs_listings, change all material specifications - ! so that they contain atom percents summing to 1 - call normalize_ao() - - ! Read ACE-format cross sections - call time_read_xs%start() - if (run_CE) then - call read_ace_xs() - else - call read_mgxs() - end if - call time_read_xs%stop() - ! Construct information needed for nuclear data if (run_CE) then ! Set undefined cell temperatures to match the material data. @@ -140,7 +126,10 @@ contains end select else ! Create material macroscopic data for MGXS + call time_read_xs%start() + call read_mgxs() call create_macro_xs() + call time_read_xs%stop() end if ! Allocate and setup tally stride, matching_bins, and tally maps @@ -800,71 +789,6 @@ contains end subroutine adjust_indices -!=============================================================================== -! NORMALIZE_AO normalizes the atom or weight percentages for each material -!=============================================================================== - - subroutine normalize_ao() - - integer :: index_list ! index in xs_listings array - integer :: i ! index in materials array - integer :: j ! index over nuclides in material - real(8) :: sum_percent ! summation - real(8) :: awr ! atomic weight ratio - real(8) :: x ! atom percent - logical :: percent_in_atom ! nuclides specified in atom percent? - logical :: density_in_atom ! density specified in atom/b-cm? - type(Material), pointer :: mat => null() - - ! first find the index in the xs_listings array for each nuclide in each - ! material - do i = 1, n_materials - mat => materials(i) - - percent_in_atom = (mat%atom_density(1) > ZERO) - density_in_atom = (mat%density > ZERO) - - sum_percent = ZERO - do j = 1, mat%n_nuclides - ! determine atomic weight ratio - index_list = xs_listing_dict%get_key(mat%names(j)) - awr = xs_listings(index_list)%awr - - ! if given weight percent, convert all values so that they are divided - ! by awr. thus, when a sum is done over the values, it's actually - ! sum(w/awr) - if (.not. percent_in_atom) then - mat%atom_density(j) = -mat%atom_density(j) / awr - end if - end do - - ! determine normalized atom percents. if given atom percents, this is - ! straightforward. if given weight percents, the value is w/awr and is - ! divided by sum(w/awr) - sum_percent = sum(mat%atom_density) - mat%atom_density = mat%atom_density / sum_percent - - ! Change density in g/cm^3 to atom/b-cm. Since all values are now in atom - ! percent, the sum needs to be re-evaluated as 1/sum(x*awr) - if (.not. density_in_atom) then - sum_percent = ZERO - do j = 1, mat%n_nuclides - index_list = xs_listing_dict%get_key(mat%names(j)) - awr = xs_listings(index_list)%awr - x = mat%atom_density(j) - sum_percent = sum_percent + x*awr - end do - sum_percent = ONE / sum_percent - mat%density = -mat%density * N_AVOGADRO & - / MASS_NEUTRON * sum_percent - end if - - ! Calculate nuclide atom densities - mat%atom_density = mat%density * mat%atom_density - end do - - end subroutine normalize_ao - !=============================================================================== ! CALCULATE_WORK determines how many particles each processor should simulate !=============================================================================== diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 3c6143e5a..0fc96ef4b 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -12,17 +12,22 @@ module input_xml use global use list_header, only: ListChar, ListInt, ListReal use mesh_header, only: RegularMesh + use multipole, only: multipole_read use output, only: write_message use plot_header use random_lcg, only: prn, seed use surface_header - use stl_vector, only: VectorInt - use string, only: str_to_int, str_to_real, tokenize, & - to_lower, to_str, starts_with, ends_with + use set_header, only: SetChar + use stl_vector, only: VectorInt, VectorReal, VectorChar + use string, only: to_lower, to_str, str_to_int, str_to_real, & + starts_with, ends_with, tokenize, split_string use tally_header, only: TallyObject, TallyFilter use tally_initialize, only: add_tallies use xml_interface + use hdf5 + use hdf5_interface + implicit none save @@ -39,15 +44,8 @@ contains subroutine read_input_xml() call read_settings_xml() - if (run_mode /= MODE_PLOTTING) then - if (run_CE) then - call read_ce_cross_sections_xml() - else - call read_mg_cross_sections_xml() - end if - end if call read_geometry_xml() - call read_materials_xml() + call read_materials() call read_tallies_xml() if (cmfd_run) call configure_cmfd() @@ -127,46 +125,42 @@ contains ! Find cross_sections.xml file -- the first place to look is the ! settings.xml file. If no file is found there, then we check the ! CROSS_SECTIONS environment variable - if (run_mode /= MODE_PLOTTING) then - if (.not. check_for_node(doc, "cross_sections") .and. & - run_mode /= MODE_PLOTTING) then - ! No cross_sections.xml file specified in settings.xml, check - ! environment variable - if (run_CE) then - call get_environment_variable("OPENMC_CROSS_SECTIONS", env_variable) + if (.not. check_for_node(doc, "cross_sections")) then + ! No cross_sections.xml file specified in settings.xml, check + ! environment variable + if (run_CE) then + call get_environment_variable("OPENMC_CROSS_SECTIONS", env_variable) + if (len_trim(env_variable) == 0) then + call get_environment_variable("CROSS_SECTIONS", env_variable) if (len_trim(env_variable) == 0) then - call get_environment_variable("CROSS_SECTIONS", env_variable) - if (len_trim(env_variable) == 0) then - call fatal_error("No cross_sections.xml file was specified in & - &settings.xml or in the OPENMC_CROSS_SECTIONS environment & - &variable. OpenMC needs such a file to identify where to & - &find ACE cross section libraries. Please consult the & - &user's guide at http://mit-crpg.github.io/openmc for & - &information on how to set up ACE cross section libraries.") - else - call warning("The CROSS_SECTIONS environment variable is & - &deprecated. Please update your environment to use & - &OPENMC_CROSS_SECTIONS instead.") - end if - end if - path_cross_sections = trim(env_variable) - else - call get_environment_variable("OPENMC_MG_CROSS_SECTIONS", & - env_variable) - if (len_trim(env_variable) == 0) then - call fatal_error("No mgxs.xml file was specified in & - &settings.xml or in the OPENMC_MG_CROSS_SECTIONS environment & + call fatal_error("No cross_sections.xml file was specified in & + &settings.xml or in the OPENMC_CROSS_SECTIONS environment & &variable. OpenMC needs such a file to identify where to & - &find the cross section libraries. Please consult the user's & - &guide at http://mit-crpg.github.io/openmc for information on & - &how to set up the cross section libraries.") + &find ACE cross section libraries. Please consult the & + &user's guide at http://mit-crpg.github.io/openmc for & + &information on how to set up ACE cross section libraries.") else - path_cross_sections = trim(env_variable) + call warning("The CROSS_SECTIONS environment variable is & + &deprecated. Please update your environment to use & + &OPENMC_CROSS_SECTIONS instead.") end if end if + path_cross_sections = trim(env_variable) else - call get_node_value(doc, "cross_sections", path_cross_sections) + call get_environment_variable("OPENMC_MG_CROSS_SECTIONS", env_variable) + if (len_trim(env_variable) == 0) then + call fatal_error("No mgxs.xml file was specified in & + &settings.xml or in the OPENMC_MG_CROSS_SECTIONS environment & + &variable. OpenMC needs such a file to identify where to & + &find ACE cross section libraries. Please consult the user's & + &guide at http://mit-crpg.github.io/openmc for information on & + &how to set up ACE cross section libraries.") + else + path_cross_sections = trim(env_variable) + end if end if + else + call get_node_value(doc, "cross_sections", path_cross_sections) end if ! Find the windowed multipole library @@ -2060,7 +2054,55 @@ contains ! for errors and placing properly-formatted data in the right data structures !=============================================================================== - subroutine read_materials_xml() + subroutine read_materials() + integer :: i, j + type(DictCharInt) :: library_dict + type(Library), allocatable :: libraries(:) + + if (run_CE) then + call read_ce_cross_sections_xml(libraries) + else + call read_mg_cross_sections_xml(libraries) + end if + + ! Creating dictionary that maps the name of the material to the entry + do i = 1, size(libraries) + do j = 1, size(libraries(i) % materials) + call library_dict % add_key(to_lower(libraries(i) % materials(j)), i) + end do + end do + + ! Check that 0K nuclides are listed in the cross_sections.xml file + if (allocated(nuclides_0K)) then + do i = 1, size(nuclides_0K) + if (.not. library_dict % has_key(to_lower(nuclides_0K(i) % name_0K))) then + call fatal_error("Could not find resonant scatterer " & + // trim(nuclides_0K(i) % name_0K) & + // " in cross_sections.xml file!") + end if + end do + end if + + ! Parse data from materials.xml + call read_materials_xml(libraries, library_dict) + + ! Read continuous-energy cross sections + if (run_CE) then + call time_read_xs%start() + call read_ce_cross_sections(libraries, library_dict) + call time_read_xs%stop() + end if + + ! Normalize atom/weight percents + call normalize_ao() + + ! Clear dictionary + call library_dict % clear() + end subroutine read_materials + + subroutine read_materials_xml(libraries, library_dict) + type(Library), intent(in) :: libraries(:) + type(DictCharInt), intent(inout) :: library_dict integer :: i ! loop index for materials integer :: j ! loop index for nuclides @@ -2068,23 +2110,20 @@ contains integer :: n ! number of nuclides integer :: n_sab ! number of sab tables for a material integer :: n_nuc_ele ! number of nuclides in an element - integer :: index_list ! index in xs_listings array + integer :: i_library ! index in libraries array integer :: index_nuclide ! index in nuclides - integer :: index_nuc_zaid ! index in nuclide ZAID integer :: index_sab ! index in sab_tables real(8) :: val ! value entered for density real(8) :: temp_dble ! temporary double prec. real logical :: file_exists ! does materials.xml exist? logical :: sum_density ! density is taken to be sum of nuclide densities - integer :: zaid ! ZAID of nuclide - character(12) :: name ! name of isotope, e.g. 92235.03c - character(12) :: alias ! alias of nuclide, e.g. U-235.03c + character(20) :: name ! name of isotope, e.g. 92235.03c character(MAX_WORD_LEN) :: units ! units on density character(MAX_LINE_LEN) :: filename ! absolute path to materials.xml character(MAX_LINE_LEN) :: temp_str ! temporary string when reading - type(ListChar) :: list_names ! temporary list of nuclide names - type(ListReal) :: list_density ! temporary list of nuclide densities - type(ListInt) :: list_iso_lab ! temporary list of isotropic lab scatterers + type(VectorChar) :: names ! temporary list of nuclide names + type(VectorReal) :: densities ! temporary list of nuclide densities + type(VectorInt) :: list_iso_lab ! temporary list of isotropic lab scatterers type(Material), pointer :: mat => null() type(Node), pointer :: doc => null() type(Node), pointer :: node_mat => null() @@ -2128,7 +2167,6 @@ contains ! Initialize count for number of nuclides/S(a,b) tables index_nuclide = 0 - index_nuc_zaid = 0 index_sab = 0 do i = 1, n_materials @@ -2153,13 +2191,6 @@ contains ! Copy material name if (check_for_node(node_mat, "name")) then call get_node_value(node_mat, "name", mat % name) - mat % name = to_lower(mat % name) - end if - - if (run_mode == MODE_PLOTTING) then - ! add to the dictionary and skip xs processing - call material_dict % add_key(mat % id, i) - cycle end if ! ======================================================================= @@ -2277,12 +2308,12 @@ contains name = to_lower(name) ! save name and density to list - call list_names % append(name) + call names % push_back(name) ! Check if no atom/weight percents were specified or if both atom and ! weight percents were specified if (units == 'macro') then - call list_density % append(ONE) + call densities % push_back(ONE) else call fatal_error("Units can only be macro for macroscopic data " & // trim(name)) @@ -2318,15 +2349,15 @@ contains if (check_for_node(node_nuc, "scattering")) then call get_node_value(node_nuc, "scattering", temp_str) if (adjustl(to_lower(temp_str)) == "iso-in-lab") then - call list_iso_lab % append(1) + call list_iso_lab % push_back(1) else if (adjustl(to_lower(temp_str)) == "data") then - call list_iso_lab % append(0) + call list_iso_lab % push_back(0) else call fatal_error("Scattering must be isotropic in lab or follow& & the ACE file data") end if else - call list_iso_lab % append(0) + call list_iso_lab % push_back(0) end if end if @@ -2335,15 +2366,14 @@ contains if (check_for_node(node_nuc, "xs")) & call get_node_value(node_nuc, "xs", name) name = trim(temp_str) // "." // trim(name) - name = to_lower(name) ! save name and density to list - call list_names % append(name) + call names % push_back(name) ! Check if no atom/weight percents were specified or if both atom and ! weight percents were specified if (units == 'macro') then - call list_density % append(ONE) + call densities % push_back(ONE) else if (.not. check_for_node(node_nuc, "ao") .and. & .not. check_for_node(node_nuc, "wo")) then @@ -2358,10 +2388,10 @@ contains ! Copy atom/weight percents if (check_for_node(node_nuc, "ao")) then call get_node_value(node_nuc, "ao", temp_dble) - call list_density % append(temp_dble) + call densities % push_back(temp_dble) else call get_node_value(node_nuc, "wo", temp_dble) - call list_density % append(-temp_dble) + call densities % push_back(-temp_dble) end if end if end do INDIVIDUAL_NUCLIDES @@ -2408,20 +2438,20 @@ contains end if ! Get current number of nuclides - n_nuc_ele = list_names % size() + n_nuc_ele = names % size() ! Expand element into naturally-occurring isotopes if (check_for_node(node_ele, "ao")) then call get_node_value(node_ele, "ao", temp_dble) - call expand_natural_element(name, temp_str, temp_dble, & - list_names, list_density) + call expand_natural_element(name, temp_str, temp_dble, names, & + densities) else call fatal_error("The ability to expand a natural element based on & &weight percentage is not yet supported.") end if ! Compute number of new nuclides from the natural element expansion - n_nuc_ele = list_names % size() - n_nuc_ele + n_nuc_ele = names % size() - n_nuc_ele ! Check enforced isotropic lab scattering if (run_CE) then @@ -2434,9 +2464,9 @@ contains ! Set ace or iso-in-lab scattering for each nuclide in element do k = 1, n_nuc_ele if (adjustl(to_lower(temp_str)) == "iso-in-lab") then - call list_iso_lab % append(1) + call list_iso_lab % push_back(1) else if (adjustl(to_lower(temp_str)) == "data") then - call list_iso_lab % append(0) + call list_iso_lab % push_back(0) else call fatal_error("Scattering must be isotropic in lab or follow& & the ACE file data") @@ -2450,7 +2480,7 @@ contains ! COPY NUCLIDES TO ARRAYS IN MATERIAL ! allocate arrays in Material object - n = list_names % size() + n = names % size() mat % n_nuclides = n allocate(mat % names(n)) allocate(mat % nuclide(n)) @@ -2459,27 +2489,21 @@ contains ALL_NUCLIDES: do j = 1, mat % n_nuclides ! Check that this nuclide is listed in the cross_sections.xml file - name = trim(list_names % get_item(j)) - if (.not. xs_listing_dict % has_key(to_lower(name))) then + name = trim(names % data(j)) + if (.not. library_dict % has_key(to_lower(name))) then call fatal_error("Could not find nuclide " // trim(name) & // " in cross_sections data file!") end if + i_library = library_dict % get_key(to_lower(name)) if (run_CE) then ! Check to make sure cross-section is continuous energy neutron table - n = len_trim(name) - if (name(n:n) /= 'c') then + if (libraries(i_library) % type /= LIBRARY_NEUTRON) then call fatal_error("Cross-section table " // trim(name) & // " is not a continuous-energy neutron table.") end if end if - ! Find xs_listing and set the name/alias according to the listing - index_list = xs_listing_dict % get_key(to_lower(name)) - name = xs_listings(index_list) % name - alias = xs_listings(index_list) % alias - zaid = xs_listings(index_list) % zaid - ! If this nuclide hasn't been encountered yet, we need to add its name ! and alias to the nuclide_dict if (.not. nuclide_dict % has_key(to_lower(name))) then @@ -2487,26 +2511,21 @@ contains mat % nuclide(j) = index_nuclide call nuclide_dict % add_key(to_lower(name), index_nuclide) - call nuclide_dict % add_key(to_lower(alias), index_nuclide) else mat % nuclide(j) = nuclide_dict % get_key(to_lower(name)) end if - ! Construct dict of nuclide zaid - if (.not. nuc_zaid_dict % has_key(zaid)) then - index_nuc_zaid = index_nuc_zaid + 1 - call nuc_zaid_dict % add_key(zaid, index_nuc_zaid) - end if - ! Copy name and atom/weight percent mat % names(j) = name - mat % atom_density(j) = list_density % get_item(j) + mat % atom_density(j) = densities % data(j) ! Cast integer isotropic lab scattering flag to boolean - if (list_iso_lab % get_item(j) == 1) then - mat % p0(j) = .true. - else - mat % p0(j) = .false. + if (run_CE) then + if (list_iso_lab % data(j) == 1) then + mat % p0(j) = .true. + else + mat % p0(j) = .false. + end if end if end do ALL_NUCLIDES @@ -2523,8 +2542,8 @@ contains if (sum_density) mat % density = sum(mat % atom_density) ! Clear lists - call list_names % clear() - call list_density % clear() + call names % clear() + call densities % clear() call list_iso_lab % clear() ! ======================================================================= @@ -2562,15 +2581,22 @@ contains mat % sab_names(j) = name ! Check that this nuclide is listed in the cross_sections.xml file - if (.not. xs_listing_dict % has_key(to_lower(name))) then + if (.not. library_dict % has_key(to_lower(name))) then call fatal_error("Could not find S(a,b) table " // trim(name) & // " in cross_sections.xml file!") end if ! Find index in xs_listing and set the name and alias according to the ! listing - index_list = xs_listing_dict % get_key(to_lower(name)) - name = xs_listings(index_list) % name + i_library = library_dict % get_key(to_lower(name)) + + if (run_CE) then + ! Check to make sure cross-section is continuous energy neutron table + if (libraries(i_library) % type /= LIBRARY_THERMAL) then + call fatal_error("Cross-section table " // trim(name) & + // " is not a S(a,b) table.") + end if + end if ! If this S(a,b) table hasn't been encountered yet, we need to add its ! name and alias to the sab_dict @@ -2592,7 +2618,6 @@ contains ! Set total number of nuclides and S(a,b) tables n_nuclides_total = index_nuclide n_sab_tables = index_sab - n_nuc_zaid_total = index_nuc_zaid ! Close materials XML file call close_xmldoc(doc) @@ -3270,10 +3295,10 @@ contains ! If a specific nuclide was specified word = to_lower(sarray(j)) - ! Append default_xs specifier to nuclide if needed - if ((default_xs /= '') .and. (.not. ends_with(sarray(j), 'c'))) then - word = trim(word) // "." // trim(default_xs) - end if +!!$ ! Append default_xs specifier to nuclide if needed +!!$ if ((default_xs /= '') .and. (.not. ends_with(sarray(j), 'c'))) then +!!$ word = trim(word) // "." // trim(default_xs) +!!$ end if ! Search through nuclides pair_list => nuclide_dict % keys() @@ -4516,19 +4541,19 @@ contains ! file contains a listing of the CE and MG cross sections that may be used. !=============================================================================== - subroutine read_ce_cross_sections_xml() + subroutine read_ce_cross_sections_xml(libraries) + type(Library), allocatable, intent(out) :: libraries(:) integer :: i ! loop index - integer :: filetype ! default file type - integer :: recl ! default record length - integer :: entries ! default number of entries + integer :: n + integer :: n_libraries logical :: file_exists ! does cross_sections.xml exist? - character(MAX_WORD_LEN) :: directory ! directory with cross sections - character(MAX_LINE_LEN) :: temp_str - type(XsListing), pointer :: listing => null() - type(Node), pointer :: doc => null() - type(Node), pointer :: node_ace => null() - type(NodeList), pointer :: node_ace_list => null() + character(MAX_WORD_LEN) :: directory ! directory with cross sections + character(MAX_WORD_LEN) :: words(MAX_WORDS) + character(10000) :: temp_str + type(Node), pointer :: doc + type(Node), pointer :: node_library + type(NodeList), pointer :: node_library_list ! Check if cross_sections.xml exists inquire(FILE=path_cross_sections, EXIST=file_exists) @@ -4553,118 +4578,64 @@ contains 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) - if (trim(temp_str) == 'ascii') then - filetype = ASCII - elseif (trim(temp_str) == 'binary') then - filetype = BINARY - elseif (len_trim(temp_str) == 0) then - filetype = ASCII - else - call fatal_error("Unknown filetype in cross_sections.xml: " & - // trim(temp_str)) - end if - - ! copy default record length and entries for binary files - if (filetype == BINARY) then - call get_node_value(doc, "record_length", recl) - call get_node_value(doc, "entries", entries) - end if - - ! Get node list of all - call get_node_list(doc, "ace_table", node_ace_list) - n_listings = get_list_size(node_ace_list) + ! Get node list of all + call get_node_list(doc, "library", node_library_list) + n_libraries = get_list_size(node_library_list) ! Allocate xs_listings array - if (n_listings == 0) then - call fatal_error("No ACE table listings present in cross_sections.xml & + if (n_libraries == 0) then + call fatal_error("No cross section libraries present in cross_sections.xml & &file!") else - allocate(xs_listings(n_listings)) + allocate(libraries(n_libraries)) end if - do i = 1, n_listings - listing => xs_listings(i) - + do i = 1, n_libraries ! Get pointer to ace table XML node - call get_list_item(node_ace_list, i, node_ace) + call get_list_item(node_library_list, i, node_library) - ! 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 + ! Get list of materials + if (check_for_node(node_library, "materials")) then + call get_node_value(node_library, "materials", temp_str) + call split_string(temp_str, words, n) + allocate(libraries(i) % materials(n)) + libraries(i) % materials(:) = words(1:n) 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 + ! Get type of library + if (check_for_node(node_library, "type")) then + call get_node_value(node_library, "type", temp_str) + select case(to_lower(temp_str)) + case ('neutron') + libraries(i) % type = LIBRARY_NEUTRON + case ('thermal') + libraries(i) % type = LIBRARY_THERMAL + end select 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 - - ! determine metastable state - if (.not. check_for_node(node_ace, "metastable")) then - listing % metastable = .false. - else - listing % metastable = .true. + call fatal_error("Missing library type") 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) + if (check_for_node(node_library, "path")) then + call get_node_value(node_library, "path", temp_str) else - call fatal_error("Path missing for isotope " // listing % name) + call fatal_error("Missing library path") end if if (starts_with(temp_str, '/')) then - listing % path = trim(temp_str) + libraries(i) % path = trim(temp_str) else if (ends_with(directory,'/')) then - listing % path = trim(directory) // trim(temp_str) + libraries(i) % path = trim(directory) // trim(temp_str) else - listing % path = trim(directory) // '/' // trim(temp_str) + libraries(i) % 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 - end do - - ! Check that 0K nuclides are listed in the cross_sections.xml file - do i = 1, n_res_scatterers_total - if (.not. xs_listing_dict % has_key(trim(nuclides_0K(i) % name_0K))) then - call fatal_error("Could not find nuclide " & - // trim(nuclides_0K(i) % name_0K) & - // " in cross_sections.xml file!") + inquire(FILE=libraries(i) % path, EXIST=file_exists) + if (.not. file_exists) then + call warning("Cross section library " // trim(libraries(i) % path) // & + " does not exist.") end if end do @@ -4673,11 +4644,12 @@ contains end subroutine read_ce_cross_sections_xml - subroutine read_mg_cross_sections_xml() + subroutine read_mg_cross_sections_xml(libraries) + type(Library), allocatable, intent(out) :: libraries(:) integer :: i ! loop index - logical :: file_exists ! does mgxs.xml exist? - type(XsListing), pointer :: listing => null() + integer :: n_libraries + logical :: file_exists ! does cross_sections.xml exist? type(Node), pointer :: doc => null() type(Node), pointer :: node_xsdata => null() type(NodeList), pointer :: node_xsdata_list => null() @@ -4736,55 +4708,23 @@ contains ! Get node list of all call get_node_list(doc, "xsdata", node_xsdata_list) - n_listings = get_list_size(node_xsdata_list) + n_libraries = get_list_size(node_xsdata_list) ! Allocate xs_listings array - if (n_listings == 0) then + if (n_libraries == 0) then call fatal_error("At least one element must be present in & &mgxs.xml file!") else - allocate(xs_listings(n_listings)) + allocate(libraries(n_libraries)) end if - do i = 1, n_listings - listing => xs_listings(i) - + do i = 1, n_libraries ! Get pointer to xsdata table XML node call get_list_item(node_xsdata_list, i, node_xsdata) - ! copy a number of attributes - call get_node_value(node_xsdata, "name", listing % name) - listing % name = to_lower(listing % name) - listing % alias = listing % name - if (check_for_node(node_xsdata, "alias")) & - call get_node_value(node_xsdata, "alias", listing % alias) - listing % alias = to_lower(listing % alias) - if (check_for_node(node_xsdata, "zaid")) then - call get_node_value(node_xsdata, "zaid", listing % zaid) - else - listing % zaid = -1 - end if - if (check_for_node(node_xsdata, "awr")) then - call get_node_value(node_xsdata, "awr", listing % awr) - else - ! Set to a default of 1; this allows a macroscopic library to still - ! be used with materials with atom/b-cm units for testing purposes - listing % awr = ONE - end if - if (check_for_node(node_xsdata, "kT")) then - call get_node_value(node_xsdata, "kT", listing % kT) - else - listing % kT = 293.6_8 * K_BOLTZMANN - end if - - ! determine type of cross section - if (ends_with(listing % name, 'c')) then - listing % type = NEUTRON - end if - - ! create dictionary entry for both name and alias - call xs_listing_dict % add_key(to_lower(listing % name), i) - call xs_listing_dict % add_key(to_lower(listing % alias), i) + ! Get name of material + allocate(libraries(i) % materials(1)) + call get_node_value(node_xsdata, "name", libraries(i) % materials(1)) end do ! Close cross sections XML file @@ -4800,14 +4740,12 @@ contains ! evaluations of particular isotopes don't exist. !=============================================================================== - subroutine expand_natural_element(name, xs, density, list_names, & - list_density) - - character(*), intent(in) :: name - character(*), intent(in) :: xs - real(8), intent(in) :: density - type(ListChar), intent(inout) :: list_names - type(ListReal), intent(inout) :: list_density + subroutine expand_natural_element(name, xs, density, names, densities) + character(*), intent(in) :: name + character(*), intent(in) :: xs + real(8), intent(in) :: density + type(VectorChar), intent(inout) :: names + type(VectorReal), intent(inout) :: densities character(2) :: element_name @@ -4815,670 +4753,670 @@ contains select case (to_lower(element_name)) case ('h') - call list_names % append('1001.' // xs) - call list_density % append(density * 0.999885_8) - call list_names % append('1002.' // xs) - call list_density % append(density * 0.000115_8) + call names % push_back('H1.' // xs) + call densities % push_back(density * 0.999885_8) + call names % push_back('H2.' // xs) + call densities % push_back(density * 0.000115_8) case ('he') - call list_names % append('2003.' // xs) - call list_density % append(density * 0.00000134_8) - call list_names % append('2004.' // xs) - call list_density % append(density * 0.99999866_8) + call names % push_back('He3.' // xs) + call densities % push_back(density * 0.00000134_8) + call names % push_back('He4.' // xs) + call densities % push_back(density * 0.99999866_8) case ('li') - call list_names % append('3006.' // xs) - call list_density % append(density * 0.0759_8) - call list_names % append('3007.' // xs) - call list_density % append(density * 0.9241_8) + call names % push_back('Li6.' // xs) + call densities % push_back(density * 0.0759_8) + call names % push_back('Li7.' // xs) + call densities % push_back(density * 0.9241_8) case ('be') - call list_names % append('4009.' // xs) - call list_density % append(density) + call names % push_back('Be9.' // xs) + call densities % push_back(density) case ('b') - call list_names % append('5010.' // xs) - call list_density % append(density * 0.199_8) - call list_names % append('5011.' // xs) - call list_density % append(density * 0.801_8) + call names % push_back('B10.' // xs) + call densities % push_back(density * 0.199_8) + call names % push_back('B11.' // xs) + call densities % push_back(density * 0.801_8) case ('c') ! No evaluations split up Carbon into isotopes yet - call list_names % append('6000.' // xs) - call list_density % append(density) + call names % push_back('C0.' // xs) + call densities % push_back(density) case ('n') - call list_names % append('7014.' // xs) - call list_density % append(density * 0.99636_8) - call list_names % append('7015.' // xs) - call list_density % append(density * 0.00364_8) + call names % push_back('N14.' // xs) + call densities % push_back(density * 0.99636_8) + call names % push_back('N15.' // xs) + call densities % push_back(density * 0.00364_8) case ('o') if (default_expand == JEFF_32) then - call list_names % append('8016.' // xs) - call list_density % append(density * 0.99757_8) - call list_names % append('8017.' // xs) - call list_density % append(density * 0.00038_8) - call list_names % append('8018.' // xs) - call list_density % append(density * 0.00205_8) + call names % push_back('O16.' // xs) + call densities % push_back(density * 0.99757_8) + call names % push_back('O17.' // xs) + call densities % push_back(density * 0.00038_8) + call names % push_back('O18.' // xs) + call densities % push_back(density * 0.00205_8) elseif (default_expand >= JENDL_32 .and. default_expand <= JENDL_40) then - call list_names % append('8016.' // xs) - call list_density % append(density) + call names % push_back('O16.' // xs) + call densities % push_back(density) else - call list_names % append('8016.' // xs) - call list_density % append(density * 0.99962_8) - call list_names % append('8017.' // xs) - call list_density % append(density * 0.00038_8) + call names % push_back('O16.' // xs) + call densities % push_back(density * 0.99962_8) + call names % push_back('O17.' // xs) + call densities % push_back(density * 0.00038_8) end if case ('f') - call list_names % append('9019.' // xs) - call list_density % append(density) + call names % push_back('F19.' // xs) + call densities % push_back(density) case ('ne') - call list_names % append('10020.' // xs) - call list_density % append(density * 0.9048_8) - call list_names % append('10021.' // xs) - call list_density % append(density * 0.0027_8) - call list_names % append('10022.' // xs) - call list_density % append(density * 0.0925_8) + call names % push_back('Ne20.' // xs) + call densities % push_back(density * 0.9048_8) + call names % push_back('Ne21.' // xs) + call densities % push_back(density * 0.0027_8) + call names % push_back('Ne22.' // xs) + call densities % push_back(density * 0.0925_8) case ('na') - call list_names % append('11023.' // xs) - call list_density % append(density) + call names % push_back('Na23.' // xs) + call densities % push_back(density) case ('mg') - call list_names % append('12024.' // xs) - call list_density % append(density * 0.7899_8) - call list_names % append('12025.' // xs) - call list_density % append(density * 0.1000_8) - call list_names % append('12026.' // xs) - call list_density % append(density * 0.1101_8) + call names % push_back('Mg24.' // xs) + call densities % push_back(density * 0.7899_8) + call names % push_back('Mg25.' // xs) + call densities % push_back(density * 0.1000_8) + call names % push_back('Mg26.' // xs) + call densities % push_back(density * 0.1101_8) case ('al') - call list_names % append('13027.' // xs) - call list_density % append(density) + call names % push_back('Al27.' // xs) + call densities % push_back(density) case ('si') - call list_names % append('14028.' // xs) - call list_density % append(density * 0.92223_8) - call list_names % append('14029.' // xs) - call list_density % append(density * 0.04685_8) - call list_names % append('14030.' // xs) - call list_density % append(density * 0.03092_8) + call names % push_back('Si28.' // xs) + call densities % push_back(density * 0.92223_8) + call names % push_back('Si29.' // xs) + call densities % push_back(density * 0.04685_8) + call names % push_back('Si30.' // xs) + call densities % push_back(density * 0.03092_8) case ('p') - call list_names % append('15031.' // xs) - call list_density % append(density) + call names % push_back('P31.' // xs) + call densities % push_back(density) case ('s') - call list_names % append('16032.' // xs) - call list_density % append(density * 0.9499_8) - call list_names % append('16033.' // xs) - call list_density % append(density * 0.0075_8) - call list_names % append('16034.' // xs) - call list_density % append(density * 0.0425_8) - call list_names % append('16036.' // xs) - call list_density % append(density * 0.0001_8) + call names % push_back('S32.' // xs) + call densities % push_back(density * 0.9499_8) + call names % push_back('S33.' // xs) + call densities % push_back(density * 0.0075_8) + call names % push_back('S34.' // xs) + call densities % push_back(density * 0.0425_8) + call names % push_back('S36.' // xs) + call densities % push_back(density * 0.0001_8) case ('cl') - call list_names % append('17035.' // xs) - call list_density % append(density * 0.7576_8) - call list_names % append('17037.' // xs) - call list_density % append(density * 0.2424_8) + call names % push_back('Cl35.' // xs) + call densities % push_back(density * 0.7576_8) + call names % push_back('Cl37.' // xs) + call densities % push_back(density * 0.2424_8) case ('ar') - call list_names % append('18036.' // xs) - call list_density % append(density * 0.003336_8) - call list_names % append('18038.' // xs) - call list_density % append(density * 0.000629_8) - call list_names % append('18040.' // xs) - call list_density % append(density * 0.996035_8) + call names % push_back('Ar36.' // xs) + call densities % push_back(density * 0.003336_8) + call names % push_back('Ar38.' // xs) + call densities % push_back(density * 0.000629_8) + call names % push_back('Ar40.' // xs) + call densities % push_back(density * 0.996035_8) case ('k') - call list_names % append('19039.' // xs) - call list_density % append(density * 0.932581_8) - call list_names % append('19040.' // xs) - call list_density % append(density * 0.000117_8) - call list_names % append('19041.' // xs) - call list_density % append(density * 0.067302_8) + call names % push_back('K39.' // xs) + call densities % push_back(density * 0.932581_8) + call names % push_back('K40.' // xs) + call densities % push_back(density * 0.000117_8) + call names % push_back('K41.' // xs) + call densities % push_back(density * 0.067302_8) case ('ca') - call list_names % append('20040.' // xs) - call list_density % append(density * 0.96941_8) - call list_names % append('20042.' // xs) - call list_density % append(density * 0.00647_8) - call list_names % append('20043.' // xs) - call list_density % append(density * 0.00135_8) - call list_names % append('20044.' // xs) - call list_density % append(density * 0.02086_8) - call list_names % append('20046.' // xs) - call list_density % append(density * 0.00004_8) - call list_names % append('20048.' // xs) - call list_density % append(density * 0.00187_8) + call names % push_back('Ca40.' // xs) + call densities % push_back(density * 0.96941_8) + call names % push_back('Ca42.' // xs) + call densities % push_back(density * 0.00647_8) + call names % push_back('Ca43.' // xs) + call densities % push_back(density * 0.00135_8) + call names % push_back('Ca44.' // xs) + call densities % push_back(density * 0.02086_8) + call names % push_back('Ca46.' // xs) + call densities % push_back(density * 0.00004_8) + call names % push_back('Ca48.' // xs) + call densities % push_back(density * 0.00187_8) case ('sc') - call list_names % append('21045.' // xs) - call list_density % append(density) + call names % push_back('Sc45.' // xs) + call densities % push_back(density) case ('ti') - call list_names % append('22046.' // xs) - call list_density % append(density * 0.0825_8) - call list_names % append('22047.' // xs) - call list_density % append(density * 0.0744_8) - call list_names % append('22048.' // xs) - call list_density % append(density * 0.7372_8) - call list_names % append('22049.' // xs) - call list_density % append(density * 0.0541_8) - call list_names % append('22050.' // xs) - call list_density % append(density * 0.0518_8) + call names % push_back('Ti46.' // xs) + call densities % push_back(density * 0.0825_8) + call names % push_back('Ti47.' // xs) + call densities % push_back(density * 0.0744_8) + call names % push_back('Ti48.' // xs) + call densities % push_back(density * 0.7372_8) + call names % push_back('Ti49.' // xs) + call densities % push_back(density * 0.0541_8) + call names % push_back('Ti50.' // xs) + call densities % push_back(density * 0.0518_8) case ('v') if (default_expand == ENDF_BVII0 .or. default_expand == JEFF_311 & .or. default_expand == JEFF_32 .or. & (default_expand >= JENDL_32 .and. default_expand <= JENDL_33)) then - call list_names % append('23000.' // xs) - call list_density % append(density) + call names % push_back('V0.' // xs) + call densities % push_back(density) else - call list_names % append('23050.' // xs) - call list_density % append(density * 0.0025_8) - call list_names % append('23051.' // xs) - call list_density % append(density * 0.9975_8) + call names % push_back('V50.' // xs) + call densities % push_back(density * 0.0025_8) + call names % push_back('V51.' // xs) + call densities % push_back(density * 0.9975_8) end if case ('cr') - call list_names % append('24050.' // xs) - call list_density % append(density * 0.04345_8) - call list_names % append('24052.' // xs) - call list_density % append(density * 0.83789_8) - call list_names % append('24053.' // xs) - call list_density % append(density * 0.09501_8) - call list_names % append('24054.' // xs) - call list_density % append(density * 0.02365_8) + call names % push_back('Cr50.' // xs) + call densities % push_back(density * 0.04345_8) + call names % push_back('Cr52.' // xs) + call densities % push_back(density * 0.83789_8) + call names % push_back('Cr53.' // xs) + call densities % push_back(density * 0.09501_8) + call names % push_back('Cr54.' // xs) + call densities % push_back(density * 0.02365_8) case ('mn') - call list_names % append('25055.' // xs) - call list_density % append(density) + call names % push_back('Mn55.' // xs) + call densities % push_back(density) case ('fe') - call list_names % append('26054.' // xs) - call list_density % append(density * 0.05845_8) - call list_names % append('26056.' // xs) - call list_density % append(density * 0.91754_8) - call list_names % append('26057.' // xs) - call list_density % append(density * 0.02119_8) - call list_names % append('26058.' // xs) - call list_density % append(density * 0.00282_8) + call names % push_back('Fe54.' // xs) + call densities % push_back(density * 0.05845_8) + call names % push_back('Fe56.' // xs) + call densities % push_back(density * 0.91754_8) + call names % push_back('Fe57.' // xs) + call densities % push_back(density * 0.02119_8) + call names % push_back('Fe58.' // xs) + call densities % push_back(density * 0.00282_8) case ('co') - call list_names % append('27059.' // xs) - call list_density % append(density) + call names % push_back('Co59.' // xs) + call densities % push_back(density) case ('ni') - call list_names % append('28058.' // xs) - call list_density % append(density * 0.68077_8) - call list_names % append('28060.' // xs) - call list_density % append(density * 0.26223_8) - call list_names % append('28061.' // xs) - call list_density % append(density * 0.011399_8) - call list_names % append('28062.' // xs) - call list_density % append(density * 0.036346_8) - call list_names % append('28064.' // xs) - call list_density % append(density * 0.009255_8) + call names % push_back('Ni58.' // xs) + call densities % push_back(density * 0.68077_8) + call names % push_back('Ni60.' // xs) + call densities % push_back(density * 0.26223_8) + call names % push_back('Ni61.' // xs) + call densities % push_back(density * 0.011399_8) + call names % push_back('Ni62.' // xs) + call densities % push_back(density * 0.036346_8) + call names % push_back('Ni64.' // xs) + call densities % push_back(density * 0.009255_8) case ('cu') - call list_names % append('29063.' // xs) - call list_density % append(density * 0.6915_8) - call list_names % append('29065.' // xs) - call list_density % append(density * 0.3085_8) + call names % push_back('Cu63.' // xs) + call densities % push_back(density * 0.6915_8) + call names % push_back('Cu65.' // xs) + call densities % push_back(density * 0.3085_8) case ('zn') if (default_expand == ENDF_BVII0 .or. default_expand == & JEFF_311 .or. default_expand == JEFF_312) then - call list_names % append('30000.' // xs) - call list_density % append(density) + call names % push_back('Zn0.' // xs) + call densities % push_back(density) else - call list_names % append('30064.' // xs) - call list_density % append(density * 0.4917_8) - call list_names % append('30066.' // xs) - call list_density % append(density * 0.2773_8) - call list_names % append('30067.' // xs) - call list_density % append(density * 0.0404_8) - call list_names % append('30068.' // xs) - call list_density % append(density * 0.1845_8) - call list_names % append('30070.' // xs) - call list_density % append(density * 0.0061_8) + call names % push_back('Zn64.' // xs) + call densities % push_back(density * 0.4917_8) + call names % push_back('Zn66.' // xs) + call densities % push_back(density * 0.2773_8) + call names % push_back('Zn67.' // xs) + call densities % push_back(density * 0.0404_8) + call names % push_back('Zn68.' // xs) + call densities % push_back(density * 0.1845_8) + call names % push_back('Zn70.' // xs) + call densities % push_back(density * 0.0061_8) end if case ('ga') if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then - call list_names % append('31000.' // xs) - call list_density % append(density) + call names % push_back('Ga0.' // xs) + call densities % push_back(density) else - call list_names % append('31069.' // xs) - call list_density % append(density * 0.60108_8) - call list_names % append('31071.' // xs) - call list_density % append(density * 0.39892_8) + call names % push_back('Ha69.' // xs) + call densities % push_back(density * 0.60108_8) + call names % push_back('Ga71.' // xs) + call densities % push_back(density * 0.39892_8) end if case ('ge') - call list_names % append('32070.' // xs) - call list_density % append(density * 0.2057_8) - call list_names % append('32072.' // xs) - call list_density % append(density * 0.2745_8) - call list_names % append('32073.' // xs) - call list_density % append(density * 0.0775_8) - call list_names % append('32074.' // xs) - call list_density % append(density * 0.3650_8) - call list_names % append('32076.' // xs) - call list_density % append(density * 0.0773_8) + call names % push_back('Ge70.' // xs) + call densities % push_back(density * 0.2057_8) + call names % push_back('Ge72.' // xs) + call densities % push_back(density * 0.2745_8) + call names % push_back('Ge73.' // xs) + call densities % push_back(density * 0.0775_8) + call names % push_back('Ge74.' // xs) + call densities % push_back(density * 0.3650_8) + call names % push_back('Ge76.' // xs) + call densities % push_back(density * 0.0773_8) case ('as') - call list_names % append('33075.' // xs) - call list_density % append(density) + call names % push_back('As75.' // xs) + call densities % push_back(density) case ('se') - call list_names % append('34074.' // xs) - call list_density % append(density * 0.0089_8) - call list_names % append('34076.' // xs) - call list_density % append(density * 0.0937_8) - call list_names % append('34077.' // xs) - call list_density % append(density * 0.0763_8) - call list_names % append('34078.' // xs) - call list_density % append(density * 0.2377_8) - call list_names % append('34080.' // xs) - call list_density % append(density * 0.4961_8) - call list_names % append('34082.' // xs) - call list_density % append(density * 0.0873_8) + call names % push_back('Se74.' // xs) + call densities % push_back(density * 0.0089_8) + call names % push_back('Se76.' // xs) + call densities % push_back(density * 0.0937_8) + call names % push_back('Se77.' // xs) + call densities % push_back(density * 0.0763_8) + call names % push_back('Se78.' // xs) + call densities % push_back(density * 0.2377_8) + call names % push_back('Se80.' // xs) + call densities % push_back(density * 0.4961_8) + call names % push_back('Se82.' // xs) + call densities % push_back(density * 0.0873_8) case ('br') - call list_names % append('35079.' // xs) - call list_density % append(density * 0.5069_8) - call list_names % append('35081.' // xs) - call list_density % append(density * 0.4931_8) + call names % push_back('Br79.' // xs) + call densities % push_back(density * 0.5069_8) + call names % push_back('Br81.' // xs) + call densities % push_back(density * 0.4931_8) case ('kr') - call list_names % append('36078.' // xs) - call list_density % append(density * 0.00355_8) - call list_names % append('36080.' // xs) - call list_density % append(density * 0.02286_8) - call list_names % append('36082.' // xs) - call list_density % append(density * 0.11593_8) - call list_names % append('36083.' // xs) - call list_density % append(density * 0.11500_8) - call list_names % append('36084.' // xs) - call list_density % append(density * 0.56987_8) - call list_names % append('36086.' // xs) - call list_density % append(density * 0.17279_8) + call names % push_back('Kr78.' // xs) + call densities % push_back(density * 0.00355_8) + call names % push_back('Kr80.' // xs) + call densities % push_back(density * 0.02286_8) + call names % push_back('Kr82.' // xs) + call densities % push_back(density * 0.11593_8) + call names % push_back('Kr83.' // xs) + call densities % push_back(density * 0.11500_8) + call names % push_back('Kr84.' // xs) + call densities % push_back(density * 0.56987_8) + call names % push_back('Kr86.' // xs) + call densities % push_back(density * 0.17279_8) case ('rb') - call list_names % append('37085.' // xs) - call list_density % append(density * 0.7217_8) - call list_names % append('37087.' // xs) - call list_density % append(density * 0.2783_8) + call names % push_back('Rb85.' // xs) + call densities % push_back(density * 0.7217_8) + call names % push_back('Rb87.' // xs) + call densities % push_back(density * 0.2783_8) case ('sr') - call list_names % append('38084.' // xs) - call list_density % append(density * 0.0056_8) - call list_names % append('38086.' // xs) - call list_density % append(density * 0.0986_8) - call list_names % append('38087.' // xs) - call list_density % append(density * 0.0700_8) - call list_names % append('38088.' // xs) - call list_density % append(density * 0.8258_8) + call names % push_back('Sr84.' // xs) + call densities % push_back(density * 0.0056_8) + call names % push_back('Sr86.' // xs) + call densities % push_back(density * 0.0986_8) + call names % push_back('Sr87.' // xs) + call densities % push_back(density * 0.0700_8) + call names % push_back('Sr88.' // xs) + call densities % push_back(density * 0.8258_8) case ('y') - call list_names % append('39089.' // xs) - call list_density % append(density) + call names % push_back('Y89.' // xs) + call densities % push_back(density) case ('zr') - call list_names % append('40090.' // xs) - call list_density % append(density * 0.5145_8) - call list_names % append('40091.' // xs) - call list_density % append(density * 0.1122_8) - call list_names % append('40092.' // xs) - call list_density % append(density * 0.1715_8) - call list_names % append('40094.' // xs) - call list_density % append(density * 0.1738_8) - call list_names % append('40096.' // xs) - call list_density % append(density * 0.0280_8) + call names % push_back('Zr90.' // xs) + call densities % push_back(density * 0.5145_8) + call names % push_back('Zr91.' // xs) + call densities % push_back(density * 0.1122_8) + call names % push_back('Zr92.' // xs) + call densities % push_back(density * 0.1715_8) + call names % push_back('Zr94.' // xs) + call densities % push_back(density * 0.1738_8) + call names % push_back('Zr96.' // xs) + call densities % push_back(density * 0.0280_8) case ('nb') - call list_names % append('41093.' // xs) - call list_density % append(density) + call names % push_back('Nb93.' // xs) + call densities % push_back(density) case ('mo') - call list_names % append('42092.' // xs) - call list_density % append(density * 0.1453_8) - call list_names % append('42094.' // xs) - call list_density % append(density * 0.0915_8) - call list_names % append('42095.' // xs) - call list_density % append(density * 0.1584_8) - call list_names % append('42096.' // xs) - call list_density % append(density * 0.1667_8) - call list_names % append('42097.' // xs) - call list_density % append(density * 0.0960_8) - call list_names % append('42098.' // xs) - call list_density % append(density * 0.2439_8) - call list_names % append('42100.' // xs) - call list_density % append(density * 0.0982_8) + call names % push_back('Mo92.' // xs) + call densities % push_back(density * 0.1453_8) + call names % push_back('Mo94.' // xs) + call densities % push_back(density * 0.0915_8) + call names % push_back('Mo95.' // xs) + call densities % push_back(density * 0.1584_8) + call names % push_back('Mo96.' // xs) + call densities % push_back(density * 0.1667_8) + call names % push_back('Mo97.' // xs) + call densities % push_back(density * 0.0960_8) + call names % push_back('Mo98.' // xs) + call densities % push_back(density * 0.2439_8) + call names % push_back('Mo100.' // xs) + call densities % push_back(density * 0.0982_8) case ('ru') - call list_names % append('44096.' // xs) - call list_density % append(density * 0.0554_8) - call list_names % append('44098.' // xs) - call list_density % append(density * 0.0187_8) - call list_names % append('44099.' // xs) - call list_density % append(density * 0.1276_8) - call list_names % append('44100.' // xs) - call list_density % append(density * 0.1260_8) - call list_names % append('44101.' // xs) - call list_density % append(density * 0.1706_8) - call list_names % append('44102.' // xs) - call list_density % append(density * 0.3155_8) - call list_names % append('44104.' // xs) - call list_density % append(density * 0.1862_8) + call names % push_back('Ru96.' // xs) + call densities % push_back(density * 0.0554_8) + call names % push_back('Ru98.' // xs) + call densities % push_back(density * 0.0187_8) + call names % push_back('Ru99.' // xs) + call densities % push_back(density * 0.1276_8) + call names % push_back('Ru100.' // xs) + call densities % push_back(density * 0.1260_8) + call names % push_back('Ru101.' // xs) + call densities % push_back(density * 0.1706_8) + call names % push_back('Ru102.' // xs) + call densities % push_back(density * 0.3155_8) + call names % push_back('Ru104.' // xs) + call densities % push_back(density * 0.1862_8) case ('rh') - call list_names % append('45103.' // xs) - call list_density % append(density) + call names % push_back('Rh103.' // xs) + call densities % push_back(density) case ('pd') - call list_names % append('46102.' // xs) - call list_density % append(density * 0.0102_8) - call list_names % append('46104.' // xs) - call list_density % append(density * 0.1114_8) - call list_names % append('46105.' // xs) - call list_density % append(density * 0.2233_8) - call list_names % append('46106.' // xs) - call list_density % append(density * 0.2733_8) - call list_names % append('46108.' // xs) - call list_density % append(density * 0.2646_8) - call list_names % append('46110.' // xs) - call list_density % append(density * 0.1172_8) + call names % push_back('Pd102.' // xs) + call densities % push_back(density * 0.0102_8) + call names % push_back('Pd104.' // xs) + call densities % push_back(density * 0.1114_8) + call names % push_back('Pd105.' // xs) + call densities % push_back(density * 0.2233_8) + call names % push_back('Pd106.' // xs) + call densities % push_back(density * 0.2733_8) + call names % push_back('Pd108.' // xs) + call densities % push_back(density * 0.2646_8) + call names % push_back('Pd110.' // xs) + call densities % push_back(density * 0.1172_8) case ('ag') - call list_names % append('47107.' // xs) - call list_density % append(density * 0.51839_8) - call list_names % append('47109.' // xs) - call list_density % append(density * 0.48161_8) + call names % push_back('Ag107.' // xs) + call densities % push_back(density * 0.51839_8) + call names % push_back('Ag109.' // xs) + call densities % push_back(density * 0.48161_8) case ('cd') - call list_names % append('48106.' // xs) - call list_density % append(density * 0.0125_8) - call list_names % append('48108.' // xs) - call list_density % append(density * 0.0089_8) - call list_names % append('48110.' // xs) - call list_density % append(density * 0.1249_8) - call list_names % append('48111.' // xs) - call list_density % append(density * 0.1280_8) - call list_names % append('48112.' // xs) - call list_density % append(density * 0.2413_8) - call list_names % append('48113.' // xs) - call list_density % append(density * 0.1222_8) - call list_names % append('48114.' // xs) - call list_density % append(density * 0.2873_8) - call list_names % append('48116.' // xs) - call list_density % append(density * 0.0749_8) + call names % push_back('Cd106.' // xs) + call densities % push_back(density * 0.0125_8) + call names % push_back('Cd108.' // xs) + call densities % push_back(density * 0.0089_8) + call names % push_back('Cd110.' // xs) + call densities % push_back(density * 0.1249_8) + call names % push_back('Cd111.' // xs) + call densities % push_back(density * 0.1280_8) + call names % push_back('Cd112.' // xs) + call densities % push_back(density * 0.2413_8) + call names % push_back('Cd113.' // xs) + call densities % push_back(density * 0.1222_8) + call names % push_back('Cd114.' // xs) + call densities % push_back(density * 0.2873_8) + call names % push_back('Cd116.' // xs) + call densities % push_back(density * 0.0749_8) case ('in') - call list_names % append('49113.' // xs) - call list_density % append(density * 0.0429_8) - call list_names % append('49115.' // xs) - call list_density % append(density * 0.9571_8) + call names % push_back('In113.' // xs) + call densities % push_back(density * 0.0429_8) + call names % push_back('In115.' // xs) + call densities % push_back(density * 0.9571_8) case ('sn') - call list_names % append('50112.' // xs) - call list_density % append(density * 0.0097_8) - call list_names % append('50114.' // xs) - call list_density % append(density * 0.0066_8) - call list_names % append('50115.' // xs) - call list_density % append(density * 0.0034_8) - call list_names % append('50116.' // xs) - call list_density % append(density * 0.1454_8) - call list_names % append('50117.' // xs) - call list_density % append(density * 0.0768_8) - call list_names % append('50118.' // xs) - call list_density % append(density * 0.2422_8) - call list_names % append('50119.' // xs) - call list_density % append(density * 0.0859_8) - call list_names % append('50120.' // xs) - call list_density % append(density * 0.3258_8) - call list_names % append('50122.' // xs) - call list_density % append(density * 0.0463_8) - call list_names % append('50124.' // xs) - call list_density % append(density * 0.0579_8) + call names % push_back('Sn112.' // xs) + call densities % push_back(density * 0.0097_8) + call names % push_back('Sn114.' // xs) + call densities % push_back(density * 0.0066_8) + call names % push_back('Sn115.' // xs) + call densities % push_back(density * 0.0034_8) + call names % push_back('Sn116.' // xs) + call densities % push_back(density * 0.1454_8) + call names % push_back('Sn117.' // xs) + call densities % push_back(density * 0.0768_8) + call names % push_back('Sn118.' // xs) + call densities % push_back(density * 0.2422_8) + call names % push_back('Sn119.' // xs) + call densities % push_back(density * 0.0859_8) + call names % push_back('Sn120.' // xs) + call densities % push_back(density * 0.3258_8) + call names % push_back('Sn122.' // xs) + call densities % push_back(density * 0.0463_8) + call names % push_back('Sn124.' // xs) + call densities % push_back(density * 0.0579_8) case ('sb') - call list_names % append('51121.' // xs) - call list_density % append(density * 0.5721_8) - call list_names % append('51123.' // xs) - call list_density % append(density * 0.4279_8) + call names % push_back('Sb121.' // xs) + call densities % push_back(density * 0.5721_8) + call names % push_back('Sb123.' // xs) + call densities % push_back(density * 0.4279_8) case ('te') - call list_names % append('52120.' // xs) - call list_density % append(density * 0.0009_8) - call list_names % append('52122.' // xs) - call list_density % append(density * 0.0255_8) - call list_names % append('52123.' // xs) - call list_density % append(density * 0.0089_8) - call list_names % append('52124.' // xs) - call list_density % append(density * 0.0474_8) - call list_names % append('52125.' // xs) - call list_density % append(density * 0.0707_8) - call list_names % append('52126.' // xs) - call list_density % append(density * 0.1884_8) - call list_names % append('52128.' // xs) - call list_density % append(density * 0.3174_8) - call list_names % append('52130.' // xs) - call list_density % append(density * 0.3408_8) + call names % push_back('Te120.' // xs) + call densities % push_back(density * 0.0009_8) + call names % push_back('Te122.' // xs) + call densities % push_back(density * 0.0255_8) + call names % push_back('Te123.' // xs) + call densities % push_back(density * 0.0089_8) + call names % push_back('Te124.' // xs) + call densities % push_back(density * 0.0474_8) + call names % push_back('Te125.' // xs) + call densities % push_back(density * 0.0707_8) + call names % push_back('Te126.' // xs) + call densities % push_back(density * 0.1884_8) + call names % push_back('Te128.' // xs) + call densities % push_back(density * 0.3174_8) + call names % push_back('Te130.' // xs) + call densities % push_back(density * 0.3408_8) case ('i') - call list_names % append('53127.' // xs) - call list_density % append(density) + call names % push_back('I127.' // xs) + call densities % push_back(density) case ('xe') - call list_names % append('54124.' // xs) - call list_density % append(density * 0.000952_8) - call list_names % append('54126.' // xs) - call list_density % append(density * 0.000890_8) - call list_names % append('54128.' // xs) - call list_density % append(density * 0.019102_8) - call list_names % append('54129.' // xs) - call list_density % append(density * 0.264006_8) - call list_names % append('54130.' // xs) - call list_density % append(density * 0.040710_8) - call list_names % append('54131.' // xs) - call list_density % append(density * 0.212324_8) - call list_names % append('54132.' // xs) - call list_density % append(density * 0.269086_8) - call list_names % append('54134.' // xs) - call list_density % append(density * 0.104357_8) - call list_names % append('54136.' // xs) - call list_density % append(density * 0.088573_8) + call names % push_back('Xe124.' // xs) + call densities % push_back(density * 0.000952_8) + call names % push_back('Xe126.' // xs) + call densities % push_back(density * 0.000890_8) + call names % push_back('Xe128.' // xs) + call densities % push_back(density * 0.019102_8) + call names % push_back('Xe129.' // xs) + call densities % push_back(density * 0.264006_8) + call names % push_back('Xe130.' // xs) + call densities % push_back(density * 0.040710_8) + call names % push_back('Xe131.' // xs) + call densities % push_back(density * 0.212324_8) + call names % push_back('Xe132.' // xs) + call densities % push_back(density * 0.269086_8) + call names % push_back('Xe134.' // xs) + call densities % push_back(density * 0.104357_8) + call names % push_back('Xe136.' // xs) + call densities % push_back(density * 0.088573_8) case ('cs') - call list_names % append('55133.' // xs) - call list_density % append(density) + call names % push_back('Cs133.' // xs) + call densities % push_back(density) case ('ba') - call list_names % append('56130.' // xs) - call list_density % append(density * 0.00106_8) - call list_names % append('56132.' // xs) - call list_density % append(density * 0.00101_8) - call list_names % append('56134.' // xs) - call list_density % append(density * 0.02417_8) - call list_names % append('56135.' // xs) - call list_density % append(density * 0.06592_8) - call list_names % append('56136.' // xs) - call list_density % append(density * 0.07854_8) - call list_names % append('56137.' // xs) - call list_density % append(density * 0.11232_8) - call list_names % append('56138.' // xs) - call list_density % append(density * 0.71698_8) + call names % push_back('Ba130.' // xs) + call densities % push_back(density * 0.00106_8) + call names % push_back('Ba132.' // xs) + call densities % push_back(density * 0.00101_8) + call names % push_back('Ba134.' // xs) + call densities % push_back(density * 0.02417_8) + call names % push_back('Ba135.' // xs) + call densities % push_back(density * 0.06592_8) + call names % push_back('Ba136.' // xs) + call densities % push_back(density * 0.07854_8) + call names % push_back('Ba137.' // xs) + call densities % push_back(density * 0.11232_8) + call names % push_back('Ba138.' // xs) + call densities % push_back(density * 0.71698_8) case ('la') - call list_names % append('57138.' // xs) - call list_density % append(density * 0.0008881_8) - call list_names % append('57139.' // xs) - call list_density % append(density * 0.9991119_8) + call names % push_back('La138.' // xs) + call densities % push_back(density * 0.0008881_8) + call names % push_back('La139.' // xs) + call densities % push_back(density * 0.9991119_8) case ('ce') - call list_names % append('58136.' // xs) - call list_density % append(density * 0.00185_8) - call list_names % append('58138.' // xs) - call list_density % append(density * 0.00251_8) - call list_names % append('58140.' // xs) - call list_density % append(density * 0.88450_8) - call list_names % append('58142.' // xs) - call list_density % append(density * 0.11114_8) + call names % push_back('Ce136.' // xs) + call densities % push_back(density * 0.00185_8) + call names % push_back('Ce138.' // xs) + call densities % push_back(density * 0.00251_8) + call names % push_back('Ce140.' // xs) + call densities % push_back(density * 0.88450_8) + call names % push_back('Ce142.' // xs) + call densities % push_back(density * 0.11114_8) case ('pr') - call list_names % append('59141.' // xs) - call list_density % append(density) + call names % push_back('Pr141.' // xs) + call densities % push_back(density) case ('nd') - call list_names % append('60142.' // xs) - call list_density % append(density * 0.27152_8) - call list_names % append('60143.' // xs) - call list_density % append(density * 0.12174_8) - call list_names % append('60144.' // xs) - call list_density % append(density * 0.23798_8) - call list_names % append('60145.' // xs) - call list_density % append(density * 0.08293_8) - call list_names % append('60146.' // xs) - call list_density % append(density * 0.17189_8) - call list_names % append('60148.' // xs) - call list_density % append(density * 0.05756_8) - call list_names % append('60150.' // xs) - call list_density % append(density * 0.05638_8) + call names % push_back('Nd142.' // xs) + call densities % push_back(density * 0.27152_8) + call names % push_back('Nd143.' // xs) + call densities % push_back(density * 0.12174_8) + call names % push_back('Nd144.' // xs) + call densities % push_back(density * 0.23798_8) + call names % push_back('Nd145.' // xs) + call densities % push_back(density * 0.08293_8) + call names % push_back('Nd146.' // xs) + call densities % push_back(density * 0.17189_8) + call names % push_back('Nd148.' // xs) + call densities % push_back(density * 0.05756_8) + call names % push_back('Nd150.' // xs) + call densities % push_back(density * 0.05638_8) case ('sm') - call list_names % append('62144.' // xs) - call list_density % append(density * 0.0307_8) - call list_names % append('62147.' // xs) - call list_density % append(density * 0.1499_8) - call list_names % append('62148.' // xs) - call list_density % append(density * 0.1124_8) - call list_names % append('62149.' // xs) - call list_density % append(density * 0.1382_8) - call list_names % append('62150.' // xs) - call list_density % append(density * 0.0738_8) - call list_names % append('62152.' // xs) - call list_density % append(density * 0.2675_8) - call list_names % append('62154.' // xs) - call list_density % append(density * 0.2275_8) + call names % push_back('Sm144.' // xs) + call densities % push_back(density * 0.0307_8) + call names % push_back('Sm147.' // xs) + call densities % push_back(density * 0.1499_8) + call names % push_back('Sm148.' // xs) + call densities % push_back(density * 0.1124_8) + call names % push_back('Sm149.' // xs) + call densities % push_back(density * 0.1382_8) + call names % push_back('Sm150.' // xs) + call densities % push_back(density * 0.0738_8) + call names % push_back('Sm152.' // xs) + call densities % push_back(density * 0.2675_8) + call names % push_back('Sm154.' // xs) + call densities % push_back(density * 0.2275_8) case ('eu') - call list_names % append('63151.' // xs) - call list_density % append(density * 0.4781_8) - call list_names % append('63153.' // xs) - call list_density % append(density * 0.5219_8) + call names % push_back('Eu151.' // xs) + call densities % push_back(density * 0.4781_8) + call names % push_back('Eu153.' // xs) + call densities % push_back(density * 0.5219_8) case ('gd') - call list_names % append('64152.' // xs) - call list_density % append(density * 0.0020_8) - call list_names % append('64154.' // xs) - call list_density % append(density * 0.0218_8) - call list_names % append('64155.' // xs) - call list_density % append(density * 0.1480_8) - call list_names % append('64156.' // xs) - call list_density % append(density * 0.2047_8) - call list_names % append('64157.' // xs) - call list_density % append(density * 0.1565_8) - call list_names % append('64158.' // xs) - call list_density % append(density * 0.2484_8) - call list_names % append('64160.' // xs) - call list_density % append(density * 0.2186_8) + call names % push_back('Gd152.' // xs) + call densities % push_back(density * 0.0020_8) + call names % push_back('Gd154.' // xs) + call densities % push_back(density * 0.0218_8) + call names % push_back('Gd155.' // xs) + call densities % push_back(density * 0.1480_8) + call names % push_back('Gd156.' // xs) + call densities % push_back(density * 0.2047_8) + call names % push_back('Gd157.' // xs) + call densities % push_back(density * 0.1565_8) + call names % push_back('Gd158.' // xs) + call densities % push_back(density * 0.2484_8) + call names % push_back('Gd160.' // xs) + call densities % push_back(density * 0.2186_8) case ('tb') - call list_names % append('65159.' // xs) - call list_density % append(density) + call names % push_back('Tb159.' // xs) + call densities % push_back(density) case ('dy') - call list_names % append('66156.' // xs) - call list_density % append(density * 0.00056_8) - call list_names % append('66158.' // xs) - call list_density % append(density * 0.00095_8) - call list_names % append('66160.' // xs) - call list_density % append(density * 0.02329_8) - call list_names % append('66161.' // xs) - call list_density % append(density * 0.18889_8) - call list_names % append('66162.' // xs) - call list_density % append(density * 0.25475_8) - call list_names % append('66163.' // xs) - call list_density % append(density * 0.24896_8) - call list_names % append('66164.' // xs) - call list_density % append(density * 0.28260_8) + call names % push_back('Dy156.' // xs) + call densities % push_back(density * 0.00056_8) + call names % push_back('Dy158.' // xs) + call densities % push_back(density * 0.00095_8) + call names % push_back('Dy160.' // xs) + call densities % push_back(density * 0.02329_8) + call names % push_back('Dy161.' // xs) + call densities % push_back(density * 0.18889_8) + call names % push_back('Dy162.' // xs) + call densities % push_back(density * 0.25475_8) + call names % push_back('Dy163.' // xs) + call densities % push_back(density * 0.24896_8) + call names % push_back('Dy164.' // xs) + call densities % push_back(density * 0.28260_8) case ('ho') - call list_names % append('67165.' // xs) - call list_density % append(density) + call names % push_back('Ho165.' // xs) + call densities % push_back(density) case ('er') - call list_names % append('68162.' // xs) - call list_density % append(density * 0.00139_8) - call list_names % append('68164.' // xs) - call list_density % append(density * 0.01601_8) - call list_names % append('68166.' // xs) - call list_density % append(density * 0.33503_8) - call list_names % append('68167.' // xs) - call list_density % append(density * 0.22869_8) - call list_names % append('68168.' // xs) - call list_density % append(density * 0.26978_8) - call list_names % append('68170.' // xs) - call list_density % append(density * 0.14910_8) + call names % push_back('Er162.' // xs) + call densities % push_back(density * 0.00139_8) + call names % push_back('Er164.' // xs) + call densities % push_back(density * 0.01601_8) + call names % push_back('Er166.' // xs) + call densities % push_back(density * 0.33503_8) + call names % push_back('Er167.' // xs) + call densities % push_back(density * 0.22869_8) + call names % push_back('Er168.' // xs) + call densities % push_back(density * 0.26978_8) + call names % push_back('Er170.' // xs) + call densities % push_back(density * 0.14910_8) case ('tm') - call list_names % append('69169.' // xs) - call list_density % append(density) + call names % push_back('Tm169.' // xs) + call densities % push_back(density) case ('yb') - call list_names % append('70168.' // xs) - call list_density % append(density * 0.00123_8) - call list_names % append('70170.' // xs) - call list_density % append(density * 0.02982_8) - call list_names % append('70171.' // xs) - call list_density % append(density * 0.1409_8) - call list_names % append('70172.' // xs) - call list_density % append(density * 0.2168_8) - call list_names % append('70173.' // xs) - call list_density % append(density * 0.16103_8) - call list_names % append('70174.' // xs) - call list_density % append(density * 0.32026_8) - call list_names % append('70176.' // xs) - call list_density % append(density * 0.12996_8) + call names % push_back('Yb168.' // xs) + call densities % push_back(density * 0.00123_8) + call names % push_back('Yb170.' // xs) + call densities % push_back(density * 0.02982_8) + call names % push_back('Yb171.' // xs) + call densities % push_back(density * 0.1409_8) + call names % push_back('Yb172.' // xs) + call densities % push_back(density * 0.2168_8) + call names % push_back('Yb173.' // xs) + call densities % push_back(density * 0.16103_8) + call names % push_back('Yb174.' // xs) + call densities % push_back(density * 0.32026_8) + call names % push_back('Yb176.' // xs) + call densities % push_back(density * 0.12996_8) case ('lu') - call list_names % append('71175.' // xs) - call list_density % append(density * 0.97401_8) - call list_names % append('71176.' // xs) - call list_density % append(density * 0.02599_8) + call names % push_back('Lu175.' // xs) + call densities % push_back(density * 0.97401_8) + call names % push_back('Lu176.' // xs) + call densities % push_back(density * 0.02599_8) case ('hf') - call list_names % append('72174.' // xs) - call list_density % append(density * 0.0016_8) - call list_names % append('72176.' // xs) - call list_density % append(density * 0.0526_8) - call list_names % append('72177.' // xs) - call list_density % append(density * 0.1860_8) - call list_names % append('72178.' // xs) - call list_density % append(density * 0.2728_8) - call list_names % append('72179.' // xs) - call list_density % append(density * 0.1362_8) - call list_names % append('72180.' // xs) - call list_density % append(density * 0.3508_8) + call names % push_back('Hf174.' // xs) + call densities % push_back(density * 0.0016_8) + call names % push_back('Hf176.' // xs) + call densities % push_back(density * 0.0526_8) + call names % push_back('Hf177.' // xs) + call densities % push_back(density * 0.1860_8) + call names % push_back('Hf178.' // xs) + call densities % push_back(density * 0.2728_8) + call names % push_back('Hf179.' // xs) + call densities % push_back(density * 0.1362_8) + call names % push_back('Hf180.' // xs) + call densities % push_back(density * 0.3508_8) case ('ta') if (default_expand == ENDF_BVII0 .or. & (default_expand >= JEFF_311 .and. default_expand <= JEFF_312) .or. & (default_expand >= JENDL_32 .and. default_expand <= JENDL_40)) then - call list_names % append('73181.' // xs) - call list_density % append(density) + call names % push_back('Ta181.' // xs) + call densities % push_back(density) else - call list_names % append('73180.' // xs) - call list_density % append(density * 0.0001201_8) - call list_names % append('73181.' // xs) - call list_density % append(density * 0.9998799_8) + call names % push_back('Ta180.' // xs) + call densities % push_back(density * 0.0001201_8) + call names % push_back('Ta181.' // xs) + call densities % push_back(density * 0.9998799_8) end if case ('w') @@ -5486,139 +5424,139 @@ contains .or. default_expand == JEFF_312 .or. & (default_expand >= JENDL_32 .and. default_expand <= JENDL_33)) then ! Combine W-180 with W-182 - call list_names % append('74182.' // xs) - call list_density % append(density * 0.2662_8) - call list_names % append('74183.' // xs) - call list_density % append(density * 0.1431_8) - call list_names % append('74184.' // xs) - call list_density % append(density * 0.3064_8) - call list_names % append('74186.' // xs) - call list_density % append(density * 0.2843_8) + call names % push_back('W182.' // xs) + call densities % push_back(density * 0.2662_8) + call names % push_back('W183.' // xs) + call densities % push_back(density * 0.1431_8) + call names % push_back('W184.' // xs) + call densities % push_back(density * 0.3064_8) + call names % push_back('W186.' // xs) + call densities % push_back(density * 0.2843_8) else - call list_names % append('74180.' // xs) - call list_density % append(density * 0.0012_8) - call list_names % append('74182.' // xs) - call list_density % append(density * 0.2650_8) - call list_names % append('74183.' // xs) - call list_density % append(density * 0.1431_8) - call list_names % append('74184.' // xs) - call list_density % append(density * 0.3064_8) - call list_names % append('74186.' // xs) - call list_density % append(density * 0.2843_8) + call names % push_back('W180.' // xs) + call densities % push_back(density * 0.0012_8) + call names % push_back('W182.' // xs) + call densities % push_back(density * 0.2650_8) + call names % push_back('W183.' // xs) + call densities % push_back(density * 0.1431_8) + call names % push_back('W184.' // xs) + call densities % push_back(density * 0.3064_8) + call names % push_back('W186.' // xs) + call densities % push_back(density * 0.2843_8) end if case ('re') - call list_names % append('75185.' // xs) - call list_density % append(density * 0.3740_8) - call list_names % append('75187.' // xs) - call list_density % append(density * 0.6260_8) + call names % push_back('Re185.' // xs) + call densities % push_back(density * 0.3740_8) + call names % push_back('Re187.' // xs) + call densities % push_back(density * 0.6260_8) case ('os') if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then - call list_names % append('76000.' // xs) - call list_density % append(density) + call names % push_back('Os0.' // xs) + call densities % push_back(density) else - call list_names % append('76184.' // xs) - call list_density % append(density * 0.0002_8) - call list_names % append('76186.' // xs) - call list_density % append(density * 0.0159_8) - call list_names % append('76187.' // xs) - call list_density % append(density * 0.0196_8) - call list_names % append('76188.' // xs) - call list_density % append(density * 0.1324_8) - call list_names % append('76189.' // xs) - call list_density % append(density * 0.1615_8) - call list_names % append('76190.' // xs) - call list_density % append(density * 0.2626_8) - call list_names % append('76192.' // xs) - call list_density % append(density * 0.4078_8) + call names % push_back('Os184.' // xs) + call densities % push_back(density * 0.0002_8) + call names % push_back('Os186.' // xs) + call densities % push_back(density * 0.0159_8) + call names % push_back('Os187.' // xs) + call densities % push_back(density * 0.0196_8) + call names % push_back('Os188.' // xs) + call densities % push_back(density * 0.1324_8) + call names % push_back('Os189.' // xs) + call densities % push_back(density * 0.1615_8) + call names % push_back('Os190.' // xs) + call densities % push_back(density * 0.2626_8) + call names % push_back('Os192.' // xs) + call densities % push_back(density * 0.4078_8) end if case ('ir') - call list_names % append('77191.' // xs) - call list_density % append(density * 0.373_8) - call list_names % append('77193.' // xs) - call list_density % append(density * 0.627_8) + call names % push_back('Ir191.' // xs) + call densities % push_back(density * 0.373_8) + call names % push_back('Ir193.' // xs) + call densities % push_back(density * 0.627_8) case ('pt') if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then - call list_names % append('78000.' // xs) - call list_density % append(density) + call names % push_back('Pt0.' // xs) + call densities % push_back(density) else - call list_names % append('78190.' // xs) - call list_density % append(density * 0.00012_8) - call list_names % append('78192.' // xs) - call list_density % append(density * 0.00782_8) - call list_names % append('78194.' // xs) - call list_density % append(density * 0.3286_8) - call list_names % append('78195.' // xs) - call list_density % append(density * 0.3378_8) - call list_names % append('78196.' // xs) - call list_density % append(density * 0.2521_8) - call list_names % append('78198.' // xs) - call list_density % append(density * 0.07356_8) + call names % push_back('Pt190.' // xs) + call densities % push_back(density * 0.00012_8) + call names % push_back('Pt192.' // xs) + call densities % push_back(density * 0.00782_8) + call names % push_back('Pt194.' // xs) + call densities % push_back(density * 0.3286_8) + call names % push_back('Pt195.' // xs) + call densities % push_back(density * 0.3378_8) + call names % push_back('Pt196.' // xs) + call densities % push_back(density * 0.2521_8) + call names % push_back('Pt198.' // xs) + call densities % push_back(density * 0.07356_8) end if case ('au') - call list_names % append('79197.' // xs) - call list_density % append(density) + call names % push_back('Au197.' // xs) + call densities % push_back(density) case ('hg') - call list_names % append('80196.' // xs) - call list_density % append(density * 0.0015_8) - call list_names % append('80198.' // xs) - call list_density % append(density * 0.0997_8) - call list_names % append('80199.' // xs) - call list_density % append(density * 0.1687_8) - call list_names % append('80200.' // xs) - call list_density % append(density * 0.2310_8) - call list_names % append('80201.' // xs) - call list_density % append(density * 0.1318_8) - call list_names % append('80202.' // xs) - call list_density % append(density * 0.2986_8) - call list_names % append('80204.' // xs) - call list_density % append(density * 0.0687_8) + call names % push_back('Hg196.' // xs) + call densities % push_back(density * 0.0015_8) + call names % push_back('Hg198.' // xs) + call densities % push_back(density * 0.0997_8) + call names % push_back('Hg199.' // xs) + call densities % push_back(density * 0.1687_8) + call names % push_back('Hg200.' // xs) + call densities % push_back(density * 0.2310_8) + call names % push_back('Hg201.' // xs) + call densities % push_back(density * 0.1318_8) + call names % push_back('Hg202.' // xs) + call densities % push_back(density * 0.2986_8) + call names % push_back('Hg204.' // xs) + call densities % push_back(density * 0.0687_8) case ('tl') if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then - call list_names % append('81000.' // xs) - call list_density % append(density) + call names % push_back('Tl0.' // xs) + call densities % push_back(density) else - call list_names % append('81203.' // xs) - call list_density % append(density * 0.2952_8) - call list_names % append('81205.' // xs) - call list_density % append(density * 0.7048_8) + call names % push_back('Tl203.' // xs) + call densities % push_back(density * 0.2952_8) + call names % push_back('Tl205.' // xs) + call densities % push_back(density * 0.7048_8) end if case ('pb') - call list_names % append('82204.' // xs) - call list_density % append(density * 0.014_8) - call list_names % append('82206.' // xs) - call list_density % append(density * 0.241_8) - call list_names % append('82207.' // xs) - call list_density % append(density * 0.221_8) - call list_names % append('82208.' // xs) - call list_density % append(density * 0.524_8) + call names % push_back('Pb204.' // xs) + call densities % push_back(density * 0.014_8) + call names % push_back('Pb206.' // xs) + call densities % push_back(density * 0.241_8) + call names % push_back('Pb207.' // xs) + call densities % push_back(density * 0.221_8) + call names % push_back('Pb208.' // xs) + call densities % push_back(density * 0.524_8) case ('bi') - call list_names % append('83209.' // xs) - call list_density % append(density) + call names % push_back('Bi209.' // xs) + call densities % push_back(density) case ('th') - call list_names % append('90232.' // xs) - call list_density % append(density) + call names % push_back('Th232.' // xs) + call densities % push_back(density) case ('pa') - call list_names % append('91231.' // xs) - call list_density % append(density) + call names % push_back('Pa231.' // xs) + call densities % push_back(density) case ('u') - call list_names % append('92234.' // xs) - call list_density % append(density * 0.000054_8) - call list_names % append('92235.' // xs) - call list_density % append(density * 0.007204_8) - call list_names % append('92238.' // xs) - call list_density % append(density * 0.992742_8) + call names % push_back('U234.' // xs) + call densities % push_back(density * 0.000054_8) + call names % push_back('U235.' // xs) + call densities % push_back(density * 0.007204_8) + call names % push_back('U238.' // xs) + call densities % push_back(density * 0.992742_8) case default call fatal_error("Cannot expand element: " // name) @@ -5714,4 +5652,405 @@ contains end do end subroutine generate_rpn +!=============================================================================== +! NORMALIZE_AO normalizes the atom or weight percentages for each material +!=============================================================================== + + subroutine normalize_ao() + integer :: i ! index in materials array + integer :: j ! index over nuclides in material + real(8) :: sum_percent ! summation + real(8) :: awr ! atomic weight ratio + real(8) :: x ! atom percent + logical :: percent_in_atom ! nuclides specified in atom percent? + logical :: density_in_atom ! density specified in atom/b-cm? + + do i = 1, size(materials) + associate (mat => materials(i)) + percent_in_atom = (mat % atom_density(1) > ZERO) + density_in_atom = (mat % density > ZERO) + + sum_percent = ZERO + do j = 1, size(mat % nuclide) + ! determine atomic weight ratio + if (run_CE) then + awr = nuclides(mat % nuclide(j)) % awr + else + awr = ONE + end if + + ! if given weight percent, convert all values so that they are divided + ! by awr. thus, when a sum is done over the values, it's actually + ! sum(w/awr) + if (.not. percent_in_atom) then + mat % atom_density(j) = -mat % atom_density(j) / awr + end if + end do + + ! determine normalized atom percents. if given atom percents, this is + ! straightforward. if given weight percents, the value is w/awr and is + ! divided by sum(w/awr) + sum_percent = sum(mat % atom_density) + mat % atom_density = mat % atom_density / sum_percent + + ! Change density in g/cm^3 to atom/b-cm. Since all values are now in atom + ! percent, the sum needs to be re-evaluated as 1/sum(x*awr) + if (.not. density_in_atom) then + sum_percent = ZERO + do j = 1, mat % n_nuclides + if (run_CE) then + awr = nuclides(mat % nuclide(j)) % awr + else + awr = ONE + end if + x = mat % atom_density(j) + sum_percent = sum_percent + x*awr + end do + sum_percent = ONE / sum_percent + mat%density = -mat % density * N_AVOGADRO & + / MASS_NEUTRON * sum_percent + end if + + ! Calculate nuclide atom densities + mat % atom_density = mat % density * mat % atom_density + end associate + end do + + end subroutine normalize_ao + +!=============================================================================== +! ASSIGN_SAB_TABLES assigns S(alpha,beta) tables to specific nuclides within +! materials so the code knows when to apply bound thermal scattering data +!=============================================================================== + + subroutine assign_sab_tables() + integer :: i ! index in materials array + integer :: j ! index over nuclides in material + integer :: k ! index over S(a,b) tables in material + integer :: m ! position for sorting + integer :: temp_nuclide ! temporary value for sorting + integer :: temp_table ! temporary value for sorting + + do i = 1, size(materials) + ! Skip materials with no S(a,b) tables + if (.not. allocated(materials(i) % i_sab_tables)) cycle + + associate (mat => materials(i)) + + ASSIGN_SAB: do k = 1, size(mat % i_sab_tables) + ! In order to know which nuclide the S(a,b) table applies to, we need + ! to search through the list of nuclides for one which has a matching + ! zaid + associate (sab => sab_tables(mat % i_sab_tables(k))) + FIND_NUCLIDE: do j = 1, size(mat % nuclide) + if (any(sab % zaid == nuclides(mat % nuclide(j)) % zaid)) then + mat % i_sab_nuclides(k) = j + exit FIND_NUCLIDE + end if + end do FIND_NUCLIDE + end associate + + ! Check to make sure S(a,b) table matched a nuclide + if (mat % i_sab_nuclides(k) == NONE) then + call fatal_error("S(a,b) table " // trim(mat % & + sab_names(k)) // " did not match any nuclide on material " & + // trim(to_str(mat % id))) + end if + end do ASSIGN_SAB + + ! If there are multiple S(a,b) tables, we need to make sure that the + ! entries in i_sab_nuclides are sorted or else they won't be applied + ! correctly in the cross_section module. The algorithm here is a simple + ! insertion sort -- don't need anything fancy! + + if (size(mat % i_sab_tables) > 1) then + SORT_SAB: do k = 2, size(mat % i_sab_tables) + ! Save value to move + m = k + temp_nuclide = mat % i_sab_nuclides(k) + temp_table = mat % i_sab_tables(k) + + MOVE_OVER: do + ! Check if insertion value is greater than (m-1)th value + if (temp_nuclide >= mat % i_sab_nuclides(m-1)) exit + + ! Move values over until hitting one that's not larger + mat % i_sab_nuclides(m) = mat % i_sab_nuclides(m-1) + mat % i_sab_tables(m) = mat % i_sab_tables(m-1) + m = m - 1 + + ! Exit if we've reached the beginning of the list + if (m == 1) exit + end do MOVE_OVER + + ! Put the original value into its new position + mat % i_sab_nuclides(m) = temp_nuclide + mat % i_sab_tables(m) = temp_table + end do SORT_SAB + end if + + ! Deallocate temporary arrays for names of nuclides and S(a,b) tables + if (allocated(mat % names)) deallocate(mat % names) + end associate + end do + end subroutine assign_sab_tables + + subroutine read_ce_cross_sections(libraries, library_dict) + type(Library), intent(in) :: libraries(:) + type(DictCharInt), intent(inout) :: library_dict + + integer :: i, j + integer :: i_library + integer :: i_nuclide + integer :: i_sab + integer :: index_nuc_zaid ! index in nuclide ZAID + integer :: zaid ! ZAID of nuclide + integer(HID_T) :: file_id + integer(HID_T) :: group_id + logical :: mp_found ! if windowed multipole libraries were found + character(MAX_WORD_LEN) :: name + type(SetChar) :: already_read + + allocate(nuclides(n_nuclides_total)) + allocate(sab_tables(n_sab_tables)) +!$omp parallel + allocate(micro_xs(n_nuclides_total)) +!$omp end parallel + + index_nuc_zaid = 0 + + ! Read cross sections + do i = 1, size(materials) + do j = 1, size(materials(i) % names) + name = materials(i) % names(j) + + if (.not. already_read % contains(name)) then + i_library = library_dict % get_key(to_lower(name)) + i_nuclide = nuclide_dict % get_key(to_lower(name)) + + call write_message('Reading ' // trim(name) // ' from ' // & + trim(libraries(i_library) % path), 6) + + ! Read nuclide data from HDF5 + file_id = file_open(libraries(i_library) % path, 'r') + group_id = open_group(file_id, name) + call nuclides(i_nuclide) % from_hdf5(group_id) + call close_group(group_id) + call file_close(file_id) + + ! Assign resonant scattering data + if (treat_res_scat) call read_0K_elastic_scattering(& + nuclides(i_nuclide), libraries, library_dict) + + ! Determine if minimum/maximum energy for this nuclide is greater/less + ! than the previous + energy_min_neutron = max(energy_min_neutron, nuclides(i_nuclide) % energy(1)) + energy_max_neutron = min(energy_max_neutron, nuclides(i_nuclide) % energy(& + size(nuclides(i_nuclide) % energy))) + + ! Add name and alias to dictionary + call already_read % add(name) + + ! Construct dictionary mapping nuclide zaids to [1,N] -- used for + ! unresolved resonance probability tables + zaid = nuclides(i_nuclide) % zaid + if (.not. nuc_zaid_dict % has_key(zaid)) then + index_nuc_zaid = index_nuc_zaid + 1 + call nuc_zaid_dict % add_key(zaid, index_nuc_zaid) + end if + + ! Read multipole file into the appropriate entry on the nuclides array + if (multipole_active) call read_multipole_data(i_nuclide) + end if + + ! Check if material is fissionable + if (nuclides(materials(i) % nuclide(j)) % fissionable) then + materials(i) % fissionable = .true. + end if + end do + end do + + do i = 1, size(materials) + ! Skip materials with no S(a,b) tables + if (.not. allocated(materials(i) % sab_names)) cycle + + do j = 1, size(materials(i) % sab_names) + ! Get name of S(a,b) table + name = materials(i) % sab_names(j) + + if (.not. already_read % contains(name)) then + i_library = library_dict % get_key(to_lower(name)) + i_sab = sab_dict % get_key(to_lower(name)) + + call write_message('Reading ' // trim(name) // ' from ' // & + trim(libraries(i_library) % path), 6) + + ! Read S(a,b) data from HDF5 + file_id = file_open(libraries(i_library) % path, 'r') + group_id = open_group(file_id, name) + call sab_tables(i_sab) % from_hdf5(group_id) + call close_group(group_id) + call file_close(file_id) + + ! Add name to dictionary + call already_read % add(name) + end if + end do + end do + + n_nuc_zaid_total = index_nuc_zaid + + ! Associate S(a,b) tables with specific nuclides + call assign_sab_tables() + + ! Show which nuclide results in lowest energy for neutron transport + do i = 1, size(nuclides) + if (nuclides(i) % energy(nuclides(i) % n_grid) == energy_max_neutron) then + call write_message("Maximum neutron transport energy: " // & + trim(to_str(energy_max_neutron)) // " MeV for " // & + trim(adjustl(nuclides(i) % name)), 6) + exit + end if + end do + + ! If the user wants multipole, make sure we found a multipole library. + if (multipole_active) then + mp_found = .false. + do i = 1, size(nuclides) + if (nuclides(i) % mp_present) then + mp_found = .true. + exit + end if + end do + if (.not. mp_found) call warning("Windowed multipole functionality is & + &turned on, but no multipole libraries were found. Set the & + & element in settings.xml or the & + &OPENMC_MULTIPOLE_LIBRARY environment variable.") + end if + + end subroutine read_ce_cross_sections + +!=============================================================================== +! READ_0K_ELASTIC_SCATTERING +!=============================================================================== + + subroutine read_0K_elastic_scattering(nuc, libraries, library_dict) + type(Nuclide), intent(inout) :: nuc + type(Library), intent(in) :: libraries(:) + type(DictCharInt), intent(inout) :: library_dict + + integer :: i, j + integer :: i_library + integer(HID_T) :: file_id + integer(HID_T) :: group_id + real(8) :: xs_cdf_sum + character(MAX_WORD_LEN) :: name + type(Nuclide) :: resonant_nuc + + do i = 1, size(nuclides_0K) + if (nuc % name == nuclides_0K(i) % name) then + ! Copy basic information from settings.xml + nuc % resonant = .true. + nuc % name_0K = trim(nuclides_0K(i) % name_0K) + nuc % scheme = trim(nuclides_0K(i) % scheme) + nuc % E_min = nuclides_0K(i) % E_min + nuc % E_max = nuclides_0K(i) % E_max + + ! Get index in libraries array + name = nuc % name_0K + i_library = library_dict % get_key(to_lower(name)) + + call write_message('Reading ' // trim(name) // ' 0K data from ' // & + trim(libraries(i_library) % path), 6) + + ! Read nuclide data from HDF5 + file_id = file_open(libraries(i_library) % path, 'r') + group_id = open_group(file_id, name) + call resonant_nuc % from_hdf5(group_id) + call close_group(group_id) + call file_close(file_id) + + ! Copy 0K energy grid and elastic scattering cross section + call move_alloc(TO=nuc % energy_0K, FROM=resonant_nuc % energy) + call move_alloc(TO=nuc % elastic_0K, FROM=resonant_nuc % elastic) + nuc % n_grid_0K = size(nuc % energy_0K) + + ! Build CDF for 0K elastic scattering + xs_cdf_sum = ZERO + allocate(nuc % xs_cdf(size(nuc % energy_0K))) + + do j = 1, size(nuc % energy_0K) - 1 + ! Negative cross sections result in a CDF that is not monotonically + ! increasing. Set all negative xs values to ZERO. + if (nuc % elastic_0K(j) < ZERO) nuc % elastic_0K(j) = ZERO + + ! build xs cdf + xs_cdf_sum = xs_cdf_sum & + + (sqrt(nuc % energy_0K(j)) * nuc % elastic_0K(j) & + + sqrt(nuc % energy_0K(j+1)) * nuc % elastic_0K(j+1)) / TWO & + * (nuc % energy_0K(j+1) - nuc % energy_0K(j)) + nuc % xs_cdf(j) = xs_cdf_sum + end do + + exit + end if + end do + + end subroutine read_0K_elastic_scattering + +!=============================================================================== +! READ_MULTIPOLE_DATA checks for the existence of a multipole library in the +! directory and loads it using multipole_read +!=============================================================================== + + subroutine read_multipole_data(i_table) + + integer, intent(in) :: i_table ! index in nuclides/sab_tables + + integer :: i + logical :: file_exists ! Does multipole library exist? + character(7) :: readable ! Is multipole library readable? + character(6) :: zaid_string ! String of the ZAID + character(MAX_FILE_LEN+9) :: filename ! Path to multipole xs library + + ! For the time being, and I know this is a bit hacky, we just assume + ! that the file will be zaid.h5. + associate (nuc => nuclides(i_table)) + + write(zaid_string, '(I6.6)') nuc % zaid + filename = trim(path_multipole) // zaid_string // ".h5" + + ! Check if Multipole library exists and is readable + inquire(FILE=filename, EXIST=file_exists, READ=readable) + if (.not. file_exists) then + nuc % mp_present = .false. + return + elseif (readable(1:3) == 'NO') then + call fatal_error("Multipole library '" // trim(filename) // "' is not & + &readable! Change file permissions with chmod command.") + end if + + ! Display message + call write_message("Loading Multipole XS table: " // filename, 6) + + allocate(nuc % multipole) + + ! Call the read routine + call multipole_read(filename, nuc % multipole, i_table) + nuc % mp_present = .true. + + ! Recreate nu-fission cross section + if (nuc % fissionable) then + do i = 1, size(nuc % energy) + nuc % nu_fission(i) = nuc % nu(nuc % energy(i), EMISSION_TOTAL) * & + nuc % fission(i) + end do + else + nuc % nu_fission(:) = ZERO + end if + + end associate + + end subroutine read_multipole_data + end module input_xml diff --git a/src/material_header.F90 b/src/material_header.F90 index 91c4cdfb8..be4c860e2 100644 --- a/src/material_header.F90 +++ b/src/material_header.F90 @@ -27,8 +27,8 @@ module material_header integer, allocatable :: i_sab_tables(:) ! index in sab_tables ! Temporary names read during initialization - character(12), allocatable :: names(:) ! isotope names - character(12), allocatable :: sab_names(:) ! name of S(a,b) table + character(20), allocatable :: names(:) ! isotope names + character(20), allocatable :: sab_names(:) ! name of S(a,b) table ! Does this material contain fissionable nuclides? logical :: fissionable = .false. diff --git a/src/mgxs_data.F90 b/src/mgxs_data.F90 index 38d6ebc6c..491bd8409 100644 --- a/src/mgxs_data.F90 +++ b/src/mgxs_data.F90 @@ -23,10 +23,9 @@ contains integer :: i ! index in materials array integer :: j ! index over nuclides in material - integer :: i_listing ! index in xs_listings array + integer :: i_xsdata ! index in list integer :: i_nuclide ! index in nuclides - character(12) :: name ! name of isotope, e.g. 92235.03c - character(12) :: alias ! alias of isotope, e.g. U-235.03c + character(20) :: name ! name of isotope, e.g. 92235.03c integer :: representation ! Data representation type(Material), pointer :: mat type(SetChar) :: already_read @@ -37,6 +36,7 @@ contains character(MAX_LINE_LEN) :: temp_str logical :: get_kfiss, get_fiss integer :: l + type(DictCharInt) :: xsdata_dict ! Check if cross_sections.xml exists inquire(FILE=path_cross_sections, EXIST=file_exists) @@ -53,7 +53,17 @@ contains ! Get node list of all call get_node_list(doc, "xsdata", node_xsdata_list) - n_listings = get_list_size(node_xsdata_list) + + ! Build dictionary mapping nuclide names to an index in the node + ! list + do i = 1, get_list_size(node_xsdata_list) + ! Get pointer to xsdata table XML node + call get_list_item(node_xsdata_list, i, node_xsdata) + + ! Get name and create pair (name, i) + call get_node_value(node_xsdata, "name", name) + call xsdata_dict % add_key(to_lower(name), i) + end do ! allocate arrays for ACE table storage and cross section cache allocate(nuclides_MG(n_nuclides_total)) @@ -89,13 +99,11 @@ contains name = mat % names(j) if (.not. already_read % contains(name)) then - i_listing = xs_listing_dict % get_key(to_lower(name)) + i_xsdata = xsdata_dict % get_key(to_lower(name)) i_nuclide = mat % nuclide(j) - name = xs_listings(i_listing) % name - alias = xs_listings(i_listing) % alias ! Get pointer to xsdata table XML node - call get_list_item(node_xsdata_list, i_listing, node_xsdata) + call get_list_item(node_xsdata_list, i_xsdata, node_xsdata) call write_message("Loading " // trim(name) // " Data...", 5) @@ -125,11 +133,10 @@ contains ! Now read in the data specific to the type we just declared call nuclides_MG(i_nuclide) % obj % init_file(node_xsdata, & - energy_groups, get_kfiss, get_fiss, max_order, i_listing) + energy_groups, get_kfiss, get_fiss, max_order) - ! Add name and alias to dictionary + ! Add name to dictionary call already_read % add(name) - call already_read % add(alias) end if end do NUCLIDE_LOOP end do MATERIAL_LOOP @@ -185,8 +192,8 @@ contains allocate(MgxsAngle :: macro_xs(i_mat) % obj) end select call macro_xs(i_mat) % obj % combine(mat, nuclides_MG, energy_groups, & - max_order, scatt_type, i_mat) + max_order, scatt_type) end do end subroutine create_macro_xs -end module mgxs_data \ No newline at end of file +end module mgxs_data diff --git a/src/mgxs_header.F90 b/src/mgxs_header.F90 index 753f4e149..06dd1e213 100644 --- a/src/mgxs_header.F90 +++ b/src/mgxs_header.F90 @@ -21,7 +21,6 @@ module mgxs_header character(len=104) :: name ! name of dataset, e.g. 92235.03c integer :: zaid ! Z and A identifier, e.g. 92235 real(8) :: awr ! Atomic Weight Ratio - integer :: listing ! index in xs_listings real(8) :: kT ! temperature in MeV (k*T) ! Fission information @@ -54,8 +53,8 @@ module mgxs_header !=============================================================================== abstract interface - subroutine mgxs_init_file_(this,node_xsdata,groups,get_kfiss,get_fiss, & - max_order,i_listing) + subroutine mgxs_init_file_(this, node_xsdata, groups, get_kfiss, get_fiss, & + max_order) import Mgxs, Node class(Mgxs), intent(inout) :: this ! Working Object type(Node), pointer, intent(in) :: node_xsdata ! Data from MGXS xml @@ -63,7 +62,6 @@ module mgxs_header logical, intent(in) :: get_kfiss ! Need Kappa-Fission? logical, intent(in) :: get_fiss ! Should we get fiss data? integer, intent(in) :: max_order ! Maximum requested order - integer, intent(in) :: i_listing ! Index of listings array end subroutine mgxs_init_file_ subroutine mgxs_print_(this, unit) @@ -96,8 +94,7 @@ module mgxs_header end function mgxs_calc_f_ - subroutine mgxs_combine_(this,mat,nuclides,groups,max_order,scatt_type, & - i_listing) + subroutine mgxs_combine_(this, mat, nuclides, groups, max_order, scatt_type) import Mgxs, Material, MgxsContainer class(Mgxs), intent(inout) :: this ! The Mgxs to initialize type(Material), pointer, intent(in) :: mat ! base material @@ -105,7 +102,6 @@ module mgxs_header integer, intent(in) :: groups ! Number of E groups integer, intent(in) :: max_order ! Maximum requested order integer, intent(in) :: scatt_type ! Legendre or Tabular Scatt? - integer, intent(in) :: i_listing ! Index in listings end subroutine mgxs_combine_ function mgxs_sample_fission_(this, gin, uvw) result(gout) @@ -201,10 +197,9 @@ module mgxs_header ! the xsdata object node itself. !=============================================================================== - subroutine mgxs_init_file(this, node_xsdata, i_listing) + subroutine mgxs_init_file(this, node_xsdata) class(Mgxs), intent(inout) :: this ! Working Object type(Node), pointer, intent(in) :: node_xsdata ! Data from MGXS xml - integer, intent(in) :: i_listing ! Index in listings array character(MAX_LINE_LEN) :: temp_str @@ -254,20 +249,16 @@ module mgxs_header call fatal_error("Fissionable element must be set!") end if - ! Keep track of what listing is associated with this nuclide - this % listing = i_listing - end subroutine mgxs_init_file subroutine mgxsiso_init_file(this, node_xsdata, groups, get_kfiss, get_fiss, & - max_order, i_listing) + max_order) class(MgxsIso), intent(inout) :: this ! Working Object type(Node), pointer, intent(in) :: node_xsdata ! Data from MGXS xml integer, intent(in) :: groups ! Number of Energy groups logical, intent(in) :: get_kfiss ! Need Kappa-Fission? logical, intent(in) :: get_fiss ! Need fiss data? integer, intent(in) :: max_order ! Maximum requested order - integer, intent(in) :: i_listing ! Index in listings array type(Node), pointer :: node_legendre_mu character(MAX_LINE_LEN) :: temp_str @@ -282,7 +273,7 @@ module mgxs_header integer :: legendre_mu_points, imu ! Call generic data gathering routine (will populate the metadata) - call mgxs_init_file(this, node_xsdata, i_listing) + call mgxs_init_file(this, node_xsdata) ! Load the more specific data allocate(this % nu_fission(groups)) @@ -564,14 +555,13 @@ module mgxs_header end subroutine mgxsiso_init_file subroutine mgxsang_init_file(this, node_xsdata, groups, get_kfiss, get_fiss, & - max_order, i_listing) + max_order) class(MgxsAngle), intent(inout) :: this ! Working Object type(Node), pointer, intent(in) :: node_xsdata ! Data from MGXS xml integer, intent(in) :: groups ! Number of Energy groups logical, intent(in) :: get_kfiss ! Need Kappa-Fission? logical, intent(in) :: get_fiss ! Should we get fiss data? integer, intent(in) :: max_order ! Maximum requested order - integer, intent(in) :: i_listing ! Index in listings array type(Node), pointer :: node_legendre_mu character(MAX_LINE_LEN) :: temp_str @@ -586,7 +576,7 @@ module mgxs_header integer :: legendre_mu_points, imu, ipol, iazi ! Call generic data gathering routine (will populate the metadata) - call mgxs_init_file(this, node_xsdata, i_listing) + call mgxs_init_file(this, node_xsdata) if (check_for_node(node_xsdata, "num_polar")) then call get_node_value(node_xsdata, "num_polar", this % n_pol) @@ -1318,11 +1308,10 @@ module mgxs_header ! objects !=============================================================================== - subroutine mgxs_combine(this, mat, scatt_type, i_listing) + subroutine mgxs_combine(this, mat, scatt_type) class(Mgxs), intent(inout) :: this ! The Mgxs to initialize type(Material), pointer, intent(in) :: mat ! base material integer, intent(in) :: scatt_type ! How is data presented - integer, intent(in) :: i_listing ! Index in listings ! Fill in meta-data from material information if (mat % name == "") then @@ -1331,7 +1320,6 @@ module mgxs_header this % name = mat % name end if this % zaid = -mat % id - this % listing = i_listing this % fissionable = mat % fissionable this % scatt_type = scatt_type @@ -1342,15 +1330,13 @@ module mgxs_header end subroutine mgxs_combine - subroutine mgxsiso_combine(this, mat, nuclides, groups, max_order, scatt_type, & - i_listing) + subroutine mgxsiso_combine(this, mat, nuclides, groups, max_order, scatt_type) class(MgxsIso), intent(inout) :: this ! The Mgxs to initialize type(Material), pointer, intent(in) :: mat ! base material type(MgxsContainer), intent(in) :: nuclides(:) ! List of nuclides to harvest from integer, intent(in) :: groups ! Number of E groups integer, intent(in) :: max_order ! Maximum requested order integer, intent(in) :: scatt_type ! How is data presented - integer, intent(in) :: i_listing ! Index in listings integer :: i ! loop index over nuclides integer :: gin, gout ! group indices @@ -1361,7 +1347,7 @@ module mgxs_header real(8), allocatable :: scatt_coeffs(:, :, :) ! Set the meta-data - call mgxs_combine(this, mat, scatt_type, i_listing) + call mgxs_combine(this, mat, scatt_type) ! Determine the scattering type of our data and ensure all scattering orders ! are the same. @@ -1538,15 +1524,13 @@ module mgxs_header end subroutine mgxsiso_combine - subroutine mgxsang_combine(this, mat, nuclides, groups, max_order, scatt_type, & - i_listing) + subroutine mgxsang_combine(this, mat, nuclides, groups, max_order, scatt_type) class(MgxsAngle), intent(inout) :: this ! The Mgxs to initialize type(Material), pointer, intent(in) :: mat ! base material type(MgxsContainer), intent(in) :: nuclides(:) ! List of nuclides to harvest from integer, intent(in) :: groups ! Number of E groups integer, intent(in) :: max_order ! Maximum requested order integer, intent(in) :: scatt_type ! Legendre or Tabular Scatt? - integer, intent(in) :: i_listing ! Index in listings integer :: i ! loop index over nuclides integer :: gin, gout ! group indices @@ -1558,7 +1542,7 @@ module mgxs_header real(8), allocatable :: mult_denom(:, :, :, :), scatt_coeffs(:, :, :, :, :) ! Set the meta-data - call mgxs_combine(this, mat, scatt_type, i_listing) + call mgxs_combine(this, mat, scatt_type) ! Get the number of each polar and azi angles and make sure all the ! NuclideAngle types have the same number of these angles @@ -1939,4 +1923,4 @@ module mgxs_header end subroutine find_angle -end module mgxs_header \ No newline at end of file +end module mgxs_header diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index 2c59e700d..be61ff8b9 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -5,13 +5,18 @@ module nuclide_header use constants use dict_header, only: DictIntInt use endf, only: reaction_name, is_fission, is_disappearance - use endf_header, only: Function1D + use endf_header, only: Function1D, Constant1D, Polynomial, Tabulated1D use error, only: fatal_error, warning + use hdf5, only: HID_T, HSIZE_T, SIZE_T, h5iget_name_f + use h5lt, only: h5ltpath_valid_f + use hdf5_interface, only: read_attribute, open_group, close_group, & + open_dataset, read_dataset, close_dataset, get_shape use list_header, only: ListInt use math, only: evaluate_legendre use multipole_header, only: MultipoleArray use product_header, only: AngleEnergyContainer use reaction_header, only: Reaction + use secondary_uncorrelated, only: UncorrelatedAngleEnergy use stl_vector, only: VectorInt use string use urr_header, only: UrrData @@ -26,14 +31,14 @@ module nuclide_header type :: Nuclide ! Nuclide meta-data - character(12) :: name ! name of nuclide, e.g. 92235.03c + character(20) :: name ! name of nuclide, e.g. U235.71c integer :: zaid ! Z and A identifier, e.g. 92235 + integer :: metastable ! metastable state real(8) :: awr ! Atomic Weight Ratio - integer :: listing ! index in xs_listings real(8) :: kT ! temperature in MeV (k*T) ! Fission information - logical :: fissionable ! nuclide is fissionable? + logical :: fissionable = .false. ! nuclide is fissionable? ! Energy grid information integer :: n_grid ! # of nuclide grid points @@ -61,13 +66,13 @@ module nuclide_header ! Fission information logical :: has_partial_fission = .false. ! nuclide has partial fission reactions? - integer :: n_fission ! # of fission reactions + integer :: n_fission = 0 ! # of fission reactions integer :: n_precursor = 0 ! # of delayed neutron precursors integer, allocatable :: index_fission(:) ! indices in reactions class(Function1D), allocatable :: total_nu ! Unresolved resonance data - logical :: urr_present + logical :: urr_present = .false. integer :: urr_inelastic type(UrrData), pointer :: urr_data => null() @@ -84,7 +89,9 @@ module nuclide_header contains procedure :: clear => nuclide_clear procedure :: print => nuclide_print + procedure :: from_hdf5 => nuclide_from_hdf5 procedure :: nu => nuclide_nu + procedure, private :: create_derived => nuclide_create_derived end type Nuclide !=============================================================================== @@ -144,24 +151,14 @@ module nuclide_header end type MaterialMacroXS !=============================================================================== -! XSLISTING contains data read from a CE or MG cross_sections.xml file -! (or equivalent) +! LIBRARY contains data read from a cross_sections.xml file !=============================================================================== - type XsListing - character(12) :: name ! table name, e.g. 92235.70c - character(12) :: alias ! table alias, e.g. U-235.70c - integer :: type ! type of table (cont-E neutron, S(A,b), etc) - integer :: zaid ! ZAID identifier = 1000*Z + A - integer :: filetype ! ASCII or BINARY - integer :: location ! location of table within library - integer :: recl ! record length for library - integer :: entries ! number of entries per record - real(8) :: awr ! atomic weight ratio (# of neutron masses) - real(8) :: kT ! Boltzmann constant * temperature (MeV) - logical :: metastable ! is this nuclide metastable? - character(MAX_FILE_LEN) :: path ! path to library containing table - end type XsListing + type Library + integer :: type + character(MAX_WORD_LEN), allocatable :: materials(:) + character(MAX_FILE_LEN) :: path + end type Library contains @@ -173,18 +170,254 @@ module nuclide_header class(Nuclide), intent(inout) :: this ! The Nuclide object to clear if (associated(this % urr_data)) deallocate(this % urr_data) - - call this % reaction_index % clear() - if (associated(this % multipole)) deallocate(this % multipole) end subroutine nuclide_clear + subroutine nuclide_from_hdf5(this, group_id) + class(Nuclide), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + integer :: i + integer :: Z + integer :: A + integer :: n_reaction + integer :: hdf5_err + integer(HID_T) :: urr_group, nu_group + integer(HID_T) :: energy_dset + integer(HID_T) :: rx_group + integer(HID_T) :: total_nu + integer(SIZE_T) :: name_len, name_file_len + integer(HSIZE_T) :: dims(1) + character(MAX_WORD_LEN) :: temp + logical :: exists + + ! Get name of nuclide from group + name_len = len(this % name) + call h5iget_name_f(group_id, this % name, name_len, name_file_len, hdf5_err) + + ! Get rid of leading '/' + this % name = trim(this % name(2:)) + + call read_attribute(Z, group_id, 'Z') + call read_attribute(A, group_id, 'A') + call read_attribute(this % metastable, group_id, 'metastable') + this % zaid = 1000*Z + A + 400*this % metastable + call read_attribute(this % awr, group_id, 'atomic_weight_ratio') + call read_attribute(this % kT, group_id, 'temperature') + call read_attribute(n_reaction, group_id, 'n_reaction') + this % n_reaction = n_reaction + + ! Read energy grid + energy_dset = open_dataset(group_id, 'energy') + call get_shape(energy_dset, dims) + this % n_grid = int(dims(1), 4) + allocate(this % energy(this % n_grid)) + call read_dataset(this % energy, energy_dset) + call close_dataset(energy_dset) + + ! Read reactions + allocate(this % reactions(n_reaction)) + do i = 1, size(this % reactions) + rx_group = open_group(group_id, 'reaction_' // trim(to_str(i - 1))) + call this % reactions(i) % from_hdf5(rx_group) + call close_group(rx_group) + end do + + ! Read unresolved resonance probability tables if present + call h5ltpath_valid_f(group_id, 'urr', .true., exists, hdf5_err) + if (exists) then + this % urr_present = .true. + allocate(this % urr_data) + urr_group = open_group(group_id, 'urr') + call this % urr_data % from_hdf5(urr_group) + + ! if the inelastic competition flag indicates that the inelastic cross + ! section should be determined from a normal reaction cross section, we need + ! to get the index of the reaction + if (this % urr_data % inelastic_flag > 0) then + do i = 1, size(this % reactions) + if (this % reactions(i) % MT == this % urr_data % inelastic_flag) then + this % urr_inelastic = i + end if + end do + + ! Abort if no corresponding inelastic reaction was found + if (this % urr_inelastic == NONE) then + call fatal_error("Could not find inelastic reaction specified on & + &unresolved resonance probability table.") + end if + end if + + ! Check for negative values + if (any(this % urr_data % prob < ZERO)) then + call warning("Negative value(s) found on probability table & + &for nuclide " // this % name) + end if + end if + + ! Check for nu-total + call h5ltpath_valid_f(group_id, 'total_nu', .true., exists, hdf5_err) + if (exists) then + nu_group = open_group(group_id, 'total_nu') + + ! Read total nu data + total_nu = open_dataset(nu_group, 'yield') + call read_attribute(temp, total_nu, 'type') + select case (temp) + case ('constant') + allocate(Constant1D :: this % total_nu) + case ('tabulated') + allocate(Tabulated1D :: this % total_nu) + case ('polynomial') + allocate(Polynomial :: this % total_nu) + end select + call this % total_nu % from_hdf5(total_nu) + call close_dataset(total_nu) + + call close_group(nu_group) + end if + + ! Create derived cross section data + call this % create_derived() + + end subroutine nuclide_from_hdf5 + + subroutine nuclide_create_derived(this) + class(Nuclide), intent(inout) :: this + + integer :: i + integer :: j + integer :: k + integer :: m + integer :: n + integer :: i_fission + type(ListInt) :: MTs + + ! Allocate and initialize derived cross sections + allocate(this % total(this % n_grid)) + allocate(this % elastic(this % n_grid)) + allocate(this % fission(this % n_grid)) + allocate(this % nu_fission(this % n_grid)) + allocate(this % absorption(this % n_grid)) + this % total(:) = ZERO + this % elastic(:) = ZERO + this % fission(:) = ZERO + this % nu_fission(:) = ZERO + this % absorption(:) = ZERO + + i_fission = 0 + + do i = 1, size(this % reactions) + call MTs % append(this % reactions(i) % MT) + call this % reaction_index % add_key(this % reactions(i) % MT, i) + + associate (rx => this % reactions(i)) + j = rx % threshold + n = size(rx % sigma) + + ! Skip total inelastic level scattering, gas production cross sections + ! (MT=200+), etc. + if (rx % MT == N_LEVEL .or. rx % MT == N_NONELASTIC) cycle + if (rx % MT > N_5N2P .and. rx % MT < N_P0) cycle + + ! Skip level cross sections if total is available + if (rx % MT >= N_P0 .and. rx % MT <= N_PC .and. MTs % contains(N_P)) cycle + if (rx % MT >= N_D0 .and. rx % MT <= N_DC .and. MTs % contains(N_D)) cycle + if (rx % MT >= N_T0 .and. rx % MT <= N_TC .and. MTs % contains(N_T)) cycle + if (rx % MT >= N_3HE0 .and. rx % MT <= N_3HEC .and. MTs % contains(N_3HE)) cycle + if (rx % MT >= N_A0 .and. rx % MT <= N_AC .and. MTs % contains(N_A)) cycle + if (rx % MT >= N_2N0 .and. rx % MT <= N_2NC .and. MTs % contains(N_2N)) cycle + + ! Copy elastic + if (rx % MT == ELASTIC) this % elastic(:) = rx % sigma + + ! Add contribution to total cross section + this % total(j:j+n-1) = this % total(j:j+n-1) + rx % sigma + + ! Add contribution to absorption cross section + if (is_disappearance(rx % MT)) then + this % absorption(j:j+n-1) = this % absorption(j:j+n-1) + rx % sigma + end if + + ! Information about fission reactions + if (rx % MT == N_FISSION) then + allocate(this % index_fission(1)) + elseif (rx % MT == N_F) then + allocate(this % index_fission(PARTIAL_FISSION_MAX)) + this % has_partial_fission = .true. + end if + + ! Add contribution to fission cross section + if (is_fission(rx % MT)) then + this % fissionable = .true. + this % fission(j:j+n-1) = this % fission(j:j+n-1) + rx % sigma + + ! Also need to add fission cross sections to absorption + this % absorption(j:j+n-1) = this % absorption(j:j+n-1) + rx % sigma + + ! If total fission reaction is present, there's no need to store the + ! reaction cross-section since it was copied to this % fission + if (rx % MT == N_FISSION) deallocate(rx % sigma) + + ! Keep track of this reaction for easy searching later + i_fission = i_fission + 1 + this % index_fission(i_fission) = i + this % n_fission = this % n_fission + 1 + + ! <<<<<<<<<<<<<<<<<<<<<<<<<<<< REMOVE THIS <<<<<<<<<<<<<<<<<<<<<<<<<<< + ! Before the secondary distribution refactor, when the angle/energy + ! distribution was uncorrelated, no angle was actually sampled. With + ! the refactor, an angle is always sampled for an uncorrelated + ! distribution even when no angle distribution exists in the ACE file + ! (isotropic is assumed). To preserve the RNG stream, we explicitly + ! mark fission reactions so that we avoid the angle sampling. + do k = 1, size(rx % products) + if (rx % products(k) % particle == NEUTRON) then + do m = 1, size(rx % products(k) % distribution) + associate (aedist => rx % products(k) % distribution(m) % obj) + select type (aedist) + type is (UncorrelatedAngleEnergy) + aedist % fission = .true. + end select + end associate + end do + end if + end do + ! <<<<<<<<<<<<<<<<<<<<<<<<<<<< REMOVE THIS <<<<<<<<<<<<<<<<<<<<<<<<<<< + end if + end associate + end do + + ! Determine number of delayed neutron precursors + if (this % fissionable) then + do i = 1, size(this % reactions(this % index_fission(1)) % products) + if (this % reactions(this % index_fission(1)) % products(i) % & + emission_mode == EMISSION_DELAYED) then + this % n_precursor = this % n_precursor + 1 + end if + end do + end if + + ! Calculate nu-fission cross section + if (this % fissionable) then + do i = 1, size(this % energy) + this % nu_fission(i) = this % nu(this % energy(i), EMISSION_TOTAL) * & + this % fission(i) + end do + else + this % nu_fission(:) = ZERO + end if + + ! Clear MTs set + call MTs % clear() + end subroutine nuclide_create_derived + !=============================================================================== ! NUCLIDE_NU is an interface to the number of fission neutrons produced !=============================================================================== - function nuclide_nu(this, E, emission_mode, group) result(nu) + pure function nuclide_nu(this, E, emission_mode, group) result(nu) class(Nuclide), intent(in) :: this real(8), intent(in) :: E integer, intent(in) :: emission_mode @@ -237,8 +470,8 @@ module nuclide_header if (allocated(this % total_nu)) then nu = this % total_nu % evaluate(E) else - associate (rx => this % reactions(this % index_fission(1))) - nu = rx % products(1) % yield % evaluate(E) + associate (product => this % reactions(this % index_fission(1)) % products(1)) + nu = product % yield % evaluate(E) end associate end if end select diff --git a/src/output.F90 b/src/output.F90 index d7dfe7e1c..09df23f0d 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -741,7 +741,6 @@ contains integer :: filter_index ! index in results array for filters integer :: score_index ! scoring bin index integer :: i_nuclide ! index in nuclides array - integer :: i_listing ! index in xs_listings array integer :: n_order ! loop index for moment orders integer :: nm_order ! loop index for Ynm moment orders integer :: unit_tally ! tallies.out file unit @@ -908,13 +907,8 @@ contains write(UNIT=unit_tally, FMT='(1X,2A,1X,A)') repeat(" ", indent), & "Total Material" else - if (run_CE) then - i_listing = nuclides(i_nuclide) % listing - else - i_listing = nuclides_MG(i_nuclide) % obj % listing - end if write(UNIT=unit_tally, FMT='(1X,2A,1X,A)') repeat(" ", indent), & - trim(xs_listings(i_listing) % alias) + trim(nuclides(i_nuclide) % name) end if indent = indent + 2 diff --git a/src/product_header.F90 b/src/product_header.F90 index e20c173b4..fbe0ee71f 100644 --- a/src/product_header.F90 +++ b/src/product_header.F90 @@ -4,7 +4,15 @@ module product_header use constants, only: ZERO, MAX_WORD_LEN, EMISSION_PROMPT, EMISSION_DELAYED, & EMISSION_TOTAL, NEUTRON, PHOTON use endf_header, only: Tabulated1D, Function1D, Constant1D, Polynomial + use hdf5, only: HID_T + use hdf5_interface, only: read_attribute, open_group, close_group, & + open_dataset, close_dataset, read_dataset use random_lcg, only: prn + use secondary_correlated, only: CorrelatedAngleEnergy + use secondary_kalbach, only: KalbachMann + use secondary_nbody, only: NBodyPhaseSpace + use secondary_uncorrelated, only: UncorrelatedAngleEnergy + use string, only: to_str !=============================================================================== ! REACTIONPRODUCT stores a data for a reaction product including its yield and @@ -23,6 +31,7 @@ module product_header type(AngleEnergyContainer), allocatable :: distribution(:) contains procedure :: sample => reactionproduct_sample + procedure :: from_hdf5 => reactionproduct_from_hdf5 end type ReactionProduct contains @@ -59,4 +68,89 @@ contains end subroutine reactionproduct_sample + subroutine reactionproduct_from_hdf5(this, group_id) + class(ReactionProduct), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + integer :: i + integer :: n + integer(HID_T) :: dgroup + integer(HID_T) :: app + integer(HID_T) :: yield + character(MAX_WORD_LEN) :: temp + + ! Read particle type + call read_attribute(temp, group_id, 'particle') + select case (temp) + case ('neutron') + this % particle = NEUTRON + case ('photon') + this % particle = PHOTON + end select + + ! Read emission mode and decay rate + call read_attribute(temp, group_id, 'emission_mode') + select case (temp) + case ('prompt') + this % emission_mode = EMISSION_PROMPT + case ('delayed') + this % emission_mode = EMISSION_DELAYED + case ('total') + this % emission_mode = EMISSION_TOTAL + end select + + ! Read decay rate for delayed emission + if (this % emission_mode == EMISSION_DELAYED) then + call read_attribute(this % decay_rate, group_id, 'decay_rate') + end if + + ! Read secondary particle yield + yield = open_dataset(group_id, 'yield') + call read_attribute(temp, yield, 'type') + select case (temp) + case ('constant') + allocate(Constant1D :: this % yield) + case ('tabulated') + allocate(Tabulated1D :: this % yield) + case ('polynomial') + allocate(Polynomial :: this % yield) + end select + call this % yield % from_hdf5(yield) + call close_dataset(yield) + + call read_attribute(n, group_id, 'n_distribution') + allocate(this%applicability(n)) + allocate(this%distribution(n)) + + do i = 1, n + dgroup = open_group(group_id, trim('distribution_' // to_str(i - 1))) + + ! Read applicability + if (n > 1) then + app = open_dataset(dgroup, 'applicability') + call this%applicability(i)%from_hdf5(app) + call close_dataset(app) + end if + + ! Read type of distribution and allocate accordingly + call read_attribute(temp, dgroup, 'type') + select case (temp) + case ('uncorrelated') + allocate(UncorrelatedAngleEnergy :: this%distribution(i)%obj) + case ('correlated') + allocate(CorrelatedAngleEnergy :: this%distribution(i)%obj) + case ('nbody') + allocate(NBodyPhaseSpace :: this%distribution(i)%obj) + case ('kalbach-mann') + allocate(KalbachMann :: this%distribution(i)%obj) + end select + + ! Read distribution data + call this%distribution(i)%obj%from_hdf5(dgroup) + + call close_group(dgroup) + end do + + end subroutine reactionproduct_from_hdf5 + end module product_header diff --git a/src/reaction_header.F90 b/src/reaction_header.F90 index 160ad6323..8af75b3cf 100644 --- a/src/reaction_header.F90 +++ b/src/reaction_header.F90 @@ -1,6 +1,10 @@ module reaction_header + use hdf5, only: HID_T, HSIZE_T + use hdf5_interface, only: read_attribute, open_group, close_group, & + open_dataset, read_dataset, close_dataset, get_shape use product_header, only: ReactionProduct + use string, only: to_str implicit none @@ -16,6 +20,44 @@ module reaction_header logical :: scatter_in_cm ! scattering system in center-of-mass? real(8), allocatable :: sigma(:) ! Cross section values type(ReactionProduct), allocatable :: products(:) + contains + procedure :: from_hdf5 => reaction_from_hdf5 end type Reaction +contains + + subroutine reaction_from_hdf5(this, group_id) + class(Reaction), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + integer :: i + integer :: cm + integer :: n_product + integer(HID_T) :: pgroup + integer(HID_T) :: xs + integer(HSIZE_T) :: dims(1) + + call read_attribute(this % Q_value, group_id, 'Q_value') + call read_attribute(this % MT, group_id, 'MT') + call read_attribute(this % threshold, group_id, 'threshold_idx') + call read_attribute(cm, group_id, 'center_of_mass') + this % scatter_in_cm = (cm == 1) + + ! Read cross section + xs = open_dataset(group_id, 'xs') + call get_shape(xs, dims) + allocate(this % sigma(dims(1))) + call read_dataset(this % sigma, xs) + call close_dataset(xs) + + ! Read products + call read_attribute(n_product, group_id, 'n_product') + allocate(this % products(n_product)) + do i = 1, n_product + pgroup = open_group(group_id, 'product_' // trim(to_str(i - 1))) + call this % products(i) % from_hdf5(pgroup) + call close_group(pgroup) + end do + end subroutine reaction_from_hdf5 + end module reaction_header diff --git a/src/relaxng/materials.rnc b/src/relaxng/materials.rnc index 21b36c07e..1b5b7c705 100644 --- a/src/relaxng/materials.rnc +++ b/src/relaxng/materials.rnc @@ -11,8 +11,7 @@ element materials { } & element nuclide { - (element name { xsd:string { maxLength = "7" } } | - attribute name { xsd:string { maxLength = "7" } }) & + (element name { xsd:string } | attribute name { xsd:string }) & (element xs { xsd:string { maxLength = "5" } } | attribute xs { xsd:string { maxLength = "5" } })? & (element scattering { ( "data" | "iso-in-lab" ) } | @@ -44,8 +43,7 @@ element materials { }* & element sab { - (element name { xsd:string { maxLength = "7" } } | - attribute name { xsd:string { maxLength = "7" } }) & + (element name { xsd:string } | attribute name { xsd:string }) & (element xs { xsd:string { maxLength = "5" } } | attribute xs { xsd:string { maxLength = "5" } })? }* diff --git a/src/relaxng/materials.rng b/src/relaxng/materials.rng index 6a4bc3964..e93f20165 100644 --- a/src/relaxng/materials.rng +++ b/src/relaxng/materials.rng @@ -57,26 +57,22 @@ - - 7 - + - - 7 - + - 3 + 5 - 3 + 5 @@ -123,25 +119,21 @@ - - 7 - + - - 7 - + - 3 + 5 - 3 + 5 @@ -167,12 +159,12 @@ - 3 + 5 - 3 + 5 @@ -219,26 +211,22 @@ - - 7 - + - - 7 - + - 3 + 5 - 3 + 5 @@ -252,7 +240,7 @@ - 3 + 5 diff --git a/src/sab_header.F90 b/src/sab_header.F90 index 695f735c0..3e9e18fab 100644 --- a/src/sab_header.F90 +++ b/src/sab_header.F90 @@ -3,6 +3,12 @@ module sab_header use, intrinsic :: ISO_FORTRAN_ENV use constants + use distribution_univariate, only: Tabular + use hdf5, only: HID_T, HSIZE_T + use h5lt, only: h5ltpath_valid_f + use hdf5_interface, only: read_attribute, get_shape, open_group, close_group, & + open_dataset, read_dataset, close_dataset + use secondary_correlated, only: CorrelatedAngleEnergy use string, only: to_str implicit none @@ -27,10 +33,10 @@ module sab_header !=============================================================================== type SAlphaBeta - character(10) :: name ! name of table, e.g. lwtr.10t - real(8) :: awr ! weight of nucleus in neutron masses - real(8) :: kT ! temperature in MeV (k*T) - integer :: n_zaid ! Number of valid zaids + character(100) :: name ! name of table, e.g. lwtr.10t + real(8) :: awr ! weight of nucleus in neutron masses + real(8) :: kT ! temperature in MeV (k*T) + integer :: n_zaid ! Number of valid zaids integer, allocatable :: zaid(:) ! List of valid Z and A identifiers, e.g. 6012 ! threshold for S(a,b) treatment (usually ~4 eV) @@ -61,90 +67,247 @@ module sab_header real(8), allocatable :: elastic_P(:) real(8), allocatable :: elastic_mu(:,:) contains - procedure :: print => print_sab_table + procedure :: print => salphabeta_print + procedure :: from_hdf5 => salphabeta_from_hdf5 end type SAlphaBeta - contains +contains !=============================================================================== ! PRINT_SAB_TABLE displays information about a S(a,b) table containing data ! describing thermal scattering from bound materials such as hydrogen in water. !=============================================================================== - subroutine print_sab_table(this, unit) - class(SAlphaBeta), intent(in) :: this - integer, intent(in), optional :: unit + subroutine salphabeta_print(this, unit) + class(SAlphaBeta), intent(in) :: this + integer, intent(in), optional :: unit - integer :: size_sab ! memory used by S(a,b) table - integer :: unit_ ! unit to write to - integer :: i ! Loop counter for parsing through this % zaid - integer :: char_count ! Counter for the number of characters on a line + integer :: size_sab ! memory used by S(a,b) table + integer :: unit_ ! unit to write to + integer :: i ! Loop counter for parsing through this % zaid + integer :: char_count ! Counter for the number of characters on a line - ! set default unit for writing information - if (present(unit)) then - unit_ = unit + ! set default unit for writing information + if (present(unit)) then + unit_ = unit + else + unit_ = OUTPUT_UNIT + end if + + ! Basic S(a,b) table information + write(unit_,*) 'S(a,b) Table ' // trim(this % name) + write(unit_,'(A)',advance="no") ' zaids = ' + ! Initialize the counter based on the above string + char_count = 11 + do i = 1, this % n_zaid + ! Deal with a line thats too long + if (char_count >= 73) then ! 73 = 80 - (5 ZAID chars + 1 space + 1 comma) + ! End the line + write(unit_,*) "" + ! Add 11 leading blanks + write(unit_,'(A)', advance="no") " " + ! reset the counter to 11 + char_count = 11 + end if + if (i < this % n_zaid) then + ! Include a comma + write(unit_,'(A)',advance="no") trim(to_str(this % zaid(i))) // ", " + char_count = char_count + len(trim(to_str(this % zaid(i)))) + 2 else - unit_ = OUTPUT_UNIT + ! Don't include a comma, since we are all done + write(unit_,'(A)',advance="no") trim(to_str(this % zaid(i))) end if - ! Basic S(a,b) table information - write(unit_,*) 'S(a,b) Table ' // trim(this % name) - write(unit_,'(A)',advance="no") ' zaids = ' - ! Initialize the counter based on the above string - char_count = 11 - do i = 1, this % n_zaid - ! Deal with a line thats too long - if (char_count >= 73) then ! 73 = 80 - (5 ZAID chars + 1 space + 1 comma) - ! End the line - write(unit_,*) "" - ! Add 11 leading blanks - write(unit_,'(A)', advance="no") " " - ! reset the counter to 11 - char_count = 11 - end if - if (i < this % n_zaid) then - ! Include a comma - write(unit_,'(A)',advance="no") trim(to_str(this % zaid(i))) // ", " - char_count = char_count + len(trim(to_str(this % zaid(i)))) + 2 - else - ! Don't include a comma, since we are all done - write(unit_,'(A)',advance="no") trim(to_str(this % zaid(i))) - end if + end do + write(unit_,*) "" ! Move to next line + write(unit_,*) ' awr = ' // trim(to_str(this % awr)) + write(unit_,*) ' kT = ' // trim(to_str(this % kT)) - end do - write(unit_,*) "" ! Move to next line - write(unit_,*) ' awr = ' // trim(to_str(this % awr)) - write(unit_,*) ' kT = ' // trim(to_str(this % kT)) + ! Inelastic data + write(unit_,*) ' # of Incoming Energies (Inelastic) = ' // & + trim(to_str(this % n_inelastic_e_in)) + write(unit_,*) ' # of Outgoing Energies (Inelastic) = ' // & + trim(to_str(this % n_inelastic_e_out)) + write(unit_,*) ' # of Outgoing Angles (Inelastic) = ' // & + trim(to_str(this % n_inelastic_mu)) + write(unit_,*) ' Threshold for Inelastic = ' // & + trim(to_str(this % threshold_inelastic)) - ! Inelastic data - write(unit_,*) ' # of Incoming Energies (Inelastic) = ' // & - trim(to_str(this % n_inelastic_e_in)) - write(unit_,*) ' # of Outgoing Energies (Inelastic) = ' // & - trim(to_str(this % n_inelastic_e_out)) - write(unit_,*) ' # of Outgoing Angles (Inelastic) = ' // & - trim(to_str(this % n_inelastic_mu)) - write(unit_,*) ' Threshold for Inelastic = ' // & - trim(to_str(this % threshold_inelastic)) + ! Elastic data + if (this % n_elastic_e_in > 0) then + write(unit_,*) ' # of Incoming Energies (Elastic) = ' // & + trim(to_str(this % n_elastic_e_in)) + write(unit_,*) ' # of Outgoing Angles (Elastic) = ' // & + trim(to_str(this % n_elastic_mu)) + write(unit_,*) ' Threshold for Elastic = ' // & + trim(to_str(this % threshold_elastic)) + end if - ! Elastic data - if (this % n_elastic_e_in > 0) then - write(unit_,*) ' # of Incoming Energies (Elastic) = ' // & - trim(to_str(this % n_elastic_e_in)) - write(unit_,*) ' # of Outgoing Angles (Elastic) = ' // & - trim(to_str(this % n_elastic_mu)) - write(unit_,*) ' Threshold for Elastic = ' // & - trim(to_str(this % threshold_elastic)) + ! Determine memory used by S(a,b) table and write out + size_sab = 8 * (this % n_inelastic_e_in * (2 + this % n_inelastic_e_out * & + (1 + this % n_inelastic_mu)) + this % n_elastic_e_in * & + (2 + this % n_elastic_mu)) + write(unit_,*) ' Memory Used = ' // trim(to_str(size_sab)) // ' bytes' + + ! Blank line at end + write(unit_,*) + + end subroutine salphabeta_print + + subroutine salphabeta_from_hdf5(this, group_id) + class(SAlphaBeta), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + integer :: i, j + integer :: n_energy, n_energy_out, n_mu + integer :: hdf5_err + integer(HID_T) :: elastic_group + integer(HID_T) :: inelastic_group + integer(HID_T) :: dset_id + integer(HSIZE_T) :: dims2(2) + integer(HSIZE_T) :: dims3(3) + real(8), allocatable :: temp(:,:) + character(20) :: type + logical :: exists + type(CorrelatedAngleEnergy) :: correlated_dist + + call read_attribute(this % awr, group_id, 'atomic_weight_ratio') + call read_attribute(this % kT, group_id, 'temperature') + call read_attribute(this % zaid, group_id, 'zaids') + this % n_zaid = size(this % zaid) + + ! Coherent elastic data + call h5ltpath_valid_f(group_id, 'elastic', .true., exists, hdf5_err) + if (exists) then + ! Read cross section data + elastic_group = open_group(group_id, 'elastic') + dset_id = open_dataset(elastic_group, 'xs') + call read_attribute(type, dset_id, 'type') + call get_shape(dset_id, dims2) + allocate(temp(dims2(1), dims2(2))) + call read_dataset(temp, dset_id) + call close_dataset(dset_id) + + ! Set cross section data and type + this % n_elastic_e_in = int(dims2(1), 4) + allocate(this % elastic_e_in(this % n_elastic_e_in)) + allocate(this % elastic_P(this % n_elastic_e_in)) + this % elastic_e_in(:) = temp(:, 1) + this % elastic_P(:) = temp(:, 2) + select case (type) + case ('tab1') + this % elastic_mode = SAB_ELASTIC_DISCRETE + case ('bragg') + this % elastic_mode = SAB_ELASTIC_EXACT + end select + deallocate(temp) + + ! Set elastic threshold + this % threshold_elastic = this % elastic_e_in(this % n_elastic_e_in) + + ! Read angle distribution + if (this % elastic_mode /= SAB_ELASTIC_EXACT) then + dset_id = open_dataset(elastic_group, 'mu_out') + call get_shape(dset_id, dims2) + this % n_elastic_mu = int(dims2(1), 4) + allocate(this % elastic_mu(dims2(1), dims2(2))) + call read_dataset(this % elastic_mu, dset_id) + call close_dataset(dset_id) end if - ! Determine memory used by S(a,b) table and write out - size_sab = 8 * (this % n_inelastic_e_in * (2 + this % n_inelastic_e_out * & - (1 + this % n_inelastic_mu)) + this % n_elastic_e_in * & - (2 + this % n_elastic_mu)) - write(unit_,*) ' Memory Used = ' // trim(to_str(size_sab)) // ' bytes' + call close_group(elastic_group) + end if - ! Blank line at end - write(unit_,*) + ! Inelastic data + call h5ltpath_valid_f(group_id, 'inelastic', .true., exists, hdf5_err) + if (exists) then + ! Read type of inelastic data + inelastic_group = open_group(group_id, 'inelastic') + call read_attribute(type, inelastic_group, 'secondary_mode') + select case (type) + case ('equal') + this % secondary_mode = SAB_SECONDARY_EQUAL + case ('skewed') + this % secondary_mode = SAB_SECONDARY_SKEWED + case ('continuous') + this % secondary_mode = SAB_SECONDARY_CONT + end select - end subroutine print_sab_table + ! Read cross section data + dset_id = open_dataset(inelastic_group, 'xs') + call get_shape(dset_id, dims2) + allocate(temp(dims2(1), dims2(2))) + call read_dataset(temp, dset_id) + call close_dataset(dset_id) + + ! Set cross section data + this % n_inelastic_e_in = int(dims2(1), 4) + allocate(this % inelastic_e_in(this % n_inelastic_e_in)) + allocate(this % inelastic_sigma(this % n_inelastic_e_in)) + this % inelastic_e_in(:) = temp(:, 1) + this % inelastic_sigma(:) = temp(:, 2) + deallocate(temp) + + ! Set inelastic threshold + this % threshold_inelastic = this % inelastic_e_in(this % n_inelastic_e_in) + + if (this % secondary_mode /= SAB_SECONDARY_CONT) then + ! Read energy distribution + dset_id = open_dataset(inelastic_group, 'energy_out') + call get_shape(dset_id, dims2) + this % n_inelastic_e_out = int(dims2(1), 4) + allocate(this % inelastic_e_out(dims2(1), dims2(2))) + call read_dataset(this % inelastic_e_out, dset_id) + call close_dataset(dset_id) + + ! Read angle distribution + dset_id = open_dataset(inelastic_group, 'mu_out') + call get_shape(dset_id, dims3) + this % n_inelastic_mu = int(dims3(1), 4) + allocate(this % inelastic_mu(dims3(1), dims3(2), dims3(3))) + call read_dataset(this % inelastic_mu, dset_id) + call close_dataset(dset_id) + else + ! Read correlated angle-energy distribution + call correlated_dist % from_hdf5(inelastic_group) + + ! Convert to S(a,b) native format + n_energy = size(correlated_dist % energy) + allocate(this % inelastic_data(n_energy)) + do i = 1, n_energy + associate (edist => correlated_dist % distribution(i)) + ! Get number of outgoing energies for incoming energy i + n_energy_out = size(edist % e_out) + this % inelastic_data(i) % n_e_out = n_energy_out + allocate(this % inelastic_data(i) % e_out(n_energy_out)) + allocate(this % inelastic_data(i) % e_out_pdf(n_energy_out)) + allocate(this % inelastic_data(i) % e_out_cdf(n_energy_out)) + + ! Copy outgoing energy distribution + this % inelastic_data(i) % e_out(:) = edist % e_out + this % inelastic_data(i) % e_out_pdf(:) = edist % p + this % inelastic_data(i) % e_out_cdf(:) = edist % c + + do j = 1, n_energy_out + select type (adist => edist % angle(j) % obj) + type is (Tabular) + ! On first pass, allocate space for angles + if (j == 1) then + n_mu = size(adist % x) + this % n_inelastic_mu = n_mu + allocate(this % inelastic_data(i) % mu(n_mu, n_energy_out)) + end if + + ! Copy outgoing angles + this % inelastic_data(i) % mu(:, j) = adist % x + end select + end do + end associate + end do + end if + + call close_group(inelastic_group) + end if + end subroutine salphabeta_from_hdf5 end module sab_header diff --git a/src/secondary_correlated.F90 b/src/secondary_correlated.F90 index b556d02dc..0576b28f6 100644 --- a/src/secondary_correlated.F90 +++ b/src/secondary_correlated.F90 @@ -1,8 +1,11 @@ module secondary_correlated use angleenergy_header, only: AngleEnergy - use constants, only: ZERO, ONE, TWO, HISTOGRAM, LINEAR_LINEAR - use distribution_univariate, only: DistributionContainer + use constants, only: ZERO, ONE, HALF, TWO, HISTOGRAM, LINEAR_LINEAR + use distribution_univariate, only: DistributionContainer, Tabular + use hdf5, only: HID_T, HSIZE_T + use hdf5_interface, only: get_shape, read_attribute, open_dataset, & + read_dataset, close_dataset use random_lcg, only: prn use search, only: binary_search @@ -28,6 +31,7 @@ module secondary_correlated type(AngleEnergyTable), allocatable :: distribution(:) ! outgoing E/mu distributions contains procedure :: sample => correlated_sample + procedure :: from_hdf5 => correlated_from_hdf5 end type CorrelatedAngleEnergy contains @@ -145,4 +149,156 @@ contains end if end subroutine correlated_sample + subroutine correlated_from_hdf5(this, group_id) + class(CorrelatedAngleEnergy), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + integer :: i, j, k + integer :: n_energy + integer :: m, n + integer :: offset_mu + integer :: interp_mu + integer(HID_T) :: dset_id + integer(HSIZE_T) :: dims(1), dims2(2) + integer, allocatable :: temp(:,:) + integer, allocatable :: offsets(:) + integer, allocatable :: interp(:) + integer, allocatable :: n_discrete(:) + real(8), allocatable :: eout(:,:) + real(8), allocatable :: mu(:,:) + + ! Open incoming energy dataset + dset_id = open_dataset(group_id, 'energy') + + ! Get interpolation parameters + call read_attribute(temp, dset_id, 'interpolation') + allocate(this%breakpoints(size(temp, 1))) + allocate(this%interpolation(size(temp, 1))) + this%breakpoints(:) = temp(:, 1) + this%interpolation(:) = temp(:, 2) + this%n_region = size(this%breakpoints) + deallocate(temp) + + ! Get incoming energies + call get_shape(dset_id, dims) + n_energy = int(dims(1), 4) + allocate(this%energy(n_energy)) + allocate(this%distribution(n_energy)) + call read_dataset(this%energy, dset_id) + call close_dataset(dset_id) + + ! Get outgoing energy distribution data + dset_id = open_dataset(group_id, 'energy_out') + call read_attribute(offsets, dset_id, 'offsets') + call read_attribute(interp, dset_id, 'interpolation') + call read_attribute(n_discrete, dset_id, 'n_discrete_lines') + call get_shape(dset_id, dims2) + allocate(eout(dims2(1), dims2(2))) + call read_dataset(eout, dset_id) + call close_dataset(dset_id) + + ! Get outgoing angle data + dset_id = open_dataset(group_id, 'mu') + call get_shape(dset_id, dims2) + allocate(mu(dims2(1), dims2(2))) + call read_dataset(mu, dset_id) + call close_dataset(dset_id) + + do i = 1, n_energy + ! Determine number of outgoing energies + j = offsets(i) + if (i < n_energy) then + n = offsets(i+1) - j + else + n = size(eout, 1) - j + end if + + associate (d => this % distribution(i)) + ! Assign interpolation scheme and number of discrete lines + d % interpolation = interp(i) + d % n_discrete = n_discrete(i) + + ! Allocate arrays for energies and PDF/CDF + allocate(d % e_out(n)) + allocate(d % p(n)) + allocate(d % c(n)) + allocate(d % angle(n)) + + ! Copy data + d % e_out(:) = eout(j+1:j+n, 1) + d % p(:) = eout(j+1:j+n, 2) + d % c(:) = eout(j+1:j+n, 3) + + ! To get answers that match ACE data, for now we still use the tabulated + ! CDF values that were passed through to the HDF5 library. At a later + ! time, we can remove the CDF values from the HDF5 library and + ! reconstruct them using the PDF + if (.false.) then + ! Calculate cumulative distribution function -- discrete portion + do k = 1, d % n_discrete + if (k == 1) then + d % c(k) = d % p(k) + else + d % c(k) = d % c(k-1) + d % p(k) + end if + end do + + ! Continuous portion + do k = d % n_discrete + 1, n + if (k == d % n_discrete + 1) then + d % c(k) = sum(d % p(1:d % n_discrete)) + else + if (d % interpolation == HISTOGRAM) then + d % c(k) = d % c(k-1) + d % p(k-1) * & + (d % e_out(k) - d % e_out(k-1)) + elseif (d % interpolation == LINEAR_LINEAR) then + d % c(k) = d % c(k-1) + HALF*(d % p(k-1) + d % p(k)) * & + (d % e_out(k) - d % e_out(k-1)) + end if + end if + end do + + ! Normalize density and distribution functions + d % p(:) = d % p(:)/d % c(n) + d % c(:) = d % c(:)/d % c(n) + end if + end associate + + do j = 1, n + allocate(Tabular :: this%distribution(i)%angle(j)%obj) + select type(mudist => this%distribution(i)%angle(j)%obj) + type is (Tabular) + ! Get interpolation scheme + interp_mu = nint(eout(offsets(i)+j, 4)) + + ! Determine offset and size of distribution + offset_mu = nint(eout(offsets(i)+j, 5)) + if (offsets(i) + j < size(eout, 1)) then + m = nint(eout(offsets(i)+j+1, 5)) - offset_mu + else + m = size(mu, 1) - offset_mu + end if + + ! To get answers that match ACE data, for now we still use the tabulated + ! CDF values that were passed through to the HDF5 library. At a later + ! time, we can remove the CDF values from the HDF5 library and + ! reconstruct them using the PDF + if (.true.) then + mudist % interpolation = interp_mu + allocate(mudist % x(m)) + allocate(mudist % p(m)) + allocate(mudist % c(m)) + mudist % x(:) = mu(offset_mu+1:offset_mu+m, 1) + mudist % p(:) = mu(offset_mu+1:offset_mu+m, 2) + mudist % c(:) = mu(offset_mu+1:offset_mu+m, 3) + else + ! Initialize tabular distribution + call mudist % initialize(mu(offset_mu+1:offset_mu+m, 1), & + mu(offset_mu+1:offset_mu+m, 2), interp_mu) + end if + end select + end do + end do + end subroutine correlated_from_hdf5 + end module secondary_correlated diff --git a/src/secondary_kalbach.F90 b/src/secondary_kalbach.F90 index 668917d62..920d17869 100644 --- a/src/secondary_kalbach.F90 +++ b/src/secondary_kalbach.F90 @@ -1,7 +1,10 @@ module secondary_kalbach use angleenergy_header, only: AngleEnergy - use constants, only: ZERO, ONE, TWO, HISTOGRAM, LINEAR_LINEAR + use constants, only: ZERO, HALF, ONE, TWO, HISTOGRAM, LINEAR_LINEAR + use hdf5, only: HID_T, HSIZE_T + use hdf5_interface, only: read_attribute, read_dataset, open_dataset, & + close_dataset, get_shape use random_lcg, only: prn use search, only: binary_search @@ -29,6 +32,7 @@ module secondary_kalbach type(KalbachMannTable), allocatable :: distribution(:) ! outgoing E/mu parameters contains procedure :: sample => kalbachmann_sample + procedure :: from_hdf5 => kalbachmann_from_hdf5 end type KalbachMann contains @@ -161,4 +165,116 @@ contains end subroutine kalbachmann_sample + subroutine kalbachmann_from_hdf5(this, group_id) + class(KalbachMann), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + integer :: i, j, k + integer :: n + integer :: n_energy + integer(HID_T) :: dset_id + integer(HSIZE_T) :: dims(1), dims2(2) + integer, allocatable :: temp(:,:) + integer, allocatable :: offsets(:) + integer, allocatable :: interp(:) + integer, allocatable :: n_discrete(:) + real(8), allocatable :: eout(:,:) + + ! Open incoming energy dataset + dset_id = open_dataset(group_id, 'energy') + + ! Get interpolation parameters + call read_attribute(temp, dset_id, 'interpolation') + allocate(this%breakpoints(size(temp, 1))) + allocate(this%interpolation(size(temp, 1))) + this%breakpoints(:) = temp(:, 1) + this%interpolation(:) = temp(:, 2) + this%n_region = size(this%breakpoints) + + ! Get incoming energies + call get_shape(dset_id, dims) + n_energy = int(dims(1), 4) + allocate(this%energy(n_energy)) + allocate(this%distribution(n_energy)) + call read_dataset(this%energy, dset_id) + call close_dataset(dset_id) + + ! Get outgoing energy distribution data + dset_id = open_dataset(group_id, 'distribution') + call read_attribute(offsets, dset_id, 'offsets') + call read_attribute(interp, dset_id, 'interpolation') + call read_attribute(n_discrete, dset_id, 'n_discrete_lines') + call get_shape(dset_id, dims2) + allocate(eout(dims2(1), dims2(2))) + call read_dataset(eout, dset_id) + call close_dataset(dset_id) + + do i = 1, n_energy + ! Determine number of outgoing energies + j = offsets(i) + if (i < n_energy) then + n = offsets(i+1) - j + else + n = size(eout, 1) - j + end if + + associate (d => this%distribution(i)) + ! Assign interpolation scheme and number of discrete lines + d % interpolation = interp(i) + d % n_discrete = n_discrete(i) + + ! Allocate arrays for energies and PDF/CDF + allocate(d % e_out(n)) + allocate(d % p(n)) + allocate(d % c(n)) + allocate(d % r(n)) + allocate(d % a(n)) + + ! Copy data + d % e_out(:) = eout(j+1:j+n, 1) + d % p(:) = eout(j+1:j+n, 2) + d % c(:) = eout(j+1:j+n, 3) + d % r(:) = eout(j+1:j+n, 4) + d % a(:) = eout(j+1:j+n, 5) + + + ! To get answers that match ACE data, for now we still use the tabulated + ! CDF values that were passed through to the HDF5 library. At a later + ! time, we can remove the CDF values from the HDF5 library and + ! reconstruct them using the PDF + if (.false.) then + ! Calculate cumulative distribution function -- discrete portion + do k = 1, d % n_discrete + if (k == 1) then + d % c(k) = d % p(k) + else + d % c(k) = d % c(k-1) + d % p(k) + end if + end do + + ! Continuous portion + do k = d % n_discrete + 1, n + if (k == d % n_discrete + 1) then + d % c(k) = sum(d % p(1:d % n_discrete)) + else + if (d % interpolation == HISTOGRAM) then + d % c(k) = d % c(k-1) + d % p(k-1) * & + (d % e_out(k) - d % e_out(k-1)) + elseif (d % interpolation == LINEAR_LINEAR) then + d % c(k) = d % c(k-1) + HALF*(d % p(k-1) + d % p(k)) * & + (d % e_out(k) - d % e_out(k-1)) + end if + end if + end do + + ! Normalize density and distribution functions + d % p(:) = d % p(:)/d % c(n) + d % c(:) = d % c(:)/d % c(n) + end if + end associate + + j = j + n + end do + end subroutine kalbachmann_from_hdf5 + end module secondary_kalbach diff --git a/src/secondary_nbody.F90 b/src/secondary_nbody.F90 index 71cae6fa2..d45c59879 100644 --- a/src/secondary_nbody.F90 +++ b/src/secondary_nbody.F90 @@ -2,6 +2,8 @@ module secondary_nbody use angleenergy_header, only: AngleEnergy use constants, only: ONE, TWO, PI + use hdf5, only: HID_T + use hdf5_interface, only: read_attribute use math, only: maxwell_spectrum use random_lcg, only: prn @@ -18,6 +20,7 @@ module secondary_nbody real(8) :: Q contains procedure :: sample => nbody_sample + procedure :: from_hdf5 => nbody_from_hdf5 end type NBodyPhaseSpace contains @@ -67,4 +70,14 @@ contains E_out = E_max * v end subroutine nbody_sample + subroutine nbody_from_hdf5(this, group_id) + class(NBodyPhaseSpace), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + call read_attribute(this%mass_ratio, group_id, 'total_mass') + call read_attribute(this%n_bodies, group_id, 'n_particles') + call read_attribute(this%A, group_id, 'atomic_weight_ratio') + call read_attribute(this%Q, group_id, 'q_value') + end subroutine nbody_from_hdf5 + end module secondary_nbody diff --git a/src/secondary_uncorrelated.F90 b/src/secondary_uncorrelated.F90 index 7bc8fa13d..3158913cc 100644 --- a/src/secondary_uncorrelated.F90 +++ b/src/secondary_uncorrelated.F90 @@ -2,8 +2,13 @@ module secondary_uncorrelated use angle_distribution, only: AngleDistribution use angleenergy_header, only: AngleEnergy - use constants, only: ONE, TWO - use energy_distribution, only: EnergyDistribution + use constants, only: ONE, TWO, MAX_WORD_LEN + use energy_distribution, only: EnergyDistribution, LevelInelastic, & + ContinuousTabular, MaxwellEnergy, Evaporation, WattEnergy, DiscretePhoton + use error, only: warning + use h5lt, only: h5ltpath_valid_f + use hdf5, only: HID_T + use hdf5_interface, only: read_attribute, open_group, close_group use random_lcg, only: prn !=============================================================================== @@ -18,6 +23,7 @@ module secondary_uncorrelated class(EnergyDistribution), allocatable :: energy contains procedure :: sample => uncorrelated_sample + procedure :: from_hdf5 => uncorrelated_from_hdf5 end type UncorrelatedAngleEnergy contains @@ -45,4 +51,55 @@ contains E_out = this%energy%sample(E_in) end subroutine uncorrelated_sample + subroutine uncorrelated_from_hdf5(this, group_id) + class(UncorrelatedAngleEnergy), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + logical :: exists + integer :: hdf5_err + integer(HID_T) :: energy_group + integer(HID_T) :: angle_group + character(MAX_WORD_LEN) :: type + + ! Check if energy group is present + call h5ltpath_valid_f(group_id, 'angle', .true., exists, hdf5_err) + + if (exists) then + angle_group = open_group(group_id, 'angle') + call this%angle%from_hdf5(angle_group) + call close_group(angle_group) + end if + + ! Check if energy group is present + call h5ltpath_valid_f(group_id, 'energy', .true., exists, hdf5_err) + + if (exists) then + energy_group = open_group(group_id, 'energy') + call read_attribute(type, energy_group, 'type') + select case (type) + case ('discrete_photon') + allocate(DiscretePhoton :: this%energy) + case ('level') + allocate(LevelInelastic :: this%energy) + case ('continuous') + allocate(ContinuousTabular :: this%energy) + case ('maxwell') + allocate(MaxwellEnergy :: this%energy) + case ('evaporation') + allocate(Evaporation :: this%energy) + case ('watt') + allocate(WattEnergy :: this%energy) + case default + call warning("Energy distribution type '" // trim(type) & + // "' not implemented.") + end select + + if (allocated(this % energy)) then + call this%energy%from_hdf5(energy_group) + end if + + call close_group(energy_group) + end if + end subroutine uncorrelated_from_hdf5 + end module secondary_uncorrelated diff --git a/src/state_point.F90 b/src/state_point.F90 index f37950134..87ef4ead7 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -43,7 +43,7 @@ contains subroutine write_state_point() integer :: i, j, k - integer :: i_list, i_xs + integer :: i_xs integer :: n_order ! loop index for moment orders integer :: nm_order ! loop index for Ynm moment orders integer, allocatable :: id_array(:) @@ -295,20 +295,11 @@ contains allocate(str_array(tally % n_nuclide_bins)) NUCLIDE_LOOP: do j = 1, tally % n_nuclide_bins if (tally % nuclide_bins(j) > 0) then - ! Get index in cross section listings for this nuclide - if (run_CE) then - i_list = nuclides(tally % nuclide_bins(j)) % listing - else - i_list = nuclides_MG(tally % nuclide_bins(j)) % obj % listing - end if - - ! Determine position of . in alias string (e.g. "U-235.71c"). If - ! no . is found, just use the entire string. - i_xs = index(xs_listings(i_list) % alias, '.') + i_xs = index(nuclides(tally % nuclide_bins(j)) % name, '.') if (i_xs > 0) then - str_array(j) = xs_listings(i_list) % alias(1:i_xs - 1) + str_array(j) = nuclides(tally % nuclide_bins(j)) % name(1 : i_xs-1) else - str_array(j) = xs_listings(i_list) % alias + str_array(j) = nuclides(tally % nuclide_bins(j)) % name end if else str_array(j) = 'total' diff --git a/src/stl_vector.F90 b/src/stl_vector.F90 index 8038628fb..c7f2246ff 100644 --- a/src/stl_vector.F90 +++ b/src/stl_vector.F90 @@ -38,6 +38,7 @@ module stl_vector implicit none private + integer, parameter :: VECTOR_CHAR_LEN = 255 real(8), parameter :: GROWTH_FACTOR = 1.5 type, public :: VectorInt @@ -76,6 +77,24 @@ module stl_vector procedure :: size => size_real end type VectorReal + type, public :: VectorChar + integer, private :: size_ = 0 + integer, private :: capacity_ = 0 + character(VECTOR_CHAR_LEN), allocatable :: data(:) + contains + procedure :: capacity => capacity_char + procedure :: clear => clear_char + generic :: initialize => & + initialize_fill_char + procedure, private :: initialize_fill_char + procedure :: pop_back => pop_back_char + procedure :: push_back => push_back_char + procedure :: reserve => reserve_char + procedure :: resize => resize_char + procedure :: shrink_to_fit => shrink_to_fit_char + procedure :: size => size_char + end type VectorChar + contains !=============================================================================== @@ -348,4 +367,143 @@ contains size = this%size_ end function size_real +!=============================================================================== +! Implementation of VectorChar +!=============================================================================== + + pure function capacity_char(this) result(capacity) + class(VectorChar), intent(in) :: this + integer :: capacity + + capacity = this%capacity_ + end function capacity_char + + subroutine clear_char(this) + class(VectorChar), intent(inout) :: this + + ! Since char is trivially destructible, we only need to set size to zero and + ! can leave capacity as is + this%size_ = 0 + end subroutine clear_char + + subroutine initialize_fill_char(this, n, val) + class(VectorChar), intent(inout) :: this + integer, intent(in) :: n + character(*), optional, intent(in) :: val + + integer :: i + character(VECTOR_CHAR_LEN) :: val_ + + ! If no value given, fill the vector with empty strings + if (present(val)) then + val_ = val + else + val_ = '' + end if + + if (allocated(this%data)) deallocate(this%data) + + allocate(this%data(n)) + do i = 1, n + this%data(i) = val_ + end do + this%size_ = n + this%capacity_ = n + end subroutine initialize_fill_char + + subroutine pop_back_char(this) + class(VectorChar), intent(inout) :: this + if (this%size_ > 0) this%size_ = this%size_ - 1 + end subroutine pop_back_char + + subroutine push_back_char(this, val) + class(VectorChar), intent(inout) :: this + character(*), intent(in) :: val + + integer :: capacity + character(VECTOR_CHAR_LEN), allocatable :: data(:) + + if (this%capacity_ == this%size_) then + ! Create new data array that is GROWTH_FACTOR larger. Note that + if (this%capacity_ == 0) then + capacity = 8 + else + capacity = int(GROWTH_FACTOR*this%capacity_) + end if + allocate(data(capacity)) + + ! Copy existing elements + if (this%size_ > 0) data(1:this%size_) = this%data + + ! Move allocation + call move_alloc(FROM=data, TO=this%data) + this%capacity_ = capacity + end if + + ! Increase size of vector by one and set new element + this%size_ = this%size_ + 1 + this%data(this%size_) = val + end subroutine push_back_char + + subroutine reserve_char(this, n) + class(VectorChar), intent(inout) :: this + integer, intent(in) :: n + + character(VECTOR_CHAR_LEN), allocatable :: data(:) + + if (n > this%capacity_) then + allocate(data(n)) + + ! Copy existing elements + if (this%size_ > 0) data(1:this%size_) = this%data(1:this%size_) + + ! Move allocation + call move_alloc(FROM=data, TO=this%data) + this%capacity_ = n + end if + end subroutine reserve_char + + subroutine resize_char(this, n, val) + class(VectorChar), intent(inout) :: this + integer, intent(in) :: n + character(*), intent(in), optional :: val + + if (n < this%size_) then + this%size_ = n + elseif (n > this%size_) then + ! If requested size is greater than capacity, first reserve that many + ! elements + if (n > this%capacity_) call this%reserve(n) + + ! Fill added elements with specified value and increase size + if (present(val)) this%data(this%size_ + 1 : n) = val + this%size_ = n + end if + + end subroutine resize_char + + subroutine shrink_to_fit_char(this) + class(VectorChar), intent(inout) :: this + + character(VECTOR_CHAR_LEN), allocatable :: data(:) + + if (this%capacity_ > this%size_) then + if (this%size_ > 0) then + allocate(data(this%size_)) + data(:) = this%data(1:this%size_) + call move_alloc(FROM=data, TO=this%data) + this%capacity_ = this%size_ + else + if (allocated(this%data)) deallocate(this%data) + end if + end if + end subroutine shrink_to_fit_char + + pure function size_char(this) result(size) + class(VectorChar), intent(in) :: this + integer :: size + + size = this%size_ + end function size_char + end module stl_vector diff --git a/src/summary.F90 b/src/summary.F90 index 2ec96042c..9ad9aa23c 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -128,11 +128,11 @@ contains allocate(zaids(n_nuclides_total)) do i = 1, n_nuclides_total if (run_CE) then - nucnames(i) = xs_listings(nuclides(i) % listing) % alias + nucnames(i) = nuclides(i) % name awrs(i) = nuclides(i) % awr zaids(i) = nuclides(i) % zaid else - nucnames(i) = xs_listings(nuclides_MG(i) % obj % listing) % alias + nucnames(i) = nuclides_MG(i) % obj % name awrs(i) = nuclides_MG(i) % obj % awr zaids(i) = nuclides_MG(i) % obj % zaid end if @@ -508,8 +508,7 @@ contains integer :: i integer :: j - integer :: i_list - character(12), allocatable :: nucnames(:) + character(20), allocatable :: nucnames(:) integer(HID_T) :: materials_group integer(HID_T) :: material_group type(Material), pointer :: m @@ -540,11 +539,10 @@ contains allocate(nucnames(m%n_nuclides)) do j = 1, m%n_nuclides if (run_CE) then - i_list = nuclides(m%nuclide(j))%listing + nucnames(j) = nuclides(m%nuclide(j))%name else - i_list = nuclides_MG(m%nuclide(j))%obj%listing + nucnames(j) = nuclides_MG(m%nuclide(j))%obj%name end if - nucnames(j) = xs_listings(i_list)%alias end do ! Write temporary array to 'nuclides' @@ -575,7 +573,7 @@ contains integer(HID_T), intent(in) :: file_id integer :: i, j, k - integer :: i_list, i_xs + integer :: i_xs integer :: n_order ! loop index for moment orders integer :: nm_order ! loop index for Ynm moment orders integer(HID_T) :: tallies_group @@ -705,16 +703,11 @@ contains allocate(str_array(t%n_nuclide_bins)) NUCLIDE_LOOP: do j = 1, t%n_nuclide_bins if (t%nuclide_bins(j) > 0) then - if (run_CE) then - i_list = nuclides(t % nuclide_bins(j)) % listing - else - i_list = nuclides_MG(t % nuclide_bins(j)) % obj % listing - end if - i_xs = index(xs_listings(i_list)%alias, '.') + i_xs = index(nuclides(t%nuclide_bins(j))%name, '.') if (i_xs > 0) then - str_array(j) = xs_listings(i_list)%alias(1:i_xs - 1) + str_array(j) = nuclides(t%nuclide_bins(j))%name(1 : i_xs-1) else - str_array(j) = xs_listings(i_list)%alias + str_array(j) = nuclides(t%nuclide_bins(j))%name end if else str_array(j) = 'total' diff --git a/src/urr_header.F90 b/src/urr_header.F90 index 96e182d2e..cc41d43cc 100644 --- a/src/urr_header.F90 +++ b/src/urr_header.F90 @@ -1,5 +1,9 @@ module urr_header + use hdf5, only: HID_T, HSIZE_T + use hdf5_interface, only: read_attribute, open_dataset, read_dataset, & + close_dataset, get_shape + implicit none !=============================================================================== @@ -15,6 +19,55 @@ module urr_header logical :: multiply_smooth ! multiply by smooth cross section? real(8), allocatable :: energy(:) ! incident energies real(8), allocatable :: prob(:,:,:) ! actual probabibility tables + contains + procedure :: from_hdf5 => urr_from_hdf5 end type UrrData +contains + + subroutine urr_from_hdf5(this, group_id) + class(UrrData), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + + integer :: i, j, k + integer(HID_T) :: energy + integer(HID_T) :: table + integer(HSIZE_T) :: dims(1) + integer(HSIZE_T) :: dims3(3) + real(8), allocatable :: temp(:,:,:) + + ! Read interpolation and other flags + call read_attribute(this % interp, group_id, 'interpolation') + call read_attribute(this % inelastic_flag, group_id, 'inelastic') + call read_attribute(this % absorption_flag, group_id, 'absorption') + call read_attribute(i, group_id, 'multiply_smooth') + this % multiply_smooth = (i == 1) + + ! Read energies at which tables exist + energy = open_dataset(group_id, 'energy') + call get_shape(energy, dims) + this % n_energy = int(dims(1), 4) + allocate(this % energy(this % n_energy)) + call read_dataset(this % energy, energy) + call close_dataset(energy) + + ! Read URR tables + table = open_dataset(group_id, 'table') + call get_shape(table, dims3) + this % n_prob = int(dims3(1), 4) + allocate(temp(this % n_prob, 6, this % n_energy)) + call read_dataset(temp, table) + call close_dataset(table) + + ! Swap first and last indices + allocate(this % prob(this % n_energy, 6, this % n_prob)) + do i = 1, this % n_energy + do j = 1, 6 + do k = 1, this % n_prob + this % prob(i, j, k) = temp(k, j, i) + end do + end do + end do + end subroutine urr_from_hdf5 + end module urr_header diff --git a/tests/input_set.py b/tests/input_set.py index 13c0e99a7..827484022 100644 --- a/tests/input_set.py +++ b/tests/input_set.py @@ -24,250 +24,250 @@ class InputSet(object): # Define materials. fuel = openmc.Material(name='Fuel', material_id=1) fuel.set_density('g/cm3', 10.062) - fuel.add_nuclide("U-234", 4.9476e-6) - fuel.add_nuclide("U-235", 4.8218e-4) - fuel.add_nuclide("U-236", 9.0402e-5) - fuel.add_nuclide("U-238", 2.1504e-2) - fuel.add_nuclide("Np-237", 7.3733e-6) - fuel.add_nuclide("Pu-238", 1.5148e-6) - fuel.add_nuclide("Pu-239", 1.3955e-4) - fuel.add_nuclide("Pu-240", 3.4405e-5) - fuel.add_nuclide("Pu-241", 2.1439e-5) - fuel.add_nuclide("Pu-242", 3.7422e-6) - fuel.add_nuclide("Am-241", 4.5041e-7) - fuel.add_nuclide("Am-242m", 9.2301e-9) - fuel.add_nuclide("Am-243", 4.7878e-7) - fuel.add_nuclide("Cm-242", 1.0485e-7) - fuel.add_nuclide("Cm-243", 1.4268e-9) - fuel.add_nuclide("Cm-244", 8.8756e-8) - fuel.add_nuclide("Cm-245", 3.5285e-9) - fuel.add_nuclide("Mo-95", 2.6497e-5) - fuel.add_nuclide("Tc-99", 3.2772e-5) - fuel.add_nuclide("Ru-101", 3.0742e-5) - fuel.add_nuclide("Ru-103", 2.3505e-6) - fuel.add_nuclide("Ag-109", 2.0009e-6) - fuel.add_nuclide("Xe-135", 1.0801e-8) - fuel.add_nuclide("Cs-133", 3.4612e-5) - fuel.add_nuclide("Nd-143", 2.6078e-5) - fuel.add_nuclide("Nd-145", 1.9898e-5) - fuel.add_nuclide("Sm-147", 1.6128e-6) - fuel.add_nuclide("Sm-149", 1.1627e-7) - fuel.add_nuclide("Sm-150", 7.1727e-6) - fuel.add_nuclide("Sm-151", 5.4947e-7) - fuel.add_nuclide("Sm-152", 3.0221e-6) - fuel.add_nuclide("Eu-153", 2.6209e-6) - fuel.add_nuclide("Gd-155", 1.5369e-9) - fuel.add_nuclide("O-16", 4.5737e-2) + fuel.add_nuclide("U234", 4.9476e-6) + fuel.add_nuclide("U235", 4.8218e-4) + fuel.add_nuclide("U236", 9.0402e-5) + fuel.add_nuclide("U238", 2.1504e-2) + fuel.add_nuclide("Np237", 7.3733e-6) + fuel.add_nuclide("Pu238", 1.5148e-6) + fuel.add_nuclide("Pu239", 1.3955e-4) + fuel.add_nuclide("Pu240", 3.4405e-5) + fuel.add_nuclide("Pu241", 2.1439e-5) + fuel.add_nuclide("Pu242", 3.7422e-6) + fuel.add_nuclide("Am241", 4.5041e-7) + fuel.add_nuclide("Am242_m1", 9.2301e-9) + fuel.add_nuclide("Am243", 4.7878e-7) + fuel.add_nuclide("Cm242", 1.0485e-7) + fuel.add_nuclide("Cm243", 1.4268e-9) + fuel.add_nuclide("Cm244", 8.8756e-8) + fuel.add_nuclide("Cm245", 3.5285e-9) + fuel.add_nuclide("Mo95", 2.6497e-5) + fuel.add_nuclide("Tc99", 3.2772e-5) + fuel.add_nuclide("Ru101", 3.0742e-5) + fuel.add_nuclide("Ru103", 2.3505e-6) + fuel.add_nuclide("Ag109", 2.0009e-6) + fuel.add_nuclide("Xe135", 1.0801e-8) + fuel.add_nuclide("Cs133", 3.4612e-5) + fuel.add_nuclide("Nd143", 2.6078e-5) + fuel.add_nuclide("Nd145", 1.9898e-5) + fuel.add_nuclide("Sm147", 1.6128e-6) + fuel.add_nuclide("Sm149", 1.1627e-7) + fuel.add_nuclide("Sm150", 7.1727e-6) + fuel.add_nuclide("Sm151", 5.4947e-7) + fuel.add_nuclide("Sm152", 3.0221e-6) + fuel.add_nuclide("Eu153", 2.6209e-6) + fuel.add_nuclide("Gd155", 1.5369e-9) + fuel.add_nuclide("O16", 4.5737e-2) clad = openmc.Material(name='Cladding', material_id=2) clad.set_density('g/cm3', 5.77) - clad.add_nuclide("Zr-90", 0.5145) - clad.add_nuclide("Zr-91", 0.1122) - clad.add_nuclide("Zr-92", 0.1715) - clad.add_nuclide("Zr-94", 0.1738) - clad.add_nuclide("Zr-96", 0.0280) + clad.add_nuclide("Zr90", 0.5145) + clad.add_nuclide("Zr91", 0.1122) + clad.add_nuclide("Zr92", 0.1715) + clad.add_nuclide("Zr94", 0.1738) + clad.add_nuclide("Zr96", 0.0280) cold_water = openmc.Material(name='Cold borated water', material_id=3) cold_water.set_density('atom/b-cm', 0.07416) - cold_water.add_nuclide("H-1", 2.0) - cold_water.add_nuclide("O-16", 1.0) - cold_water.add_nuclide("B-10", 6.490e-4) - cold_water.add_nuclide("B-11", 2.689e-3) - cold_water.add_s_alpha_beta('HH2O', '71t') + cold_water.add_nuclide("H1", 2.0) + cold_water.add_nuclide("O16", 1.0) + cold_water.add_nuclide("B10", 6.490e-4) + cold_water.add_nuclide("B11", 2.689e-3) + cold_water.add_s_alpha_beta('c_H_in_H2O', '71t') hot_water = openmc.Material(name='Hot borated water', material_id=4) hot_water.set_density('atom/b-cm', 0.06614) - hot_water.add_nuclide("H-1", 2.0) - hot_water.add_nuclide("O-16", 1.0) - hot_water.add_nuclide("B-10", 6.490e-4) - hot_water.add_nuclide("B-11", 2.689e-3) - hot_water.add_s_alpha_beta('HH2O', '71t') + hot_water.add_nuclide("H1", 2.0) + hot_water.add_nuclide("O16", 1.0) + hot_water.add_nuclide("B10", 6.490e-4) + hot_water.add_nuclide("B11", 2.689e-3) + hot_water.add_s_alpha_beta('c_H_in_H2O', '71t') rpv_steel = openmc.Material(name='Reactor pressure vessel steel', material_id=5) rpv_steel.set_density('g/cm3', 7.9) - rpv_steel.add_nuclide("Fe-54", 0.05437098, 'wo') - rpv_steel.add_nuclide("Fe-56", 0.88500663, 'wo') - rpv_steel.add_nuclide("Fe-57", 0.0208008, 'wo') - rpv_steel.add_nuclide("Fe-58", 0.00282159, 'wo') - rpv_steel.add_nuclide("Ni-58", 0.0067198, 'wo') - rpv_steel.add_nuclide("Ni-60", 0.0026776, 'wo') - rpv_steel.add_nuclide("Ni-61", 0.0001183, 'wo') - rpv_steel.add_nuclide("Ni-62", 0.0003835, 'wo') - rpv_steel.add_nuclide("Ni-64", 0.0001008, 'wo') - rpv_steel.add_nuclide("Mn-55", 0.01, 'wo') - rpv_steel.add_nuclide("Mo-92", 0.000849, 'wo') - rpv_steel.add_nuclide("Mo-94", 0.0005418, 'wo') - rpv_steel.add_nuclide("Mo-95", 0.0009438, 'wo') - rpv_steel.add_nuclide("Mo-96", 0.0010002, 'wo') - rpv_steel.add_nuclide("Mo-97", 0.0005796, 'wo') - rpv_steel.add_nuclide("Mo-98", 0.0014814, 'wo') - rpv_steel.add_nuclide("Mo-100", 0.0006042, 'wo') - rpv_steel.add_nuclide("Si-28", 0.00367464, 'wo') - rpv_steel.add_nuclide("Si-29", 0.00019336, 'wo') - rpv_steel.add_nuclide("Si-30", 0.000132, 'wo') - rpv_steel.add_nuclide("Cr-50", 0.00010435, 'wo') - rpv_steel.add_nuclide("Cr-52", 0.002092475, 'wo') - rpv_steel.add_nuclide("Cr-53", 0.00024185, 'wo') - rpv_steel.add_nuclide("Cr-54", 6.1325e-05, 'wo') - rpv_steel.add_nuclide("C-Nat", 0.0025, 'wo') - rpv_steel.add_nuclide("Cu-63", 0.0013696, 'wo') - rpv_steel.add_nuclide("Cu-65", 0.0006304, 'wo') + rpv_steel.add_nuclide("Fe54", 0.05437098, 'wo') + rpv_steel.add_nuclide("Fe56", 0.88500663, 'wo') + rpv_steel.add_nuclide("Fe57", 0.0208008, 'wo') + rpv_steel.add_nuclide("Fe58", 0.00282159, 'wo') + rpv_steel.add_nuclide("Ni58", 0.0067198, 'wo') + rpv_steel.add_nuclide("Ni60", 0.0026776, 'wo') + rpv_steel.add_nuclide("Ni61", 0.0001183, 'wo') + rpv_steel.add_nuclide("Ni62", 0.0003835, 'wo') + rpv_steel.add_nuclide("Ni64", 0.0001008, 'wo') + rpv_steel.add_nuclide("Mn55", 0.01, 'wo') + rpv_steel.add_nuclide("Mo92", 0.000849, 'wo') + rpv_steel.add_nuclide("Mo94", 0.0005418, 'wo') + rpv_steel.add_nuclide("Mo95", 0.0009438, 'wo') + rpv_steel.add_nuclide("Mo96", 0.0010002, 'wo') + rpv_steel.add_nuclide("Mo97", 0.0005796, 'wo') + rpv_steel.add_nuclide("Mo98", 0.0014814, 'wo') + rpv_steel.add_nuclide("Mo100", 0.0006042, 'wo') + rpv_steel.add_nuclide("Si28", 0.00367464, 'wo') + rpv_steel.add_nuclide("Si29", 0.00019336, 'wo') + rpv_steel.add_nuclide("Si30", 0.000132, 'wo') + rpv_steel.add_nuclide("Cr50", 0.00010435, 'wo') + rpv_steel.add_nuclide("Cr52", 0.002092475, 'wo') + rpv_steel.add_nuclide("Cr53", 0.00024185, 'wo') + rpv_steel.add_nuclide("Cr54", 6.1325e-05, 'wo') + rpv_steel.add_nuclide("C0", 0.0025, 'wo') + rpv_steel.add_nuclide("Cu63", 0.0013696, 'wo') + rpv_steel.add_nuclide("Cu65", 0.0006304, 'wo') lower_rad_ref = openmc.Material(name='Lower radial reflector', material_id=6) lower_rad_ref.set_density('g/cm3', 4.32) - lower_rad_ref.add_nuclide("H-1", 0.0095661, 'wo') - lower_rad_ref.add_nuclide("O-16", 0.0759107, 'wo') - lower_rad_ref.add_nuclide("B-10", 3.08409e-5, 'wo') - lower_rad_ref.add_nuclide("B-11", 1.40499e-4, 'wo') - lower_rad_ref.add_nuclide("Fe-54", 0.035620772088, 'wo') - lower_rad_ref.add_nuclide("Fe-56", 0.579805982228, 'wo') - lower_rad_ref.add_nuclide("Fe-57", 0.01362750048, 'wo') - lower_rad_ref.add_nuclide("Fe-58", 0.001848545204, 'wo') - lower_rad_ref.add_nuclide("Ni-58", 0.055298376566, 'wo') - lower_rad_ref.add_nuclide("Ni-60", 0.022034425592, 'wo') - lower_rad_ref.add_nuclide("Ni-61", 0.000973510811, 'wo') - lower_rad_ref.add_nuclide("Ni-62", 0.003155886695, 'wo') - lower_rad_ref.add_nuclide("Ni-64", 0.000829500336, 'wo') - lower_rad_ref.add_nuclide("Mn-55", 0.0182870, 'wo') - lower_rad_ref.add_nuclide("Si-28", 0.00839976771, 'wo') - lower_rad_ref.add_nuclide("Si-29", 0.00044199679, 'wo') - lower_rad_ref.add_nuclide("Si-30", 0.0003017355, 'wo') - lower_rad_ref.add_nuclide("Cr-50", 0.007251360806, 'wo') - lower_rad_ref.add_nuclide("Cr-52", 0.145407678031, 'wo') - lower_rad_ref.add_nuclide("Cr-53", 0.016806340306, 'wo') - lower_rad_ref.add_nuclide("Cr-54", 0.004261520857, 'wo') - lower_rad_ref.add_s_alpha_beta('HH2O', '71t') + lower_rad_ref.add_nuclide("H1", 0.0095661, 'wo') + lower_rad_ref.add_nuclide("O16", 0.0759107, 'wo') + lower_rad_ref.add_nuclide("B10", 3.08409e-5, 'wo') + lower_rad_ref.add_nuclide("B11", 1.40499e-4, 'wo') + lower_rad_ref.add_nuclide("Fe54", 0.035620772088, 'wo') + lower_rad_ref.add_nuclide("Fe56", 0.579805982228, 'wo') + lower_rad_ref.add_nuclide("Fe57", 0.01362750048, 'wo') + lower_rad_ref.add_nuclide("Fe58", 0.001848545204, 'wo') + lower_rad_ref.add_nuclide("Ni58", 0.055298376566, 'wo') + lower_rad_ref.add_nuclide("Ni60", 0.022034425592, 'wo') + lower_rad_ref.add_nuclide("Ni61", 0.000973510811, 'wo') + lower_rad_ref.add_nuclide("Ni62", 0.003155886695, 'wo') + lower_rad_ref.add_nuclide("Ni64", 0.000829500336, 'wo') + lower_rad_ref.add_nuclide("Mn55", 0.0182870, 'wo') + lower_rad_ref.add_nuclide("Si28", 0.00839976771, 'wo') + lower_rad_ref.add_nuclide("Si29", 0.00044199679, 'wo') + lower_rad_ref.add_nuclide("Si30", 0.0003017355, 'wo') + lower_rad_ref.add_nuclide("Cr50", 0.007251360806, 'wo') + lower_rad_ref.add_nuclide("Cr52", 0.145407678031, 'wo') + lower_rad_ref.add_nuclide("Cr53", 0.016806340306, 'wo') + lower_rad_ref.add_nuclide("Cr54", 0.004261520857, 'wo') + lower_rad_ref.add_s_alpha_beta('c_H_in_H2O', '71t') upper_rad_ref = openmc.Material(name='Upper radial reflector /' 'Top plate region', material_id=7) upper_rad_ref.set_density('g/cm3', 4.28) - upper_rad_ref.add_nuclide("H-1", 0.0086117, 'wo') - upper_rad_ref.add_nuclide("O-16", 0.0683369, 'wo') - upper_rad_ref.add_nuclide("B-10", 2.77638e-5, 'wo') - upper_rad_ref.add_nuclide("B-11", 1.26481e-4, 'wo') - upper_rad_ref.add_nuclide("Fe-54", 0.035953677186, 'wo') - upper_rad_ref.add_nuclide("Fe-56", 0.585224740891, 'wo') - upper_rad_ref.add_nuclide("Fe-57", 0.01375486056, 'wo') - upper_rad_ref.add_nuclide("Fe-58", 0.001865821363, 'wo') - upper_rad_ref.add_nuclide("Ni-58", 0.055815129186, 'wo') - upper_rad_ref.add_nuclide("Ni-60", 0.022240333032, 'wo') - upper_rad_ref.add_nuclide("Ni-61", 0.000982608081, 'wo') - upper_rad_ref.add_nuclide("Ni-62", 0.003185377845, 'wo') - upper_rad_ref.add_nuclide("Ni-64", 0.000837251856, 'wo') - upper_rad_ref.add_nuclide("Mn-55", 0.0184579, 'wo') - upper_rad_ref.add_nuclide("Si-28", 0.00847831314, 'wo') - upper_rad_ref.add_nuclide("Si-29", 0.00044612986, 'wo') - upper_rad_ref.add_nuclide("Si-30", 0.000304557, 'wo') - upper_rad_ref.add_nuclide("Cr-50", 0.00731912987, 'wo') - upper_rad_ref.add_nuclide("Cr-52", 0.146766614995, 'wo') - upper_rad_ref.add_nuclide("Cr-53", 0.01696340737, 'wo') - upper_rad_ref.add_nuclide("Cr-54", 0.004301347765, 'wo') - upper_rad_ref.add_s_alpha_beta('HH2O', '71t') + upper_rad_ref.add_nuclide("H1", 0.0086117, 'wo') + upper_rad_ref.add_nuclide("O16", 0.0683369, 'wo') + upper_rad_ref.add_nuclide("B10", 2.77638e-5, 'wo') + upper_rad_ref.add_nuclide("B11", 1.26481e-4, 'wo') + upper_rad_ref.add_nuclide("Fe54", 0.035953677186, 'wo') + upper_rad_ref.add_nuclide("Fe56", 0.585224740891, 'wo') + upper_rad_ref.add_nuclide("Fe57", 0.01375486056, 'wo') + upper_rad_ref.add_nuclide("Fe58", 0.001865821363, 'wo') + upper_rad_ref.add_nuclide("Ni58", 0.055815129186, 'wo') + upper_rad_ref.add_nuclide("Ni60", 0.022240333032, 'wo') + upper_rad_ref.add_nuclide("Ni61", 0.000982608081, 'wo') + upper_rad_ref.add_nuclide("Ni62", 0.003185377845, 'wo') + upper_rad_ref.add_nuclide("Ni64", 0.000837251856, 'wo') + upper_rad_ref.add_nuclide("Mn55", 0.0184579, 'wo') + upper_rad_ref.add_nuclide("Si28", 0.00847831314, 'wo') + upper_rad_ref.add_nuclide("Si29", 0.00044612986, 'wo') + upper_rad_ref.add_nuclide("Si30", 0.000304557, 'wo') + upper_rad_ref.add_nuclide("Cr50", 0.00731912987, 'wo') + upper_rad_ref.add_nuclide("Cr52", 0.146766614995, 'wo') + upper_rad_ref.add_nuclide("Cr53", 0.01696340737, 'wo') + upper_rad_ref.add_nuclide("Cr54", 0.004301347765, 'wo') + upper_rad_ref.add_s_alpha_beta('c_H_in_H2O', '71t') bot_plate = openmc.Material(name='Bottom plate region', material_id=8) bot_plate.set_density('g/cm3', 7.184) - bot_plate.add_nuclide("H-1", 0.0011505, 'wo') - bot_plate.add_nuclide("O-16", 0.0091296, 'wo') - bot_plate.add_nuclide("B-10", 3.70915e-6, 'wo') - bot_plate.add_nuclide("B-11", 1.68974e-5, 'wo') - bot_plate.add_nuclide("Fe-54", 0.03855611055, 'wo') - bot_plate.add_nuclide("Fe-56", 0.627585036425, 'wo') - bot_plate.add_nuclide("Fe-57", 0.014750478, 'wo') - bot_plate.add_nuclide("Fe-58", 0.002000875025, 'wo') - bot_plate.add_nuclide("Ni-58", 0.059855207342, 'wo') - bot_plate.add_nuclide("Ni-60", 0.023850159704, 'wo') - bot_plate.add_nuclide("Ni-61", 0.001053732407, 'wo') - bot_plate.add_nuclide("Ni-62", 0.003415945715, 'wo') - bot_plate.add_nuclide("Ni-64", 0.000897854832, 'wo') - bot_plate.add_nuclide("Mn-55", 0.0197940, 'wo') - bot_plate.add_nuclide("Si-28", 0.00909197802, 'wo') - bot_plate.add_nuclide("Si-29", 0.00047842098, 'wo') - bot_plate.add_nuclide("Si-30", 0.000326601, 'wo') - bot_plate.add_nuclide("Cr-50", 0.007848910646, 'wo') - bot_plate.add_nuclide("Cr-52", 0.157390026871, 'wo') - bot_plate.add_nuclide("Cr-53", 0.018191270146, 'wo') - bot_plate.add_nuclide("Cr-54", 0.004612692337, 'wo') - bot_plate.add_s_alpha_beta('HH2O', '71t') + bot_plate.add_nuclide("H1", 0.0011505, 'wo') + bot_plate.add_nuclide("O16", 0.0091296, 'wo') + bot_plate.add_nuclide("B10", 3.70915e-6, 'wo') + bot_plate.add_nuclide("B11", 1.68974e-5, 'wo') + bot_plate.add_nuclide("Fe54", 0.03855611055, 'wo') + bot_plate.add_nuclide("Fe56", 0.627585036425, 'wo') + bot_plate.add_nuclide("Fe57", 0.014750478, 'wo') + bot_plate.add_nuclide("Fe58", 0.002000875025, 'wo') + bot_plate.add_nuclide("Ni58", 0.059855207342, 'wo') + bot_plate.add_nuclide("Ni60", 0.023850159704, 'wo') + bot_plate.add_nuclide("Ni61", 0.001053732407, 'wo') + bot_plate.add_nuclide("Ni62", 0.003415945715, 'wo') + bot_plate.add_nuclide("Ni64", 0.000897854832, 'wo') + bot_plate.add_nuclide("Mn55", 0.0197940, 'wo') + bot_plate.add_nuclide("Si28", 0.00909197802, 'wo') + bot_plate.add_nuclide("Si29", 0.00047842098, 'wo') + bot_plate.add_nuclide("Si30", 0.000326601, 'wo') + bot_plate.add_nuclide("Cr50", 0.007848910646, 'wo') + bot_plate.add_nuclide("Cr52", 0.157390026871, 'wo') + bot_plate.add_nuclide("Cr53", 0.018191270146, 'wo') + bot_plate.add_nuclide("Cr54", 0.004612692337, 'wo') + bot_plate.add_s_alpha_beta('c_H_in_H2O', '71t') bot_nozzle = openmc.Material(name='Bottom nozzle region', material_id=9) bot_nozzle.set_density('g/cm3', 2.53) - bot_nozzle.add_nuclide("H-1", 0.0245014, 'wo') - bot_nozzle.add_nuclide("O-16", 0.1944274, 'wo') - bot_nozzle.add_nuclide("B-10", 7.89917e-5, 'wo') - bot_nozzle.add_nuclide("B-11", 3.59854e-4, 'wo') - bot_nozzle.add_nuclide("Fe-54", 0.030411411144, 'wo') - bot_nozzle.add_nuclide("Fe-56", 0.495012237964, 'wo') - bot_nozzle.add_nuclide("Fe-57", 0.01163454624, 'wo') - bot_nozzle.add_nuclide("Fe-58", 0.001578204652, 'wo') - bot_nozzle.add_nuclide("Ni-58", 0.047211231662, 'wo') - bot_nozzle.add_nuclide("Ni-60", 0.018811987544, 'wo') - bot_nozzle.add_nuclide("Ni-61", 0.000831139127, 'wo') - bot_nozzle.add_nuclide("Ni-62", 0.002694352115, 'wo') - bot_nozzle.add_nuclide("Ni-64", 0.000708189552, 'wo') - bot_nozzle.add_nuclide("Mn-55", 0.0156126, 'wo') - bot_nozzle.add_nuclide("Si-28", 0.007171335558, 'wo') - bot_nozzle.add_nuclide("Si-29", 0.000377356542, 'wo') - bot_nozzle.add_nuclide("Si-30", 0.0002576079, 'wo') - bot_nozzle.add_nuclide("Cr-50", 0.006190885148, 'wo') - bot_nozzle.add_nuclide("Cr-52", 0.124142524198, 'wo') - bot_nozzle.add_nuclide("Cr-53", 0.014348496148, 'wo') - bot_nozzle.add_nuclide("Cr-54", 0.003638294506, 'wo') - bot_nozzle.add_s_alpha_beta('HH2O', '71t') + bot_nozzle.add_nuclide("H1", 0.0245014, 'wo') + bot_nozzle.add_nuclide("O16", 0.1944274, 'wo') + bot_nozzle.add_nuclide("B10", 7.89917e-5, 'wo') + bot_nozzle.add_nuclide("B11", 3.59854e-4, 'wo') + bot_nozzle.add_nuclide("Fe54", 0.030411411144, 'wo') + bot_nozzle.add_nuclide("Fe56", 0.495012237964, 'wo') + bot_nozzle.add_nuclide("Fe57", 0.01163454624, 'wo') + bot_nozzle.add_nuclide("Fe58", 0.001578204652, 'wo') + bot_nozzle.add_nuclide("Ni58", 0.047211231662, 'wo') + bot_nozzle.add_nuclide("Ni60", 0.018811987544, 'wo') + bot_nozzle.add_nuclide("Ni61", 0.000831139127, 'wo') + bot_nozzle.add_nuclide("Ni62", 0.002694352115, 'wo') + bot_nozzle.add_nuclide("Ni64", 0.000708189552, 'wo') + bot_nozzle.add_nuclide("Mn55", 0.0156126, 'wo') + bot_nozzle.add_nuclide("Si28", 0.007171335558, 'wo') + bot_nozzle.add_nuclide("Si29", 0.000377356542, 'wo') + bot_nozzle.add_nuclide("Si30", 0.0002576079, 'wo') + bot_nozzle.add_nuclide("Cr50", 0.006190885148, 'wo') + bot_nozzle.add_nuclide("Cr52", 0.124142524198, 'wo') + bot_nozzle.add_nuclide("Cr53", 0.014348496148, 'wo') + bot_nozzle.add_nuclide("Cr54", 0.003638294506, 'wo') + bot_nozzle.add_s_alpha_beta('c_H_in_H2O', '71t') top_nozzle = openmc.Material(name='Top nozzle region', material_id=10) top_nozzle.set_density('g/cm3', 1.746) - top_nozzle.add_nuclide("H-1", 0.0358870, 'wo') - top_nozzle.add_nuclide("O-16", 0.2847761, 'wo') - top_nozzle.add_nuclide("B-10", 1.15699e-4, 'wo') - top_nozzle.add_nuclide("B-11", 5.27075e-4, 'wo') - top_nozzle.add_nuclide("Fe-54", 0.02644016154, 'wo') - top_nozzle.add_nuclide("Fe-56", 0.43037146399, 'wo') - top_nozzle.add_nuclide("Fe-57", 0.0101152584, 'wo') - top_nozzle.add_nuclide("Fe-58", 0.00137211607, 'wo') - top_nozzle.add_nuclide("Ni-58", 0.04104621835, 'wo') - top_nozzle.add_nuclide("Ni-60", 0.0163554502, 'wo') - top_nozzle.add_nuclide("Ni-61", 0.000722605975, 'wo') - top_nozzle.add_nuclide("Ni-62", 0.002342513875, 'wo') - top_nozzle.add_nuclide("Ni-64", 0.0006157116, 'wo') - top_nozzle.add_nuclide("Mn-55", 0.0135739, 'wo') - top_nozzle.add_nuclide("Si-28", 0.006234853554, 'wo') - top_nozzle.add_nuclide("Si-29", 0.000328078746, 'wo') - top_nozzle.add_nuclide("Si-30", 0.0002239677, 'wo') - top_nozzle.add_nuclide("Cr-50", 0.005382452306, 'wo') - top_nozzle.add_nuclide("Cr-52", 0.107931450781, 'wo') - top_nozzle.add_nuclide("Cr-53", 0.012474806806, 'wo') - top_nozzle.add_nuclide("Cr-54", 0.003163190107, 'wo') - top_nozzle.add_s_alpha_beta('HH2O', '71t') + top_nozzle.add_nuclide("H1", 0.0358870, 'wo') + top_nozzle.add_nuclide("O16", 0.2847761, 'wo') + top_nozzle.add_nuclide("B10", 1.15699e-4, 'wo') + top_nozzle.add_nuclide("B11", 5.27075e-4, 'wo') + top_nozzle.add_nuclide("Fe54", 0.02644016154, 'wo') + top_nozzle.add_nuclide("Fe56", 0.43037146399, 'wo') + top_nozzle.add_nuclide("Fe57", 0.0101152584, 'wo') + top_nozzle.add_nuclide("Fe58", 0.00137211607, 'wo') + top_nozzle.add_nuclide("Ni58", 0.04104621835, 'wo') + top_nozzle.add_nuclide("Ni60", 0.0163554502, 'wo') + top_nozzle.add_nuclide("Ni61", 0.000722605975, 'wo') + top_nozzle.add_nuclide("Ni62", 0.002342513875, 'wo') + top_nozzle.add_nuclide("Ni64", 0.0006157116, 'wo') + top_nozzle.add_nuclide("Mn55", 0.0135739, 'wo') + top_nozzle.add_nuclide("Si28", 0.006234853554, 'wo') + top_nozzle.add_nuclide("Si29", 0.000328078746, 'wo') + top_nozzle.add_nuclide("Si30", 0.0002239677, 'wo') + top_nozzle.add_nuclide("Cr50", 0.005382452306, 'wo') + top_nozzle.add_nuclide("Cr52", 0.107931450781, 'wo') + top_nozzle.add_nuclide("Cr53", 0.012474806806, 'wo') + top_nozzle.add_nuclide("Cr54", 0.003163190107, 'wo') + top_nozzle.add_s_alpha_beta('c_H_in_H2O', '71t') top_fa = openmc.Material(name='Top of fuel assemblies', material_id=11) top_fa.set_density('g/cm3', 3.044) - top_fa.add_nuclide("H-1", 0.0162913, 'wo') - top_fa.add_nuclide("O-16", 0.1292776, 'wo') - top_fa.add_nuclide("B-10", 5.25228e-5, 'wo') - top_fa.add_nuclide("B-11", 2.39272e-4, 'wo') - top_fa.add_nuclide("Zr-90", 0.43313403903, 'wo') - top_fa.add_nuclide("Zr-91", 0.09549277374, 'wo') - top_fa.add_nuclide("Zr-92", 0.14759527104, 'wo') - top_fa.add_nuclide("Zr-94", 0.15280552077, 'wo') - top_fa.add_nuclide("Zr-96", 0.02511169542, 'wo') - top_fa.add_s_alpha_beta('HH2O', '71t') + top_fa.add_nuclide("H1", 0.0162913, 'wo') + top_fa.add_nuclide("O16", 0.1292776, 'wo') + top_fa.add_nuclide("B10", 5.25228e-5, 'wo') + top_fa.add_nuclide("B11", 2.39272e-4, 'wo') + top_fa.add_nuclide("Zr90", 0.43313403903, 'wo') + top_fa.add_nuclide("Zr91", 0.09549277374, 'wo') + top_fa.add_nuclide("Zr92", 0.14759527104, 'wo') + top_fa.add_nuclide("Zr94", 0.15280552077, 'wo') + top_fa.add_nuclide("Zr96", 0.02511169542, 'wo') + top_fa.add_s_alpha_beta('c_H_in_H2O', '71t') bot_fa = openmc.Material(name='Bottom of fuel assemblies', material_id=12) bot_fa.set_density('g/cm3', 1.762) - bot_fa.add_nuclide("H-1", 0.0292856, 'wo') - bot_fa.add_nuclide("O-16", 0.2323919, 'wo') - bot_fa.add_nuclide("B-10", 9.44159e-5, 'wo') - bot_fa.add_nuclide("B-11", 4.30120e-4, 'wo') - bot_fa.add_nuclide("Zr-90", 0.3741373658, 'wo') - bot_fa.add_nuclide("Zr-91", 0.0824858164, 'wo') - bot_fa.add_nuclide("Zr-92", 0.1274914944, 'wo') - bot_fa.add_nuclide("Zr-94", 0.1319920622, 'wo') - bot_fa.add_nuclide("Zr-96", 0.0216912612, 'wo') - bot_fa.add_s_alpha_beta('HH2O', '71t') + bot_fa.add_nuclide("H1", 0.0292856, 'wo') + bot_fa.add_nuclide("O16", 0.2323919, 'wo') + bot_fa.add_nuclide("B10", 9.44159e-5, 'wo') + bot_fa.add_nuclide("B11", 4.30120e-4, 'wo') + bot_fa.add_nuclide("Zr90", 0.3741373658, 'wo') + bot_fa.add_nuclide("Zr91", 0.0824858164, 'wo') + bot_fa.add_nuclide("Zr92", 0.1274914944, 'wo') + bot_fa.add_nuclide("Zr94", 0.1319920622, 'wo') + bot_fa.add_nuclide("Zr96", 0.0216912612, 'wo') + bot_fa.add_s_alpha_beta('c_H_in_H2O', '71t') # Define the materials file. self.materials.default_xs = '71c' @@ -592,26 +592,26 @@ class PinCellInputSet(object): # Define materials. fuel = openmc.Material(name='Fuel') fuel.set_density('g/cm3', 10.29769) - fuel.add_nuclide("U-234", 4.4843e-6) - fuel.add_nuclide("U-235", 5.5815e-4) - fuel.add_nuclide("U-238", 2.2408e-2) - fuel.add_nuclide("O-16", 4.5829e-2) + fuel.add_nuclide("U234", 4.4843e-6) + fuel.add_nuclide("U235", 5.5815e-4) + fuel.add_nuclide("U238", 2.2408e-2) + fuel.add_nuclide("O16", 4.5829e-2) clad = openmc.Material(name='Cladding') clad.set_density('g/cm3', 6.55) - clad.add_nuclide("Zr-90", 2.1827e-2) - clad.add_nuclide("Zr-91", 4.7600e-3) - clad.add_nuclide("Zr-92", 7.2758e-3) - clad.add_nuclide("Zr-94", 7.3734e-3) - clad.add_nuclide("Zr-96", 1.1879e-3) + clad.add_nuclide("Zr90", 2.1827e-2) + clad.add_nuclide("Zr91", 4.7600e-3) + clad.add_nuclide("Zr92", 7.2758e-3) + clad.add_nuclide("Zr94", 7.3734e-3) + clad.add_nuclide("Zr96", 1.1879e-3) hot_water = openmc.Material(name='Hot borated water') hot_water.set_density('g/cm3', 0.740582) - hot_water.add_nuclide("H-1", 4.9457e-2) - hot_water.add_nuclide("O-16", 2.4672e-2) - hot_water.add_nuclide("B-10", 8.0042e-6) - hot_water.add_nuclide("B-11", 3.2218e-5) - hot_water.add_s_alpha_beta('HH2O', '71t') + hot_water.add_nuclide("H1", 4.9457e-2) + hot_water.add_nuclide("O16", 2.4672e-2) + hot_water.add_nuclide("B10", 8.0042e-6) + hot_water.add_nuclide("B11", 3.2218e-5) + hot_water.add_s_alpha_beta('c_H_in_H2O', '71t') # Define the materials file. self.materials.default_xs = '71c' diff --git a/tests/test_asymmetric_lattice/inputs_true.dat b/tests/test_asymmetric_lattice/inputs_true.dat index f40e661b3..d503a3a0b 100644 --- a/tests/test_asymmetric_lattice/inputs_true.dat +++ b/tests/test_asymmetric_lattice/inputs_true.dat @@ -1 +1 @@ -9b859eb5501c05b6a652d299bd0cadc0a924ffae31117babbdc9f7f8ca87689322c275818eb0dde0ff5fa78317d8d8f1585b18dcc772e3ff4ed499de8a491dc3 \ No newline at end of file +a55899cd2ed0a8ec5d44003139da639f87f5f03ee76b2d6577db6a8c2014849e4277f8e68fa874ac6795e4cbc4eb6e4031d726cafe6e663e84787d1ecd8e7f86 \ No newline at end of file diff --git a/tests/test_cmfd_feed/materials.xml b/tests/test_cmfd_feed/materials.xml index 7b4baf9e1..8f32169d9 100644 --- a/tests/test_cmfd_feed/materials.xml +++ b/tests/test_cmfd_feed/materials.xml @@ -4,9 +4,9 @@ - - - + + + diff --git a/tests/test_cmfd_nofeed/materials.xml b/tests/test_cmfd_nofeed/materials.xml index 7b4baf9e1..8f32169d9 100644 --- a/tests/test_cmfd_nofeed/materials.xml +++ b/tests/test_cmfd_nofeed/materials.xml @@ -4,9 +4,9 @@ - - - + + + diff --git a/tests/test_complex_cell/materials.xml b/tests/test_complex_cell/materials.xml index 60ec99673..a9e69b8bc 100644 --- a/tests/test_complex_cell/materials.xml +++ b/tests/test_complex_cell/materials.xml @@ -5,11 +5,11 @@ - + - + diff --git a/tests/test_confidence_intervals/materials.xml b/tests/test_confidence_intervals/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_confidence_intervals/materials.xml +++ b/tests/test_confidence_intervals/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_density/materials.xml b/tests/test_density/materials.xml index 36947d066..c474c5c65 100644 --- a/tests/test_density/materials.xml +++ b/tests/test_density/materials.xml @@ -3,24 +3,24 @@ - + - + - + - - - + + + diff --git a/tests/test_distribmat/inputs_true.dat b/tests/test_distribmat/inputs_true.dat index 9c8a86bfa..1212a28e5 100644 --- a/tests/test_distribmat/inputs_true.dat +++ b/tests/test_distribmat/inputs_true.dat @@ -1 +1 @@ -96c54eb4f1da175445bf2187449ee32c9ff435d8c60e9421a4a16497aae9f233e3e494f531892dd55f6ac1a06e0240799503ff19e14e2436a0b0f0d83ba56cb8 \ No newline at end of file +46df57157980545d90b482acfb01f525b84c0e623fa93a5d9c08a65723d677ef1c092360219a3c7fcf5110c6ba32f1eacbd5c5eaed40be4bfe154f302400c0a4 \ No newline at end of file diff --git a/tests/test_distribmat/test_distribmat.py b/tests/test_distribmat/test_distribmat.py index 96d41c3fb..a8d013996 100644 --- a/tests/test_distribmat/test_distribmat.py +++ b/tests/test_distribmat/test_distribmat.py @@ -17,16 +17,16 @@ class DistribmatTestHarness(PyAPITestHarness): moderator = openmc.Material(material_id=1) moderator.set_density('g/cc', 1.0) - moderator.add_nuclide('H-1', 2.0) - moderator.add_nuclide('O-16', 1.0) + moderator.add_nuclide('H1', 2.0) + moderator.add_nuclide('O16', 1.0) dense_fuel = openmc.Material(material_id=2) dense_fuel.set_density('g/cc', 4.5) - dense_fuel.add_nuclide('U-235', 1.0) + dense_fuel.add_nuclide('U235', 1.0) light_fuel = openmc.Material(material_id=3) light_fuel.set_density('g/cc', 2.0) - light_fuel.add_nuclide('U-235', 1.0) + light_fuel.add_nuclide('U235', 1.0) mats_file = openmc.Materials([moderator, dense_fuel, light_fuel]) mats_file.default_xs = '71c' diff --git a/tests/test_eigenvalue_genperbatch/materials.xml b/tests/test_eigenvalue_genperbatch/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_eigenvalue_genperbatch/materials.xml +++ b/tests/test_eigenvalue_genperbatch/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_eigenvalue_no_inactive/materials.xml b/tests/test_eigenvalue_no_inactive/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_eigenvalue_no_inactive/materials.xml +++ b/tests/test_eigenvalue_no_inactive/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_energy_grid/materials.xml b/tests/test_energy_grid/materials.xml index 45ccc6554..ed9b38d90 100644 --- a/tests/test_energy_grid/materials.xml +++ b/tests/test_energy_grid/materials.xml @@ -3,9 +3,9 @@ - - - + + + diff --git a/tests/test_energy_laws/materials.xml b/tests/test_energy_laws/materials.xml index 97f9b84be..c70e071cf 100644 --- a/tests/test_energy_laws/materials.xml +++ b/tests/test_energy_laws/materials.xml @@ -3,9 +3,9 @@ 71c - - - - + + + + diff --git a/tests/test_entropy/materials.xml b/tests/test_entropy/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_entropy/materials.xml +++ b/tests/test_entropy/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_filter_distribcell/case-1/materials.xml b/tests/test_filter_distribcell/case-1/materials.xml index 0bb9a35a3..891cc9fd0 100644 --- a/tests/test_filter_distribcell/case-1/materials.xml +++ b/tests/test_filter_distribcell/case-1/materials.xml @@ -6,13 +6,13 @@ - + - - + + diff --git a/tests/test_filter_distribcell/case-2/materials.xml b/tests/test_filter_distribcell/case-2/materials.xml index 0bb9a35a3..891cc9fd0 100644 --- a/tests/test_filter_distribcell/case-2/materials.xml +++ b/tests/test_filter_distribcell/case-2/materials.xml @@ -6,13 +6,13 @@ - + - - + + diff --git a/tests/test_filter_distribcell/case-3/materials.xml b/tests/test_filter_distribcell/case-3/materials.xml index 8f50a6a60..6a5916a83 100644 --- a/tests/test_filter_distribcell/case-3/materials.xml +++ b/tests/test_filter_distribcell/case-3/materials.xml @@ -6,120 +6,120 @@ - - - + + + - - - - - + + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - + + + + + + + + + diff --git a/tests/test_filter_distribcell/case-4/materials.xml b/tests/test_filter_distribcell/case-4/materials.xml index 19678c2a1..ab9f8688e 100644 --- a/tests/test_filter_distribcell/case-4/materials.xml +++ b/tests/test_filter_distribcell/case-4/materials.xml @@ -3,16 +3,16 @@ 71c - + - - - + + + - + diff --git a/tests/test_filter_mesh_2d/materials.xml b/tests/test_filter_mesh_2d/materials.xml index 9c0b74f3f..f5a9e61be 100644 --- a/tests/test_filter_mesh_2d/materials.xml +++ b/tests/test_filter_mesh_2d/materials.xml @@ -6,267 +6,267 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + diff --git a/tests/test_filter_mesh_3d/materials.xml b/tests/test_filter_mesh_3d/materials.xml index 9c0b74f3f..f5a9e61be 100644 --- a/tests/test_filter_mesh_3d/materials.xml +++ b/tests/test_filter_mesh_3d/materials.xml @@ -6,267 +6,267 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + diff --git a/tests/test_fixed_source/materials.xml b/tests/test_fixed_source/materials.xml index ab7a76bc0..6c52b2501 100644 --- a/tests/test_fixed_source/materials.xml +++ b/tests/test_fixed_source/materials.xml @@ -3,8 +3,8 @@ - - + + diff --git a/tests/test_infinite_cell/materials.xml b/tests/test_infinite_cell/materials.xml index 2e5b48381..1c2d64942 100644 --- a/tests/test_infinite_cell/materials.xml +++ b/tests/test_infinite_cell/materials.xml @@ -3,12 +3,12 @@ - + - + diff --git a/tests/test_iso_in_lab/inputs_true.dat b/tests/test_iso_in_lab/inputs_true.dat index bd722c9f6..34f522872 100644 --- a/tests/test_iso_in_lab/inputs_true.dat +++ b/tests/test_iso_in_lab/inputs_true.dat @@ -1 +1 @@ -85faac9b8c725ec9242ebc3793b70dcd1c8e58aeb4296345aefd8031304263bd66eaad0c6f1c61a1c644b73f397699856ab3d76d2b397295176650b4069acc9e \ No newline at end of file +c05fdb7815ccc1dcd2f260429b9139ad96ad4a7d1643e2bb938e3cd61268451363538ef4e41c5eaf73a64dbace43b2bd4489d5ff012a33104c2c1d6fa61146eb \ No newline at end of file diff --git a/tests/test_lattice/materials.xml b/tests/test_lattice/materials.xml index 4edf926d5..67240c4c9 100644 --- a/tests/test_lattice/materials.xml +++ b/tests/test_lattice/materials.xml @@ -15,127 +15,127 @@ - - - - - - - - - - - + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - - + + + + + - - + + - - + + - - - + + + - - - + + + - - - - + + + + - - + + - + - - - + + + - - - - + + + + - + - - - - - + + + + + - + - - - - + + + + diff --git a/tests/test_lattice_hex/materials.xml b/tests/test_lattice_hex/materials.xml index 987a25ab1..92d10fa81 100644 --- a/tests/test_lattice_hex/materials.xml +++ b/tests/test_lattice_hex/materials.xml @@ -4,39 +4,39 @@ - - - + + + - - - + + + - - - - - + + + + + - - - - - - - + + + + + + + diff --git a/tests/test_lattice_mixed/materials.xml b/tests/test_lattice_mixed/materials.xml index 987a25ab1..92d10fa81 100644 --- a/tests/test_lattice_mixed/materials.xml +++ b/tests/test_lattice_mixed/materials.xml @@ -4,39 +4,39 @@ - - - + + + - - - + + + - - - - - + + + + + - - - - - - - + + + + + + + diff --git a/tests/test_lattice_multiple/materials.xml b/tests/test_lattice_multiple/materials.xml index 9c0b74f3f..f5a9e61be 100644 --- a/tests/test_lattice_multiple/materials.xml +++ b/tests/test_lattice_multiple/materials.xml @@ -6,267 +6,267 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + diff --git a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat index 9633a46a8..332c2df5f 100644 --- a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat +++ b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat @@ -1 +1 @@ -34d5891f6f17c2d4b686b814ba61ba0045bc4289e278b1c3c47dbba59b83837fcfe15f2b8d58e7a2b07627b73d51e40348d70e9ed36dbb7cc94468d61c068c4c \ No newline at end of file +fb9c9180f692198548ca14543b29a8b623b382a19932999b2140ca4dd440f2102ba2fdbcb500ede3b8829aa85e1b4498151d280f1422d2d6b1bb5789aff34d71 \ No newline at end of file diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat index 79ca0ec66..d92cc888a 100644 --- a/tests/test_mgxs_library_condense/inputs_true.dat +++ b/tests/test_mgxs_library_condense/inputs_true.dat @@ -1 +1 @@ -317a63a9dd3bfd84e969667b00f46018e56c04c356461a75103f63569e6b70c84d0da7f5e611faaf1b2631330b05ab4346223d3d843018ce0ce8876671a450c0 \ No newline at end of file +855919f7a333acff6423527b82656d6a472ea8416002fb475c2d21c676e2f75f5c040d209a3e9a3a6118cf944f2c1bfb8cf2318273b890861d790b1927791a35 \ No newline at end of file diff --git a/tests/test_mgxs_library_distribcell/inputs_true.dat b/tests/test_mgxs_library_distribcell/inputs_true.dat index dc67b7c56..9c33eeab4 100644 --- a/tests/test_mgxs_library_distribcell/inputs_true.dat +++ b/tests/test_mgxs_library_distribcell/inputs_true.dat @@ -1 +1 @@ -88849ac150f9c389e67de96356dfceb0bde08643f68ca25699e67d263995b95893d7340a2b08b2f0f5075fc5020f73553c5287ec6c56ace2f35ce0214961e123 \ No newline at end of file +3a3b7f75b326c94a8e5c7efe3046b2fdb887e9f75ecf6eb27587f9450c77cf8fd6acc4198c15bffb4e7ceead6d7b4327c19536bbf9cc35dfaae3f4ce4c26cc1a \ No newline at end of file diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat index 79ca0ec66..d92cc888a 100644 --- a/tests/test_mgxs_library_hdf5/inputs_true.dat +++ b/tests/test_mgxs_library_hdf5/inputs_true.dat @@ -1 +1 @@ -317a63a9dd3bfd84e969667b00f46018e56c04c356461a75103f63569e6b70c84d0da7f5e611faaf1b2631330b05ab4346223d3d843018ce0ce8876671a450c0 \ No newline at end of file +855919f7a333acff6423527b82656d6a472ea8416002fb475c2d21c676e2f75f5c040d209a3e9a3a6118cf944f2c1bfb8cf2318273b890861d790b1927791a35 \ No newline at end of file diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat index 79ca0ec66..d92cc888a 100644 --- a/tests/test_mgxs_library_no_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat @@ -1 +1 @@ -317a63a9dd3bfd84e969667b00f46018e56c04c356461a75103f63569e6b70c84d0da7f5e611faaf1b2631330b05ab4346223d3d843018ce0ce8876671a450c0 \ No newline at end of file +855919f7a333acff6423527b82656d6a472ea8416002fb475c2d21c676e2f75f5c040d209a3e9a3a6118cf944f2c1bfb8cf2318273b890861d790b1927791a35 \ No newline at end of file diff --git a/tests/test_mgxs_library_nuclides/inputs_true.dat b/tests/test_mgxs_library_nuclides/inputs_true.dat index 8dbb564c6..ea7655c91 100644 --- a/tests/test_mgxs_library_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_nuclides/inputs_true.dat @@ -1 +1 @@ -eebb1469278f470b5859ed83e9b6526e7c4e3fed503bd22e414c6dc13b19b8e4cb6a44e3c14269e6e173f43056eda78268f455662ae119280bc18ea6a071dac7 \ No newline at end of file +739796983940a1bad601998cf9ea2f90453a994477c7f675c2fd404d1864fe04a7fbfb5a15c5fe7cf9bad016b78432ba0910baba6f9cc026143761e9f526b62a \ No newline at end of file diff --git a/tests/test_mgxs_library_nuclides/results_true.dat b/tests/test_mgxs_library_nuclides/results_true.dat index 4f47bd417..d8ebe19a1 100644 --- a/tests/test_mgxs_library_nuclides/results_true.dat +++ b/tests/test_mgxs_library_nuclides/results_true.dat @@ -1 +1 @@ -a631b8a347f344d822e6300ed2576caa7c05a74daedeb4aaaabfb89570942cff1bbd47ad7f81306e668e12266404f7abdcf680fdfeb5a4835579892e32bf57e8 \ No newline at end of file +d56c6bae6bf3cd8950d3f50f089458c1c6c807be780fc97570532c6af6eb7e3057968d3345bd3c363f01315271129ef7b2ca028b05767353e601dc37b035f8a7 \ No newline at end of file diff --git a/tests/test_multipole/inputs_true.dat b/tests/test_multipole/inputs_true.dat index 5890332ed..801536d07 100644 --- a/tests/test_multipole/inputs_true.dat +++ b/tests/test_multipole/inputs_true.dat @@ -1 +1 @@ -28df9e4c4729798d35741e6e9a4f910f3386c831acc54325d0e583bd989065a487cea6981068d8669bc80c3388b166c002c2127446936733f8f3f0da3e154bae \ No newline at end of file +c727431ebef7a5987dade28f4cd940c566142f97b5ce01fbf9343d680caf9056623f0fac550db64f8f1043fa2cd8230155cfcbbcaffd1ae92cede723974596d7 \ No newline at end of file diff --git a/tests/test_multipole/test_multipole.py b/tests/test_multipole/test_multipole.py index 7c3615ad7..bd6822bdf 100644 --- a/tests/test_multipole/test_multipole.py +++ b/tests/test_multipole/test_multipole.py @@ -16,12 +16,12 @@ class MultipoleTestHarness(PyAPITestHarness): moderator = openmc.Material(material_id=1) moderator.set_density('g/cc', 1.0) - moderator.add_nuclide('H-1', 2.0) - moderator.add_nuclide('O-16', 1.0) + moderator.add_nuclide('H1', 2.0) + moderator.add_nuclide('O16', 1.0) dense_fuel = openmc.Material(material_id=2) dense_fuel.set_density('g/cc', 4.5) - dense_fuel.add_nuclide('U-235', 1.0) + dense_fuel.add_nuclide('U235', 1.0) mats_file = openmc.Materials([moderator, dense_fuel]) mats_file.default_xs = '71c' diff --git a/tests/test_natural_element/materials.xml b/tests/test_natural_element/materials.xml index 5a3b3bbc6..60d60b81f 100644 --- a/tests/test_natural_element/materials.xml +++ b/tests/test_natural_element/materials.xml @@ -8,9 +8,9 @@ - - - + + + @@ -18,7 +18,7 @@ - + diff --git a/tests/test_output/materials.xml b/tests/test_output/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_output/materials.xml +++ b/tests/test_output/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_particle_restart_eigval/materials.xml b/tests/test_particle_restart_eigval/materials.xml index 1fd2fb1c7..5ff4b736f 100644 --- a/tests/test_particle_restart_eigval/materials.xml +++ b/tests/test_particle_restart_eigval/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_particle_restart_fixed/materials.xml b/tests/test_particle_restart_fixed/materials.xml index deddaef97..f132f9763 100644 --- a/tests/test_particle_restart_fixed/materials.xml +++ b/tests/test_particle_restart_fixed/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_periodic/inputs_true.dat b/tests/test_periodic/inputs_true.dat index d50d0b859..56d3e01bf 100644 --- a/tests/test_periodic/inputs_true.dat +++ b/tests/test_periodic/inputs_true.dat @@ -1 +1 @@ -af589996f2930337afe34ba9894098ff5efe3b29b6e927117220b718bf29b630ffdbc931754d465a8e8100125a8aa997dbe10aab322b43f69d59710573996a6d \ No newline at end of file +0766f3e0ac9b3d26bf5529eb3c92e0337698994d663b6a68dd8c1340807d6941c7589d777430782bc7b78590adced55f0f55b1de71a7c70d453f78d4ca469d8d \ No newline at end of file diff --git a/tests/test_periodic/test_periodic.py b/tests/test_periodic/test_periodic.py index 558514575..026071104 100644 --- a/tests/test_periodic/test_periodic.py +++ b/tests/test_periodic/test_periodic.py @@ -11,13 +11,13 @@ class PeriodicTest(PyAPITestHarness): def _build_inputs(self): # Define materials water = openmc.Material(1) - water.add_nuclide('H-1', 2.0) - water.add_nuclide('O-16', 1.0) - water.add_s_alpha_beta('HH2O', '71t') + water.add_nuclide('H1', 2.0) + water.add_nuclide('O16', 1.0) + water.add_s_alpha_beta('c_H_in_H2O', '71t') water.set_density('g/cc', 1.0) fuel = openmc.Material(2) - fuel.add_nuclide('U-235', 1.0) + fuel.add_nuclide('U235', 1.0) fuel.set_density('g/cc', 4.5) materials = openmc.Materials((water, fuel)) diff --git a/tests/test_plot/materials.xml b/tests/test_plot/materials.xml index f90a5e7f8..826f670a4 100644 --- a/tests/test_plot/materials.xml +++ b/tests/test_plot/materials.xml @@ -3,17 +3,17 @@ - + - + - + diff --git a/tests/test_ptables_off/materials.xml b/tests/test_ptables_off/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_ptables_off/materials.xml +++ b/tests/test_ptables_off/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_quadric_surfaces/materials.xml b/tests/test_quadric_surfaces/materials.xml index 0150332b3..606253bec 100644 --- a/tests/test_quadric_surfaces/materials.xml +++ b/tests/test_quadric_surfaces/materials.xml @@ -3,8 +3,8 @@ - - + + diff --git a/tests/test_reflective_plane/materials.xml b/tests/test_reflective_plane/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_reflective_plane/materials.xml +++ b/tests/test_reflective_plane/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_resonance_scattering/inputs_true.dat b/tests/test_resonance_scattering/inputs_true.dat index f2a875c7e..fdfb2b84e 100644 --- a/tests/test_resonance_scattering/inputs_true.dat +++ b/tests/test_resonance_scattering/inputs_true.dat @@ -1 +1 @@ -ece83bb075ed8144af89ce7cebf1577dcb2489d2e9ce4afbe61a3e4398837e7a9aaa2ae0cea0a6542f51ca5e0d119b570c675ed1dca0d74237cd5fdce0b606a3 \ No newline at end of file +a97844ec7ab45b9e8c1d5849c99414dfa1408956fd951fa783ffa99f78770cd4644a3fb5abe038b0f835ef233ccea2b014e8bd7448f06769944383035ef38ac6 \ No newline at end of file diff --git a/tests/test_resonance_scattering/test_resonance_scattering.py b/tests/test_resonance_scattering/test_resonance_scattering.py index b752cf7f3..0d70c0d8d 100644 --- a/tests/test_resonance_scattering/test_resonance_scattering.py +++ b/tests/test_resonance_scattering/test_resonance_scattering.py @@ -12,10 +12,10 @@ class ResonanceScatteringTestHarness(PyAPITestHarness): # Materials mat = openmc.Material(material_id=1) mat.set_density('g/cc', 1.0) - mat.add_nuclide('U-238', 1.0) - mat.add_nuclide('U-235', 0.02) - mat.add_nuclide('Pu-239', 0.02) - mat.add_nuclide('H-1', 20.0) + mat.add_nuclide('U238', 1.0) + mat.add_nuclide('U235', 0.02) + mat.add_nuclide('Pu239', 0.02) + mat.add_nuclide('H1', 20.0) mats_file = openmc.Materials([mat]) mats_file.default_xs = '71c' @@ -37,8 +37,7 @@ class ResonanceScatteringTestHarness(PyAPITestHarness): geometry.export_to_xml() # Settings - nuclide = openmc.Nuclide('U-238', '71c') - nuclide.zaid = 92238 + nuclide = openmc.Nuclide('U238', '71c') res_scatt_dbrc = openmc.ResonanceScattering() res_scatt_dbrc.nuclide = nuclide res_scatt_dbrc.nuclide_0K = nuclide # This is a bad idea! Just for tests @@ -46,8 +45,7 @@ class ResonanceScatteringTestHarness(PyAPITestHarness): res_scatt_dbrc.E_min = 1e-6 res_scatt_dbrc.E_max = 210e-6 - nuclide = openmc.Nuclide('U-235', '71c') - nuclide.zaid = 92235 + nuclide = openmc.Nuclide('U235', '71c') res_scatt_wcm = openmc.ResonanceScattering() res_scatt_wcm.nuclide = nuclide res_scatt_wcm.nuclide_0K = nuclide @@ -55,8 +53,7 @@ class ResonanceScatteringTestHarness(PyAPITestHarness): res_scatt_wcm.E_min = 1e-6 res_scatt_wcm.E_max = 210e-6 - nuclide = openmc.Nuclide('Pu-239', '71c') - nuclide.zaid = 94239 + nuclide = openmc.Nuclide('Pu239', '71c') res_scatt_ares = openmc.ResonanceScattering() res_scatt_ares.nuclide = nuclide res_scatt_ares.nuclide_0K = nuclide diff --git a/tests/test_rotation/materials.xml b/tests/test_rotation/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_rotation/materials.xml +++ b/tests/test_rotation/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_salphabeta/materials.xml b/tests/test_salphabeta/materials.xml index b51395f18..2bc401e49 100644 --- a/tests/test_salphabeta/materials.xml +++ b/tests/test_salphabeta/materials.xml @@ -5,39 +5,39 @@ - - - + + + - - - + + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + diff --git a/tests/test_score_current/materials.xml b/tests/test_score_current/materials.xml index 9c0b74f3f..f5a9e61be 100644 --- a/tests/test_score_current/materials.xml +++ b/tests/test_score_current/materials.xml @@ -6,267 +6,267 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + diff --git a/tests/test_seed/materials.xml b/tests/test_seed/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_seed/materials.xml +++ b/tests/test_seed/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_source/inputs_true.dat b/tests/test_source/inputs_true.dat index 69a1e2ea8..f11998e6c 100644 --- a/tests/test_source/inputs_true.dat +++ b/tests/test_source/inputs_true.dat @@ -1 +1 @@ -526c91551d9a80dc01216e5cb04162253f12ec684cc2b4912ca18cfc510f1ea2e5303029f1c1607882082b0c2c8a47f25dd5be14678f449a1579e3601d1bdec5 \ No newline at end of file +27ceb546499a4134eac08ffb22d02ce21d67f12617d43a02991b443e9aca7b7eca818d03e146676c0b352abaef6505423e48edef24cfd7a8fdb148cb3dbcdb1f \ No newline at end of file diff --git a/tests/test_source/test_source.py b/tests/test_source/test_source.py index 0abae4344..09a13efaa 100644 --- a/tests/test_source/test_source.py +++ b/tests/test_source/test_source.py @@ -15,7 +15,7 @@ class SourceTestHarness(PyAPITestHarness): def _build_inputs(self): mat1 = openmc.Material(material_id=1) mat1.set_density('g/cm3', 4.5) - mat1.add_nuclide(openmc.Nuclide('U-235', '71c'), 1.0) + mat1.add_nuclide(openmc.Nuclide('U235', '71c'), 1.0) materials = openmc.Materials([mat1]) materials.export_to_xml() diff --git a/tests/test_source_file/materials.xml b/tests/test_source_file/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_source_file/materials.xml +++ b/tests/test_source_file/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_sourcepoint_batch/materials.xml b/tests/test_sourcepoint_batch/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_sourcepoint_batch/materials.xml +++ b/tests/test_sourcepoint_batch/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_sourcepoint_interval/materials.xml b/tests/test_sourcepoint_interval/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_sourcepoint_interval/materials.xml +++ b/tests/test_sourcepoint_interval/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_sourcepoint_latest/materials.xml b/tests/test_sourcepoint_latest/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_sourcepoint_latest/materials.xml +++ b/tests/test_sourcepoint_latest/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_sourcepoint_restart/materials.xml b/tests/test_sourcepoint_restart/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_sourcepoint_restart/materials.xml +++ b/tests/test_sourcepoint_restart/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_statepoint_batch/materials.xml b/tests/test_statepoint_batch/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_statepoint_batch/materials.xml +++ b/tests/test_statepoint_batch/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_statepoint_interval/materials.xml b/tests/test_statepoint_interval/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_statepoint_interval/materials.xml +++ b/tests/test_statepoint_interval/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_statepoint_restart/materials.xml b/tests/test_statepoint_restart/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_statepoint_restart/materials.xml +++ b/tests/test_statepoint_restart/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_statepoint_sourcesep/materials.xml b/tests/test_statepoint_sourcesep/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_statepoint_sourcesep/materials.xml +++ b/tests/test_statepoint_sourcesep/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_survival_biasing/materials.xml b/tests/test_survival_biasing/materials.xml index 1748e09fd..facad016b 100644 --- a/tests/test_survival_biasing/materials.xml +++ b/tests/test_survival_biasing/materials.xml @@ -3,8 +3,8 @@ - - + + diff --git a/tests/test_tallies/inputs_true.dat b/tests/test_tallies/inputs_true.dat index e3d37be30..ddab630f2 100644 --- a/tests/test_tallies/inputs_true.dat +++ b/tests/test_tallies/inputs_true.dat @@ -1 +1 @@ -ea09926d8f5c6c96529bf5529f4deb3be78eda2da80adbbf3440147c337587358c2b1823bc72df9463676135573eb481dcd361b735f18365216645ee81092f1e \ No newline at end of file +a392a7a8f27fd2f959b06a6809df29b3482e215da175b19846c248af44dc2ee7e2b05269b802dd9d6ed434506b05092f349436a0048411adab6b296dba0bd683 \ No newline at end of file diff --git a/tests/test_tallies/test_tallies.py b/tests/test_tallies/test_tallies.py index 9e40d4185..e51e4616f 100644 --- a/tests/test_tallies/test_tallies.py +++ b/tests/test_tallies/test_tallies.py @@ -155,7 +155,7 @@ class TalliesTestHarness(PyAPITestHarness): total_tallies[0].scores = ['total'] for t in total_tallies[1:]: t.scores = ['total-y4'] - t.nuclides = ['U-235', 'total'] + t.nuclides = ['U235', 'total'] total_tallies[1].estimator = 'tracklength' total_tallies[2].estimator = 'analog' total_tallies[3].estimator = 'collision' diff --git a/tests/test_tally_aggregation/inputs_true.dat b/tests/test_tally_aggregation/inputs_true.dat index 055ac76fd..9c7978755 100644 --- a/tests/test_tally_aggregation/inputs_true.dat +++ b/tests/test_tally_aggregation/inputs_true.dat @@ -1 +1 @@ -f819f1b3564ca1df1e235f120f4bd65003cd80935fa8261f0a5982b7e7ec5b2e7497716673c142fab99f3fb26c174ac7a12e145b9a6f2caf707d2a07702f6eb2 \ No newline at end of file +67daf0d74cddb40ecbbc7e3793a3302866adcb1617fe2dc454dd161c06105e65027523f5e5954d80b961ba6c6abf14114b8be5c4d5b7682eaddffc1288d3e7c8 \ No newline at end of file diff --git a/tests/test_tally_aggregation/test_tally_aggregation.py b/tests/test_tally_aggregation/test_tally_aggregation.py index fdc086e68..76284ef9d 100644 --- a/tests/test_tally_aggregation/test_tally_aggregation.py +++ b/tests/test_tally_aggregation/test_tally_aggregation.py @@ -16,9 +16,9 @@ class TallyAggregationTestHarness(PyAPITestHarness): self._input_set.settings.output = {'summary': True} # Initialize the nuclides - u235 = openmc.Nuclide('U-235') - u238 = openmc.Nuclide('U-238') - pu239 = openmc.Nuclide('Pu-239') + u235 = openmc.Nuclide('U235') + u238 = openmc.Nuclide('U238') + pu239 = openmc.Nuclide('Pu239') # Initialize the filters energy_filter = openmc.Filter(type='energy', bins=[0.0, 0.253e-6, @@ -60,7 +60,7 @@ class TallyAggregationTestHarness(PyAPITestHarness): outstr += ', '.join(map(str, tally_sum.std_dev)) # Sum across all nuclides - tally_sum = tally.summation(nuclides=['U-235', 'U-238', 'Pu-239']) + tally_sum = tally.summation(nuclides=['U235', 'U238', 'Pu239']) outstr += ', '.join(map(str, tally_sum.mean)) outstr += ', '.join(map(str, tally_sum.std_dev)) diff --git a/tests/test_tally_arithmetic/inputs_true.dat b/tests/test_tally_arithmetic/inputs_true.dat index d7b854a51..b56c17b6b 100644 --- a/tests/test_tally_arithmetic/inputs_true.dat +++ b/tests/test_tally_arithmetic/inputs_true.dat @@ -1 +1 @@ -bb7e730630f7bb4694a27fd77c3c0171f70c78df2681acc26b0ef88bcff367523b11335f487b46269325adbcee7faeb756484af64055c3c91b0103f7ed962053 \ No newline at end of file +c8772a174e2162030f0315a318991085f1a5c0b054883a5f071d520e34f9ecf7d309f25700067bea8685e2b6324a19a003bd6f6ab38161ee87c95257b5a6ae69 \ No newline at end of file diff --git a/tests/test_tally_arithmetic/test_tally_arithmetic.py b/tests/test_tally_arithmetic/test_tally_arithmetic.py index a5919909f..20f86d97b 100644 --- a/tests/test_tally_arithmetic/test_tally_arithmetic.py +++ b/tests/test_tally_arithmetic/test_tally_arithmetic.py @@ -19,9 +19,9 @@ class TallyArithmeticTestHarness(PyAPITestHarness): tallies_file = openmc.Tallies() # Initialize the nuclides - u235 = openmc.Nuclide('U-235') - u238 = openmc.Nuclide('U-238') - pu239 = openmc.Nuclide('Pu-239') + u235 = openmc.Nuclide('U235') + u238 = openmc.Nuclide('U238') + pu239 = openmc.Nuclide('Pu239') # Initialize Mesh mesh = openmc.Mesh(mesh_id=1) diff --git a/tests/test_tally_assumesep/materials.xml b/tests/test_tally_assumesep/materials.xml index 9c0b74f3f..f5a9e61be 100644 --- a/tests/test_tally_assumesep/materials.xml +++ b/tests/test_tally_assumesep/materials.xml @@ -6,267 +6,267 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + diff --git a/tests/test_tally_nuclides/materials.xml b/tests/test_tally_nuclides/materials.xml index 2761be30c..e9667b41f 100644 --- a/tests/test_tally_nuclides/materials.xml +++ b/tests/test_tally_nuclides/materials.xml @@ -6,7 +6,7 @@ - + diff --git a/tests/test_tally_nuclides/tallies.xml b/tests/test_tally_nuclides/tallies.xml index cf20668c8..3440dbf21 100644 --- a/tests/test_tally_nuclides/tallies.xml +++ b/tests/test_tally_nuclides/tallies.xml @@ -7,7 +7,7 @@ - Pu-239 + Pu239 total absorption fission scatter diff --git a/tests/test_tally_slice_merge/inputs_true.dat b/tests/test_tally_slice_merge/inputs_true.dat index 771a1de8e..16d11b6d2 100644 --- a/tests/test_tally_slice_merge/inputs_true.dat +++ b/tests/test_tally_slice_merge/inputs_true.dat @@ -1 +1 @@ -8e54df241233bf8d5424afa0a22cc23c614a3541e5d7cc64036b5284edd28fe2353905ffdfebb446a4dd0202dda6a7da6d0110af00b4ca79117ec1dbe0584ba7 \ No newline at end of file +a17354ce54bcb5ce93e861ae95fd932c45fe60c733d999aa180d5dee636f43130fac5b003c615e23c65d44fe55f376ef4c86596b78603ab217d7e37fd694074d \ No newline at end of file diff --git a/tests/test_tally_slice_merge/results_true.dat b/tests/test_tally_slice_merge/results_true.dat index f986a91de..89d415b0d 100644 --- a/tests/test_tally_slice_merge/results_true.dat +++ b/tests/test_tally_slice_merge/results_true.dat @@ -1,67 +1,67 @@ cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 21 0.00e+00 6.25e-07 U-235 fission 1.08e-01 7.94e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 21 0.00e+00 6.25e-07 U-235 nu-fission 2.64e-01 1.94e-02 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 21 0.00e+00 6.25e-07 U-238 fission 1.51e-07 1.00e-08 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 21 0.00e+00 6.25e-07 U-238 nu-fission 3.76e-07 2.50e-08 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 21 6.25e-07 2.00e+01 U-235 fission 3.12e-02 2.56e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 21 6.25e-07 2.00e+01 U-235 nu-fission 7.65e-02 6.24e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 21 6.25e-07 2.00e+01 U-238 fission 2.00e-02 1.30e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 21 6.25e-07 2.00e+01 U-238 nu-fission 5.56e-02 3.78e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 27 0.00e+00 6.25e-07 U-235 fission 4.43e-02 7.21e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 27 0.00e+00 6.25e-07 U-235 nu-fission 1.08e-01 1.76e-02 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 27 0.00e+00 6.25e-07 U-238 fission 6.14e-08 9.64e-09 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 27 0.00e+00 6.25e-07 U-238 nu-fission 1.53e-07 2.40e-08 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 27 6.25e-07 2.00e+01 U-235 fission 1.39e-02 1.06e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 27 6.25e-07 2.00e+01 U-235 nu-fission 3.40e-02 2.61e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 27 6.25e-07 2.00e+01 U-238 fission 9.72e-03 1.21e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 27 6.25e-07 2.00e+01 U-238 nu-fission 2.71e-02 3.80e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 21 0.00e+00 6.25e-07 U-235 fission 1.08e-01 7.94e-03 -1 21 0.00e+00 6.25e-07 U-235 nu-fission 2.64e-01 1.94e-02 -2 21 0.00e+00 6.25e-07 U-238 fission 1.51e-07 1.00e-08 -3 21 0.00e+00 6.25e-07 U-238 nu-fission 3.76e-07 2.50e-08 -4 21 6.25e-07 2.00e+01 U-235 fission 3.12e-02 2.56e-03 -5 21 6.25e-07 2.00e+01 U-235 nu-fission 7.65e-02 6.24e-03 -6 21 6.25e-07 2.00e+01 U-238 fission 2.00e-02 1.30e-03 -7 21 6.25e-07 2.00e+01 U-238 nu-fission 5.56e-02 3.78e-03 -8 27 0.00e+00 6.25e-07 U-235 fission 4.43e-02 7.21e-03 -9 27 0.00e+00 6.25e-07 U-235 nu-fission 1.08e-01 1.76e-02 -10 27 0.00e+00 6.25e-07 U-238 fission 6.14e-08 9.64e-09 -11 27 0.00e+00 6.25e-07 U-238 nu-fission 1.53e-07 2.40e-08 -12 27 6.25e-07 2.00e+01 U-235 fission 1.39e-02 1.06e-03 -13 27 6.25e-07 2.00e+01 U-235 nu-fission 3.40e-02 2.61e-03 -14 27 6.25e-07 2.00e+01 U-238 fission 9.72e-03 1.21e-03 -15 27 6.25e-07 2.00e+01 U-238 nu-fission 2.71e-02 3.80e-03 +0 21 0.00e+00 6.25e-07 U235 fission 1.08e-01 7.94e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-07 U235 nu-fission 2.64e-01 1.94e-02 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-07 U238 fission 1.51e-07 1.00e-08 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-07 U238 nu-fission 3.76e-07 2.50e-08 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 6.25e-07 2.00e+01 U235 fission 3.12e-02 2.56e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 6.25e-07 2.00e+01 U235 nu-fission 7.65e-02 6.24e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 6.25e-07 2.00e+01 U238 fission 2.00e-02 1.30e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 6.25e-07 2.00e+01 U238 nu-fission 5.56e-02 3.78e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-07 U235 fission 4.43e-02 7.21e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-07 U235 nu-fission 1.08e-01 1.76e-02 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-07 U238 fission 6.14e-08 9.64e-09 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-07 U238 nu-fission 1.53e-07 2.40e-08 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 6.25e-07 2.00e+01 U235 fission 1.39e-02 1.06e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 6.25e-07 2.00e+01 U235 nu-fission 3.40e-02 2.61e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 6.25e-07 2.00e+01 U238 fission 9.72e-03 1.21e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 27 6.25e-07 2.00e+01 U238 nu-fission 2.71e-02 3.80e-03 cell energy low [MeV] energy high [MeV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-07 U235 fission 1.08e-01 7.94e-03 +1 21 0.00e+00 6.25e-07 U235 nu-fission 2.64e-01 1.94e-02 +2 21 0.00e+00 6.25e-07 U238 fission 1.51e-07 1.00e-08 +3 21 0.00e+00 6.25e-07 U238 nu-fission 3.76e-07 2.50e-08 +4 21 6.25e-07 2.00e+01 U235 fission 3.12e-02 2.56e-03 +5 21 6.25e-07 2.00e+01 U235 nu-fission 7.65e-02 6.24e-03 +6 21 6.25e-07 2.00e+01 U238 fission 2.00e-02 1.30e-03 +7 21 6.25e-07 2.00e+01 U238 nu-fission 5.56e-02 3.78e-03 +8 27 0.00e+00 6.25e-07 U235 fission 4.43e-02 7.21e-03 +9 27 0.00e+00 6.25e-07 U235 nu-fission 1.08e-01 1.76e-02 +10 27 0.00e+00 6.25e-07 U238 fission 6.14e-08 9.64e-09 +11 27 0.00e+00 6.25e-07 U238 nu-fission 1.53e-07 2.40e-08 +12 27 6.25e-07 2.00e+01 U235 fission 1.39e-02 1.06e-03 +13 27 6.25e-07 2.00e+01 U235 nu-fission 3.40e-02 2.61e-03 +14 27 6.25e-07 2.00e+01 U238 fission 9.72e-03 1.21e-03 +15 27 6.25e-07 2.00e+01 U238 nu-fission 2.71e-02 3.80e-03 sum(distribcell) energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 (0, 100, 2000, 30000) 0.00e+00 6.25e-07 U-235 fission 0.00e+00 0.00e+00 -1 (0, 100, 2000, 30000) 0.00e+00 6.25e-07 U-235 nu-fission 0.00e+00 0.00e+00 -2 (0, 100, 2000, 30000) 0.00e+00 6.25e-07 U-238 fission 0.00e+00 0.00e+00 -3 (0, 100, 2000, 30000) 0.00e+00 6.25e-07 U-238 nu-fission 0.00e+00 0.00e+00 -4 (0, 100, 2000, 30000) 6.25e-07 2.00e+01 U-235 fission 0.00e+00 0.00e+00 -5 (0, 100, 2000, 30000) 6.25e-07 2.00e+01 U-235 nu-fission 0.00e+00 0.00e+00 -6 (0, 100, 2000, 30000) 6.25e-07 2.00e+01 U-238 fission 0.00e+00 0.00e+00 -7 (0, 100, 2000, 30000) 6.25e-07 2.00e+01 U-238 nu-fission 0.00e+00 0.00e+00 -8 (500, 5000, 50000) 0.00e+00 6.25e-07 U-235 fission 0.00e+00 0.00e+00 -9 (500, 5000, 50000) 0.00e+00 6.25e-07 U-235 nu-fission 0.00e+00 0.00e+00 -10 (500, 5000, 50000) 0.00e+00 6.25e-07 U-238 fission 0.00e+00 0.00e+00 -11 (500, 5000, 50000) 0.00e+00 6.25e-07 U-238 nu-fission 0.00e+00 0.00e+00 -12 (500, 5000, 50000) 6.25e-07 2.00e+01 U-235 fission 0.00e+00 0.00e+00 -13 (500, 5000, 50000) 6.25e-07 2.00e+01 U-235 nu-fission 0.00e+00 0.00e+00 -14 (500, 5000, 50000) 6.25e-07 2.00e+01 U-238 fission 0.00e+00 0.00e+00 -15 (500, 5000, 50000) 6.25e-07 2.00e+01 U-238 nu-fission 0.00e+00 0.00e+00 +0 (0, 100, 2000, 30000) 0.00e+00 6.25e-07 U235 fission 0.00e+00 0.00e+00 +1 (0, 100, 2000, 30000) 0.00e+00 6.25e-07 U235 nu-fission 0.00e+00 0.00e+00 +2 (0, 100, 2000, 30000) 0.00e+00 6.25e-07 U238 fission 0.00e+00 0.00e+00 +3 (0, 100, 2000, 30000) 0.00e+00 6.25e-07 U238 nu-fission 0.00e+00 0.00e+00 +4 (0, 100, 2000, 30000) 6.25e-07 2.00e+01 U235 fission 0.00e+00 0.00e+00 +5 (0, 100, 2000, 30000) 6.25e-07 2.00e+01 U235 nu-fission 0.00e+00 0.00e+00 +6 (0, 100, 2000, 30000) 6.25e-07 2.00e+01 U238 fission 0.00e+00 0.00e+00 +7 (0, 100, 2000, 30000) 6.25e-07 2.00e+01 U238 nu-fission 0.00e+00 0.00e+00 +8 (500, 5000, 50000) 0.00e+00 6.25e-07 U235 fission 0.00e+00 0.00e+00 +9 (500, 5000, 50000) 0.00e+00 6.25e-07 U235 nu-fission 0.00e+00 0.00e+00 +10 (500, 5000, 50000) 0.00e+00 6.25e-07 U238 fission 0.00e+00 0.00e+00 +11 (500, 5000, 50000) 0.00e+00 6.25e-07 U238 nu-fission 0.00e+00 0.00e+00 +12 (500, 5000, 50000) 6.25e-07 2.00e+01 U235 fission 0.00e+00 0.00e+00 +13 (500, 5000, 50000) 6.25e-07 2.00e+01 U235 nu-fission 0.00e+00 0.00e+00 +14 (500, 5000, 50000) 6.25e-07 2.00e+01 U238 fission 0.00e+00 0.00e+00 +15 (500, 5000, 50000) 6.25e-07 2.00e+01 U238 nu-fission 0.00e+00 0.00e+00 sum(mesh) energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U-235 fission 9.18e-03 1.62e-03 -1 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U-235 nu-fission 2.24e-02 3.94e-03 -2 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U-238 fission 1.31e-08 2.08e-09 -3 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U-238 nu-fission 3.26e-08 5.19e-09 -4 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U-235 fission 8.40e-04 2.13e-04 -5 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U-235 nu-fission 2.06e-03 5.17e-04 -6 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U-238 fission 7.05e-04 3.42e-04 -7 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U-238 nu-fission 1.99e-03 1.01e-03 -8 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U-235 fission 8.77e-03 1.30e-03 -9 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U-235 nu-fission 2.14e-02 3.18e-03 -10 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U-238 fission 1.24e-08 1.74e-09 -11 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U-238 nu-fission 3.08e-08 4.33e-09 -12 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U-235 fission 2.30e-03 6.20e-04 -13 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U-235 nu-fission 5.63e-03 1.52e-03 -14 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U-238 fission 1.45e-03 7.19e-04 -15 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U-238 nu-fission 3.97e-03 1.98e-03 +0 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U235 fission 9.18e-03 1.62e-03 +1 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U235 nu-fission 2.24e-02 3.94e-03 +2 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U238 fission 1.31e-08 2.08e-09 +3 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U238 nu-fission 3.26e-08 5.19e-09 +4 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U235 fission 8.40e-04 2.13e-04 +5 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U235 nu-fission 2.06e-03 5.17e-04 +6 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U238 fission 7.05e-04 3.42e-04 +7 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U238 nu-fission 1.99e-03 1.01e-03 +8 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U235 fission 8.77e-03 1.30e-03 +9 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U235 nu-fission 2.14e-02 3.18e-03 +10 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U238 fission 1.24e-08 1.74e-09 +11 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U238 nu-fission 3.08e-08 4.33e-09 +12 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U235 fission 2.30e-03 6.20e-04 +13 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U235 nu-fission 5.63e-03 1.52e-03 +14 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U238 fission 1.45e-03 7.19e-04 +15 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U238 nu-fission 3.97e-03 1.98e-03 diff --git a/tests/test_tally_slice_merge/test_tally_slice_merge.py b/tests/test_tally_slice_merge/test_tally_slice_merge.py index 78ea4fe9d..2794539d2 100644 --- a/tests/test_tally_slice_merge/test_tally_slice_merge.py +++ b/tests/test_tally_slice_merge/test_tally_slice_merge.py @@ -1,5 +1,7 @@ #!/usr/bin/env python +from __future__ import division + import os import sys import glob @@ -20,7 +22,7 @@ class TallySliceMergeTestHarness(PyAPITestHarness): tallies_file = openmc.Tallies() # Define nuclides and scores to add to both tallies - self.nuclides = ['U-235', 'U-238'] + self.nuclides = ['U235', 'U238'] self.scores = ['fission', 'nu-fission'] # Define filters for energy and spatial domain @@ -60,7 +62,7 @@ class TallySliceMergeTestHarness(PyAPITestHarness): # Merge all cell tallies together while len(tallies) != 1: - halfway = int(len(tallies) / 2) + halfway = len(tallies) // 2 zip_split = zip(tallies[:halfway], tallies[halfway:]) tallies = list(map(lambda xy: xy[0].merge(xy[1]), zip_split)) diff --git a/tests/test_trace/materials.xml b/tests/test_trace/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_trace/materials.xml +++ b/tests/test_trace/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_track_output/materials.xml b/tests/test_track_output/materials.xml index e2b96cb53..017797aa1 100644 --- a/tests/test_track_output/materials.xml +++ b/tests/test_track_output/materials.xml @@ -4,92 +4,92 @@ - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + diff --git a/tests/test_translation/materials.xml b/tests/test_translation/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_translation/materials.xml +++ b/tests/test_translation/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_trigger_batch_interval/materials.xml b/tests/test_trigger_batch_interval/materials.xml index 2761be30c..e9667b41f 100644 --- a/tests/test_trigger_batch_interval/materials.xml +++ b/tests/test_trigger_batch_interval/materials.xml @@ -6,7 +6,7 @@ - + diff --git a/tests/test_trigger_batch_interval/tallies.xml b/tests/test_trigger_batch_interval/tallies.xml index cf20668c8..3440dbf21 100644 --- a/tests/test_trigger_batch_interval/tallies.xml +++ b/tests/test_trigger_batch_interval/tallies.xml @@ -7,7 +7,7 @@ - Pu-239 + Pu239 total absorption fission scatter diff --git a/tests/test_trigger_no_batch_interval/materials.xml b/tests/test_trigger_no_batch_interval/materials.xml index 2761be30c..e9667b41f 100644 --- a/tests/test_trigger_no_batch_interval/materials.xml +++ b/tests/test_trigger_no_batch_interval/materials.xml @@ -6,7 +6,7 @@ - + diff --git a/tests/test_trigger_no_batch_interval/tallies.xml b/tests/test_trigger_no_batch_interval/tallies.xml index cf20668c8..3440dbf21 100644 --- a/tests/test_trigger_no_batch_interval/tallies.xml +++ b/tests/test_trigger_no_batch_interval/tallies.xml @@ -7,7 +7,7 @@ - Pu-239 + Pu239 total absorption fission scatter diff --git a/tests/test_trigger_no_status/materials.xml b/tests/test_trigger_no_status/materials.xml index 2761be30c..e9667b41f 100644 --- a/tests/test_trigger_no_status/materials.xml +++ b/tests/test_trigger_no_status/materials.xml @@ -6,7 +6,7 @@ - + diff --git a/tests/test_trigger_no_status/tallies.xml b/tests/test_trigger_no_status/tallies.xml index cf20668c8..3440dbf21 100644 --- a/tests/test_trigger_no_status/tallies.xml +++ b/tests/test_trigger_no_status/tallies.xml @@ -7,7 +7,7 @@ - Pu-239 + Pu239 total absorption fission scatter diff --git a/tests/test_trigger_tallies/materials.xml b/tests/test_trigger_tallies/materials.xml index 2761be30c..e9667b41f 100644 --- a/tests/test_trigger_tallies/materials.xml +++ b/tests/test_trigger_tallies/materials.xml @@ -6,7 +6,7 @@ - + diff --git a/tests/test_trigger_tallies/tallies.xml b/tests/test_trigger_tallies/tallies.xml index 2dbc836ee..0d66e1538 100644 --- a/tests/test_trigger_tallies/tallies.xml +++ b/tests/test_trigger_tallies/tallies.xml @@ -7,7 +7,7 @@ - Pu-239 + Pu239 total absorption fission scatter diff --git a/tests/test_triso/inputs_true.dat b/tests/test_triso/inputs_true.dat index 3e54e5e6f..04119a2dc 100644 --- a/tests/test_triso/inputs_true.dat +++ b/tests/test_triso/inputs_true.dat @@ -1 +1 @@ -2dcfd1a17cba671874e60192a7355deb57e2e51467a474fd168c8b51e454a977edb34df07ae11625c0a43906112152c75113e442a9a8f240a4c9d1a11ee4771d \ No newline at end of file +f33e6653b883200457df2ff2ba9cf715d5ddaa1296dd71d277c6f1d9d5b7831cc92aaf1e97509d26e5a93235cd9f775c0cfaa5ebc3dfe8fc71469bac166d362b \ No newline at end of file diff --git a/tests/test_triso/test_triso.py b/tests/test_triso/test_triso.py index d1ac4e5cd..9a8fb0c3b 100644 --- a/tests/test_triso/test_triso.py +++ b/tests/test_triso/test_triso.py @@ -19,35 +19,35 @@ class TRISOTestHarness(PyAPITestHarness): # Define TRISO matrials fuel = openmc.Material() fuel.set_density('g/cm3', 10.5) - fuel.add_nuclide('U-235', 0.14154) - fuel.add_nuclide('U-238', 0.85846) - fuel.add_nuclide('C-Nat', 0.5) - fuel.add_nuclide('O-16', 1.5) + fuel.add_nuclide('U235', 0.14154) + fuel.add_nuclide('U238', 0.85846) + fuel.add_nuclide('C0', 0.5) + fuel.add_nuclide('O16', 1.5) porous_carbon = openmc.Material() porous_carbon.set_density('g/cm3', 1.0) - porous_carbon.add_nuclide('C-Nat', 1.0) - porous_carbon.add_s_alpha_beta('Graph', '71t') + porous_carbon.add_nuclide('C0', 1.0) + porous_carbon.add_s_alpha_beta('c_Graphite', '71t') ipyc = openmc.Material() ipyc.set_density('g/cm3', 1.90) - ipyc.add_nuclide('C-Nat', 1.0) - ipyc.add_s_alpha_beta('Graph', '71t') + ipyc.add_nuclide('C0', 1.0) + ipyc.add_s_alpha_beta('c_Graphite', '71t') sic = openmc.Material() sic.set_density('g/cm3', 3.20) sic.add_element('Si', 1.0) - sic.add_nuclide('C-Nat', 1.0) + sic.add_nuclide('C0', 1.0) opyc = openmc.Material() opyc.set_density('g/cm3', 1.87) - opyc.add_nuclide('C-Nat', 1.0) - opyc.add_s_alpha_beta('Graph', '71t') + opyc.add_nuclide('C0', 1.0) + opyc.add_s_alpha_beta('c_Graphite', '71t') graphite = openmc.Material() graphite.set_density('g/cm3', 1.1995) - graphite.add_nuclide('C-Nat', 1.0) - graphite.add_s_alpha_beta('Graph', '71t') + graphite.add_nuclide('C0', 1.0) + graphite.add_s_alpha_beta('c_Graphite', '71t') # Create TRISO particles spheres = [openmc.Sphere(R=r*1e-4) diff --git a/tests/test_uniform_fs/materials.xml b/tests/test_uniform_fs/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_uniform_fs/materials.xml +++ b/tests/test_uniform_fs/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_union_energy_grids/materials.xml b/tests/test_union_energy_grids/materials.xml index 45ccc6554..ed9b38d90 100644 --- a/tests/test_union_energy_grids/materials.xml +++ b/tests/test_union_energy_grids/materials.xml @@ -3,9 +3,9 @@ - - - + + + diff --git a/tests/test_universe/materials.xml b/tests/test_universe/materials.xml index 315c0fa84..23d7f969d 100644 --- a/tests/test_universe/materials.xml +++ b/tests/test_universe/materials.xml @@ -3,7 +3,7 @@ - + diff --git a/tests/test_void/materials.xml b/tests/test_void/materials.xml index b8f993824..4768bad0b 100644 --- a/tests/test_void/materials.xml +++ b/tests/test_void/materials.xml @@ -8,56 +8,56 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - + + + + - - + + From 9230203efb8f78523fc058873b96546d61350b1a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 13 May 2016 22:09:36 -0500 Subject: [PATCH 10/33] Remove unused table types in openmc.data.ace --- openmc/data/ace.py | 367 +-------------------------------------------- 1 file changed, 1 insertion(+), 366 deletions(-) diff --git a/openmc/data/ace.py b/openmc/data/ace.py index 16c18dfb4..358d98789 100644 --- a/openmc/data/ace.py +++ b/openmc/data/ace.py @@ -1856,371 +1856,6 @@ class Reaction(object): return rxn -class DosimetryTable(Table): - def __init__(self, name, atomic_weight_ratio, temperature): - super(DosimetryTable, self).__init__( - name, atomic_weight_ratio, temperature) - - def __repr__(self): - if hasattr(self, 'name'): - return "".format(self.name) - else: - return "" - - -class NeutronDiscreteTable(Table): - - def __init__(self, name, atomic_weight_ratio, temperature): - super(NeutronDiscreteTable, self).__init__( - name, atomic_weight_ratio, temperature) - - def __repr__(self): - if hasattr(self, 'name'): - return "".format(self.name) - else: - return "" - - -class NeutronMGTable(Table): - - def __init__(self, name, atomic_weight_ratio, temperature): - super(NeutronMGTable, self).__init__( - name, atomic_weight_ratio, temperature) - - def __repr__(self): - if hasattr(self, 'name'): - return "".format(self.name) - else: - return "" - - -class PhotoatomicTable(Table): - - def __init__(self, name, atomic_weight_ratio, temperature): - super(PhotoatomicTable, self).__init__( - name, atomic_weight_ratio, temperature) - - def __repr__(self): - if hasattr(self, 'name'): - return "".format(self.name) - else: - return "" - - def _read_all(self): - self._read_eszg() - self._read_jinc() - self._read_jcoh() - self._read_heating() - self._read_compton_data() - - def _read_eszg(self): - # Determine number of energies on common energy grid - n_energies = self._nxs[3] - - # Read cross sections - idx = self._jxs[1] - data = np.asarray(self._xss[idx:idx + 5*n_energies]) - data.shape = (5, n_energies) - self.energy = data[0] - self.incoherent = data[1] - self.coherent = data[2] - self.photoelectric = data[3] - self.pairproduction = data[4] - - def _read_jinc(self): - # Read incoherent scattering function - idx = self._jxs[2] - self.incoherent_scattering = self._xss[idx:idx + 21] - - def _read_jcoh(self): - # Read coherent form factors and integrated coherent form factors - idx = self._jxs[3] - self.int_coherent_form_factors = self._xss[idx:idx + 55] - self.coherent_form_factors = self._xss[idx + 55:idx + 2*55] - - def _read_jflo(self): - raise NotImplementedError - - def _read_heating(self): - idx = self._jxs[5] - self.avg_heating = self._xss[idx:idx + self._nxs[3]] - - def _read_compton_data(self): - # Determine number of Compton profiles - n_shells = self._nxs[5] - - if n_shells > 0: - # Number of electrons per shell - idx = self._jxs[6] - self.electrons_per_shell = np.asarray( - self._xss[idx:idx + n_shells], dtype=int) - - # Binding energy per shell - idx = self._jxs[7] - self.binding_energy_per_shell = self._xss[idx:idx + n_shells] - - # Probability of interaction per shell - idx = self._jxs[8] - self.probability_per_shell = self._xss[idx:idx + n_shells] - - # Initialize arrays for Compton profile data - self.compton_profile_interp = np.zeros(n_shells) - self.compton_profile_momentum = [] - self.compton_profile_pdf = [] - self.compton_profile_cdf = [] - - for i in range(n_shells): - # Get locator for SWD block - loca = int(self._xss[self._jxs[9] + i]) - idx = self._jxs[10] + loca - 1 - - # Get interpolation parameter and number of momentum entries - self.compton_profile_interp[i] = int(self._xss[idx]) - n_momentum = int(self._xss[idx + 1]) - idx += 2 - - # Get momentum entries, PDF, and CDF - data = self._xss[idx:idx + 3*n_momentum] - data.shape = (3, n_momentum) - self.compton_profile_momentum.append(data[0]) - self.compton_profile_pdf.append(data[1]) - self.compton_profile_cdf.append(data[2]) - - -class PhotoatomicMGTable(Table): - - def __init__(self, name, atomic_weight_ratio, temperature): - super(PhotoatomicMGTable, self).__init__( - name, atomic_weight_ratio, temperature) - - def __repr__(self): - if hasattr(self, 'name'): - return "".format(self.name) - else: - return "" - - -class ElectronTable(Table): - - def __init__(self, name, atomic_weight_ratio, temperature): - super(ElectronTable, self).__init__( - name, atomic_weight_ratio, temperature) - - def __repr__(self): - if hasattr(self, 'name'): - return "".format(self.name) - else: - return "" - - -class PhotonuclearTable(Table): - - def __init__(self, name, atomic_weight_ratio, temperature): - super(PhotonuclearTable, self).__init__( - name, atomic_weight_ratio, temperature) - self.reactions = OrderedDict() - - def __repr__(self): - if hasattr(self, 'name'): - return "".format(self.name) - else: - return "" - - def _read_all(self): - self._read_basic() - self._read_cross_sections() - self._read_secondaries() - self._read_angular_distributions() - self._read_energy_distributions() - - def _read_basic(self): - n_energies = self._nxs[3] - - # Read energy mesh - idx = self._jxs[1] - self.energy = self._xss[idx:idx + n_energies] - - # Read total cross section - idx = self._jxs[2] - self.total_xs = self._xss[idx:idx + n_energies] - - # Read non-elastic and elastic cross section - if self._jxs[4] > 0: - idx = self._jxs[3] - self.non_elastic_xs = self._xss[idx:idx + n_energies] - idx = self._jxs[4] - self.elastic_xs = self._xss[idx:idx + n_energies] - else: - self.non_elastic_xs = self.total_xs.copy() - self.elastic_xs = np.zeros(n_energies) - - # Read heating numbers - idx = self._jxs[5] - if idx > 0: - self.heating_number = self._xss[idx:idx + n_energies] - else: - self.heating_number = np.zeros(n_energies) - - def _read_cross_sections(self): - # Determine number of reactions - n_reactions = self._nxs[4] - - # Read list of MT numbers and Q values - mts = np.asarray(self._xss[self._jxs[6]:self._jxs[6] + - n_reactions], dtype=int) - qvalues = np.asarray(self._xss[self._jxs[7]:self._jxs[7] + - n_reactions]) - - # Create reactions in dictionary - reactions = [(mt, Reaction(mt, self)) for mt in mts] - self.reactions.update(reactions) - - for i, rx in enumerate(self.reactions.values()): - # Copy Q values - rx.Q_value = qvalues[i] - - # Determine starting index on energy grid and number of energies - idx = self._jxs[9] + int(self._xss[self._jxs[8] + i]) - 1 - rx.threshold_idx = int(self._xss[idx]) - n_energies = int(self._xss[idx + 1]) - energy = self.energy[rx.threshold_idx:rx.threshold_idx + n_energies] - idx += 2 - - # Read reaction cross setion - xs = self._xss[idx:idx + n_energies] - rx.xs = Tabulated1D(energy, xs, [], []) - - def _read_secondaries(self): - names = {1: 'neutron', 2: 'photon', 3: 'electron', - 9: 'proton', 31: 'deuteron', 32: 'triton', - 33: 'helium3', 34: 'alpha'} - - n_particles = self._nxs[5] - n_entries = self._nxs[7] - - idx = self._jxs[10] - ixs = np.asarray(self._xss[idx:idx + n_particles*n_entries], dtype=int) - ixs.shape = (n_particles, n_entries) - self.ixs = ixs.transpose() - - self.particles = [] - - for j in range(n_particles): - # Create dictionary for particle - particle = {} - self.particles.append(particle) - - # Get secondary particle type/name - particle['ipt'] = self.ixs[0, j] - particle['name'] = names[particle['ipt']] - - # Number of reactions that produce secondary particle - n_producing = self.ixs[1, j] - - # Particle-production cross section - idx = self.ixs[2, j] - particle['ie_production'] = int(self._xss[idx]) - ne = int(self._xss[idx + 1]) - idx += 2 - particle['production'] = self._xss[idx:idx + ne] - - # Average heating numbers - idx = self.ixs[3, j] - particle['ie_heating'] = int(self._xss[idx]) - ne = int(self._xss[idx + 1]) - idx += 2 - particle['heating_number'] = self._xss[idx:idx + ne] - - # MTs of particle production reactions - idx = self.ixs[4, j] - particle['mt_producing'] = np.asarray( - self._xss[idx:idx + n_producing], dtype=int) - - # Coordinate system of reaction producing secondary particle - idx = self.ixs[5, j] - particle['center_of_mass'] = [i < 0 for i in - self._xss[idx:idx + n_producing]] - - # Reaction yields - particle['yield'] = {} - for k in range(n_producing): - # Create dictionary for yield data - yieldData = {} - - # Read reaction yield data for a single MT - idx = self.ixs[7, j] + int(self._xss[self.ixs[6, j] + k]) - 1 - - yieldData['mftype'] = int(self._xss[idx]) - idx += 1 - - if yieldData['mftype'] in (6, 12, 16): - # Yield data from ENDF File 6 or 12 - mtmult = int(self._xss[idx]) - assert mtmult == particle['mt_producing'][k] - - # Read yield as function of energy - yieldData['multiplicity'] = _get_tabulated_1d( - self._xss, idx + 1) - - elif yieldData['mftype'] == 13: - # Production cross section for corresponding MT - yieldData['ie'] = int(self._xss[idx]) - ne = int(self._xss[idx + 1]) - idx += 2 - yieldData['cross_section'] = self._xss[idx:idx + ne] - - # Add reaction yield data to dictionary - mt = particle['mt_producing'][k] - particle['yield'][mt] = yieldData - - def _read_angular_distributions(self): - for j, particle in enumerate(self.particles): - # Create dictionary for angular distributions - angular_dists = {} - particle['angular_distribution'] = angular_dists - - for k, mt in enumerate(particle['mt_producing']): - landp = int(self._xss[self.ixs[8, j] + k]) - - # check if angular distribution data exists - if landp == -1: - # Angular distribution data are specified through the - # DLWP block - continue - elif landp == 0: - # No angular distribution data are given for this - # reaction, isotropic scattering is assumed - ie = self.reactions[mt].threshold_idx - ne = len(self.reactions[mt].sigma) - angular_dists[mt] = AngularDistribution.isotropic( - np.array([self.energy[ie], self.energy[ie + ne - 1]])) - continue - - idx = self.ixs[9, j] + landp - 1 - - angular_dists[mt] = AngularDistribution() - angular_dists[mt].read(self._xss, idx, self.ixs[9, j]) - - def _read_energy_distributions(self): - for j, particle in enumerate(self.particles): - # Create dictionary for energy distributions - energy_dists = {} - particle['energy_distribution'] = energy_dists - - for k, mt in enumerate(particle['mt_producing']): - # Determine locator for kth energy distribution - ldlwp = int(self._xss[self.ixs[10, j] + k]) - - # Read energy distribution data - energy_dists[mt] = self._get_energy_distribution( - self.ixs[11, j], ldlwp) table_types = { "c": NeutronTable, - "t": SabTable, - "y": DosimetryTable, - "d": NeutronDiscreteTable, - "p": PhotoatomicTable, - "m": NeutronMGTable, - "g": PhotoatomicMGTable, - "e": ElectronTable, - "u": PhotonuclearTable} + "t": SabTable} From e19291118e1398f399e780db5c6f661c265a9fc7 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 9 Jun 2016 14:52:58 -0500 Subject: [PATCH 11/33] Refactor use of ACE tables to generate neutron/thermal scattering data --- data/convert_hdf5.py | 96 - data/cross_sections.xml | 2076 --------------------- data/cross_sections_ascii.xml | 2066 --------------------- data/cross_sections_nndc.xml | 870 --------- data/cross_sections_serpent.xml | 2707 ---------------------------- data/get_nndc_data.py | 50 +- docs/source/index.rst | 6 +- docs/source/methods/physics.rst | 410 ++--- docs/source/pythonapi/index.rst | 8 +- openmc/data/__init__.py | 3 + openmc/data/ace.py | 1573 +--------------- openmc/data/angle_distribution.py | 68 +- openmc/data/angle_energy.py | 70 + openmc/data/container.py | 39 + openmc/data/correlated.py | 117 +- openmc/data/energy_distribution.py | 227 ++- openmc/data/kalbach_mann.py | 94 +- openmc/data/library.py | 47 + openmc/data/nbody.py | 24 + openmc/data/neutron.py | 405 +++++ openmc/data/reaction.py | 512 ++++++ openmc/data/thermal.py | 305 +++- openmc/data/urr.py | 39 + openmc/mgxs/library.py | 4 +- openmc/mgxs/mgxs.py | 70 +- openmc/mgxs_library.py | 2 +- openmc/nuclide.py | 6 +- openmc/tallies.py | 14 +- scripts/openmc-ace-to-hdf5 | 139 ++ scripts/openmc-ascii-to-binary | 13 - scripts/openmc-update-inputs | 66 + scripts/openmc-xsdata-to-xml | 148 -- scripts/openmc-xsdir-to-xml | 288 --- src/reaction_header.F90 | 2 +- src/relaxng/cross_sections.rnc | 29 +- src/relaxng/cross_sections.rng | 112 +- 36 files changed, 2467 insertions(+), 10238 deletions(-) delete mode 100644 data/convert_hdf5.py delete mode 100644 data/cross_sections.xml delete mode 100644 data/cross_sections_ascii.xml delete mode 100644 data/cross_sections_nndc.xml delete mode 100644 data/cross_sections_serpent.xml create mode 100644 openmc/data/library.py create mode 100644 openmc/data/neutron.py create mode 100644 openmc/data/reaction.py create mode 100755 scripts/openmc-ace-to-hdf5 delete mode 100755 scripts/openmc-ascii-to-binary delete mode 100755 scripts/openmc-xsdata-to-xml delete mode 100755 scripts/openmc-xsdir-to-xml diff --git a/data/convert_hdf5.py b/data/convert_hdf5.py deleted file mode 100644 index 3f5fcfdb7..000000000 --- a/data/convert_hdf5.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python - -import glob -import os -from xml.dom.minidom import getDOMImplementation - -import openmc.data.ace - - -if not os.path.isdir('nndc_hdf5'): - os.mkdir('nndc_hdf5') - -nndc_files = glob.glob('nndc/293.6K/*.ace') -nndc_thermal_files = glob.glob('nndc/tsl/*.acer') - -thermal_names = {'al': 'c_Al27', - 'be': 'c_Be', - 'bebeo': 'c_Be_in_BeO', - 'benzine': 'c_Benzine', - 'dd2o': 'c_D_in_D2O', - 'fe': 'c_Fe56', - 'graphite': 'c_Graphite', - 'hch2': 'c_H_in_CH2', - 'hh2o': 'c_H_in_H2O', - 'hzrh': 'c_H_in_ZrH', - 'lch4': 'c_liquid_CH4', - 'obeo': 'c_O_in_BeO', - 'orthod': 'c_ortho_D', - 'orthoh': 'c_ortho_H', - 'ouo2': 'c_O_in_UO2', - 'parad': 'c_para_D', - 'parah': 'c_para_H', - 'sch4': 'c_solid_CH4', - 'uuo2': 'c_U_in_UO2', - 'zrzrh': 'c_Zr_in_ZrH'} - -impl = getDOMImplementation() -doc = impl.createDocument(None, "cross_sections", None) -doc_root = doc.documentElement - -for f in sorted(nndc_files): - print('Converting {}...'.format(f)) - - # Deterine output file name - dirname, basename = os.path.split(f) - root, ext = os.path.splitext(basename) - outfile = os.path.join('nndc_hdf5', root + '.h5') - if os.path.exists(outfile): - os.remove(outfile) - - # Determine elemental symbol, mass number and metastable state - element, mass_number, temp = basename.split('_') - metastable = int(mass_number[-1]) if 'm' in mass_number else 0 - mass_number = int(mass_number[:3]) - - # Parse ACE file, create HDF5 file - t = openmc.data.ace.get_table(f) - t.export_to_hdf5(outfile, element, mass_number, metastable) - xs = t.name.split('.')[1] - if metastable > 0: - name = "{}{}_m{}.{}".format(element, mass_number, metastable, xs) - else: - name = "{}{}.{}".format(element, mass_number, xs) - - # Add entry to XML listing - libraryNode = doc.createElement("library") - libraryNode.setAttribute("path", root + '.h5') - libraryNode.setAttribute("materials", name) - libraryNode.setAttribute("type", "neutron") - doc_root.appendChild(libraryNode) - -for f in sorted(nndc_thermal_files): - print('Converting {}...'.format(f)) - - # Deterine output file name - dirname, basename = os.path.split(f) - root, ext = os.path.splitext(basename) - outfile = os.path.join('nndc_hdf5', root + '.h5') - if os.path.exists(outfile): - os.remove(outfile) - - # Parse ACE file, create HDF5 file - t = openmc.data.ace.get_table(f) - t.export_to_hdf5(outfile, thermal_names[root]) - xs = t.name.split('.')[1] - - # Add entry to XML listing - libraryNode = doc.createElement("library") - libraryNode.setAttribute("path", root + '.h5') - libraryNode.setAttribute("materials", thermal_names[root] + '.' + xs) - libraryNode.setAttribute("type", "thermal") - doc_root.appendChild(libraryNode) - -# Write cross_sections.xml -lines = doc.toprettyxml(indent=' ') -open(os.path.join('nndc_hdf5', 'cross_sections.xml'), 'w').write(lines) diff --git a/data/cross_sections.xml b/data/cross_sections.xml deleted file mode 100644 index 180021064..000000000 --- a/data/cross_sections.xml +++ /dev/null @@ -1,2076 +0,0 @@ - - - - /opt/mcnp/data - - - binary - - - 4096 - - - 512 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/cross_sections_ascii.xml b/data/cross_sections_ascii.xml deleted file mode 100644 index b0f083bb2..000000000 --- a/data/cross_sections_ascii.xml +++ /dev/null @@ -1,2066 +0,0 @@ - - - /opt/mcnp/data - ascii - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/cross_sections_nndc.xml b/data/cross_sections_nndc.xml deleted file mode 100644 index 3a7a5ca72..000000000 --- a/data/cross_sections_nndc.xml +++ /dev/null @@ -1,870 +0,0 @@ - - - ascii - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/cross_sections_serpent.xml b/data/cross_sections_serpent.xml deleted file mode 100644 index 959790309..000000000 --- a/data/cross_sections_serpent.xml +++ /dev/null @@ -1,2707 +0,0 @@ - - - - /opt/serpent/xsdata/endfb7/acedata - - ascii - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/get_nndc_data.py b/data/get_nndc_data.py index 844abea81..a0429fba5 100755 --- a/data/get_nndc_data.py +++ b/data/get_nndc_data.py @@ -20,10 +20,6 @@ try: except ImportError: from urllib2 import urlopen -cwd = os.getcwd() -sys.path.insert(0, os.path.join(cwd, '..')) -from openmc.data.ace import ascii_to_binary - baseUrl = 'http://www.nndc.bnl.gov/endf/b7.1/aceFiles/' files = ['ENDF-B-VII.1-neutron-293.6K.tar.gz', 'ENDF-B-VII.1-tsl.tar.gz'] @@ -114,12 +110,6 @@ text = text.replace('6012', '6000', 1) with open(graphite, 'w') as fh: fh.write(text) -# ============================================================================== -# COPY CROSS_SECTIONS.XML - -print('Copying cross_sections_nndc.xml...') -shutil.copyfile('cross_sections_nndc.xml', 'nndc/cross_sections.xml') - # ============================================================================== # PROMPT USER TO DELETE .TAR.GZ FILES @@ -140,44 +130,26 @@ if not response or response.lower().startswith('y'): os.remove(f) # ============================================================================== -# PROMPT USER TO CONVERT ASCII TO BINARY +# PROMPT USER TO GENERATE HDF5 LIBRARY # Ask user to convert if not args.batch: if sys.version_info[0] < 3: - response = raw_input('Convert ACE files to binary? ([y]/n) ') + response = raw_input('Generate HDF5 library? ([y]/n) ') else: - response = input('Convert ACE files to binary? ([y]/n) ') + response = input('Generate HDF5 library? ([y]/n) ') else: response = 'y' # Convert files if requested if not response or response.lower().startswith('y'): + # get a list of all ACE files + ace_files = sorted(glob.glob(os.path.join('nndc', '**', '*.ace*'))) - # get a list of directories - ace_dirs = glob.glob(os.path.join('nndc', '*K')) - ace_dirs += glob.glob(os.path.join('nndc', 'tsl')) + # Ensure 'import openmc.data' works in the openmc-ace-to-xml script + cwd = os.getcwd() + env = os.environ.copy() + env['PYTHONPATH'] = os.path.join(cwd, '..') - # loop around ace directories - for d in ace_dirs: - print('Converting {0}...'.format(d)) - - # get a list of files to convert - ace_files = glob.glob(os.path.join(d, '*.ace*')) - - # convert files - for f in ace_files: - print(' Converting {0}...'.format(os.path.split(f)[1])) - ascii_to_binary(f, f) - - # Change cross_sections.xml file - xs_file = os.path.join('nndc', 'cross_sections.xml') - asc_str = "ascii" - bin_str = " binary \n " - bin_str += " 4096 \n " - bin_str += " 512 " - with open(xs_file) as fh: - text = fh.read() - text = text.replace(asc_str, bin_str) - with open(xs_file, 'w') as fh: - fh.write(text) + subprocess.call(['../scripts/openmc-ace-to-hdf5', '-d', 'nndc_hdf5'] + + ace_files, env=env) diff --git a/docs/source/index.rst b/docs/source/index.rst index 413107c34..8fe680a70 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -5,9 +5,9 @@ The OpenMC Monte Carlo Code OpenMC is a Monte Carlo particle transport simulation code focused on neutron criticality calculations. It is capable of simulating 3D models based on constructive solid geometry with second-order surfaces. OpenMC supports either -continuous-energy or multi-group transport. The continuous-energy -particle interaction data is based on ACE format cross sections, also used -in the MCNP and Serpent Monte Carlo codes. +continuous-energy or multi-group transport. The continuous-energy particle +interaction data is based on a native HDF5 format that can be generated from ACE +files used by the MCNP and Serpent Monte Carlo codes. OpenMC was originally developed by members of the `Computational Reactor Physics Group`_ at the `Massachusetts Institute of Technology`_ starting diff --git a/docs/source/methods/physics.rst b/docs/source/methods/physics.rst index b246584c8..530d4ac41 100644 --- a/docs/source/methods/physics.rst +++ b/docs/source/methods/physics.rst @@ -279,9 +279,9 @@ idiosyncrasies in treating fission. In an eigenvalue calculation, secondary neutrons from fission are only "banked" for use in the next generation rather than being tracked as secondary neutrons from elastic and inelastic scattering would be. On top of this, fission is sometimes broken into first-chance fission, -second-chance fission, etc. An ACE table either lists the partial fission -reactions with secondary energy distributions for each one, or a total fission -reaction with a single secondary energy distribution. +second-chance fission, etc. The nuclear data file either lists the partial +fission reactions with secondary energy distributions for each one, or a total +fission reaction with a single secondary energy distribution. When a fission reaction is sampled in OpenMC (either total fission or, if data exists, first- or second-chance fission), the following algorithm is used to @@ -290,7 +290,7 @@ number of prompt and delayed neutrons must be determined to decide whether the secondary neutrons will be prompt or delayed. This is important because delayed neutrons have a markedly different spectrum from prompt neutrons, one that has a lower average energy of emission. The total number of neutrons emitted -:math:`\nu_t` is given as a function of incident energy in the ACE format. Two +:math:`\nu_t` is given as a function of incident energy in the ENDF format. Two representations exist for :math:`\nu_t`. The first is a polynomial of order :math:`N` with coefficients :math:`c_0,c_1,\dots,c_N`. If :math:`\nu_t` has this format, we can evaluate it at incoming energy :math:`E` by using the equation @@ -347,26 +347,52 @@ provided as group-wise data instead of in a continuous-energy format. In this case, the outgoing energy of the fission neutrons are represented as histograms by way of either the nu-fission matrix or chi vector. ------------------------------------------ -Secondary Angles and Energy Distributions ------------------------------------------ +------------------------------------ +Secondary Angle-Energy Distributions +------------------------------------ Note that this section is specific to continuous-energy mode since the multi-group scattering process has already been described including the secondary energy and angle sampling. -For any reactions with secondary neutrons, it is necessary to sample secondary -angle and energy distributions. This includes elastic and inelastic scattering, -fission, and :math:`(n,xn)` reactions. In some cases, the angle and energy -distributions may be specified separately, and in other cases, they may be -specified as a correlated angle-energy distribution. In the following sections, -we will outline the methods used to sample secondary distributions as well as -how they are used to modify the state of a particle. +For a reaction with secondary products, it is necessary to determine the +outgoing angle and energy of the products. For any reaction other than elastic +and level inelastic scattering, the outgoing energy must be determined based on +tabulated or parameterized data. The `ENDF-6 Format`_ specifies a variety of +ways that the secondary energy distribution can be represented. ENDF File 5 +contains uncorrelated energy distribution whereas ENDF File 6 contains +correlated energy-angle distributions. The ACE format specifies its own +representations based loosely on the formats given in ENDF-6. OpenMC's HDF5 +nuclear data files use a combination of ENDF and ACE distributions; in this +section, we will describe how the outgoing angle and energy of secondary +particles are sampled. + +One of the subtleties in the nuclear data format is the fact that a single +reaction product can have multiple angle-energy distributions. This is mainly +useful for reactions with multiple products of the same type in the exit channel +such as :math:`(n,2n)` or :math:`(n,3n)`. In these types of reactions, each +neutron is emitted corresponding to a different excitation level of the compound +nucleus, and thus in general the neutrons will originate from different energy +distributions. If multiple angle-energy distributions are present, they are +assigned incoming-energy-dependent probabilities that can then be used to +randomly select one. + +Once a distribution has been selected, the procedure for determining the +outgoing angle and energy will depend on the type of the distribution. + +Uncorrelated Angle-Energy Distributions +--------------------------------------- + +The first set of distributions we will look at are uncorrelated angle-energy +distributions, where angle and energy are specified separately. For these +distributions, OpenMC first samples the angular distribution as described +:ref:`sample-angle` and then samples an energy as described in +:ref:`sample-energy`. .. _sample-angle: -Sampling Secondary Angle Distributions --------------------------------------- +Sampling Angular Distributions +++++++++++++++++++++++++++++++ For elastic scattering, it is only necessary to specific a secondary angle distribution since the outgoing energy can be determined analytically. Other @@ -374,15 +400,14 @@ reactions may also have separate secondary angle and secondary energy distributions that are uncorrelated. In these cases, the secondary angle distribution is represented as either -- An Isotropic angular distribution, -- An equiprobable distribution with 32 bins, or +- An isotropic angular distribution, - A tabular distribution. Isotropic Angular Distribution -++++++++++++++++++++++++++++++ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -In the first case, no data needs to be stored on the ACE table, and the cosine -of the scattering angle is simply calculated as +In the first case, no data is stored in the nuclear data file, and the cosine of +the scattering angle is simply calculated as .. math:: :label: isotropic-angle @@ -392,42 +417,17 @@ of the scattering angle is simply calculated as where :math:`\mu` is the cosine of the scattering angle and :math:`\xi` is a random number sampled uniformly on :math:`[0,1)`. -Equiprobable Angle Bin Distribution -+++++++++++++++++++++++++++++++++++ - -For a 32 equiprobable bin distribution, we select a random number :math:`\xi` to -sample a cosine bin :math:`i` such that - -.. math:: - :label: equiprobable-bin - - i = 1 + \lfloor 32\xi \rfloor. - -The same random number can then also be used to interpolate between neighboring -:math:`\mu` values to get the final scattering cosine: - -.. math:: - :label: equiprobable-cosine - - \mu = \mu_i + (32\xi - i) (\mu_{i+1} - \mu_i) - -where :math:`\mu_i` is the :math:`i`-th scattering cosine. - .. _angle-tabular: Tabular Angular Distribution -++++++++++++++++++++++++++++ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -As the `MCNP Manual`_ points out, using an equiprobable bin distribution works -well for high-probability regions of the scattering cosine probability, but for -low-probability regions it is not very accurate. Thus, a more accurate method is -to represent the scattering cosine with a tabular distribution. In this case, we -have a table of cosines and their corresponding values for a probability -distribution function and cumulative distribution function. For each incoming -neutron energy :math:`E_i`, let us call :math:`p_{i,j}` the j-th value in the -probability distribution function and :math:`c_{i,j}` the j-th value in the -cumulative distribution function. We first find the interpolation factor on the -incoming energy grid: +In this case, we have a table of cosines and their corresponding values for a +probability distribution function and cumulative distribution function. For each +incoming neutron energy :math:`E_i`, let us call :math:`p_{i,j}` the j-th value +in the probability distribution function and :math:`c_{i,j}` the j-th value in +the cumulative distribution function. We first find the interpolation factor on +the incoming energy grid: .. math:: :label: interpolation-factor @@ -545,89 +545,11 @@ linear-linear interpolation: .. _sample-energy: -Sampling Secondary Energy and Correlated Angle/Energy Distributions -------------------------------------------------------------------- +Sampling Energy Distributions ++++++++++++++++++++++++++++++ -For a reaction with secondary neutrons, it is necessary to determine the -outgoing energy of the neutrons. For any reaction other than elastic scattering, -the outgoing energy must be determined based on tabulated or parameterized -data. The `ENDF-6 Format`_ specifies a variety of ways that the secondary energy -distribution can be represented. ENDF File 5 contains uncorrelated energy -distribution where ENDF File 6 contains correlated energy-angle -distributions. The ACE format specifies its own representations based loosely on -the formats given in ENDF-6. In this section, we will describe how the outgoing -energy of secondary particles is determined based on each ACE law. - -One of the subtleties in the ACE format is the fact that a single reaction can -have multiple secondary energy distributions. This is mainly useful for -reactions with multiple neutrons in the exit channel such as :math:`(n,2n)` or -:math:`(n,3n)`. In these types of reactions, each neutron is emitted -corresponding to a different excitation level of the compound nucleus, and thus -in general the neutrons will originate from different energy distributions. If -multiple energy distributions are present, they are assigned probabilities that -can then be used to randomly select one. - -Once a secondary energy distribution has been sampled, the procedure for -determining the outgoing energy will depend on which ACE law has been specified -for the data. - -.. _ace-law-1: - -ACE Law 1 - Tabular Equiprobable Energy Bins -++++++++++++++++++++++++++++++++++++++++++++ - -In the tabular equiprobable bin representation, an array of equiprobable -outgoing energy bins is given for a number of incident energies. While the -representation itself is simple, the complexity lies in how one interpolates -between incident as well as outgoing energies on such a table. If one performs -simple interpolation between tables for neighboring incident energies, it is -possible that the resulting energies would violate laws governing the -kinematics, i.e. the outgoing energy may be outside the range of available -energy in the reaction. - -To avoid this situation, the accepted practice is to use a process known as -scaled interpolation [Doyas]_. First, we find the tabulated incident energies -which bound the actual incoming energy of the particle, i.e. find :math:`i` such -that :math:`E_i < E < E_{i+1}` and calculate the interpolation factor :math:`f` -via :eq:`interpolation-factor`. Then, we interpolate between the minimum and -maximum energies of the outgoing energy distributions corresponding to -:math:`E_i` and :math:`E_{i+1}`: - -.. math:: - :label: ace-law-1-minmax - - E_{min} = E_{i,1} + f ( E_{i+1,1} - E_i ) \\ - E_{max} = E_{i,M} + f ( E_{i+1,M} - E_M ) - -where :math:`E_{min}` and :math:`E_{max}` are the minimum and maximum outgoing -energies of a scaled distribution, :math:`E_{i,j}` is the j-th outgoing energy -corresponding to the incoming energy :math:`E_i`, and :math:`M` is the number of -outgoing energy bins. Next, statistical interpolation is performed to choose -between using the outgoing energy distributions corresponding to energy -:math:`E_i` and :math:`E_{i+1}`. Let :math:`\ell` be the chosen table where -:math:`\ell = i` if :math:`\xi_1 > f` and :math:`\ell = i + 1` otherwise, and -:math:`\xi_1` is a random number. Now, we randomly sample an equiprobable -outgoing energy bin :math:`j` and interpolate between successive values on the -outgoing energy distribution: - -.. math:: - :label: ace-law-1-intermediate - - \hat{E} = E_{\ell,j} + \xi_2 (E_{\ell,j+1} - E_{\ell,j}) - -where :math:`\xi_2` is a random number sampled uniformly on :math:`[0,1)`. Since -this outgoing energy may violate reaction kinematics, we then scale it to the -minimum and maximum energies we calculated earlier to get the final outgoing -energy: - -.. math:: - :label: ace-law-1-energy - - E' = E_{min} + \frac{\hat{E} - E_{\ell,1}}{E_{\ell,M} - E_{\ell,1}} - (E_{max} - E_{min}) - -ACE Law 3 - Inelastic Level Scattering -++++++++++++++++++++++++++++++++++++++ +Inelastic Level Scattering +^^^^^^^^^^^^^^^^^^^^^^^^^^ It can be shown (see Foderaro_) that in inelastic level scattering, the outgoing energy of the neutron :math:`E'` can be related to the Q-value of the reaction @@ -640,31 +562,50 @@ and the incoming energy: where :math:`A` is the mass of the target nucleus measured in neutron masses. -.. _ace-law-4: +.. _continuous-tabular: -ACE Law 4 - Continuous Tabular Distribution -+++++++++++++++++++++++++++++++++++++++++++ +Continuous Tabular Distribution +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -This representation is very similar to :ref:`ace-law-1` except that instead of -equiprobable outgoing energy bins, the outgoing energy distribution for each -incoming energy is represented with a probability distribution function. For -each incoming neutron energy :math:`E_i`, let us call :math:`p_{i,j}` the j-th -value in the probability distribution function, :math:`c_{i,j}` the j-th value -in the cumulative distribution function, and :math:`E_{i,j}` the j-th outgoing -energy. +In a continuous tabular distribution, a tabulated energy distribution is +provided for each of a set of incoming energies. While the representation itself +is simple, the complexity lies in how one interpolates between incident as well +as outgoing energies on such a table. If one performs simple interpolation +between tables for neighboring incident energies, it is possible that the +resulting energies would violate laws governing the kinematics, i.e., the +outgoing energy may be outside the range of available energy in the reaction. -We proceed first as we did for ACE Law 1, determining the bounding energies of -the particle's incoming energy such that :math:`E_i < E < E_{i+1}` and -calculating an interpolation factor :math:`f` with equation -:eq:`interpolation-factor`. Next, statistical interpolation is performed to -choose between using the outgoing energy distributions corresponding to energy -:math:`E_i` and :math:`E_{i+1}`. Let :math:`\ell` be the chosen table where -:math:`\ell = i` if :math:`\xi_1 > f` and :math:`\ell = i + 1` otherwise, and -:math:`\xi_1` is a random number. Then, we sample an outgoing energy bin +To avoid this situation, the accepted practice is to use a process known as +scaled interpolation [Doyas]_. First, we find the tabulated incident energies +which bound the actual incoming energy of the particle, i.e., find :math:`i` +such that :math:`E_i < E < E_{i+1}` and calculate the interpolation factor +:math:`f` via :eq:`interpolation-factor`. Then, we interpolate between the +minimum and maximum energies of the outgoing energy distributions corresponding +to :math:`E_i` and :math:`E_{i+1}`: + +.. math:: + :label: continuous-minmax + + E_{min} = E_{i,1} + f ( E_{i+1,1} - E_{i,1} ) \\ + E_{max} = E_{i,M} + f ( E_{i+1,M} - E_{i,M} ) + +where :math:`E_{min}` and :math:`E_{max}` are the minimum and maximum outgoing +energies of a scaled distribution, :math:`E_{i,j}` is the j-th outgoing energy +corresponding to the incoming energy :math:`E_i`, and :math:`M` is the number of +outgoing energy bins. + +Next, statistical interpolation is performed to choose between using the +outgoing energy distributions corresponding to energy :math:`E_i` and +:math:`E_{i+1}`. Let :math:`\ell` be the chosen table where :math:`\ell = i` if +:math:`\xi_1 > f` and :math:`\ell = i + 1` otherwise, and :math:`\xi_1` is a +random number. For each incoming neutron energy :math:`E_i`, let us call +:math:`p_{i,j}` the j-th value in the probability distribution function, +:math:`c_{i,j}` the j-th value in the cumulative distribution function, and +:math:`E_{i,j}` the j-th outgoing energy. We then sample an outgoing energy bin :math:`j` using the cumulative distribution function: .. math:: - :label: ace-law-4-sample-cdf + :label: continuous-sample-cdf c_{\ell,j} < \xi_2 < c_{\ell,j+1} @@ -692,22 +633,22 @@ If linear-linear interpolation is to be used, the outgoing energy on the \right ). Since this outgoing energy may violate reaction kinematics, we then scale it to -minimum and maximum energies interpolated between the neighboring outgoing -energy distributions to get the final outgoing energy: +minimum and maximum energies calculated in equation :eq:`continuous-minmax` to +get the final outgoing energy: .. math:: - :label: ace-law-4-energy + :label: continuous-eout E' = E_{min} + \frac{\hat{E} - E_{\ell,1}}{E_{\ell,M} - E_{\ell,1}} (E_{max} - E_{min}) where :math:`E_{min}` and :math:`E_{max}` are defined the same as in equation -:eq:`ace-law-1-minmax`. +:eq:`continuous-minmax`. .. _maxwell: -ACE Law 7 - Maxwell Fission Spectrum -++++++++++++++++++++++++++++++++++++ +Maxwell Fission Spectrum +^^^^^^^^^^^^^^^^^^^^^^^^ One representation of the secondary energies for neutrons from fission is the so-called Maxwell spectrum. A probability distribution for the Maxwell spectrum @@ -720,7 +661,7 @@ can be written in the form where :math:`E` is the incoming energy of the neutron and :math:`T` is the so-called nuclear temperature, which is a function of the incoming energy of the -neutron. The ACE format contains a list of nuclear temperatures versus incoming +neutron. The ENDF format contains a list of nuclear temperatures versus incoming energies. The nuclear temperature is interpolated between neighboring incoming energies using a specified interpolation law. Once the temperature :math:`T` is determined, we then calculate a candidate outgoing energy based on rule C64 in @@ -740,12 +681,12 @@ interval. The outgoing energy is only accepted if 0 \le E' \le E - U -where :math:`U` is called the restriction energy and is specified on the ACE -table. If the outgoing energy is rejected, it is resampled using equation +where :math:`U` is called the restriction energy and is specified in the ENDF +data. If the outgoing energy is rejected, it is resampled using equation :eq:`maxwell-E-candidate`. -ACE Law 9 - Evaporation Spectrum -++++++++++++++++++++++++++++++++ +Evaporation Spectrum +^^^^^^^^^^^^^^^^^^^^ Evaporation spectra are primarily used in compound nucleus processes where a secondary particle can "evaporate" from the compound nucleus if it has @@ -759,7 +700,7 @@ be written in the form where :math:`E` is the incoming energy of the neutron and :math:`T` is the nuclear temperature, which is a function of the incoming energy of the -neutron. The ACE format contains a list of nuclear temperatures versus incoming +neutron. The ENDF format contains a list of nuclear temperatures versus incoming energies. The nuclear temperature is interpolated between neighboring incoming energies using a specified interpolation law. Once the temperature :math:`T` is determined, we then calculate a candidate outgoing energy based on the algorithm @@ -777,11 +718,11 @@ energy as in equation :eq:`maxwell-restriction`. This algorithm has a much higher rejection efficiency than the standard technique, i.e. rule C45 in the `Monte Carlo Sampler`_. -ACE Law 11 - Energy-Dependent Watt Spectrum -+++++++++++++++++++++++++++++++++++++++++++ +Energy-Dependent Watt Spectrum +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The probability distribution for a Watt fission spectrum can be written in the -form +The probability distribution for a [Watt]_ fission spectrum can be written in +the form .. math:: :label: watt-spectrum @@ -805,29 +746,37 @@ where :math:`\xi` is a random number sampled on the interval :math:`[0,1)`. The outgoing energy is only accepted according to a specified restriction energy :math:`U` as defined in equation :eq:`maxwell-restriction`. -This algorithm can be found in Forrest Brown's lectures_ on Monte Carlo methods -and is an unpublished sampling scheme based on the original Watt spectrum -derivation [Watt]_. +A derivation of the algorithm described here can be found in a paper by Romano_. -ACE Law 44 - Kalbach-Mann Correlated Scattering -+++++++++++++++++++++++++++++++++++++++++++++++ +Product Angle-Energy Distributions +---------------------------------- -This law is very similar to ACE Law 4 except now the outgoing angle of the -neutron is correlated to the outgoing energy and is not sampled from a separate -distribution. For each incident neutron energy :math:`E_i` tabulated, there is -an array of precompound factors :math:`R_{i,j}` and angular distribution slopes -:math:`A_{i,j}` corresponding to each outgoing energy bin :math:`j` in addition -to the outgoing energies and distribution functions as in ACE Law 4. +If the secondary distribution for a product was given in file 6 in ENDF, the +angle and energy are correlated with one another and cannot be sampled +separately. Several representations exist in ENDF/ACE for correlated +angle-energy distributions. + +Kalbach-Mann Correlated Scattering +++++++++++++++++++++++++++++++++++ + +This law is very similar to the uncorrelated continuous tabular energy +distribution except now the outgoing angle of the neutron is correlated to the +outgoing energy and is not sampled from a separate distribution. For each +incident neutron energy :math:`E_i` tabulated, there is an array of precompound +factors :math:`R_{i,j}` and angular distribution slopes :math:`A_{i,j}` +corresponding to each outgoing energy bin :math:`j` in addition to the outgoing +energies and distribution functions as in :ref:`continuous-tabular`. The calculation of the outgoing energy of the neutron proceeds exactly the same -as in the algorithm described in :ref:`ace-law-4`. In that algorithm, we found -an interpolation factor :math:`f`, statistically sampled an incoming energy bin -:math:`\ell`, and sampled an outgoing energy bin :math:`j` based on the -tabulated cumulative distribution function. Once the outgoing energy has been -determined with equation :eq:`ace-law-4-energy`, we then need to calculate the -outgoing angle based on the tabulated Kalbach-Mann parameters. These parameters -themselves are subject to either histogram or linear-linear interpolation on the -outgoing energy grid. For histogram interpolation, the parameters are +as in the algorithm described in :ref:`continuous-tabular`. In that algorithm, +we found an interpolation factor :math:`f`, statistically sampled an incoming +energy bin :math:`\ell`, and sampled an outgoing energy bin :math:`j` based on +the tabulated cumulative distribution function. Once the outgoing energy has +been determined with equation :eq:`continuous-eout`, we then need to calculate +the outgoing angle based on the tabulated Kalbach-Mann parameters. These +parameters themselves are subject to either histogram or linear-linear +interpolation on the outgoing energy grid. For histogram interpolation, the +parameters are .. math:: :label: KM-parameters-histogram @@ -873,52 +822,55 @@ outgoing angle is \mu = \frac{1}{A} \ln \left ( \xi_4 e^A + (1 - \xi_4) e^{-A} \right ). -.. _ace-law-61: +.. _correlated-energy-angle: -ACE Law 61 - Correlated Energy and Angle Distribution -+++++++++++++++++++++++++++++++++++++++++++++++++++++ +Correlated Energy and Angle Distribution +++++++++++++++++++++++++++++++++++++++++ -This law is very similar to ACE Law 44 in the sense that the outgoing angle of -the neutron is correlated to the outgoing energy and is not sampled from a -separate distribution. In this case though, rather than being determined from an -analytical distribution function, the cosine of the scattering angle is -determined from a tabulated distribution. For each incident energy :math:`i` and -outgoing energy :math:`j`, there is a tabulated angular distribution. +This distribution is very similar to a Kalbach-Mann distribution in the sense +that the outgoing angle of the neutron is correlated to the outgoing energy and +is not sampled from a separate distribution. In this case though, rather than +being determined from an analytical distribution function, the cosine of the +scattering angle is determined from a tabulated distribution. For each incident +energy :math:`i` and outgoing energy :math:`j`, there is a tabulated angular +distribution. The calculation of the outgoing energy of the neutron proceeds exactly the same -as in the algorithm described in :ref:`ace-law-4`. In that algorithm, we found -an interpolation factor :math:`f`, statistically sampled an incoming energy bin -:math:`\ell`, and sampled an outgoing energy bin :math:`j` based on the -tabulated cumulative distribution function. Once the outgoing energy has been -determined with equation :eq:`ace-law-4-energy`, we then need to decide which -angular distribution to use. If histogram interpolation was used on the outgoing -energy bins, then we use the angular distribution corresponding to incoming -energy bin :math:`\ell` and outgoing energy bin :math:`j`. If linear-linear -interpolation was used on the outgoing energy bins, then we use the whichever -angular distribution was closer to the sampled value of the cumulative -distribution function for the outgoing energy. The actual algorithm used to -sample the chosen tabular angular distribution has been previously described in -:ref:`angle-tabular`. +as in the algorithm described in :ref:`continuous-tabular`. In that algorithm, +we found an interpolation factor :math:`f`, statistically sampled an incoming +energy bin :math:`\ell`, and sampled an outgoing energy bin :math:`j` based on +the tabulated cumulative distribution function. Once the outgoing energy has +been determined with equation :eq:`continuous-eout`, we then need to decide +which angular distribution to use. If histogram interpolation was used on the +outgoing energy bins, then we use the angular distribution corresponding to +incoming energy bin :math:`\ell` and outgoing energy bin :math:`j`. If +linear-linear interpolation was used on the outgoing energy bins, then we use +the whichever angular distribution was closer to the sampled value of the +cumulative distribution function for the outgoing energy. The actual algorithm +used to sample the chosen tabular angular distribution has been previously +described in :ref:`angle-tabular`. -ACE Law 66 - N-Body Phase Space Distribution -++++++++++++++++++++++++++++++++++++++++++++ +N-Body Phase Space Distribution ++++++++++++++++++++++++++++++++ Reactions in which there are more than two products of similar masses are sometimes best treated by using what's known as an N-body phase distribution. This distribution has the following probability density function -for outgoing energy of the :math:`i`-th particle in the center-of-mass system: +for outgoing energy and angle of the :math:`i`-th particle in the center-of-mass +system: .. math:: :label: n-body-pdf - p_i(E') dE' = C_n \sqrt{E'} (E_i^{max} - E')^{(3n/2) - 4} dE' + p_i(\mu, E') dE' d\mu = C_n \sqrt{E'} (E_i^{max} - E')^{(3n/2) - 4} dE' d\mu where :math:`n` is the number of outgoing particles, :math:`C_n` is a normalization constant, :math:`E_i^{max}` is the maximum center-of-mass energy -for particle :math:`i`, and :math:`E'` is the outgoing energy. The algorithm for -sampling the outgoing energy is based on algorithms R28, C45, and C64 in the -`Monte Carlo Sampler`_. First we calculate the maximum energy in the -center-of-mass using the following equation: +for particle :math:`i`, and :math:`E'` is the outgoing energy. We see in +equation :eq:`n-body-pdf` that the angle is simply isotropic in the +center-of-mass system. The algorithm for sampling the outgoing energy is based +on algorithms R28, C45, and C64 in the `Monte Carlo Sampler`_. First we +calculate the maximum energy in the center-of-mass using the following equation: .. math:: :label: n-body-emax @@ -961,7 +913,7 @@ distribution. First, the documentation (and code) for MCNP5-1.60 has a mistake in the algorithm for :math:`n = 4`. That being said, there are no existing nuclear data evaluations which use an N-body phase space distribution with :math:`n = 4`, so the error would not affect any calculations. In the -ENDF/B-VII.0 nuclear data evaluation, only one reaction uses an N-body phase +ENDF/B-VII.1 nuclear data evaluation, only one reaction uses an N-body phase space distribution at all, the :math:`(n,2n)` reaction with H-2. .. _transform-coordinates: @@ -1527,16 +1479,16 @@ accordingly. Continuous Outgoing Energies ++++++++++++++++++++++++++++ -If the thermal data was processed with :math:`iwt=2` in NJOY, then the -outgoing energy spectra is represented by a continuous outgoing energy spectra -in tabular form with linear-linear interpolation. The sampling of the outgoing -energy portion of this format is very similar to :ref:`ACE Law 61`, -but the sampling of the correlated angle is performed as it was in the other -two representations discussed in this sub-section. In the Law 61 algorithm, -we found an interpolation factor :math:`f`, statistically sampled an incoming +If the thermal data was processed with :math:`iwt=2` in NJOY, then the outgoing +energy spectra is represented by a continuous outgoing energy spectra in tabular +form with linear-linear interpolation. The sampling of the outgoing energy +portion of this format is very similar to :ref:`correlated-energy-angle`, but +the sampling of the correlated angle is performed as it was in the other two +representations discussed in this sub-section. In the Law 61 algorithm, we +found an interpolation factor :math:`f`, statistically sampled an incoming energy bin :math:`\ell`, and sampled an outgoing energy bin :math:`j` based on the tabulated cumulative distribution function. Once the outgoing energy has -been determined with equation :eq:`ace-law-4-energy`, we then need to decide +been determined with equation :eq:`continuous-eout`, we then need to decide which angular distribution data to use. Like the linear-linear interpolation case in Law 61, the angular distribution closest to the sampled value of the cumulative distribution function for the outgoing energy is utilized. The @@ -1723,6 +1675,8 @@ another. .. _MC21: http://www.osti.gov/bridge/servlets/purl/903083-HT5p1o/903083.pdf +.. _Romano: http://dx.doi.org/10.1016/j.cpc.2014.11.001 + .. _Sutton and Brown: http://www.osti.gov/bridge/product.biblio.jsp?osti_id=307911 .. _lectures: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-ur-05-4983.pdf diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index a17af8ac6..854c2bc4c 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -328,8 +328,11 @@ Core Classes :nosignatures: :template: myclass.rst + openmc.data.IncidentNeutron + openmc.data.Reaction openmc.data.Product openmc.data.Tabulated1D + openmc.data.ThermalScattering openmc.data.CoherentElastic Angle-Energy Distributions @@ -370,11 +373,6 @@ Classes openmc.data.ace.Library openmc.data.ace.Table - openmc.data.ace.NeutronTable - openmc.data.ace.SabTable - openmc.data.ace.PhotoatomicTable - openmc.data.ace.PhotonuclearTable - openmc.data.ace.Reaction Functions +++++++++ diff --git a/openmc/data/__init__.py b/openmc/data/__init__.py index 32de3b598..c6a1baf9d 100644 --- a/openmc/data/__init__.py +++ b/openmc/data/__init__.py @@ -1,4 +1,6 @@ from .data import * +from .neutron import * +from .reaction import * from .ace import * from .angle_distribution import * from .container import * @@ -11,3 +13,4 @@ from .kalbach_mann import * from .nbody import * from .thermal import * from .urr import * +from .library import * diff --git a/openmc/data/ace.py b/openmc/data/ace.py index 358d98789..2a39e208a 100644 --- a/openmc/data/ace.py +++ b/openmc/data/ace.py @@ -21,26 +21,9 @@ from os import SEEK_CUR import struct import sys from warnings import warn -from collections import OrderedDict -from copy import deepcopy import numpy as np -from numpy.polynomial import Polynomial -import h5py -from . import atomic_number, atomic_symbol, reaction_name -from .container import Tabulated1D, interpolation_scheme -from .angle_distribution import AngleDistribution -from .energy_distribution import * -from .product import Product -from .angle_energy import AngleEnergy -from .kalbach_mann import KalbachMann -from .uncorrelated import UncorrelatedAngleEnergy -from .correlated import CorrelatedAngleEnergy -from .nbody import NBodyPhaseSpace -from .thermal import CoherentElastic -from .urr import ProbabilityTables -from openmc.stats import Tabular, Discrete, Uniform, Mixture if sys.version_info[0] >= 3: basestring = str @@ -120,47 +103,6 @@ def ascii_to_binary(ascii_file, binary_file): binary.close() -def _get_tabulated_1d(array, idx=0): - """Create a Tabulated1D object from array. - - Parameters - ---------- - array : numpy.ndarray - Array is formed as a 1 dimensional array as follows: [number of regions, - final pair for each region, interpolation parameters, number of pairs, - x-values, y-values] - idx : int, optional - Offset to read from in array (default of zero) - - Returns - ------- - openmc.data.Tabulated1D - Tabulated data object - - """ - - # Get number of regions and pairs - n_regions = int(array[idx]) - n_pairs = int(array[idx + 1 + 2*n_regions]) - - # Get interpolation information - idx += 1 - if n_regions > 0: - nbt = np.asarray(array[idx:idx + n_regions], dtype=int) - interp = np.asarray(array[idx + n_regions:idx + 2*n_regions], dtype=int) - else: - # NR=0 regions implies linear-linear interpolation by default - nbt = np.array([n_pairs]) - interp = np.array([2]) - - # Get (x,y) pairs - idx += 2*n_regions + 1 - x = array[idx:idx + n_pairs] - y = array[idx + n_pairs:idx + 2*n_pairs] - - return Tabulated1D(x, y, nbt, interp) - - def get_table(filename, name=None): """Read a single table from an ACE file @@ -181,30 +123,14 @@ def get_table(filename, name=None): lib = Library(filename) if name is None: - return list(lib.tables.values())[0] + return lib.tables[0] else: - return lib.tables[name] - - -def get_all_tables(filename): - """Read all tables from an ACE file - - Parameters - ---------- - filename : str - Path of the ACE library to load table from - name : str, optional - Name of table to load, e.g. '92235.71c' - - Returns - ------- - list of openmc.data.ace.Table - ACE tables read from the file - - """ - - lib = Library(filename) - return list(lib.tables.values()) + for table in lib.tables: + if table.name == name: + return table + else: + raise ValueError('Could not find ACE table with name: {}' + .format(name)) class Library(object): @@ -224,10 +150,8 @@ class Library(object): Attributes ---------- - tables : dict - Dictionary whose keys are the names of the ACE tables and whose values - are the instances of subclasses of :class:`Table` - (e.g. :class:`NeutronTable`) + tables : list + List of :class:`Table` instances """ @@ -237,7 +161,7 @@ class Library(object): if table_names is not None: table_names = set(table_names) - self.tables = {} + self.tables = [] # Determine whether file is ASCII or binary try: @@ -291,10 +215,11 @@ class Library(object): # material name, atomic_weight_ratio, temperature, date, comment, mat = \ struct.unpack(str('=10sdd10s70s10s'), fh.read(116)) - name = name.strip() + name = name.decode().strip() # Read ZAID/awr combinations - izaw_pairs = struct.unpack(str('=' + 16*'id'), fh.read(192)) + data = struct.unpack(str('=' + 16*'id'), fh.read(192)) + pairs = list(zip(data[::2], data[1::2])) # Read NXS nxs = list(struct.unpack(str('=16i'), fh.read(64))) @@ -303,30 +228,14 @@ class Library(object): length = nxs[0] n_records = (length + entries - 1)//entries - # name is bytes, make it a string - name = name.decode() # verify that we are supposed to read this table in if (table_names is not None) and (name not in table_names): fh.seek(start_position + recl_length*(n_records + 1)) continue - # ensure we have a valid table type - if len(name) == 0 or name[-1] not in table_types: - warn("Unsupported table: " + name, RuntimeWarning) - fh.seek(start_position + recl_length*(n_records + 1)) - continue - - # get the table - table = table_types[name[-1]](name, atomic_weight_ratio, temperature) - if verbose: temperature_in_K = round(temperature * 1e6 / 8.617342e-5) print("Loading nuclide {0} at {1} K".format(name, temperature_in_K)) - self.tables[name] = table - - # If table is S(a,b), add zaids - zaids = np.array(izaw_pairs[::2]) - table.zaids = zaids[np.nonzero(zaids)] # Read JXS jxs = list(struct.unpack(str('=32i'), fh.read(128))) @@ -336,20 +245,22 @@ class Library(object): xss = list(struct.unpack(str('={0}d'.format(length)), fh.read(length*8))) - # Insert empty object at beginning of NXS, JXS, and XSS arrays so - # that the indexing will be the same as Fortran. This makes it - # easier to follow the ACE format specification. + # Insert zeros at beginning of NXS, JXS, and XSS arrays so that the + # indexing will be the same as Fortran. This makes it easier to + # follow the ACE format specification. nxs.insert(0, 0) - table._nxs = np.array(nxs, dtype=int) + nxs = np.array(nxs, dtype=int) jxs.insert(0, 0) - table._jxs = np.array(jxs, dtype=int) + jxs = np.array(jxs, dtype=int) xss.insert(0, 0.0) - table._xss = np.array(xss) + xss = np.array(xss) - # Read all data blocks - table._read_all() + # Create ACE table with data read in + table = Table(name, atomic_weight_ratio, temperature, pairs, + nxs, jxs, xss) + self.tables.append(table) # Advance to next record fh.seek(start_position + recl_length*(n_records + 1)) @@ -397,7 +308,9 @@ class Library(object): atomic_weight_ratio = float(words[1]) temperature = float(words[2]) - izaw_pairs = (' '.join(lines[2:6])).split() + datastr = ' '.join(lines[2:6]).split() + pairs = list(zip(map(int, datastr[::2]), + map(float, datastr[1::2]))) datastr = '0 ' + ' '.join(lines[6:8]) nxs = np.fromstring(datastr, sep=' ', dtype=int) @@ -417,14 +330,6 @@ class Library(object): lines = [fh.readline() for i in range(13)] continue - # ensure we have a valid table type - if len(name) == 0 or name[-1] not in table_types: - warn("Unsupported table: " + name, RuntimeWarning) - fh.seek(n_bytes, SEEK_CUR) - fh.readline() - lines = [fh.readline() for i in range(13)] - continue - # read and fix over-shoot lines += fh.readlines(n_bytes) if 12 + n_lines < len(lines): @@ -432,41 +337,32 @@ class Library(object): lines = lines[:12+n_lines] fh.seek(-goback, SEEK_CUR) - # get the table - table = table_types[name[-1]](name, atomic_weight_ratio, temperature) - if verbose: temperature_in_K = round(temperature * 1e6 / 8.617342e-5) print("Loading nuclide {0} at {1} K".format(name, temperature_in_K)) - self.tables[name] = table # Read comment - table.comment = lines[1].strip() - - # If table is S(a,b), add zaids - if isinstance(table, SabTable): - zaids = np.fromiter(map(int, izaw_pairs[::2]), int) - table.zaids = zaids[np.nonzero(zaids)] - - # Add NXS, JXS, and XSS arrays to table Insert empty object at - # beginning of NXS, JXS, and XSS arrays so that the indexing will be - # the same as Fortran. This makes it easier to follow the ACE format - # specification. - table._nxs = nxs + comment = lines[1].strip() + # Insert zeros at beginning of NXS, JXS, and XSS arrays so that the + # indexing will be the same as Fortran. This makes it easier to + # follow the ACE format specification. datastr = '0 ' + ' '.join(lines[8:12]) - table._jxs = np.fromstring(datastr, dtype=int, sep=' ') + jxs = np.fromstring(datastr, dtype=int, sep=' ') datastr = '0.0 ' + ''.join(lines[12:12+n_lines]) - table._xss = np.fromstring(datastr, sep=' ') + xss = np.fromstring(datastr, sep=' ') + + table = Table(name, atomic_weight_ratio, temperature, pairs, + nxs, jxs, xss) + self.tables.append(table) # Read all data blocks - table._read_all() lines = [fh.readline() for i in range(13)] class Table(object): - """Abstract superclass of all other classes for cross section tables. + """ACE cross section table Parameters ---------- @@ -475,1387 +371,28 @@ class Table(object): atomic_weight_ratio : float Atomic mass ratio of the target nuclide. temperature : float - Temperature of the target nuclide in eV. - - Attributes - ---------- - name : str - ZAID identifier of the table, e.g. '92235.70c'. - atomic_weight_ratio : float - Atomic mass ratio of the target nuclide. - temperature : float - Temperature of the target nuclide in eV. + Temperature of the target nuclide in MeV. + pairs : list of tuple + 16 pairs of ZAIDs and atomic weight ratios. Used for thermal scattering + tables to indicate what isotopes scattering is applied to. + nxs : numpy.ndarray + Array that defines various lengths with in the table + jxs : numpy.ndarray + Array that gives locations in the ``xss`` array for various blocks of + data + xss : numpy.ndarray + Raw data for the ACE table """ - - def __init__(self, name, atomic_weight_ratio, temperature): + def __init__(self, name, atomic_weight_ratio, temperature, pairs, + nxs, jxs, xss): self.name = name self.atomic_weight_ratio = atomic_weight_ratio self.temperature = temperature - - def _read_all(self): - raise NotImplementedError - - def _get_continuous_tabular(self, idx, ldis): - """Get continuous tabular energy distribution (ACE law 4) starting at specified - index in the XSS array. - - Parameters - ---------- - idx : int - Index in XSS array of the start of the energy distribution data - (LDIS + LOCC - 1) - ldis : int - Index in XSS array of the start of the energy distribution block - (e.g. JXS[11]) - - Returns - ------- - openmc.data.energy_distribution.ContinuousTabular - Continuous tabular energy distribution - - """ - - # Read number of interpolation regions and incoming energies - n_regions = int(self._xss[idx]) - n_energy_in = int(self._xss[idx + 1 + 2*n_regions]) - - # Get interpolation information - idx += 1 - if n_regions > 0: - breakpoints = np.asarray(self._xss[idx:idx + n_regions], dtype=int) - interpolation = np.asarray(self._xss[idx + n_regions: - idx + 2*n_regions], dtype=int) - else: - breakpoints = np.array([n_energy_in]) - interpolation = np.array([2]) - - # Incoming energies at which distributions exist - idx += 2 * n_regions + 1 - energy = self._xss[idx:idx + n_energy_in] - - # Location of distributions - idx += n_energy_in - loc_dist = np.asarray(self._xss[idx:idx + n_energy_in], dtype=int) - - # Initialize variables - energy_out = [] - - # Read each outgoing energy distribution - for i in range(n_energy_in): - idx = ldis + loc_dist[i] - 1 - - # intt = interpolation scheme (1=hist, 2=lin-lin) - INTTp = int(self._xss[idx]) - intt = INTTp % 10 - n_discrete_lines = (INTTp - intt)//10 - if intt not in (1, 2): - warn("Interpolation scheme for continuous tabular distribution " - "is not histogram or linear-linear.") - intt = 2 - - n_energy_out = int(self._xss[idx + 1]) - data = self._xss[idx + 2:idx + 2 + 3*n_energy_out] - data.shape = (3, n_energy_out) - - # Create continuous distribution - eout_continuous = Tabular(data[0][n_discrete_lines:], - data[1][n_discrete_lines:], - interpolation_scheme[intt]) - eout_continuous.c = data[2][n_discrete_lines:] - - # If discrete lines are present, create a mixture distribution - if n_discrete_lines > 0: - eout_discrete = Discrete(data[0][:n_discrete_lines], - data[1][:n_discrete_lines]) - eout_discrete.c = data[2][:n_discrete_lines] - if n_discrete_lines == n_energy_out: - eout_i = eout_discrete - else: - p_discrete = min(sum(eout_discrete.p), 1.0) - eout_i = Mixture([p_discrete, 1. - p_discrete], - [eout_discrete, eout_continuous]) - else: - eout_i = eout_continuous - - energy_out.append(eout_i) - - return ContinuousTabular(breakpoints, interpolation, energy, - energy_out) - - def _get_general_evaporation(self, idx): - # Read nuclear temperature as Tabulated1D - theta = _get_tabulated_1d(array, idx) - - # X-function - nr = int(array[idx]) - ne = int(array[idx + 1 + 2*nr]) - idx += 2 + 2*nr + 2*ne - net = int(array[idx]) - x = array[idx + 1:idx + 1 + net] - - raise NotImplementedError("Where'd you get this ACE file from?") - - def _get_maxwell_energy(self, idx): - # Read nuclear temperature as Tabulated1D - theta = _get_tabulated_1d(self._xss, idx) - - # Restriction energy - nr = int(self._xss[idx]) - ne = int(self._xss[idx + 1 + 2*nr]) - u = self._xss[idx + 2 + 2*nr + 2*ne] - - return MaxwellEnergy(theta, u) - - def _get_evaporation(self, idx): - # Read nuclear temperature as Tabulated1D - theta = _get_tabulated_1d(self._xss, idx) - - # Restriction energy - nr = int(self._xss[idx]) - ne = int(self._xss[idx + 1 + 2*nr]) - u = self._xss[idx + 2 + 2*nr + 2*ne] - - return Evaporation(theta, u) - - def _get_watt_energy(self, idx): - # Energy-dependent a parameter - a = _get_tabulated_1d(self._xss, idx) - - # Advance index - nr = int(self._xss[idx]) - ne = int(self._xss[idx + 1 + 2*nr]) - idx += 2 + 2*nr + 2*ne - - # Energy-dependent b parameter - b = _get_tabulated_1d(self._xss, idx) - - # Advance index - nr = int(self._xss[idx]) - ne = int(self._xss[idx + 1 + 2*nr]) - idx += 2 + 2*nr + 2*ne - - # Restriction energy - u = self._xss[idx] - - return WattEnergy(a, b, u) - - def _get_kalbach_mann(self, idx, ldis): - # Read number of interpolation regions and incoming energies - n_regions = int(self._xss[idx]) - n_energy_in = int(self._xss[idx + 1 + 2*n_regions]) - - # Get interpolation information - idx += 1 - if n_regions > 0: - breakpoints = np.asarray(self._xss[idx:idx + n_regions], dtype=int) - interpolation = np.asarray(self._xss[idx + n_regions: - idx + 2*n_regions], dtype=int) - else: - breakpoints = np.array([n_energy_in]) - interpolation = np.array([2]) - - # Incoming energies at which distributions exist - idx += 2 * n_regions + 1 - energy = self._xss[idx:idx + n_energy_in] - - # Location of distributions - idx += n_energy_in - loc_dist = np.asarray(self._xss[idx:idx + n_energy_in], dtype=int) - - # Initialize variables - energy_out = [] - km_r = [] - km_a = [] - - # Read each outgoing energy distribution - for i in range(n_energy_in): - idx = ldis + loc_dist[i] - 1 - - # intt = interpolation scheme (1=hist, 2=lin-lin) - INTTp = int(self._xss[idx]) - intt = INTTp % 10 - n_discrete_lines = (INTTp - intt)//10 - if intt not in (1, 2): - warn("Interpolation scheme for continuous tabular distribution " - "is not histogram or linear-linear.") - intt = 2 - - n_energy_out = int(self._xss[idx + 1]) - data = self._xss[idx + 2:idx + 2 + 5*n_energy_out] - data.shape = (5, n_energy_out) - - # Create continuous distribution - eout_continuous = Tabular(data[0][n_discrete_lines:], - data[1][n_discrete_lines:], - interpolation_scheme[intt]) - eout_continuous.c = data[2][n_discrete_lines:] - - # If discrete lines are present, create a mixture distribution - if n_discrete_lines > 0: - eout_discrete = Discrete(data[0][:n_discrete_lines], - data[1][:n_discrete_lines]) - eout_discrete.c = data[2][:n_discrete_lines] - if n_discrete_lines == n_energy_out: - eout_i = eout_discrete - else: - p_discrete = min(sum(eout_discrete.p), 1.0) - eout_i = Mixture([p_discrete, 1. - p_discrete], - [eout_discrete, eout_continuous]) - else: - eout_i = eout_continuous - - energy_out.append(eout_i) - km_r.append(Tabulated1D(data[0], data[3])) - km_a.append(Tabulated1D(data[0], data[4])) - - return KalbachMann(breakpoints, interpolation, energy, energy_out, - km_r, km_a) - - def _get_correlated(self, idx, ldis): - # Read number of interpolation regions and incoming energies - n_regions = int(self._xss[idx]) - n_energy_in = int(self._xss[idx + 1 + 2*n_regions]) - - # Get interpolation information - idx += 1 - if n_regions > 0: - breakpoints = np.asarray(self._xss[idx:idx + n_regions], dtype=int) - interpolation = np.asarray(self._xss[idx + n_regions: - idx + 2*n_regions], dtype=int) - else: - breakpoints = np.array([n_energy_in]) - interpolation = np.array([2]) - - # Incoming energies at which distributions exist - idx += 2 * n_regions + 1 - energy = self._xss[idx:idx + n_energy_in] - - # Location of distributions - idx += n_energy_in - loc_dist = np.asarray(self._xss[idx:idx + n_energy_in], dtype=int) - - # Initialize list of distributions - energy_out = [] - mu = [] - - # Read each outgoing energy distribution - for i in range(n_energy_in): - idx = ldis + loc_dist[i] - 1 - - # intt = interpolation scheme (1=hist, 2=lin-lin) - INTTp = int(self._xss[idx]) - intt = INTTp % 10 - n_discrete_lines = (INTTp - intt)//10 - if intt not in (1, 2): - warn("Interpolation scheme for continuous tabular distribution " - "is not histogram or linear-linear.") - intt = 2 - - # Secondary energy distribution - n_energy_out = int(self._xss[idx + 1]) - data = self._xss[idx + 2:idx + 2 + 4*n_energy_out] - data.shape = (4, n_energy_out) - - # Create continuous distribution - eout_continuous = Tabular(data[0][n_discrete_lines:], - data[1][n_discrete_lines:], - interpolation_scheme[intt], - ignore_negative=True) - eout_continuous.c = data[2][n_discrete_lines:] - - # If discrete lines are present, create a mixture distribution - if n_discrete_lines > 0: - eout_discrete = Discrete(data[0][:n_discrete_lines], - data[1][:n_discrete_lines]) - eout_discrete.c = data[2][:n_discrete_lines] - if n_discrete_lines == n_energy_out: - eout_i = eout_discrete - else: - p_discrete = min(sum(eout_discrete.p), 1.0) - eout_i = Mixture([p_discrete, 1. - p_discrete], - [eout_discrete, eout_continuous]) - else: - eout_i = eout_continuous - - energy_out.append(eout_i) - - lc = np.asarray(data[3], dtype=int) - - # Secondary angular distributions - mu_i = [] - for j in range(n_energy_out): - if lc[j] > 0: - idx = ldis + abs(lc[j]) - 1 - - intt = int(self._xss[idx]) - n_cosine = int(self._xss[idx + 1]) - data = self._xss[idx + 2:idx + 2 + 3*n_cosine] - data.shape = (3, n_cosine) - - mu_ij = Tabular(data[0], data[1], interpolation_scheme[intt]) - mu_ij.c = data[2] - else: - # Isotropic distribution - mu_ij = Uniform(-1., 1.) - - mu_i.append(mu_ij) - - # Add cosine distributions for this incoming energy to list - mu.append(mu_i) - - return CorrelatedAngleEnergy(breakpoints, interpolation, energy, - energy_out, mu) - - def _get_energy_distribution(self, location_dist, location_start, rx=None): - """Returns an EnergyDistribution object from data read in starting at - location_start. - - Parameters - ---------- - location_dist : int - Index in the XSS array corresponding to the start of a block, - e.g. JXS(11) for the the DLW block. - location_start : int - Index in the XSS array corresponding to the start of an energy - distribution array - rx : Reaction - Reaction this energy distribution will be associated with - - Returns - ------- - distribution : openmc.data.AngleEnergy - Secondary angle-energy distribution - - """ - - # Set starting index for energy distribution - idx = location_dist + location_start - 1 - - law = int(self._xss[idx + 1]) - location_data = int(self._xss[idx + 2]) - - # Position index for reading law data - idx = location_dist + location_data - 1 - - # Parse energy distribution data - if law == 2: - primary_flag = int(self._xss[idx]) - energy = self._xss[idx + 1] - distribution = UncorrelatedAngleEnergy() - distribution.energy = DiscretePhoton(primary_flag, energy, - self.atomic_weight_ratio) - elif law in (3, 33): - threshold, mass_ratio = self._xss[idx:idx + 2] - distribution = UncorrelatedAngleEnergy() - distribution.energy = LevelInelastic(threshold, mass_ratio) - elif law == 4: - distribution = UncorrelatedAngleEnergy() - distribution.energy = self._get_continuous_tabular(idx, location_dist) - elif law == 5: - distribution = UncorrelatedAngleEnergy() - distribution.energy = self._get_general_evaporation(idx) - elif law == 7: - distribution = UncorrelatedAngleEnergy() - distribution.energy = self._get_maxwell_energy(idx) - elif law == 9: - distribution = UncorrelatedAngleEnergy() - distribution.energy = self._get_evaporation(idx) - elif law == 11: - distribution = UncorrelatedAngleEnergy() - distribution.energy = self._get_watt_energy(idx) - elif law == 44: - distribution = self._get_kalbach_mann(idx, location_dist) - elif law == 61: - distribution = self._get_correlated(idx, location_dist) - elif law == 66: - n_particles = int(self._xss[idx]) - total_mass = self._xss[idx + 1] - distribution = NBodyPhaseSpace(total_mass, n_particles, - self.atomic_weight_ratio, rx.Q_value) - else: - raise IOError("Unsupported ACE secondary energy " - "distribution law {0}".format(law)) - - return distribution - - -class NeutronTable(Table): - """A NeutronTable object contains continuous-energy neutron interaction data - read from an ACE-formatted table. These objects are not normally - instantiated by the user but rather created when reading data using a - Library object and stored within the :attr:`Library.tables` attribute. - - Parameters - ---------- - name : str - ZAID identifier of the table, e.g. '92235.70c'. - atomic_weight_ratio : float - Atomic mass ratio of the target nuclide. - temperature : float - Temperature of the target nuclide in eV. - - Attributes - ---------- - absorption_xs : numpy.ndarray - The microscopic absorption cross section for each value on the energy - grid. - atomic_weight_ratio : float - Atomic weight ratio of the target nuclide. - energy : numpy.ndarray - The energy values (MeV) at which reaction cross-sections are tabulated. - heating_number : numpy.ndarray - The total heating number for each value on the energy grid in MeV-b. - name : str - ZAID identifier of the table, e.g. 92235.70c. - reactions : collections.OrderedDict - Contains the cross sections, secondary angle and energy distributions, - and other associated data for each reaction. The keys are the MT values - and the values are Reaction objects. - temperature : float - Temperature of the target nuclide in eV. - total_xs : numpy.ndarray - The microscopic total cross section for each value on the energy grid in b. - urr : None or openmc.data.ProbabilityTables - Unresolved resonance region probability tables - - """ - - def __init__(self, name, atomic_weight_ratio, temperature): - super(NeutronTable, self).__init__(name, atomic_weight_ratio, temperature) - self.absorption_xs = None - self.energy = None - self.heating_number = None - self.total_xs = None - self.reactions = OrderedDict() - self.urr = None + self.pairs = pairs + self.nxs = nxs + self.jxs = jxs + self.xss = xss def __repr__(self): - if hasattr(self, 'name'): - return "".format(self.name) - else: - return "" - - def __iter__(self): - return iter(self.reactions.values()) - - def _read_all(self): - self._read_cross_sections() - self._read_nu() - self._read_secondaries() - self._read_photon_production_data() - self._read_unr() - - def _read_cross_sections(self): - """Read reaction cross sections and other data. - - Reads and parses the ESZ, MTR, LQR, TRY, LSIG, and SIG blocks. These - blocks contain the energy grid, all reaction cross sections, the total - cross section, average heating numbers, and a list of reactions with - their Q-values and multiplicites. - """ - - # Determine number of energies on nuclide grid and number of reactions - # excluding elastic scattering - n_energies = self._nxs[3] - n_reactions = self._nxs[4] - - # Read energy grid and total, absorption, elastic scattering, and - # heating cross sections -- note that this appear separate from the rest - # of the reaction cross sections - arr = self._xss[self._jxs[1]:self._jxs[1] + 5*n_energies] - arr.shape = (5, n_energies) - self.energy, self.total_xs, self.absorption_xs, \ - elastic_xs, self.heating_number = arr - - # Create elastic scattering reaction - elastic_scatter = Reaction(2, self) - elastic_scatter.products.append(Product('neutron')) - elastic_scatter.xs = Tabulated1D(self.energy, elastic_xs) - self.reactions[2] = elastic_scatter - - # Create all other reactions with MT values - mts = np.asarray(self._xss[self._jxs[3]:self._jxs[3] + n_reactions], dtype=int) - qvalues = np.asarray(self._xss[self._jxs[4]:self._jxs[4] + - n_reactions], dtype=float) - tys = np.asarray(self._xss[self._jxs[5]:self._jxs[5] + n_reactions], dtype=int) - - # Create all reactions other than elastic scatter - reactions = [(mt, Reaction(mt, self)) for mt in mts] - self.reactions.update(reactions) - - # Loop over all reactions other than elastic scattering - for i, rx in enumerate(list(self.reactions.values())[1:]): - # Copy Q values determine if scattering should be treated in the - # center-of-mass or lab system - rx.Q_value = qvalues[i] - rx.center_of_mass = (tys[i] < 0) - - # For neutron-producing reactions, get yield - if rx.MT < 100: - if tys[i] != 19: - if abs(tys[i]) > 100: - # Energy-dependent neutron yield - idx = self._jxs[11] + abs(tys[i]) - 101 - yield_ = _get_tabulated_1d(self._xss, idx) - else: - yield_ = abs(tys[i]) - - neutron = Product('neutron') - neutron.yield_ = yield_ - rx.products.append(neutron) - - # Get locator for cross-section data - loc = int(self._xss[self._jxs[6] + i]) - - # Determine starting index on energy grid - rx.threshold_idx = int(self._xss[self._jxs[7] + loc - 1]) - 1 - - # Determine number of energies in reaction - n_energies = int(self._xss[self._jxs[7] + loc]) - energy = self.energy[rx.threshold_idx:rx.threshold_idx + n_energies] - - # Read reaction cross section - xs = self._xss[self._jxs[7] + loc + 1:self._jxs[7] + loc + 1 + n_energies] - rx.xs = Tabulated1D(energy, xs) - - def _read_nu(self): - """Read the NU block -- this contains information on the prompt and delayed - neutron precursor yields, decay constants, etc - - """ - # No NU block - if self._jxs[2] == 0: - return - - products = [] - derived_products = [] - - # Either prompt nu or total nu is given - if self._xss[self._jxs[2]] > 0: - whichnu = 'prompt' if self._jxs[24] > 0 else 'total' - - neutron = Product('neutron') - neutron.emission_mode = whichnu - - idx = self._jxs[2] - LNU = int(self._xss[idx]) - if LNU == 1: - # Polynomial function form of nu - NC = int(self._xss[idx+1]) - coefficients = self._xss[idx+2 : idx+2+NC] - neutron.yield_ = Polynomial(coefficients) - elif LNU == 2: - # Tabular data form of nu - neutron.yield_ = _get_tabulated_1d(self._xss, idx + 1) - - products.append(neutron) - - # Both prompt nu and total nu - elif self._xss[self._jxs[2]] < 0: - # Read prompt neutron yield - prompt_neutron = Product('neutron') - prompt_neutron.emission_mode = 'prompt' - - idx = self._jxs[2] + 1 - LNU = int(self._xss[idx]) - if LNU == 1: - # Polynomial function form of nu - NC = int(self._xss[idx+1]) - coefficients = self._xss[idx+2 : idx+2+NC] - prompt_neutron.yield_ = Polynomial(coefficients) - elif LNU == 2: - # Tabular data form of nu - prompt_neutron.yield_ = _get_tabulated_1d(self._xss, idx + 1) - - # Read total neutron yield - total_neutron = Product('neutron') - total_neutron.emission_mode = 'total' - - idx = self._jxs[2] + int(abs(self._xss[self._jxs[2]])) + 1 - LNU = int(self._xss[idx]) - - if LNU == 1: - # Polynomial function form of nu - NC = int(self._xss[idx+1]) - coefficients = self._xss[idx+2 : idx+2+NC] - total_neutron.yield_ = Polynomial(coefficients) - elif LNU == 2: - # Tabular data form of nu - total_neutron.yield_ = _get_tabulated_1d(self._xss, idx + 1) - - products.append(prompt_neutron) - derived_products.append(total_neutron) - - # Check for delayed nu data - if self._jxs[24] > 0: - yield_delayed = _get_tabulated_1d(self._xss, self._jxs[24] + 1) - - # Delayed neutron precursor distribution - idx = self._jxs[25] - n_group = self._nxs[8] - total_group_probability = 0. - for i, group in enumerate(range(n_group)): - delayed_neutron = Product('neutron') - delayed_neutron.emission_mode = 'delayed' - delayed_neutron.decay_rate = self._xss[idx] - - group_probability = _get_tabulated_1d(self._xss, idx + 1) - if np.all(group_probability.y == group_probability.y[0]): - delayed_neutron.yield_ = deepcopy(yield_delayed) - delayed_neutron.yield_.y *= group_probability.y[0] - total_group_probability += group_probability.y[0] - else: - raise NotImplementedError( - 'Delayed neutron with energy-dependent ' - 'group probability') - - # Advance position - nr = int(self._xss[idx + 1]) - ne = int(self._xss[idx + 2 + 2*nr]) - idx += 3 + 2*nr + 2*ne - - # Energy distribution for delayed fission neutrons - location_start = int(self._xss[self._jxs[26] + group]) - delayed_neutron.distribution.append( - self._get_energy_distribution(self._jxs[27], location_start)) - - products.append(delayed_neutron) - - # Renormalize delayed neutron yields to reflect fact that in ACE - # file, the sum of the group probabilities is not exactly one - for product in products[1:]: - product.yield_.y /= total_group_probability - - # Copy fission neutrons to reactions - for MT, rx in self.reactions.items(): - if MT in (18, 19, 20, 21, 38): - rx.products = deepcopy(products) - if derived_products: - rx.derived_products = deepcopy(derived_products) - - def _get_angle_distribution(self, location_dist, location_start): - # Set starting index for angle distribution - idx = location_dist + location_start - 1 - - # Number of energies at which angular distributions are tabulated - n_energies = int(self._xss[idx]) - idx += 1 - - # Incoming energy grid - energy = self._xss[idx:idx + n_energies] - idx += n_energies - - # Read locations for angular distributions - lc = np.asarray(self._xss[idx:idx + n_energies], dtype=int) - idx += n_energies - - mu = [] - for i in range(n_energies): - if lc[i] > 0: - # Equiprobable 32 bin distribution - idx = location_dist + abs(lc[i]) - 1 - cos = self._xss[idx:idx + 33] - pdf = np.zeros(33) - pdf[:32] = 1.0/(32.0*np.diff(cos)) - cdf = np.linspace(0.0, 1.0, 33) - - mu_i = Tabular(cos, pdf, 'histogram', ignore_negative=True) - mu_i.c = cdf - elif lc[i] < 0: - # Tabular angular distribution - idx = location_dist + abs(lc[i]) - 1 - intt = int(self._xss[idx]) - n_points = int(self._xss[idx + 1]) - data = self._xss[idx + 2:idx + 2 + 3*n_points] - data.shape = (3, n_points) - - mu_i = Tabular(data[0], data[1], interpolation_scheme[intt]) - mu_i.c = data[2] - else: - # Isotropic angular distribution - mu_i = Uniform(-1., 1.) - - mu.append(mu_i) - - return AngleDistribution(energy, mu) - - def _read_secondaries(self): - """Read angle/energy distributions for each reaction MT - """ - - # Number of reactions with secondary neutrons (including elastic - # scattering) - n_reactions = self._nxs[5] + 1 - - for i, rx in enumerate(list(self.reactions.values())[:n_reactions]): - if rx.MT == 18: - for p in rx.products: - if p.emission_mode == 'prompt': - neutron = p - break - else: - neutron = rx.products[0] - - if i > 0: - # Determine locator for ith energy distribution - lnw = int(self._xss[self._jxs[10] + i - 1]) - - while lnw > 0: - # Applicability of this distribution - neutron.applicability.append(_get_tabulated_1d( - self._xss, self._jxs[11] + lnw + 2)) - - # Read energy distribution data - neutron.distribution.append(self._get_energy_distribution( - self._jxs[11], lnw, rx)) - - lnw = int(self._xss[self._jxs[11] + lnw - 1]) - else: - # No energy distribution for elastic scattering - neutron.distribution.append(UncorrelatedAngleEnergy()) - - # Check if angular distribution data exist - loc = int(self._xss[self._jxs[8] + i]) - if loc == -1: - # Angular distribution data are given as part of product - # angle-energy distribution - continue - elif loc == 0: - # No angular distribution data are given for this - # reaction, isotropic scattering is asssumed - angle_dist = None - else: - angle_dist = self._get_angle_distribution(self._jxs[9], loc) - - # Apply angular distribution to each uncorrelated angle-energy - # distribution - if angle_dist is not None: - for d in neutron.distribution: - d.angle = angle_dist - - def _read_photon_production_data(self): - """Read cross sections for each photon-production reaction""" - - n_photon_reactions = self._nxs[6] - photon_mts = np.asarray(self._xss[self._jxs[13]:self._jxs[13] + - n_photon_reactions], dtype=int) - - for i, rx in enumerate(photon_mts): - # Determine corresponding reaction - mt = photon_mts[i] // 1000 - reactions = [] - if mt not in self.reactions: - # If the photon is assigned to MT=18 but the file splits fission - # into MT=19,20,21,38, assign the photon product to each of the - # individual reactions - if mt == 18: - for mt_fiss in (19, 20, 21, 38): - if mt_fiss in self.reactions: - reactions.append(self.reactions[mt_fiss]) - if not reactions: - reactions.append(Reaction(mt, self)) - else: - reactions.append(self.reactions[mt]) - - # Create photon product and assign to reactions - photon = Product('photon') - for rx in reactions: - rx.products.append(photon) - - # ================================================================== - # Read photon yield / production cross section - - loca = int(self._xss[self._jxs[14] + i]) - idx = self._jxs[15] + loca - 1 - mftype = int(self._xss[idx]) - idx += 1 - - if mftype in (12, 16): - # Yield data taken from ENDF File 12 or 6 - mtmult = int(self._xss[idx]) - assert mtmult == mt - - # Read photon yield as function of energy - photon.yield_ = _get_tabulated_1d(self._xss, idx + 1) - - elif mftype == 13: - # Cross section data from ENDF File 13 - - # Energy grid index at which data starts - threshold_idx = int(self._xss[idx]) - 1 - - # Get photon production cross section - n_energy = int(self._xss[idx + 1]) - photon._xs = self._xss[idx + 2:idx + 2 + n_energy] - - # Determine yield based on ratio of cross sections - energy = self.energy[threshold_idx:threshold_idx + n_energy] - photon.yield_ = Tabulated1D(energy, photon._xs) - - else: - raise ValueError("MFTYPE must be 12, 13, 16. Got {0}".format( - mftype)) - - # ================================================================== - # Read photon energy distribution - - location_start = int(self._xss[self._jxs[18] + i]) - - # Read energy distribution data - distribution = self._get_energy_distribution( - self._jxs[19], location_start) - assert isinstance(distribution, UncorrelatedAngleEnergy) - - # ================================================================== - # Read photon angular distribution - loc = int(self._xss[self._jxs[16] + i]) - - if loc == 0: - # No angular distribution data are given for this reaction, - # isotropic scattering is asssumed in LAB - energy = np.array([photon.yield_.x[0], photon.yield_.x[-1]]) - mu_isotropic = Uniform(-1., 1.) - distribution.angle = AngleDistribution( - energy, [mu_isotropic, mu_isotropic]) - else: - distribution.angle = self._get_angle_distribution(self._jxs[17], loc) - - # Add to list of distributions - photon.distribution.append(distribution) - - def _read_unr(self): - """Read the unresolved resonance range probability tables if present. - """ - - # Check if URR probability tables are present - idx = self._jxs[23] - if idx == 0: - return - - N = int(self._xss[idx]) # Number of incident energies - M = int(self._xss[idx+1]) # Length of probability table - interpolation = int(self._xss[idx+2]) - inelastic_flag = int(self._xss[idx+3]) - absorption_flag = int(self._xss[idx+4]) - multiply_smooth = (int(self._xss[idx+5]) == 1) - idx += 6 - - # Get energies at which tables exist - energy = self._xss[idx : idx+N] - idx += N - - # Get probability tables - table = self._xss[idx:idx+N*6*M] - table.shape = (N, 6, M) - - # Create object - self.urr = ProbabilityTables(energy, table, interpolation, inelastic_flag, - absorption_flag, multiply_smooth) - - def export_to_hdf5(self, path, element=None, mass_number=None, metastable=0): - """Export table to an HDF5 file. - - Parameters - ---------- - path : str - Path to write HDF5 file to - element : str or None - Elemental symbol, e.g. Zr. If not specified, the atomic - number/symbol are inferred from the name of the table. - mass_number : int or None - Mass number of the nuclide. For natural elements, a value of zero - should be given. If not specified, the mass number is inferred from - the name of the table. - metastable : int - Metastable level of the nuclide. Defaults to 0. - - """ - - f = h5py.File(path, 'a') - - # If element and/or mass number haven't been specified, make an educated - # guess - zaid, xs = self.name.split('.') - if element is None: - Z = int(zaid) // 1000 - element = atomic_symbol[Z] - else: - Z = atomic_number[element] - if mass_number is None: - mass_number = int(zaid) % 1000 - - # Write basic data - if metastable > 0: - name = '{}{}_m{}.{}'.format(element, mass_number, metastable, xs) - else: - name = '{}{}.{}'.format(element, mass_number, xs) - g = f.create_group(name) - g.attrs['Z'] = Z - g.attrs['A'] = mass_number - g.attrs['metastable'] = metastable - g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio - g.attrs['temperature'] = self.temperature - g.attrs['n_reaction'] = len(self.reactions) - - # Write energy grid - g.create_dataset('energy', data=self.energy) - - # Write reaction data - for i, rx in enumerate(self.reactions.values()): - rx_group = g.create_group('reaction_{}'.format(i)) - rx.to_hdf5(rx_group) - - # Write total nu data if available - if hasattr(rx, 'derived_products') and 'total_nu' not in g: - tgroup = g.create_group('total_nu') - rx.derived_products[0].to_hdf5(tgroup) - - # Write unresolved resonance probability tables - if self.urr is not None: - urr_group = g.create_group('urr') - self.urr.to_hdf5(urr_group) - - f.close() - - @classmethod - def from_hdf5(self, group): - """Generate continuous-energy neutron interaction data from HDF5 group - - Parameters - ---------- - group : h5py.Group - HDF5 group containing interaction data - - Returns - ------- - openmc.data.ace.NeutronTable - Continuous-energy neutron interaction data - - """ - name = group.name[1:] - atomic_weight_ratio = group.attrs['atomic_weight_ratio'] - temperature = group.attrs['temperature'] - table = NeutronTable(name, atomic_weight_ratio, temperature) - - # Read energy grid - table.energy = group['energy'].value - - # Read reaction data - n_reaction = group.attrs['n_reaction'] - - # Write reaction data - for i in range(n_reaction): - rx_group = group['reaction_{}'.format(i)] - rx = Reaction.from_hdf5(rx_group, table) - table.reactions[rx.MT] = rx - - # Read total nu data if available - if 'total_nu' in rx_group: - tgroup = rx_group['total_nu'] - rx.derived_products = [Product.from_hdf5(tgroup)] - - # Read unresolved resonance probability tables - if 'urr' in group: - urr_group = group['urr'] - table.urr = ProbabilityTables.from_hdf5(urr_group) - - return table - - -class SabTable(Table): - """A SabTable object contains thermal scattering data as represented by - an S(alpha, beta) table. - - Parameters - ---------- - name : str - ZAID identifier of the table, e.g. lwtr.10t. - atomic_weight_ratio : float - Atomic mass ratio of the target nuclide. - temperature : float - Temperature of the target nuclide in eV. - - Attributes - ---------- - atomic_weight_ratio : float - Atomic mass ratio of the target nuclide. - elastic_xs : openmc.data.Tabulated1D or openmc.data.CoherentElastic - Elastic scattering cross section derived in the coherent or incoherent - approximation - inelastic_xs : openmc.data.Tabulated1D - Inelastic scattering cross section derived in the incoherent - approximation - name : str - ZAID identifier of the table, e.g. 92235.70c. - temperature : float - Temperature of the target nuclide in eV. - - """ - - def __init__(self, name, atomic_weight_ratio, temperature): - super(SabTable, self).__init__(name, atomic_weight_ratio, temperature) - self.elastic_xs = None - self.elastic_mu_out = None - - self.inelastic_xs = None - self.inelastic_e_out = None - self.inelastic_mu_out = None - self.secondary_mode = None - - def __repr__(self): - if hasattr(self, 'name'): - return "".format(self.name) - else: - return "" - - def _read_all(self): - self._read_itie() - self._read_itce() - self._read_itxe() - self._read_itca() - - def _read_itie(self): - """Read energy-dependent inelastic scattering cross sections. - """ - idx = self._jxs[1] - n_energies = int(self._xss[idx]) - energy = self._xss[idx+1 : idx+1+n_energies] - xs = self._xss[idx+1+n_energies : idx+1+2*n_energies] - self.inelastic_xs = Tabulated1D(energy, xs) - - def _read_itce(self): - """Read energy-dependent elastic scattering cross sections. - """ - # Determine if ITCE block exists - idx = self._jxs[4] - if idx == 0: - return - - # Read values - n_energies = int(self._xss[idx]) - energy = self._xss[idx+1 : idx+1+n_energies] - P = self._xss[idx+1+n_energies : idx+1+2*n_energies] - - if self._nxs[5] == 4: - self.elastic_xs = CoherentElastic(energy, P) - else: - self.elastic_xs = Tabulated1D(energy, P) - - def _read_itxe(self): - """Read coupled energy/angle distributions for inelastic scattering. - """ - # Determine number of energies and angles - NE_in = len(self.inelastic_xs) - NE_out = self._nxs[4] - - if self._nxs[7] == 0: - self.secondary_mode = 'equal' - elif self._nxs[7] == 1: - self.secondary_mode = 'skewed' - elif self._nxs[7] == 2: - self.secondary_mode = 'continuous' - - if self.secondary_mode in ('equal', 'skewed'): - NMU = self._nxs[3] - idx = self._jxs[3] - self.inelastic_e_out = self._xss[idx:idx+NE_in*NE_out*(NMU+2):NMU+2] - self.inelastic_e_out.shape = (NE_in, NE_out) - - self.inelastic_mu_out = self._xss[idx:idx+NE_in*NE_out*(NMU+2)] - self.inelastic_mu_out.shape = (NE_in, NE_out, NMU+2) - self.inelastic_mu_out = self.inelastic_mu_out[:, :, 1:] - else: - NMU = self._nxs[3] - 1 - idx = self._jxs[3] - locc = self._xss[idx:idx + NE_in].astype(int) - NE_out = self._xss[idx + NE_in:idx + 2*NE_in].astype(int) - energy_out = [] - mu_out = [] - for i in range(NE_in): - idx = locc[i] - - # Outgoing energy distribution for incoming energy i - e = self._xss[idx + 1:idx + 1 + NE_out[i]*(NMU + 3):NMU + 3] - p = self._xss[idx + 2:idx + 2 + NE_out[i]*(NMU + 3):NMU + 3] - c = self._xss[idx + 3:idx + 3 + NE_out[i]*(NMU + 3):NMU + 3] - eout_i = Tabular(e, p, 'linear-linear', ignore_negative=True) - eout_i.c = c - - # Outgoing angle distribution for each (incoming, outgoing) energy pair - mu_i = [] - for j in range(NE_out[i]): - mu = self._xss[idx + 4:idx + 4 + NMU] - p_mu = 1./NMU*np.ones(NMU) - mu_ij = Discrete(mu, p_mu) - mu_ij.c = np.cumsum(p_mu) - mu_i.append(mu_ij) - idx += 3 + NMU - - energy_out.append(eout_i) - mu_out.append(mu_i) - - # Create correlated angle-energy distribution - breakpoints = [NE_in] - interpolation = [2] - energy = self.inelastic_xs.x - self.inelastic_dist = CorrelatedAngleEnergy( - breakpoints, interpolation, energy, energy_out, mu_out) - - def _read_itca(self): - """Read angular distributions for elastic scattering. - """ - NMU = self._nxs[6] - if self._jxs[4] == 0 or NMU == -1: - return - idx = self._jxs[6] - - NE = len(self.elastic_xs) - self.elastic_mu_out = self._xss[idx:idx+NE*NMU] - self.elastic_mu_out.shape = (NE, NMU) - - def export_to_hdf5(self, path, name): - """Export table to an HDF5 file. - - Parameters - ---------- - path : str - Path to write HDF5 file to - name : str - Name of compound (used as first group in HDF5 file) - - """ - - f = h5py.File(path, 'a') - - # Write basic data - g = f.create_group('{}.{}'.format(name, self.name.split('.')[1])) - g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio - g.attrs['temperature'] = self.temperature - g.attrs['zaids'] = self.zaids - - # Write thermal elastic scattering - if self.elastic_xs is not None: - elastic_group = g.create_group('elastic') - self.elastic_xs.to_hdf5(elastic_group, 'xs') - if self.elastic_mu_out is not None: - elastic_group.create_dataset('mu_out', data=self.elastic_mu_out) - - # Write thermal inelastic scattering - if self.inelastic_xs is not None: - inelastic_group = g.create_group('inelastic') - self.inelastic_xs.to_hdf5(inelastic_group, 'xs') - inelastic_group.attrs['secondary_mode'] = np.string_(self.secondary_mode) - if self.secondary_mode in ('equal', 'skewed'): - inelastic_group.create_dataset('energy_out', data=self.inelastic_e_out) - inelastic_group.create_dataset('mu_out', data=self.inelastic_mu_out) - elif self.secondary_mode == 'continuous': - self.inelastic_dist.to_hdf5(inelastic_group) - - @classmethod - def from_hdf5(self, group): - """Generate thermal scattering data from HDF5 group - - Parameters - ---------- - group : h5py.Group - HDF5 group to read from - - Returns - ------- - openmc.data.SabTable - Neutron thermal scattering data - - """ - name = group.name[1:] - atomic_weight_ratio = group.attrs['atomic_weight_ratio'] - temperature = group.attrs['temperature'] - table = SabTable(name, atomic_weight_ratio, temperature) - table.zaids = group.attrs['zaids'] - - # Read thermal elastic scattering - if 'elastic' in group: - elastic_group = group['elastic'] - - # Cross section - elastic_xs_type = elastic_group['xs'].attrs['type'].decode() - if elastic_xs_type == 'tab1': - table.elastic_xs = Tabulated1D.from_hdf5(elastic_group['xs']) - elif elastic_xs_type == 'bragg': - table.elastic_xs = CoherentElastic.from_hdf5(elastic_group['xs']) - - # Angular distribution - if 'mu_out' in elastic_group: - table.elastic_mu_out = elastic_group['mu_out'].value - - # Read thermal inelastic scattering - if 'inelastic' in group: - inelastic_group = group['inelastic'] - table.secondary_mode = inelastic_group.attrs['secondary_mode'].decode() - table.inelastic_xs = Tabulated1D.from_hdf5(inelastic_group['xs']) - if table.secondary_mode in ('equal', 'skewed'): - table.inelastic_e_out = inelastic_group['energy_out'] - table.inelastic_mu_out = inelastic_group['mu_out'] - elif table.secondary_mode == 'continuous': - table.inelastic_dist = AngleEnergy.from_hdf5(inelastic_group) - - return table - - -class Reaction(object): - """Reaction(MT, table=None) - - A Reaction object represents a single reaction channel for a nuclide with - an associated cross section and, if present, a secondary angle and energy - distribution. These objects are stored within the ``reactions`` attribute on - subclasses of Table, e.g. NeutronTable. - - Parameters - ---------- - MT : int - The ENDF MT number for this reaction. On occasion, MCNP uses MT numbers - that don't correspond exactly to the ENDF specification. - table : openmc.data.ace.Table - The ACE table which contains this reaction. This is useful if data on - the parent nuclide is needed (for instance, the energy grid at which - cross sections are tabulated) - - Attributes - ---------- - center_of_mass : bool - Indicates whether scattering kinematics should be performed in the - center-of-mass or laboratory reference frame. - grid above the threshold value in barns. - MT : int - The ENDF MT number for this reaction. - Q_value : float - The Q-value of this reaction in MeV. - table : openmc.data.ace.Table - The ACE table which contains this reaction. - threshold : float - Threshold of the reaction in MeV - threshold_idx : int - The index on the energy grid corresponding to the threshold of this - reaction. - xs : openmc.data.Tabulated1D - Microscopic cross section for this reaction as a function of incident - energy - products : Iterable of openmc.data.Product - Reaction products - - """ - - def __init__(self, MT, table=None): - self.center_of_mass = True - self.table = table - self.MT = MT - self.Q_value = 0. - self.threshold_idx = 0 - self._xs = None - self.products = [] - - def __repr__(self): - if self.MT in reaction_name: - return "".format(self.MT, reaction_name[self.MT]) - else: - return "".format(self.MT) - - @property - def center_of_mass(self): - return self._center_of_mass - - @property - def products(self): - return self._products - - @property - def threshold(self): - return self.xs.x[0] - - @property - def xs(self): - return self._xs - - @center_of_mass.setter - def center_of_mass(self, center_of_mass): - cv.check_type('center of mass', center_of_mass, (bool, np.bool_)) - self._center_of_mass = center_of_mass - - @products.setter - def products(self, products): - cv.check_type('reaction products', products, Iterable, Product) - self._products = products - - @xs.setter - def xs(self, xs): - cv.check_type('reaction cross section', xs, Tabulated1D) - for y in xs.y: - cv.check_greater_than('reaction cross section', y, 0.0, True) - self._xs = xs - - def to_hdf5(self, group): - """Write reaction to an HDF5 group - - Parameters - ---------- - group : h5py.Group - HDF5 group to write to - - """ - - group.attrs['MT'] = self.MT - if self.MT in reaction_name: - group.attrs['label'] = np.string_(reaction_name[self.MT]) - else: - group.attrs['label'] = np.string_(self.MT) - group.attrs['Q_value'] = self.Q_value - group.attrs['threshold_idx'] = self.threshold_idx + 1 - group.attrs['center_of_mass'] = 1 if self.center_of_mass else 0 - group.attrs['n_product'] = len(self.products) - if self.xs is not None: - group.create_dataset('xs', data=self.xs.y) - for i, p in enumerate(self.products): - pgroup = group.create_group('product_{}'.format(i)) - p.to_hdf5(pgroup) - - @classmethod - def from_hdf5(cls, group, table): - """Generate reaction from an HDF5 group - - Parameters - ---------- - group : h5py.Group - HDF5 group to write to - - Returns - ------- - openmc.data.ace.Reaction - Reaction data - - """ - MT = group.attrs['MT'] - rxn = cls(MT) - rxn.table = table - rxn.Q_value = group.attrs['Q_value'] - rxn.threshold_idx = group.attrs['threshold_idx'] - 1 - rxn.center_of_mass = bool(group.attrs['center_of_mass']) - - # Read cross section - if 'xs' in group: - xs = group['xs'].value - rxn.xs = Tabulated1D(table.energy, xs) - - # Read reaction products - n_product = group.attrs['n_product'] - products = [] - for i in range(n_product): - pgroup = group['product_{}'.format(i)] - products.append(Product.from_hdf5(pgroup)) - rxn.products = products - - return rxn - - -table_types = { - "c": NeutronTable, - "t": SabTable} + return "".format(self.name) diff --git a/openmc/data/angle_distribution.py b/openmc/data/angle_distribution.py index 5f19450bc..3f086a99c 100644 --- a/openmc/data/angle_distribution.py +++ b/openmc/data/angle_distribution.py @@ -4,7 +4,7 @@ from numbers import Real import numpy as np import openmc.checkvalue as cv -from openmc.stats import Univariate, Tabular +from openmc.stats import Univariate, Tabular, Uniform from .container import interpolation_scheme @@ -132,3 +132,69 @@ class AngleDistribution(object): mu.append(mu_i) return cls(energy, mu) + + @classmethod + def from_ace(cls, ace, location_dist, location_start): + """Generate an angular distribution from ACE data + + Parameters + ---------- + ace : openmc.data.ace.Table + ACE table to read from + location_dist : int + Index in the XSS array corresponding to the start of a block, + e.g. JXS(9). + location_start : int + Index in the XSS array corresponding to the start of an angle + distribution array + + Returns + ------- + openmc.data.AngleDistribution + Angular distribution + + """ + # Set starting index for angle distribution + idx = location_dist + location_start - 1 + + # Number of energies at which angular distributions are tabulated + n_energies = int(ace.xss[idx]) + idx += 1 + + # Incoming energy grid + energy = ace.xss[idx:idx + n_energies] + idx += n_energies + + # Read locations for angular distributions + lc = ace.xss[idx:idx + n_energies].astype(int) + idx += n_energies + + mu = [] + for i in range(n_energies): + if lc[i] > 0: + # Equiprobable 32 bin distribution + idx = location_dist + abs(lc[i]) - 1 + cos = ace.xss[idx:idx + 33] + pdf = np.zeros(33) + pdf[:32] = 1.0/(32.0*np.diff(cos)) + cdf = np.linspace(0.0, 1.0, 33) + + mu_i = Tabular(cos, pdf, 'histogram', ignore_negative=True) + mu_i.c = cdf + elif lc[i] < 0: + # Tabular angular distribution + idx = location_dist + abs(lc[i]) - 1 + intt = int(ace.xss[idx]) + n_points = int(ace.xss[idx + 1]) + data = ace.xss[idx + 2:idx + 2 + 3*n_points] + data.shape = (3, n_points) + + mu_i = Tabular(data[0], data[1], interpolation_scheme[intt]) + mu_i.c = data[2] + else: + # Isotropic angular distribution + mu_i = Uniform(-1., 1.) + + mu.append(mu_i) + + return cls(energy, mu) diff --git a/openmc/data/angle_energy.py b/openmc/data/angle_energy.py index fc17d7bec..ff9f41a44 100644 --- a/openmc/data/angle_energy.py +++ b/openmc/data/angle_energy.py @@ -38,3 +38,73 @@ class AngleEnergy(object): return openmc.data.KalbachMann.from_hdf5(group) elif dist_type == 'nbody': return openmc.data.NBodyPhaseSpace.from_hdf5(group) + + @staticmethod + def from_ace(ace, location_dist, location_start, rx=None): + """Generate an AngleEnergy object from ACE data + + Parameters + ---------- + ace : openmc.data.ace.Table + ACE table to read from + location_dist : int + Index in the XSS array corresponding to the start of a block, + e.g. JXS(11) for the the DLW block. + location_start : int + Index in the XSS array corresponding to the start of an energy + distribution array + rx : Reaction + Reaction this energy distribution will be associated with + + Returns + ------- + distribution : openmc.data.AngleEnergy + Secondary angle-energy distribution + + """ + # Set starting index for energy distribution + idx = location_dist + location_start - 1 + + law = int(ace.xss[idx + 1]) + location_data = int(ace.xss[idx + 2]) + + # Position index for reading law data + idx = location_dist + location_data - 1 + + # Parse energy distribution data + if law == 2: + distribution = openmc.data.UncorrelatedAngleEnergy() + distribution.energy = openmc.data.DiscretePhoton.from_ace(ace, idx) + elif law in (3, 33): + distribution = openmc.data.UncorrelatedAngleEnergy() + distribution.energy = openmc.data.LevelInelastic.from_ace(ace, idx) + elif law == 4: + distribution = openmc.data.UncorrelatedAngleEnergy() + distribution.energy = openmc.data.ContinuousTabular.from_ace( + ace, idx, location_dist) + elif law == 5: + distribution = openmc.data.UncorrelatedAngleEnergy() + distribution.energy = openmc.data.GeneralEvaporation.from_ace(ace, idx) + elif law == 7: + distribution = openmc.data.UncorrelatedAngleEnergy() + distribution.energy = openmc.data.MaxwellEnergy.from_ace(ace, idx) + elif law == 9: + distribution = openmc.data.UncorrelatedAngleEnergy() + distribution.energy = openmc.data.Evaporation.from_ace(ace, idx) + elif law == 11: + distribution = openmc.data.UncorrelatedAngleEnergy() + distribution.energy = openmc.data.WattEnergy.from_ace(ace, idx) + elif law == 44: + distribution = openmc.data.KalbachMann.from_ace( + ace, idx, location_dist) + elif law == 61: + distribution = openmc.data.CorrelatedAngleEnergy.from_ace( + ace, idx, location_dist) + elif law == 66: + distribution = openmc.data.NBodyPhaseSpace.from_ace( + ace, idx, rx.q_value) + else: + raise IOError("Unsupported ACE secondary energy " + "distribution law {0}".format(law)) + + return distribution diff --git a/openmc/data/container.py b/openmc/data/container.py index 4bd293c36..b2b323ddd 100644 --- a/openmc/data/container.py +++ b/openmc/data/container.py @@ -267,3 +267,42 @@ class Tabulated1D(object): breakpoints = dataset.attrs['breakpoints'] interpolation = dataset.attrs['interpolation'] return cls(x, y, breakpoints, interpolation) + + @classmethod + def from_ace(cls, ace, idx=0): + """Create a Tabulated1D object from an ACE table. + + Parameters + ---------- + ace : openmc.data.ace.Table + An ACE table + idx : int + Offset to read from in XSS array (default of zero) + + Returns + ------- + openmc.data.Tabulated1D + Tabulated data object + + """ + + # Get number of regions and pairs + n_regions = int(ace.xss[idx]) + n_pairs = int(ace.xss[idx + 1 + 2*n_regions]) + + # Get interpolation information + idx += 1 + if n_regions > 0: + breakpoints = ace.xss[idx:idx + n_regions].astype(int) + interpolation = ace.xss[idx + n_regions:idx + 2*n_regions].astype(int) + else: + # 0 regions implies linear-linear interpolation by default + breakpoints = np.array([n_pairs]) + interpolation = np.array([2]) + + # Get (x,y) pairs + idx += 2*n_regions + 1 + x = ace.xss[idx:idx + n_pairs] + y = ace.xss[idx + n_pairs:idx + 2*n_pairs] + + return Tabulated1D(x, y, breakpoints, interpolation) diff --git a/openmc/data/correlated.py b/openmc/data/correlated.py index 58a90da9d..f82a28b75 100644 --- a/openmc/data/correlated.py +++ b/openmc/data/correlated.py @@ -203,8 +203,8 @@ class CorrelatedAngleEnergy(AngleEnergy): """ interp_data = group['energy'].attrs['interpolation'] - energy_breakpoints = interp_data[0,:] - energy_interpolation = interp_data[1,:] + energy_breakpoints = interp_data[0, :] + energy_interpolation = interp_data[1, :] energy = group['energy'].value offsets = group['energy_out'].attrs['offsets'] @@ -289,3 +289,116 @@ class CorrelatedAngleEnergy(AngleEnergy): return cls(energy_breakpoints, energy_interpolation, energy, energy_out, mu) + + @classmethod + def from_ace(cls, ace, idx, ldis): + """Generate correlated angle-energy distribution from ACE data + + Parameters + ---------- + ace : openmc.data.ace.Table + ACE table to read from + idx : int + Index in XSS array of the start of the energy distribution data + (LDIS + LOCC - 1) + ldis : int + Index in XSS array of the start of the energy distribution block + (e.g. JXS[11]) + + Returns + ------- + openmc.data.CorrelatedAngleEnergy + Correlated angle-energy distribution + + """ + # Read number of interpolation regions and incoming energies + n_regions = int(ace.xss[idx]) + n_energy_in = int(ace.xss[idx + 1 + 2*n_regions]) + + # Get interpolation information + idx += 1 + if n_regions > 0: + breakpoints = ace.xss[idx:idx + n_regions].astype(int) + interpolation = ace.xss[idx + n_regions:idx + 2*n_regions].astype(int) + else: + breakpoints = np.array([n_energy_in]) + interpolation = np.array([2]) + + # Incoming energies at which distributions exist + idx += 2*n_regions + 1 + energy = ace.xss[idx:idx + n_energy_in] + + # Location of distributions + idx += n_energy_in + loc_dist = ace.xss[idx:idx + n_energy_in].astype(int) + + # Initialize list of distributions + energy_out = [] + mu = [] + + # Read each outgoing energy distribution + for i in range(n_energy_in): + idx = ldis + loc_dist[i] - 1 + + # intt = interpolation scheme (1=hist, 2=lin-lin) + INTTp = int(ace.xss[idx]) + intt = INTTp % 10 + n_discrete_lines = (INTTp - intt)//10 + if intt not in (1, 2): + warn("Interpolation scheme for continuous tabular distribution " + "is not histogram or linear-linear.") + intt = 2 + + # Secondary energy distribution + n_energy_out = int(ace.xss[idx + 1]) + data = ace.xss[idx + 2:idx + 2 + 4*n_energy_out] + data.shape = (4, n_energy_out) + + # Create continuous distribution + eout_continuous = Tabular(data[0][n_discrete_lines:], + data[1][n_discrete_lines:], + interpolation_scheme[intt], + ignore_negative=True) + eout_continuous.c = data[2][n_discrete_lines:] + + # If discrete lines are present, create a mixture distribution + if n_discrete_lines > 0: + eout_discrete = Discrete(data[0][:n_discrete_lines], + data[1][:n_discrete_lines]) + eout_discrete.c = data[2][:n_discrete_lines] + if n_discrete_lines == n_energy_out: + eout_i = eout_discrete + else: + p_discrete = min(sum(eout_discrete.p), 1.0) + eout_i = Mixture([p_discrete, 1. - p_discrete], + [eout_discrete, eout_continuous]) + else: + eout_i = eout_continuous + + energy_out.append(eout_i) + + lc = data[3].astype(int) + + # Secondary angular distributions + mu_i = [] + for j in range(n_energy_out): + if lc[j] > 0: + idx = ldis + abs(lc[j]) - 1 + + intt = int(ace.xss[idx]) + n_cosine = int(ace.xss[idx + 1]) + data = ace.xss[idx + 2:idx + 2 + 3*n_cosine] + data.shape = (3, n_cosine) + + mu_ij = Tabular(data[0], data[1], interpolation_scheme[intt]) + mu_ij.c = data[2] + else: + # Isotropic distribution + mu_ij = Uniform(-1., 1.) + + mu_i.append(mu_ij) + + # Add cosine distributions for this incoming energy to list + mu.append(mu_i) + + return cls(breakpoints, interpolation, energy, energy_out, mu) diff --git a/openmc/data/energy_distribution.py b/openmc/data/energy_distribution.py index afbc39014..09b0c6ebf 100644 --- a/openmc/data/energy_distribution.py +++ b/openmc/data/energy_distribution.py @@ -1,6 +1,7 @@ from abc import ABCMeta, abstractmethod from collections import Iterable from numbers import Integral, Real +from warnings import warn import h5py import numpy as np @@ -200,6 +201,33 @@ class MaxwellEnergy(EnergyDistribution): u = group.attrs['u'] return cls(theta, u) + @classmethod + def from_ace(cls, ace, idx=0): + """Create a Maxwell distribution from an ACE table + + Parameters + ---------- + ace : openmc.data.ace.Table + An ACE table + idx : int + Offset to read from in XSS array (default of zero) + + Returns + ------- + openmc.data.MaxwellEnergy + Maxwell distribution + + """ + # Read nuclear temperature + theta = Tabulated1D.from_ace(ace, idx) + + # Restriction energy + nr = int(ace.xss[idx]) + ne = int(ace.xss[idx + 1 + 2*nr]) + u = ace.xss[idx + 2 + 2*nr + 2*ne] + + return cls(theta, u) + class Evaporation(EnergyDistribution): r"""Evaporation spectrum represented as @@ -273,13 +301,40 @@ class Evaporation(EnergyDistribution): Returns ------- openmc.data.Evaporation - Evaporation spectrum distribution + Evaporation spectrum """ theta = Tabulated1D.from_hdf5(group['theta']) u = group.attrs['u'] return cls(theta, u) + @classmethod + def from_ace(cls, ace, idx=0): + """Create an evaporation spectrum from an ACE table + + Parameters + ---------- + ace : openmc.data.ace.Table + An ACE table + idx : int + Offset to read from in XSS array (default of zero) + + Returns + ------- + openmc.data.Evaporation + Evaporation spectrum + + """ + # Read nuclear temperature + theta = Tabulated1D.from_ace(ace, idx) + + # Restriction energy + nr = int(ace.xss[idx]) + ne = int(ace.xss[idx + 1 + 2*nr]) + u = ace.xss[idx + 2 + 2*nr + 2*ne] + + return cls(theta, u) + class WattEnergy(EnergyDistribution): r"""Energy-dependent Watt spectrum represented as @@ -375,6 +430,45 @@ class WattEnergy(EnergyDistribution): u = group.attrs['u'] return cls(a, b, u) + @classmethod + def from_ace(cls, ace, idx): + """Create a Watt fission spectrum from an ACE table + + Parameters + ---------- + ace : openmc.data.ace.Table + An ACE table + idx : int + Offset to read from in XSS array (default of zero) + + Returns + ------- + openmc.data.WattEnergy + Watt fission spectrum + + """ + # Energy-dependent a parameter + a = Tabulated1D.from_ace(ace, idx) + + # Advance index + nr = int(ace.xss[idx]) + ne = int(ace.xss[idx + 1 + 2*nr]) + idx += 2 + 2*nr + 2*ne + + # Energy-dependent b parameter + b = Tabulated1D.from_ace(ace, idx) + + # Advance index + nr = int(ace.xss[idx]) + ne = int(ace.xss[idx + 1 + 2*nr]) + idx += 2 + 2*nr + 2*ne + + # Restriction energy + u = ace.xss[idx] + + return cls(a, b, u) + + class MadlandNix(EnergyDistribution): r"""Energy-dependent fission neutron spectrum (Madland and Nix) given in ENDF MF=5, LF=12 represented as @@ -574,6 +668,27 @@ class DiscretePhoton(EnergyDistribution): awr = group.attrs['atomic_weight_ratio'] return cls(primary_flag, energy, awr) + @classmethod + def from_ace(cls, ace, idx): + """Generate discrete photon energy distribution from an ACE table + + Parameters + ---------- + ace : openmc.data.ace.Table + An ACE table + idx : int + Offset to read from in XSS array (default of zero) + + Returns + ------- + openmc.data.DiscretePhoton + Discrete photon energy distribution + + """ + primary_flag = int(ace.xss[idx]) + energy = ace.xss[idx + 1] + return cls(primary_flag, energy, ace.atomic_weight_ratio) + class LevelInelastic(EnergyDistribution): r"""Level inelastic scattering @@ -650,6 +765,26 @@ class LevelInelastic(EnergyDistribution): mass_ratio = group.attrs['mass_ratio'] return cls(threshold, mass_ratio) + @classmethod + def from_ace(cls, ace, idx): + """Generate level inelastic distribution from an ACE table + + Parameters + ---------- + ace : openmc.data.ace.Table + An ACE table + idx : int + Offset to read from in XSS array (default of zero) + + Returns + ------- + openmc.data.LevelInelastic + Level inelastic scattering distribution + + """ + threshold, mass_ratio = ace.xss[idx:idx + 2] + return cls(threshold, mass_ratio) + class ContinuousTabular(EnergyDistribution): """Continuous tabular distribution @@ -802,8 +937,8 @@ class ContinuousTabular(EnergyDistribution): """ interp_data = group['energy'].attrs['interpolation'] - energy_breakpoints = interp_data[0,:] - energy_interpolation = interp_data[1,:] + energy_breakpoints = interp_data[0, :] + energy_interpolation = interp_data[1, :] energy = group['energy'].value data = group['distribution'] @@ -848,3 +983,89 @@ class ContinuousTabular(EnergyDistribution): return cls(energy_breakpoints, energy_interpolation, energy, energy_out) + + @classmethod + def from_ace(cls, ace, idx, ldis): + """Generate continuous tabular energy distribution from ACE data + + Parameters + ---------- + ace : openmc.data.ace.Table + ACE table to read from + idx : int + Index in XSS array of the start of the energy distribution data + (LDIS + LOCC - 1) + ldis : int + Index in XSS array of the start of the energy distribution block + (e.g. JXS[11]) + + Returns + ------- + openmc.data.ContinuousTabular + Continuous tabular energy distribution + + """ + # Read number of interpolation regions and incoming energies + n_regions = int(ace.xss[idx]) + n_energy_in = int(ace.xss[idx + 1 + 2*n_regions]) + + # Get interpolation information + idx += 1 + if n_regions > 0: + breakpoints = ace.xss[idx:idx + n_regions].astype(int) + interpolation = ace.xss[idx + n_regions:idx + 2*n_regions].astype(int) + else: + breakpoints = np.array([n_energy_in]) + interpolation = np.array([2]) + + # Incoming energies at which distributions exist + idx += 2*n_regions + 1 + energy = ace.xss[idx:idx + n_energy_in] + + # Location of distributions + idx += n_energy_in + loc_dist = ace.xss[idx:idx + n_energy_in].astype(int) + + # Initialize variables + energy_out = [] + + # Read each outgoing energy distribution + for i in range(n_energy_in): + idx = ldis + loc_dist[i] - 1 + + # intt = interpolation scheme (1=hist, 2=lin-lin) + INTTp = int(ace.xss[idx]) + intt = INTTp % 10 + n_discrete_lines = (INTTp - intt)//10 + if intt not in (1, 2): + warn("Interpolation scheme for continuous tabular distribution " + "is not histogram or linear-linear.") + intt = 2 + + n_energy_out = int(ace.xss[idx + 1]) + data = ace.xss[idx + 2:idx + 2 + 3*n_energy_out] + data.shape = (3, n_energy_out) + + # Create continuous distribution + eout_continuous = Tabular(data[0][n_discrete_lines:], + data[1][n_discrete_lines:], + interpolation_scheme[intt]) + eout_continuous.c = data[2][n_discrete_lines:] + + # If discrete lines are present, create a mixture distribution + if n_discrete_lines > 0: + eout_discrete = Discrete(data[0][:n_discrete_lines], + data[1][:n_discrete_lines]) + eout_discrete.c = data[2][:n_discrete_lines] + if n_discrete_lines == n_energy_out: + eout_i = eout_discrete + else: + p_discrete = min(sum(eout_discrete.p), 1.0) + eout_i = Mixture([p_discrete, 1. - p_discrete], + [eout_discrete, eout_continuous]) + else: + eout_i = eout_continuous + + energy_out.append(eout_i) + + return cls(breakpoints, interpolation, energy, energy_out) diff --git a/openmc/data/kalbach_mann.py b/openmc/data/kalbach_mann.py index a8fc8d4c6..7899ae2a6 100644 --- a/openmc/data/kalbach_mann.py +++ b/openmc/data/kalbach_mann.py @@ -197,8 +197,8 @@ class KalbachMann(AngleEnergy): """ interp_data = group['energy'].attrs['interpolation'] - energy_breakpoints = interp_data[0,:] - energy_interpolation = interp_data[1,:] + energy_breakpoints = interp_data[0, :] + energy_interpolation = interp_data[1, :] energy = group['energy'].value data = group['distribution'] @@ -251,3 +251,93 @@ class KalbachMann(AngleEnergy): return cls(energy_breakpoints, energy_interpolation, energy, energy_out, precompound, slope) + + @classmethod + def from_ace(cls, ace, idx, ldis): + """Generate Kalbach-Mann energy-angle distribution from ACE data + + Parameters + ---------- + ace : openmc.data.ace.Table + ACE table to read from + idx : int + Index in XSS array of the start of the energy distribution data + (LDIS + LOCC - 1) + ldis : int + Index in XSS array of the start of the energy distribution block + (e.g. JXS[11]) + + Returns + ------- + openmc.data.KalbachMann + Kalbach-Mann energy-angle distribution + + """ + # Read number of interpolation regions and incoming energies + n_regions = int(ace.xss[idx]) + n_energy_in = int(ace.xss[idx + 1 + 2*n_regions]) + + # Get interpolation information + idx += 1 + if n_regions > 0: + breakpoints = ace.xss[idx:idx + n_regions].astype(int) + interpolation = ace.xss[idx + n_regions:idx + 2*n_regions].astype(int) + else: + breakpoints = np.array([n_energy_in]) + interpolation = np.array([2]) + + # Incoming energies at which distributions exist + idx += 2*n_regions + 1 + energy = ace.xss[idx:idx + n_energy_in] + + # Location of distributions + idx += n_energy_in + loc_dist = ace.xss[idx:idx + n_energy_in].astype(int) + + # Initialize variables + energy_out = [] + km_r = [] + km_a = [] + + # Read each outgoing energy distribution + for i in range(n_energy_in): + idx = ldis + loc_dist[i] - 1 + + # intt = interpolation scheme (1=hist, 2=lin-lin) + INTTp = int(ace.xss[idx]) + intt = INTTp % 10 + n_discrete_lines = (INTTp - intt)//10 + if intt not in (1, 2): + warn("Interpolation scheme for continuous tabular distribution " + "is not histogram or linear-linear.") + intt = 2 + + n_energy_out = int(ace.xss[idx + 1]) + data = ace.xss[idx + 2:idx + 2 + 5*n_energy_out] + data.shape = (5, n_energy_out) + + # Create continuous distribution + eout_continuous = Tabular(data[0][n_discrete_lines:], + data[1][n_discrete_lines:], + interpolation_scheme[intt]) + eout_continuous.c = data[2][n_discrete_lines:] + + # If discrete lines are present, create a mixture distribution + if n_discrete_lines > 0: + eout_discrete = Discrete(data[0][:n_discrete_lines], + data[1][:n_discrete_lines]) + eout_discrete.c = data[2][:n_discrete_lines] + if n_discrete_lines == n_energy_out: + eout_i = eout_discrete + else: + p_discrete = min(sum(eout_discrete.p), 1.0) + eout_i = Mixture([p_discrete, 1. - p_discrete], + [eout_discrete, eout_continuous]) + else: + eout_i = eout_continuous + + energy_out.append(eout_i) + km_r.append(Tabulated1D(data[0], data[3])) + km_a.append(Tabulated1D(data[0], data[4])) + + return cls(breakpoints, interpolation, energy, energy_out, km_r, km_a) diff --git a/openmc/data/library.py b/openmc/data/library.py new file mode 100644 index 000000000..58f32609e --- /dev/null +++ b/openmc/data/library.py @@ -0,0 +1,47 @@ +import os +import xml.etree.ElementTree as ET + +import h5py + +from openmc.clean_xml import clean_xml_indentation + +class DataLibrary(object): + def __init__(self): + self.libraries = [] + + def register_file(self, filename, filetype='neutron'): + h5file = h5py.File(filename, 'r') + + materials = [] + for name, group in h5file.items(): + materials.append(name) + + library = {'path': filename, 'type': filetype, 'materials': materials} + self.libraries.append(library) + + def export_to_xml(self, path='cross_sections.xml'): + root = ET.Element('cross_sections') + + # Determine common directory for library paths + common_dir = os.path.commonpath([lib['path'] for lib in self.libraries]) + if common_dir == '': + common_dir = '.' + + directory = os.path.relpath(common_dir, os.path.dirname(path)) + if directory != '.': + dir_element = ET.SubElement(root, "directory") + dir_element.text = directory + + for library in self.libraries: + lib_element = ET.SubElement(root, "library") + lib_element.set('materials', ' '.join(library['materials'])) + lib_element.set('path', os.path.relpath(library['path'], common_dir)) + lib_element.set('type', library['type']) + + # Clean the indentation to be user-readable + clean_xml_indentation(root) + + # Write XML file + tree = ET.ElementTree(root) + tree.write(path, xml_declaration=True, encoding='utf-8', + method='xml') diff --git a/openmc/data/nbody.py b/openmc/data/nbody.py index 4fa3d05b2..a34380dc9 100644 --- a/openmc/data/nbody.py +++ b/openmc/data/nbody.py @@ -116,3 +116,27 @@ class NBodyPhaseSpace(AngleEnergy): awr = group.attrs['atomic_weight_ratio'] q_value = group.attrs['q_value'] return cls(total_mass, n_particles, awr, q_value) + + @classmethod + def from_ace(cls, ace, idx, q_value): + """Generate N-body phase space distribution from ACE data + + Parameters + ---------- + ace : openmc.data.ace.Table + ACE table to read from + idx : int + Index in XSS array of the start of the energy distribution data + (LDIS + LOCC - 1) + q_value : float + Q-value for reaction in MeV + + Returns + ------- + openmc.data.NBodyPhaseSpace + N-body phase space distribution + + """ + n_particles = int(ace.xss[idx]) + total_mass = ace.xss[idx + 1] + return cls(total_mass, n_particles, ace.atomic_weight_ratio, q_value) diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py new file mode 100644 index 000000000..ad5e370f1 --- /dev/null +++ b/openmc/data/neutron.py @@ -0,0 +1,405 @@ +from __future__ import division, unicode_literals +import io +import sys +from warnings import warn +from collections import OrderedDict, Iterable, Mapping +from copy import deepcopy +from numbers import Integral, Real +import sys + +import numpy as np +from numpy.polynomial import Polynomial +import h5py + +from . import atomic_number, atomic_symbol +from .ace import Table, get_table +from .container import Tabulated1D +from .energy_distribution import * +from .product import Product +from .reaction import Reaction, _get_photon_products +from .thermal import CoherentElastic +from .urr import ProbabilityTables +from openmc.stats import Tabular, Discrete, Uniform, Mixture +import openmc.checkvalue as cv + +if sys.version_info[0] >= 3: + basestring = str + + +class IncidentNeutron(object): + """Continuous-energy neutron interaction data. + + Instances of this class are not normally instantiated by the user but rather + created using the factory methods :meth:`IncidentNeutron.from_hdf5` and + :meth:`IncidentNeutron.from_ace`. + + Parameters + ---------- + name : str + Name of the table + atomic_number : int + Number of protons in the nucleus + mass_number : int + Number of nucleons in the nucleus + metastable : int + Metastable state of the nucleus. A value of zero indicates ground state. + atomic_weight_ratio : float + Atomic mass ratio of the target nuclide. + temperature : float + Temperature of the target nuclide in eV. + + Attributes + ---------- + atomic_number : int + Number of protons in the nucleus + atomic_symbol : str + Atomic symbol of the nuclide, e.g., 'Zr' + atomic_weight_ratio : float + Atomic weight ratio of the target nuclide. + energy : numpy.ndarray + The energy values (MeV) at which reaction cross-sections are tabulated. + mass_number : int + Number of nucleons in the nucleus + metastable : int + Metastable state of the nucleus. A value of zero indicates ground state. + name : str + ZAID identifier of the table, e.g. 92235.70c. + reactions : collections.OrderedDict + Contains the cross sections, secondary angle and energy distributions, + and other associated data for each reaction. The keys are the MT values + and the values are Reaction objects. + summed_reactions : collections.OrderedDict + Contains summed cross sections, e.g., the total cross section. The keys + are the MT values and the values are Reaction objects. + temperature : float + Temperature of the target nuclide in eV. + urr : None or openmc.data.ProbabilityTables + Unresolved resonance region probability tables + + """ + + def __init__(self, name, atomic_number, mass_number, metastable, + atomic_weight_ratio, temperature): + self.name = name + self.atomic_number = atomic_number + self.mass_number = mass_number + self.metastable = metastable + self.atomic_weight_ratio = atomic_weight_ratio + self.temperature = temperature + + self._energy = None + self.reactions = OrderedDict() + self.summed_reactions = OrderedDict() + self.urr = None + + def __repr__(self): + return "".format(self.name) + + def __iter__(self): + return iter(self.reactions.values()) + + @property + def name(self): + return self._name + + @property + def atomic_number(self): + return self._atomic_number + + @property + def mass_number(self): + return self._mass_number + + @property + def metastable(self): + return self._metastable + + @property + def atomic_weight_ratio(self): + return self._atomic_weight_ratio + + @property + def energy(self): + return self._energy + + @property + def temperature(self): + return self._temperature + + @property + def reactions(self): + return self._reactions + + @property + def summed_reactions(self): + return self._summed_reactions + + @property + def urr(self): + return self._urr + + @name.setter + def name(self, name): + cv.check_type('name', name, basestring) + self._name = name + + @property + def atomic_symbol(self): + return atomic_symbol[self.atomic_number] + + @atomic_number.setter + def atomic_number(self, atomic_number): + cv.check_type('atomic number', atomic_number, Integral) + cv.check_greater_than('atomic number', atomic_number, 0) + self._atomic_number = atomic_number + + @mass_number.setter + def mass_number(self, mass_number): + cv.check_type('mass number', mass_number, Integral) + cv.check_greater_than('mass number', mass_number, 0, True) + self._mass_number = mass_number + + @metastable.setter + def metastable(self, metastable): + cv.check_type('metastable', metastable, Integral) + cv.check_greater_than('metastable', metastable, 0, True) + self._metastable = metastable + + @atomic_weight_ratio.setter + def atomic_weight_ratio(self, atomic_weight_ratio): + cv.check_type('atomic weight ratio', atomic_weight_ratio, Real) + cv.check_greater_than('atomic weight ratio', atomic_weight_ratio, 0.0) + self._atomic_weight_ratio = atomic_weight_ratio + + @temperature.setter + def temperature(self, temperature): + cv.check_type('temperature', temperature, Real) + cv.check_greater_than('temperature', temperature, 0.0) + self._temperature = temperature + + @energy.setter + def energy(self, energy): + cv.check_type('energy grid', energy, Iterable, Real) + self._energy = energy + + @reactions.setter + def reactions(self, reactions): + cv.check_type('reactions', reactions, Mapping) + self._reactions = reactions + + @summed_reactions.setter + def summed_reactions(self, summed_reactions): + cv.check_type('summed reactions', summed_reactions, Mapping) + self._summed_reactions = summed_reactions + + @urr.setter + def urr(self, urr): + cv.check_type('probability tables', urr, + (ProbabilityTables, type(None))) + self._urr = urr + + def export_to_hdf5(self, path, mode='a'): + """Export table to an HDF5 file. + + Parameters + ---------- + path : str + Path to write HDF5 file to + mode : {'r', r+', 'w', 'x', 'a'} + Mode that is used to open the HDF5 file. This is the second argument + to the :class:`h5py.File` constructor. + + """ + + f = h5py.File(path, mode) + + # Write basic data + g = f.create_group(self.name) + g.attrs['Z'] = self.atomic_number + g.attrs['A'] = self.mass_number + g.attrs['metastable'] = self.metastable + g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio + g.attrs['temperature'] = self.temperature + g.attrs['n_reaction'] = len(self.reactions) + + # Write energy grid + g.create_dataset('energy', data=self.energy) + + # Write reaction data + for i, rx in enumerate(self.reactions.values()): + rx_group = g.create_group('reaction_{}'.format(i)) + rx.to_hdf5(rx_group) + + # Write total nu data if available + if len(rx.derived_products) > 0 and 'total_nu' not in g: + tgroup = g.create_group('total_nu') + rx.derived_products[0].to_hdf5(tgroup) + + # Write unresolved resonance probability tables + if self.urr is not None: + urr_group = g.create_group('urr') + self.urr.to_hdf5(urr_group) + + f.close() + + @classmethod + def from_hdf5(self, group_or_filename): + """Generate continuous-energy neutron interaction data from HDF5 group + + Parameters + ---------- + group_or_filename : h5py.Group or str + HDF5 group containing interaction data. If given as a string, it is + assumed to be the filename for the HDF5 file, and the first group is + used to read from. + + Returns + ------- + openmc.data.ace.IncidentNeutron + Continuous-energy neutron interaction data + + """ + if isinstance(group_or_filename, h5py.Group): + group = group_or_filename + else: + h5file = h5py.File(group_or_filename, 'r') + group = list(h5file.values())[0] + + name = group.name[1:] + atomic_number = group.attrs['Z'] + mass_number = group.attrs['A'] + metastable = group.attrs['metastable'] + atomic_weight_ratio = group.attrs['atomic_weight_ratio'] + temperature = group.attrs['temperature'] + + data = IncidentNeutron(name, atomic_number, mass_number, metastable, + atomic_weight_ratio, temperature) + + # Read energy grid + data.energy = group['energy'].value + + # Read reaction data + n_reaction = group.attrs['n_reaction'] + + # Write reaction data + for i in range(n_reaction): + rx_group = group['reaction_{}'.format(i)] + rx = Reaction.from_hdf5(rx_group, data.energy) + data.reactions[rx.mt] = rx + + # Read total nu data if available + if 'total_nu' in rx_group: + tgroup = rx_group['total_nu'] + rx.derived_products = [Product.from_hdf5(tgroup)] + + # Read unresolved resonance probability tables + if 'urr' in group: + urr_group = group['urr'] + data.urr = ProbabilityTables.from_hdf5(urr_group) + + return data + + @classmethod + def from_ace(cls, ace_or_filename, metastable_scheme='nndc'): + """Generate incident neutron continuous-energy data from an ACE table + + Parameters + ---------- + ace : openmc.data.ace.Table or str + ACE table to read from. If given as a string, it is assumed to be + the filename for the ACE file. + metastable_scheme : {'nndc', 'mcnp'} + Determine how ZAID identifiers are to be interpreted in the case of + a metastable nuclide. Because the normal ZAID (=1000*Z + A) does not + encode metastable information, different conventions are used among + different libraries. In MCNP libraries, the convention is to add 400 + for a metastable nuclide except for Am242m, for which 95242 is + metastable and 95642 (or 1095242 in newer libraries) is the ground + state. For NNDC libraries, ZAID is given as 1000*Z + A + 100*m. + + Returns + ------- + openmc.data.IncidentNeutron + Incident neutron continuous-energy data + + """ + if isinstance(ace_or_filename, Table): + ace = ace_or_filename + else: + ace = get_table(ace_or_filename) + + # If mass number hasn't been specified, make an educated guess + zaid, xs = ace.name.split('.') + zaid = int(zaid) + Z = zaid // 1000 + mass_number = zaid % 1000 + + if metastable_scheme == 'mcnp': + if zaid > 1000000: + # New SZA format + Z = Z % 1000 + if zaid == 1095242: + metastable = 0 + else: + metastable = zaid // 1000000 + else: + if zaid == 95242: + metastable = 1 + elif zaid == 95642: + metastable = 0 + else: + metastable = 1 if mass_number > 300 else 0 + elif metastable_scheme == 'nndc': + metastable = 1 if mass_number > 300 else 0 + + while mass_number > 3*Z: + mass_number -= 100 + + # Determine name for group + element = atomic_symbol[Z] + if metastable > 0: + name = '{}{}_m{}.{}'.format(element, mass_number, metastable, xs) + else: + name = '{}{}.{}'.format(element, mass_number, xs) + + data = IncidentNeutron(name, Z, mass_number, metastable, + ace.atomic_weight_ratio, ace.temperature) + + # Read energy grid + n_energy = ace.nxs[3] + energy = ace.xss[ace.jxs[1]:ace.jxs[1] + n_energy] + data.energy = energy + total_xs = ace.xss[ace.jxs[1] + n_energy:ace.jxs[1] + 2*n_energy] + absorption_xs = ace.xss[ace.jxs[1] + 2*n_energy:ace.jxs[1] + 3*n_energy] + + # Create summed reactions (total and absorption) + total = Reaction(1) + total.xs = Tabulated1D(energy, total_xs) + data.summed_reactions[1] = total + absorption = Reaction(27) + absorption.xs = Tabulated1D(energy, absorption_xs) + data.summed_reactions[27] = absorption + + # Read each reaction + n_reaction = ace.nxs[4] + 1 + for i in range(n_reaction): + rx = Reaction.from_ace(ace, i) + data.reactions[rx.mt] = rx + + # Some photon production reactions may be assigned to MTs that don't + # exist, usually MT=4. In this case, we create a new reaction and add + # them + n_photon_reactions = ace.nxs[6] + photon_mts = ace.xss[ace.jxs[13]:ace.jxs[13] + + n_photon_reactions].astype(int) + + for mt in np.unique(photon_mts // 1000): + if mt not in data.reactions: + rx = Reaction(mt) + rx.products += _get_photon_products(ace, mt) + data.summed_reactions[mt] = rx + + # Read unresolved resonance probability tables + data.urr = ProbabilityTables.from_ace(ace) + + return data diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py new file mode 100644 index 000000000..40e0910ba --- /dev/null +++ b/openmc/data/reaction.py @@ -0,0 +1,512 @@ +from __future__ import division, unicode_literals +from collections import Iterable +from copy import deepcopy +from numbers import Real + +import numpy as np +from numpy.polynomial import Polynomial + +import openmc.checkvalue as cv +from openmc.stats import Uniform +from .angle_distribution import AngleDistribution +from .angle_energy import AngleEnergy +from .container import Tabulated1D +from .data import reaction_name +from .product import Product +from .uncorrelated import UncorrelatedAngleEnergy + + +def _get_fission_products(ace): + """Generate fission products from an ACE table + + Parameters + ---------- + ace : openmc.data.ace.Table + ACE table to read from + + Returns + ------- + products : list of openmc.data.Product + Prompt and delayed fission neutrons + derived_products : list of openmc.data.Product + "Total" fission neutron + + """ + # No NU block + if ace.jxs[2] == 0: + return None, None + + products = [] + derived_products = [] + + # Either prompt nu or total nu is given + if ace.xss[ace.jxs[2]] > 0: + whichnu = 'prompt' if ace.jxs[24] > 0 else 'total' + + neutron = Product('neutron') + neutron.emission_mode = whichnu + + idx = ace.jxs[2] + LNU = int(ace.xss[idx]) + if LNU == 1: + # Polynomial function form of nu + NC = int(ace.xss[idx+1]) + coefficients = ace.xss[idx+2 : idx+2+NC] + neutron.yield_ = Polynomial(coefficients) + elif LNU == 2: + # Tabular data form of nu + neutron.yield_ = Tabulated1D.from_ace(ace, idx + 1) + + products.append(neutron) + + # Both prompt nu and total nu + elif ace.xss[ace.jxs[2]] < 0: + # Read prompt neutron yield + prompt_neutron = Product('neutron') + prompt_neutron.emission_mode = 'prompt' + + idx = ace.jxs[2] + 1 + LNU = int(ace.xss[idx]) + if LNU == 1: + # Polynomial function form of nu + NC = int(ace.xss[idx+1]) + coefficients = ace.xss[idx+2 : idx+2+NC] + prompt_neutron.yield_ = Polynomial(coefficients) + elif LNU == 2: + # Tabular data form of nu + prompt_neutron.yield_ = Tabulated1D.from_ace(ace, idx + 1) + + # Read total neutron yield + total_neutron = Product('neutron') + total_neutron.emission_mode = 'total' + + idx = ace.jxs[2] + int(abs(ace.xss[ace.jxs[2]])) + 1 + LNU = int(ace.xss[idx]) + + if LNU == 1: + # Polynomial function form of nu + NC = int(ace.xss[idx+1]) + coefficients = ace.xss[idx+2 : idx+2+NC] + total_neutron.yield_ = Polynomial(coefficients) + elif LNU == 2: + # Tabular data form of nu + total_neutron.yield_ = Tabulated1D.from_ace(ace, idx + 1) + + products.append(prompt_neutron) + derived_products.append(total_neutron) + + # Check for delayed nu data + if ace.jxs[24] > 0: + yield_delayed = Tabulated1D.from_ace(ace, ace.jxs[24] + 1) + + # Delayed neutron precursor distribution + idx = ace.jxs[25] + n_group = ace.nxs[8] + total_group_probability = 0. + for i, group in enumerate(range(n_group)): + delayed_neutron = Product('neutron') + delayed_neutron.emission_mode = 'delayed' + delayed_neutron.decay_rate = ace.xss[idx] + + group_probability = Tabulated1D.from_ace(ace, idx + 1) + if np.all(group_probability.y == group_probability.y[0]): + delayed_neutron.yield_ = deepcopy(yield_delayed) + delayed_neutron.yield_.y *= group_probability.y[0] + total_group_probability += group_probability.y[0] + else: + raise NotImplementedError( + 'Delayed neutron with energy-dependent group probability') + + # Advance position + nr = int(ace.xss[idx + 1]) + ne = int(ace.xss[idx + 2 + 2*nr]) + idx += 3 + 2*nr + 2*ne + + # Energy distribution for delayed fission neutrons + location_start = int(ace.xss[ace.jxs[26] + group]) + delayed_neutron.distribution.append( + AngleEnergy.from_ace(ace, ace.jxs[27], location_start)) + + products.append(delayed_neutron) + + # Renormalize delayed neutron yields to reflect fact that in ACE + # file, the sum of the group probabilities is not exactly one + for product in products[1:]: + product.yield_.y /= total_group_probability + + return products, derived_products + + +def _get_photon_products(ace, mt): + """Generate photon products from an ACE table + + Parameters + ---------- + ace : openmc.data.ace.Table + ACE table to read from + mt : int + MT number for the desired reaction + + Returns + ------- + photons : list of openmc.Products + Photons produced from reaction with given MT + + """ + n_photon_reactions = ace.nxs[6] + photon_mts = ace.xss[ace.jxs[13]:ace.jxs[13] + + n_photon_reactions].astype(int) + + photons = [] + for i in range(n_photon_reactions): + # Determine corresponding reaction + neutron_mt = photon_mts[i] // 1000 + + # Restrict to photons that match the requested MT. Note that if the + # photon is assigned to MT=18 but the file splits fission into + # MT=19,20,21,38, we assign the photon product to each of the individual + # reactions + if neutron_mt == 18: + if mt not in (18, 19, 20, 21, 38): + continue + elif neutron_mt != mt: + continue + + # Create photon product and assign to reactions + photon = Product('photon') + + # ================================================================== + # Photon yield / production cross section + + loca = int(ace.xss[ace.jxs[14] + i]) + idx = ace.jxs[15] + loca - 1 + mftype = int(ace.xss[idx]) + idx += 1 + + if mftype in (12, 16): + # Yield data taken from ENDF File 12 or 6 + mtmult = int(ace.xss[idx]) + assert mtmult == neutron_mt + + # Read photon yield as function of energy + photon.yield_ = Tabulated1D.from_ace(ace, idx + 1) + + elif mftype == 13: + # Cross section data from ENDF File 13 + + # Energy grid index at which data starts + threshold_idx = int(ace.xss[idx]) - 1 + + # Get photon production cross section + n_energy = int(ace.xss[idx + 1]) + photon._xs = ace.xss[idx + 2:idx + 2 + n_energy] + + # Determine yield based on ratio of cross sections + energy = ace.xss[ace.jxs[1] + threshold_idx: + ace.jxs[1] + threshold_idx + n_energy] + photon.yield_ = Tabulated1D(energy, photon._xs) + + else: + raise ValueError("MFTYPE must be 12, 13, 16. Got {0}".format( + mftype)) + + # ================================================================== + # Photon energy distribution + + location_start = int(ace.xss[ace.jxs[18] + i]) + distribution = AngleEnergy.from_ace(ace, ace.jxs[19], location_start) + assert isinstance(distribution, UncorrelatedAngleEnergy) + + # ================================================================== + # Photon angular distribution + loc = int(ace.xss[ace.jxs[16] + i]) + + if loc == 0: + # No angular distribution data are given for this reaction, + # isotropic scattering is asssumed in LAB + energy = np.array([photon.yield_.x[0], photon.yield_.x[-1]]) + mu_isotropic = Uniform(-1., 1.) + distribution.angle = AngleDistribution( + energy, [mu_isotropic, mu_isotropic]) + else: + distribution.angle = AngleDistribution.from_ace(ace, ace.jxs[17], loc) + + # Add to list of distributions + photon.distribution.append(distribution) + photons.append(photon) + + return photons + + +class Reaction(object): + """A nuclear reaction + + A Reaction object represents a single reaction channel for a nuclide with + an associated cross section and, if present, a secondary angle and energy + distribution. + + Parameters + ---------- + mt : int + The ENDF MT number for this reaction. On occasion, MCNP uses MT numbers + that don't correspond exactly to the ENDF specification. + + Attributes + ---------- + center_of_mass : bool + Indicates whether scattering kinematics should be performed in the + center-of-mass or laboratory reference frame. + grid above the threshold value in barns. + mt : int + The ENDF MT number for this reaction. + q_value : float + The Q-value of this reaction in MeV. + table : openmc.data.ace.Table + The ACE table which contains this reaction. + threshold : float + Threshold of the reaction in MeV + threshold_idx : int + The index on the energy grid corresponding to the threshold of this + reaction. + xs : openmc.data.Tabulated1D + Microscopic cross section for this reaction as a function of incident + energy + products : Iterable of openmc.data.Product + Reaction products + derived_products : Iterable of openmc.data.Product + Derived reaction products. Used for 'total' fission neutron data when + prompt/delayed data also exists. + + """ + + def __init__(self, mt): + self.center_of_mass = True + self.mt = mt + self.q_value = 0. + self.threshold_idx = 0 + self._xs = None + self.products = [] + self.derived_products = [] + + def __repr__(self): + if self.mt in reaction_name: + return "".format(self.mt, reaction_name[self.mt]) + else: + return "".format(self.mt) + + @property + def center_of_mass(self): + return self._center_of_mass + + @property + def q_value(self): + return self._q_value + + @property + def products(self): + return self._products + + @property + def threshold(self): + return self.xs.x[0] + + @property + def xs(self): + return self._xs + + @center_of_mass.setter + def center_of_mass(self, center_of_mass): + cv.check_type('center of mass', center_of_mass, (bool, np.bool_)) + self._center_of_mass = center_of_mass + + @q_value.setter + def q_value(self, q_value): + cv.check_type('Q value', q_value, Real) + self._q_value = q_value + + @products.setter + def products(self, products): + cv.check_type('reaction products', products, Iterable, Product) + self._products = products + + @xs.setter + def xs(self, xs): + cv.check_type('reaction cross section', xs, Tabulated1D) + for y in xs.y: + cv.check_greater_than('reaction cross section', y, 0.0, True) + self._xs = xs + + def to_hdf5(self, group): + """Write reaction to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + + group.attrs['mt'] = self.mt + if self.mt in reaction_name: + group.attrs['label'] = np.string_(reaction_name[self.mt]) + else: + group.attrs['label'] = np.string_(self.mt) + group.attrs['Q_value'] = self.q_value + group.attrs['threshold_idx'] = self.threshold_idx + 1 + group.attrs['center_of_mass'] = 1 if self.center_of_mass else 0 + group.attrs['n_product'] = len(self.products) + if self.xs is not None: + group.create_dataset('xs', data=self.xs.y) + for i, p in enumerate(self.products): + pgroup = group.create_group('product_{}'.format(i)) + p.to_hdf5(pgroup) + + @classmethod + def from_hdf5(cls, group, energy): + """Generate reaction from an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + energy : Iterable of float + Array of energies at which cross sections are tabulated at + + Returns + ------- + openmc.data.ace.Reaction + Reaction data + + """ + mt = group.attrs['mt'] + rx = cls(mt) + rx.q_value = group.attrs['Q_value'] + rx.threshold_idx = group.attrs['threshold_idx'] - 1 + rx.center_of_mass = bool(group.attrs['center_of_mass']) + + # Read cross section + if 'xs' in group: + xs = group['xs'].value + rx.xs = Tabulated1D(energy, xs) + + # Read reaction products + n_product = group.attrs['n_product'] + products = [] + for i in range(n_product): + pgroup = group['product_{}'.format(i)] + products.append(Product.from_hdf5(pgroup)) + rx.products = products + + return rx + + @classmethod + def from_ace(cls, ace, i_reaction): + # Get nuclide energy grid + n_grid = ace.nxs[3] + grid = ace.xss[ace.jxs[1]:ace.jxs[1] + n_grid] + + if i_reaction > 0: + mt = int(ace.xss[ace.jxs[3] + i_reaction - 1]) + rx = cls(mt) + + # Get Q-value of reaction + rx.q_value = ace.xss[ace.jxs[4] + i_reaction - 1] + + # ================================================================== + # CROSS SECTION + + # Get locator for cross-section data + loc = int(ace.xss[ace.jxs[6] + i_reaction - 1]) + + # Determine starting index on energy grid + rx.threshold_idx = int(ace.xss[ace.jxs[7] + loc - 1]) - 1 + + # Determine number of energies in reaction + n_energy = int(ace.xss[ace.jxs[7] + loc]) + energy = grid[rx.threshold_idx:rx.threshold_idx + n_energy] + + # Read reaction cross section + xs = ace.xss[ace.jxs[7] + loc + 1:ace.jxs[7] + loc + 1 + n_energy] + rx.xs = Tabulated1D(energy, xs) + + # ================================================================== + # YIELD AND ANGLE-ENERGY DISTRIBUTION + + # Determine multiplicity + ty = ace.xss[ace.jxs[5] + i_reaction - 1] + rx.center_of_mass = (ty < 0) + if i_reaction < ace.nxs[5] + 1: + if ty != 19: + if abs(ty) > 100: + # Energy-dependent neutron yield + idx = ace.jxs[11] + abs(ty) - 101 + yield_ = Tabulated1D.from_ace(ace, idx) + else: + yield_ = abs(ty) + + neutron = Product('neutron') + neutron.yield_ = yield_ + rx.products.append(neutron) + else: + assert mt in (18, 19, 20, 21, 38) + rx.products, rx.derived_products = _get_fission_products(ace) + + for p in rx.products: + if p.emission_mode in ('prompt', 'total'): + neutron = p + break + else: + raise Exception("Couldn't find prompt/total fission neutron") + + # Determine locator for ith energy distribution + lnw = int(ace.xss[ace.jxs[10] + i_reaction - 1]) + while lnw > 0: + # Applicability of this distribution + neutron.applicability.append(Tabulated1D.from_ace( + ace, ace.jxs[11] + lnw + 2)) + + # Read energy distribution data + neutron.distribution.append(AngleEnergy.from_ace( + ace, ace.jxs[11], lnw, rx)) + + lnw = int(ace.xss[ace.jxs[11] + lnw - 1]) + + else: + # Elastic scattering + mt = 2 + rx = cls(mt) + + elastic_xs = ace.xss[ace.jxs[1] + 3*n_grid:ace.jxs[1] + 4*n_grid] + rx.xs = Tabulated1D(grid, elastic_xs) + + # No energy distribution for elastic scattering + neutron = Product('neutron') + neutron.distribution.append(UncorrelatedAngleEnergy()) + rx.products.append(neutron) + + # ====================================================================== + # ANGLE DISTRIBUTION (FOR UNCORRELATED) + + if i_reaction < ace.nxs[5] + 1: + # Check if angular distribution data exist + loc = int(ace.xss[ace.jxs[8] + i_reaction]) + if loc <= 0: + # Angular distribution is either given as part of a product + # angle-energy distribution or is not given at all (in which + # case isotropic scattering is assumed) + angle_dist = None + else: + angle_dist = AngleDistribution.from_ace(ace, ace.jxs[9], loc) + + # Apply angular distribution to each uncorrelated angle-energy + # distribution + if angle_dist is not None: + for d in neutron.distribution: + d.angle = angle_dist + + # ====================================================================== + # PHOTON PRODUCTION + + rx.products += _get_photon_products(ace, mt) + + return rx diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 663b6472c..63e573a01 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -1,9 +1,39 @@ from collections import Iterable +from difflib import get_close_matches from numbers import Real +from warnings import warn import numpy as np +import h5py import openmc.checkvalue as cv +from .ace import Table, get_table +from .container import Tabulated1D + + +_THERMAL_NAMES = {'al': 'c_Al27', 'al27': 'c_Al27', + 'be': 'c_Be', + 'bebeo': 'c_Be_in_BeO', 'be-o': 'c_Be_in_BeO', + 'benz': 'c_Benzine', + 'cah': 'c_Ca_in_CaH2', + 'dd2o': 'c_D_in_D2O', 'hwtr': 'c_D_in_D2O', + 'fe': 'c_Fe56', 'fe56': 'c_Fe56', + 'graph': 'c_Graphite', 'grph': 'c_Graphite', + 'hca': 'c_H_in_CaH2', + 'hch2': 'c_H_in_CH2', 'poly': 'c_H_in_CH2', + 'hh2o': 'c_H_in_H2O', 'lwtr': 'c_H_in_H2O', + 'hzrh': 'c_H_in_ZrH', 'h-zr': 'c_H_in_ZrH', + 'lch4': 'c_liquid_CH4', 'lmeth': 'c_liquid_CH4', + 'mg': 'c_Mg24', + 'obeo': 'c_O_in_BeO', 'o-be': 'c_O_in_BeO', + 'orthod': 'c_ortho_D', 'dortho': 'c_ortho_D', + 'orthoh': 'c_ortho_H', 'hortho': 'c_ortho_H', + 'ouo2': 'c_O_in_UO2', 'o2-u': 'c_O_in_UO2', + 'parad': 'c_para_D', 'dpara': 'c_para_D', + 'parah': 'c_para_H', 'hpara': 'c_para_H', + 'sch4': 'c_solid_CH4', 'smeth': 'c_solid_CH4', + 'uuo2': 'c_U_in_UO2', 'u-o2': 'c_U_in_UO2', + 'zrzrh': 'c_Zr_in_ZrH', 'zr-h': 'c_Zr_in_ZrH'} class CoherentElastic(object): @@ -87,6 +117,277 @@ class CoherentElastic(object): Coherent elastic scattering cross section """ - bragg_edges = dataset.value[0,:] - factors = dataset.value[1,:] + bragg_edges = dataset.value[0, :] + factors = dataset.value[1, :] return cls(bragg_edges, factors) + + +class ThermalScattering(object): + """A ThermalScattering object contains thermal scattering data as represented by + an S(alpha, beta) table. + + Parameters + ---------- + name : str + ZAID identifier of the table, e.g. lwtr.10t. + atomic_weight_ratio : float + Atomic mass ratio of the target nuclide. + temperature : float + Temperature of the target nuclide in eV. + + Attributes + ---------- + atomic_weight_ratio : float + Atomic mass ratio of the target nuclide. + elastic_xs : openmc.data.Tabulated1D or openmc.data.CoherentElastic + Elastic scattering cross section derived in the coherent or incoherent + approximation + inelastic_xs : openmc.data.Tabulated1D + Inelastic scattering cross section derived in the incoherent + approximation + name : str + Name of the table, e.g. lwtr.20t. + temperature : float + Temperature of the target nuclide in eV. + zaids : Iterable of int + ZAID identifiers that the thermal scattering data applies to + + """ + + def __init__(self, name, atomic_weight_ratio, temperature): + self.name = name + self.atomic_weight_ratio = atomic_weight_ratio + self.temperature = temperature + self.elastic_xs = None + self.elastic_mu_out = None + self.inelastic_xs = None + self.inelastic_e_out = None + self.inelastic_mu_out = None + self.secondary_mode = None + self.zaids = [] + + def __repr__(self): + if hasattr(self, 'name'): + return "".format(self.name) + else: + return "" + + def export_to_hdf5(self, path, mode='a'): + """Export table to an HDF5 file. + + Parameters + ---------- + path : str + Path to write HDF5 file to + mode : {'r', r+', 'w', 'x', 'a'} + Mode that is used to open the HDF5 file. This is the second argument + to the :class:`h5py.File` constructor. + + """ + + f = h5py.File(path, mode) + + # Write basic data + g = f.create_group(self.name) + g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio + g.attrs['temperature'] = self.temperature + g.attrs['zaids'] = self.zaids + + # Write thermal elastic scattering + if self.elastic_xs is not None: + elastic_group = g.create_group('elastic') + self.elastic_xs.to_hdf5(elastic_group, 'xs') + if self.elastic_mu_out is not None: + elastic_group.create_dataset('mu_out', data=self.elastic_mu_out) + + # Write thermal inelastic scattering + if self.inelastic_xs is not None: + inelastic_group = g.create_group('inelastic') + self.inelastic_xs.to_hdf5(inelastic_group, 'xs') + inelastic_group.attrs['secondary_mode'] = np.string_(self.secondary_mode) + if self.secondary_mode in ('equal', 'skewed'): + inelastic_group.create_dataset('energy_out', data=self.inelastic_e_out) + inelastic_group.create_dataset('mu_out', data=self.inelastic_mu_out) + elif self.secondary_mode == 'continuous': + self.inelastic_dist.to_hdf5(inelastic_group) + + @classmethod + def from_hdf5(self, group): + """Generate thermal scattering data from HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.ThermalScattering + Neutron thermal scattering data + + """ + name = group.name[1:] + atomic_weight_ratio = group.attrs['atomic_weight_ratio'] + temperature = group.attrs['temperature'] + table = ThermalScattering(name, atomic_weight_ratio, temperature) + table.zaids = group.attrs['zaids'] + + # Read thermal elastic scattering + if 'elastic' in group: + elastic_group = group['elastic'] + + # Cross section + elastic_xs_type = elastic_group['xs'].attrs['type'].decode() + if elastic_xs_type == 'tab1': + table.elastic_xs = Tabulated1D.from_hdf5(elastic_group['xs']) + elif elastic_xs_type == 'bragg': + table.elastic_xs = CoherentElastic.from_hdf5(elastic_group['xs']) + + # Angular distribution + if 'mu_out' in elastic_group: + table.elastic_mu_out = elastic_group['mu_out'].value + + # Read thermal inelastic scattering + if 'inelastic' in group: + inelastic_group = group['inelastic'] + table.secondary_mode = inelastic_group.attrs['secondary_mode'].decode() + table.inelastic_xs = Tabulated1D.from_hdf5(inelastic_group['xs']) + if table.secondary_mode in ('equal', 'skewed'): + table.inelastic_e_out = inelastic_group['energy_out'] + table.inelastic_mu_out = inelastic_group['mu_out'] + elif table.secondary_mode == 'continuous': + table.inelastic_dist = AngleEnergy.from_hdf5(inelastic_group) + + return table + + @classmethod + def from_ace(cls, ace_or_filename, name=None): + """Generate thermal scattering data from an ACE table + + Parameters + ---------- + ace : openmc.data.ace.Table or str + ACE table to read from. If given as a string, it is assumed to be + the filename for the ACE file. + name : str + GND-conforming name of the material, e.g. c_H_in_H2O. If none is + passed, the appropriate name is guessed based on the name of the ACE + table. + + Returns + ------- + openmc.data.ThermalScattering + Thermal scattering data + + """ + if isinstance(ace_or_filename, Table): + ace = ace_or_filename + else: + ace = get_table(ace_or_filename) + + # Get new name that is GND-consistent + ace_name, xs = ace.name.split('.') + if name is None: + if ace_name.lower() in _THERMAL_NAMES: + name = _THERMAL_NAMES[ace_name.lower()] + '.' + xs + else: + # Make an educated guess?? This actually works well for JEFF-3.2 + # which stupidly uses names like lw00.32t, lw01.32t, etc. for + # different temperatures + matches = get_close_matches( + ace_name.lower(), _THERMAL_NAMES.keys(), cutoff=0.5) + if len(matches) > 0: + name = _THERMAL_NAMES[matches[0]] + '.' + xs + else: + # OK, we give up. Just use the ACE name. + name = 'c_' + ace.name + warn('Thermal scattering material "{}" is not recognized. ' + 'Assigning a name of {}.'.format(ace.name, name)) + + table = cls(name, ace.atomic_weight_ratio, ace.temperature) + + # Incoherent inelastic scattering cross section + idx = ace.jxs[1] + n_energy = int(ace.xss[idx]) + energy = ace.xss[idx+1 : idx+1+n_energy] + xs = ace.xss[idx+1+n_energy : idx+1+2*n_energy] + table.inelastic_xs = Tabulated1D(energy, xs) + + if ace.nxs[7] == 0: + table.secondary_mode = 'equal' + elif ace.nxs[7] == 1: + table.secondary_mode = 'skewed' + elif ace.nxs[7] == 2: + table.secondary_mode = 'continuous' + + n_energy_out = ace.nxs[4] + if table.secondary_mode in ('equal', 'skewed'): + n_mu = ace.nxs[3] + idx = ace.jxs[3] + table.inelastic_e_out = ace.xss[idx:idx+n_energy*n_energy_out*(n_mu+2):n_mu+2] + table.inelastic_e_out.shape = (n_energy, n_energy_out) + + table.inelastic_mu_out = ace.xss[idx:idx+n_energy*n_energy_out*(n_mu+2)] + table.inelastic_mu_out.shape = (n_energy, n_energy_out, n_mu+2) + table.inelastic_mu_out = table.inelastic_mu_out[:, :, 1:] + else: + n_mu = ace.nxs[3] - 1 + idx = ace.jxs[3] + locc = ace.xss[idx:idx + n_energy].astype(int) + n_energy_out = ace.xss[idx + n_energy:idx + 2*n_energy].astype(int) + energy_out = [] + mu_out = [] + for i in range(n_energy): + idx = locc[i] + + # Outgoing energy distribution for incoming energy i + e = ace.xss[idx + 1:idx + 1 + n_energy_out[i]*(n_mu + 3):n_mu + 3] + p = ace.xss[idx + 2:idx + 2 + n_energy_out[i]*(n_mu + 3):n_mu + 3] + c = ace.xss[idx + 3:idx + 3 + n_energy_out[i]*(n_mu + 3):n_mu + 3] + eout_i = Tabular(e, p, 'linear-linear', ignore_negative=True) + eout_i.c = c + + # Outgoing angle distribution for each (incoming, outgoing) energy pair + mu_i = [] + for j in range(n_energy_out[i]): + mu = ace.xss[idx + 4:idx + 4 + n_mu] + p_mu = 1./n_mu*np.ones(n_mu) + mu_ij = Discrete(mu, p_mu) + mu_ij.c = np.cumsum(p_mu) + mu_i.append(mu_ij) + idx += 3 + n_mu + + energy_out.append(eout_i) + mu_out.append(mu_i) + + # Create correlated angle-energy distribution + breakpoints = [n_energy] + interpolation = [2] + energy = inelastic_xs.x + table.inelastic_dist = CorrelatedAngleEnergy( + breakpoints, interpolation, energy, energy_out, mu_out) + + # Incoherent/coherent elastic scattering cross section + idx = ace.jxs[4] + if idx != 0: + n_energy = int(ace.xss[idx]) + energy = ace.xss[idx+1 : idx+1+n_energy] + P = ace.xss[idx+1+n_energy : idx+1+2*n_energy] + + if ace.nxs[5] == 4: + table.elastic_xs = CoherentElastic(energy, P) + else: + table.elastic_xs = Tabulated1D(energy, P) + + # Angular distribution + n_mu = ace.nxs[6] + if n_mu != -1: + idx = ace.jxs[6] + table.elastic_mu_out = ace.xss[idx:idx + n_energy*n_mu] + table.elastic_mu_out.shape = (n_energy, n_mu) + + # Get relevant ZAIDs + pairs = np.fromiter(map(lambda p: p[0], ace.pairs), int) + table.zaids = pairs[np.nonzero(pairs)] + + return table diff --git a/openmc/data/urr.py b/openmc/data/urr.py index 308a45917..b010a6c47 100644 --- a/openmc/data/urr.py +++ b/openmc/data/urr.py @@ -169,3 +169,42 @@ class ProbabilityTables(object): return cls(energy, table, interpolation, inelastic_flag, absorption_flag, multiply_smooth) + + @classmethod + def from_ace(cls, ace): + """Generate probability tables from an ACE table + + Parameters + ---------- + ace : openmc.data.ace.Table + ACE table to read from + + Returns + ------- + openmc.data.ProbabilityTables + Unresolved resonance region probability tables + + """ + # Check if URR probability tables are present + idx = ace.jxs[23] + if idx == 0: + return None + + N = int(ace.xss[idx]) # Number of incident energies + M = int(ace.xss[idx+1]) # Length of probability table + interpolation = int(ace.xss[idx+2]) + inelastic_flag = int(ace.xss[idx+3]) + absorption_flag = int(ace.xss[idx+4]) + multiply_smooth = (int(ace.xss[idx+5]) == 1) + idx += 6 + + # Get energies at which tables exist + energy = ace.xss[idx : idx+N] + idx += N + + # Get probability tables + table = ace.xss[idx : idx+N*6*M] + table.shape = (N, 6, M) + + return cls(energy, table, interpolation, inelastic_flag, + absorption_flag, multiply_smooth) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 9df9d150d..179b47330 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -625,7 +625,7 @@ class Library(object): in the report. Defaults to 'all'. nuclides : {'all', 'sum'} The nuclides of the cross-sections to include in the report. This - may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + may be a list of nuclide name strings (e.g., ['U235', 'U238']). The special string 'all' will report the cross sections for all nuclides in the spatial domain. The special string 'sum' will report the cross sections summed over all nuclides. Defaults to 'all'. @@ -758,7 +758,7 @@ class Library(object): xsdata_name : str Name to apply to the "xsdata" entry produced by this method nuclide : str - A nuclide name string (e.g., 'U-235'). Defaults to 'total' to + A nuclide name string (e.g., 'U235'). Defaults to 'total' to obtain a material-wise macroscopic cross section. xs_type: {'macro', 'micro'} Provide the macro or micro cross section in units of cm^-1 or diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 2c0cb21c6..8e6d123f7 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -120,7 +120,7 @@ class MGXS(object): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -494,7 +494,7 @@ class MGXS(object): ------- list of str A list of the string names for each nuclide in the spatial domain - (e.g., ['U-235', 'U-238', 'O-16']) + (e.g., ['U235', 'U238', 'O16']) Raises ------ @@ -522,7 +522,7 @@ class MGXS(object): Parameters ---------- nuclide : str - A nuclide name string (e.g., 'U-235') + A nuclide name string (e.g., 'U235') Returns ------- @@ -557,7 +557,7 @@ class MGXS(object): Parameters ---------- nuclides : Iterable of str or 'all' or 'sum' - A list of nuclide name strings (e.g., ['U-235', 'U-238']). The + A list of nuclide name strings (e.g., ['U235', 'U238']). The special string 'all' will return the atom densities for all nuclides in the spatial domain. The special string 'sum' will return the atom density summed across all nuclides in the spatial domain. Defaults @@ -716,7 +716,7 @@ class MGXS(object): subdomains : Iterable of Integral or 'all' Subdomain IDs of interest. Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' - A list of nuclide name strings (e.g., ['U-235', 'U-238']). The + A list of nuclide name strings (e.g., ['U235', 'U238']). The special string 'all' will return the cross sections for all nuclides in the spatial domain. The special string 'sum' will return the cross section summed over all nuclides. Defaults to 'all'. @@ -954,7 +954,7 @@ class MGXS(object): ---------- nuclides : list of str A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) + (e.g., ['U235', 'U238']; default is []) groups : list of int A list of energy group indices starting at 1 for the high energies (e.g., [1, 2, 3]; default is []) @@ -1111,7 +1111,7 @@ class MGXS(object): Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' The nuclides of the cross-sections to include in the report. This - may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + may be a list of nuclide name strings (e.g., ['U235', 'U238']). The special string 'all' will report the cross sections for all nuclides in the spatial domain. The special string 'sum' will report the cross sections summed over all nuclides. Defaults to 'all'. @@ -1215,7 +1215,7 @@ class MGXS(object): Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' The nuclides of the cross-sections to include in the report. This - may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + may be a list of nuclide name strings (e.g., ['U235', 'U238']). The special string 'all' will report the cross sections for all nuclides in the spatial domain. The special string 'sum' will report the cross sections summed over all nuclides. Defaults to 'all'. @@ -1414,7 +1414,7 @@ class MGXS(object): Energy groups of interest. Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' The nuclides of the cross-sections to include in the dataframe. This - may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + may be a list of nuclide name strings (e.g., ['U235', 'U238']). The special string 'all' will include the cross sections for all nuclides in the spatial domain. The special string 'sum' will include the cross sections summed over all nuclides. Defaults @@ -1603,7 +1603,7 @@ class MatrixMGXS(MGXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -1652,7 +1652,7 @@ class MatrixMGXS(MGXS): subdomains : Iterable of Integral or 'all' Subdomain IDs of interest. Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' - A list of nuclide name strings (e.g., ['U-235', 'U-238']). The + A list of nuclide name strings (e.g., ['U235', 'U238']). The special string 'all' will return the cross sections for all nuclides in the spatial domain. The special string 'sum' will return the cross section summed over all nuclides. Defaults to @@ -1790,7 +1790,7 @@ class MatrixMGXS(MGXS): ---------- nuclides : list of str A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) + (e.g., ['U235', 'U238']; default is []) in_groups : list of int A list of incoming energy group indices starting at 1 for the high energies (e.g., [1, 2, 3]; default is []) @@ -1840,7 +1840,7 @@ class MatrixMGXS(MGXS): Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' The nuclides of the cross-sections to include in the report. This - may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + may be a list of nuclide name strings (e.g., ['U235', 'U238']). The special string 'all' will report the cross sections for all nuclides in the spatial domain. The special string 'sum' will report the cross sections summed over all nuclides. Defaults to @@ -2024,7 +2024,7 @@ class TotalXS(MGXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -2142,7 +2142,7 @@ class TransportXS(MGXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -2272,7 +2272,7 @@ class NuTransportXS(TransportXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -2393,7 +2393,7 @@ class AbsorptionXS(MGXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -2509,7 +2509,7 @@ class CaptureXS(MGXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -2631,7 +2631,7 @@ class FissionXS(MGXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -2742,7 +2742,7 @@ class NuFissionXS(MGXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -2858,7 +2858,7 @@ class KappaFissionXS(MGXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -2971,7 +2971,7 @@ class ScatterXS(MGXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -3086,7 +3086,7 @@ class NuScatterXS(MGXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -3220,7 +3220,7 @@ class ScatterMatrixXS(MatrixMGXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -3383,7 +3383,7 @@ class ScatterMatrixXS(MatrixMGXS): ---------- nuclides : list of str A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) + (e.g., ['U235', 'U238']; default is []) in_groups : list of int A list of incoming energy group indices starting at 1 for the high energies (e.g., [1, 2, 3]; default is []) @@ -3465,7 +3465,7 @@ class ScatterMatrixXS(MatrixMGXS): subdomains : Iterable of Integral or 'all' Subdomain IDs of interest. Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' - A list of nuclide name strings (e.g., ['U-235', 'U-238']). The + A list of nuclide name strings (e.g., ['U235', 'U238']). The special string 'all' will return the cross sections for all nuclides in the spatial domain. The special string 'sum' will return the cross section summed over all nuclides. Defaults to 'all'. @@ -3612,7 +3612,7 @@ class ScatterMatrixXS(MatrixMGXS): Energy groups of interest. Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' The nuclides of the cross-sections to include in the dataframe. This - may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + may be a list of nuclide name strings (e.g., ['U235', 'U238']). The special string 'all' will include the cross sections for all nuclides in the spatial domain. The special string 'sum' will include the cross sections summed over all nuclides. Defaults @@ -3679,7 +3679,7 @@ class ScatterMatrixXS(MatrixMGXS): Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' The nuclides of the cross-sections to include in the report. This - may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + may be a list of nuclide name strings (e.g., ['U235', 'U238']). The special string 'all' will report the cross sections for all nuclides in the spatial domain. The special string 'sum' will report the cross sections summed over all nuclides. Defaults to 'all'. @@ -3869,7 +3869,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -3991,7 +3991,7 @@ class MultiplicityMatrixXS(MatrixMGXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -4138,7 +4138,7 @@ class NuFissionMatrixXS(MatrixMGXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -4253,7 +4253,7 @@ class Chi(MGXS): being tracked. This is unity if the by_nuclide attribute is False. nuclides : Iterable of str or 'sum' The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool @@ -4331,7 +4331,7 @@ class Chi(MGXS): ---------- nuclides : list of str A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) + (e.g., ['U235', 'U238']; default is []) groups : list of Integral A list of energy group indices starting at 1 for the high energies (e.g., [1, 2, 3]; default is []) @@ -4442,7 +4442,7 @@ class Chi(MGXS): subdomains : Iterable of Integral or 'all' Subdomain IDs of interest. Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' - A list of nuclide name strings (e.g., ['U-235', 'U-238']). The + A list of nuclide name strings (e.g., ['U235', 'U238']). The special string 'all' will return the cross sections for all nuclides in the spatial domain. The special string 'sum' will return the cross section summed over all nuclides. Defaults to 'all'. @@ -4575,7 +4575,7 @@ class Chi(MGXS): Energy groups of interest. Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' The nuclides of the cross-sections to include in the dataframe. This - may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + may be a list of nuclide name strings (e.g., ['U235', 'U238']). The special string 'all' will include the cross sections for all nuclides in the spatial domain. The special string 'sum' will include the cross sections summed over all nuclides. Defaults to diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index 8a572c874..6f8188b10 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -100,7 +100,7 @@ class XSdata(object): alias : str Separate unique identifier for the xsdata object zaid : int - 1000*(atomic number) + mass number. As an example, the zaid of U-235 + 1000*(atomic number) + mass number. As an example, the zaid of U235 would be 92235. awr : float Atomic weight ratio of an isotope. That is, the ratio of the mass diff --git a/openmc/nuclide.py b/openmc/nuclide.py index bfeff9311..14609161f 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -13,18 +13,18 @@ class Nuclide(object): Parameters ---------- name : str - Name of the nuclide, e.g. U-235 + Name of the nuclide, e.g. U235 xs : str Cross section identifier, e.g. 71c Attributes ---------- name : str - Name of the nuclide, e.g. U-235 + Name of the nuclide, e.g. U235 xs : str Cross section identifier, e.g. 71c zaid : int - 1000*(atomic number) + mass number. As an example, the zaid of U-235 + 1000*(atomic number) + mass number. As an example, the zaid of U235 would be 92235. scattering : 'data' or 'iso-in-lab' or None The type of angular scattering distribution to use diff --git a/openmc/tallies.py b/openmc/tallies.py index fab88e2f7..79e7c56bc 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -520,7 +520,7 @@ class Tally(object): Nuclide to add to the tally. The nuclide should be a Nuclide object when a user is adding nuclides to a Tally for input file generation. The nuclide is a str when a Tally is created from a StatePoint file - (e.g., 'H-1', 'U-235') unless a Summary has been linked with the + (e.g., 'H1', 'U235') unless a Summary has been linked with the StatePoint. The nuclide may be a CrossNuclide or AggregateNuclide for derived tallies created by tally arithmetic. @@ -1166,7 +1166,7 @@ class Tally(object): Parameters ---------- nuclide : str - The name of the Nuclide (e.g., 'H-1', 'U-238') + The name of the Nuclide (e.g., 'H1', 'U238') Returns ------- @@ -1342,7 +1342,7 @@ class Tally(object): ---------- nuclides : list of str A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) + (e.g., ['U235', 'U238']; default is []) Returns ------- @@ -1435,7 +1435,7 @@ class Tally(object): the filter_types parameter. nuclides : list of str A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) + (e.g., ['U235', 'U238']; 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 @@ -2887,7 +2887,7 @@ class Tally(object): correspond to the filter_types parameter. nuclides : list of str A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) + (e.g., ['U235', 'U238']; default is []) Returns ------- @@ -3025,7 +3025,7 @@ class Tally(object): interest. nuclides : list of str A list of nuclide name strings to sum across - (e.g., ['U-235', 'U-238']; default is []) + (e.g., ['U235', 'U238']; default is []) remove_filter : bool If a filter is being summed over, this bool indicates whether to remove that filter in the returned tally. Default is False. @@ -3173,7 +3173,7 @@ class Tally(object): interest. nuclides : list of str A list of nuclide name strings to average across - (e.g., ['U-235', 'U-238']; default is []) + (e.g., ['U235', 'U238']; default is []) remove_filter : bool If a filter is being averaged over, this bool indicates whether to remove that filter in the returned tally. Default is False. diff --git a/scripts/openmc-ace-to-hdf5 b/scripts/openmc-ace-to-hdf5 new file mode 100755 index 000000000..743cf4a50 --- /dev/null +++ b/scripts/openmc-ace-to-hdf5 @@ -0,0 +1,139 @@ +#!/usr/bin/env python + +import argparse +import os +import xml.etree.ElementTree as ET +import warnings + +import openmc.data + +description = """ +This script can be used to create HDF5 nuclear data libraries used by +OpenMC. There are four different ways you can specify ACE libraries that are to +be converted: + +1. List each ACE library as a positional argument. This is very useful in + conjunction with the usual shell utilities (ls, find, etc.). +2. Use the --xml option to specify a pre-v0.9 cross_sections.xml file. +3. Use the --xsdir option to specify a MCNP xsdir file. +4. Use the --xsdata option to specify a Serpent xsdata file. + +The script does not use any extra information from cross_sections.xml/ xsdir/ +xsdata files to determine whether the nuclide is metastable. Instead, the +--metastable argument can be used to specify whether the ZAID naming convention +follows the NNDC data convention (1000*Z + A + 300 + 100*m), or the MCNP data +convention (essentially the same as NNDC, except that the first metastable state +of Am242 is 95242 and the ground state is 95642). + +""" + +class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter, + argparse.RawDescriptionHelpFormatter): + pass + +parser = argparse.ArgumentParser( + description=description, + formatter_class=CustomFormatter +) +parser.add_argument('libraries', nargs='*', + help='ACE libraries to convert to HDF5') +parser.add_argument('-d', '--destination', default='.', + help='Directory to create new library in') +parser.add_argument('-m', '--metastable', choices=['mcnp', 'nndc'], default='nndc', + help='How to interpret ZAIDs for metastable nuclides') +parser.add_argument('--xml', help='Old-style cross_sections.xml that ' + 'lists ACE libraries') +parser.add_argument('--xsdir', help='MCNP xsdir file that lists ' + 'ACE libraries') +parser.add_argument('--xsdata', help='Serpent xsdata file that lists ' + 'ACE libraries') +args = parser.parse_args() + +if not os.path.isdir(args.destination): + os.mkdir(args.destination) + +# If the --xml argument was given, get the list of ACE libraries directory from +# elements within the specified cross_sections.xml file +ace_libraries = [] +if args.xml is not None: + tree = ET.parse(args.xml) + root = tree.getroot() + if root.find('directory') is not None: + directory = root.find('directory').text + else: + directory = os.path.dirname(args.xml) + + for ace_table in root.findall('ace_table'): + ace_libraries.append(os.path.join(directory, ace_table.attrib['path'])) + +elif args.xsdir is not None: + # Find 'directory' section + lines = open(args.xsdir, 'r').readlines() + for index, line in enumerate(lines): + if line.strip().lower() == 'directory': + break + else: + raise IOError("Could not find 'directory' section in MCNP xsdir file") + + # Create list of ACE libraries + for line in lines[index + 1:]: + words = line.split() + if len(words) < 3: + continue + + path = os.path.join(os.path.dirname(args.xsdir), words[2]) + if path not in ace_libraries: + ace_libraries.append(path) + +elif args.xsdata is not None: + with open(args.xsdata, 'r') as xsdata: + for line in xsdata: + words = line.split() + if len(words) >= 9: + path = os.path.join(os.path.dirname(args.xsdata, words[8])) + if path not in ace_libraries: + ace_libraries.append(path) + +else: + ace_libraries = args.libraries + +library = openmc.data.DataLibrary() + +for filename in ace_libraries: + # Check that ACE library exists + if not os.path.exists(filename): + warnings.warn("ACE library '{}' does not exist.".format(filename)) + continue + + lib = openmc.data.ace.Library(filename) + for table in lib.tables: + if table.name.endswith('c'): + # Continuous-energy neutron data + neutron = openmc.data.IncidentNeutron.from_ace( + table, args.metastable) + print(neutron.name) + + # Determine filename + outfile = os.path.join(args.destination, + neutron.name.replace('.', '_') + '.h5') + neutron.export_to_hdf5(outfile) + + # Register with library + library.register_file(outfile) + + elif table.name.endswith('t'): + # Thermal scattering data + thermal = openmc.data.ThermalScattering.from_ace(table) + print(thermal.name) + + # Determine filename + outfile = os.path.join(args.destination, + thermal.name.replace('.', '_') + '.h5') + thermal.export_to_hdf5(outfile) + + # Register with library + library.register_file(outfile, 'thermal') + +# Write cross_sections.xml +libpath = os.path.join(args.destination, 'cross_sections.xml') +library.export_to_xml(libpath) diff --git a/scripts/openmc-ascii-to-binary b/scripts/openmc-ascii-to-binary deleted file mode 100755 index e707e2a85..000000000 --- a/scripts/openmc-ascii-to-binary +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env python - -from openmc.ace import ascii_to_binary -import sys - - -if __name__ == '__main__': - # Check for proper number of arguments - if len(sys.argv) < 3: - sys.exit('Usage: {0} ascii_file binary_file'.format(sys.argv[0])) - - # Convert ASCII file - ascii_to_binary(sys.argv[1], sys.argv[2]) diff --git a/scripts/openmc-update-inputs b/scripts/openmc-update-inputs index 2a8097854..5b5bf0978 100755 --- a/scripts/openmc-update-inputs +++ b/scripts/openmc-update-inputs @@ -22,11 +22,14 @@ optional arguments: from __future__ import print_function import argparse +from difflib import get_close_matches from itertools import chain from random import randint from shutil import move import xml.etree.ElementTree as ET +import openmc.data +from openmc.data.thermal import _THERMAL_NAMES description = "Update OpenMC's input XML files to the latest format." epilog = """\ @@ -40,6 +43,11 @@ geometry.xml: Lattices containing 'outside' attributes/tags will be replaced with lattices containing 'outer' attributes, and the appropriate cells/universes will be added. Any 'surfaces' attributes/elements on a cell will be renamed 'region'. + +materials.xml: Nuclide names will be changed from ACE aliases (e.g., Am-242m) to + HDF5/GND names (e.g., Am242_m1). Thermal scattering table names will be + changed from ACE aliases (e.g., HH2O) to HDF5/GND names (e.g., c_H_in_H2O). + """ @@ -245,6 +253,62 @@ def update_geometry(geometry_root): return was_updated +def get_thermal_name(name): + """Get proper S(a,b) table name, e.g. 'HH2O' -> 'c_H_in_H2O'""" + if name.lower() in _THERMAL_NAMES: + return _THERMAL_NAMES[name.lower()] + else: + # Make an educated guess?? This actually works well for + # JEFF-3.2 which stupidly uses names like lw00.32t, + # lw01.32t, etc. for different temperatures + matches = get_close_matches( + name.lower(), _THERMAL_NAMES.keys(), cutoff=0.5) + if len(matches) > 0: + return _THERMAL_NAMES[matches[0]] + '.' + xs + else: + # OK, we give up. Just use the ACE name. + return 'c_' + name + return name + +def update_materials(root): + """Update the given XML materials tree. Return True if changes were made.""" + was_updated = False + + for material in root.findall('material'): + for nuclide in material.findall('nuclide'): + if 'name' in nuclide.attrib: + nucname = nuclide.attrib['name'] + nucname = nucname.replace('-', '') + nucname = nucname.replace('Nat', '0') + if nucname.endswith('m'): + nucname = nucname[:-1] + '_m1' + nuclide.set('name', nucname) + was_updated = True + + elif nuclide.find('name') is not None: + name_elem = nuclide.find('name') + nucname = name_elem.text + nucname = nucname.replace('-', '') + nucname = nucname.replace('Nat', '0') + if nucname.endswith('m'): + nucname = nucname[:-1] + '_m1' + name_elem.text = nucname + was_updated = True + + for sab in material.findall('sab'): + if 'name' in sab.attrib: + sabname = sab.attrib['name'] + sab.set('name', get_thermal_name(sabname)) + was_updated = True + + elif sab.find('name') is not None: + name_elem = sab.find('name') + sabname = name_elem.text + name_elem.text = get_thermal(sabname) + was_updated = True + + return was_updated + if __name__ == '__main__': args = parse_args() @@ -256,6 +320,8 @@ if __name__ == '__main__': if root.tag == 'geometry': was_updated = update_geometry(root) + elif root.tag == 'materials': + was_updated = update_materials(root) if was_updated: # Move the original geometry file to preserve it. diff --git a/scripts/openmc-xsdata-to-xml b/scripts/openmc-xsdata-to-xml deleted file mode 100755 index 708a196f9..000000000 --- a/scripts/openmc-xsdata-to-xml +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -from xml.dom.minidom import getDOMImplementation - -types = {1: "neutron", 2: "dosimetry", 3: "thermal"} - - -class Xsdata(object): - - def __init__(self, filename): - self._table_dict = {} - self.tables = [] - - for line in open(filename, 'r'): - words = line.split() - - # If this listing is just an alias listing, only assign the alias - # attribute - name = words[1] - alias = words[0] - table = self.find_table(name) - if table: - if name not in table.alias: - table.alias.append(alias) - continue - - table = XsdataTable() - table.name = name - table.type = types[int(words[2])] - table.zaid = int(words[3]) - table.metastable = int(words[4]) - table.awr = float(words[5]) - table.temperature = 8.6173423e-11 * float(words[6]) - table.binary = int(words[7]) - table.path = words[8] - - self.tables.append(table) - self._table_dict[name] = table - - # Check for common directory - self.directory = os.path.dirname(self.tables[0].path) - for table in self.tables: - if not table.path.startswith(self.directory): - self.directory = None - break - - def to_xml(self): - # Create XML document - impl = getDOMImplementation() - doc = impl.createDocument(None, "cross_sections", None) - - # Get root element - root = doc.documentElement - - # Add a directory node - if self.directory: - directoryNode = doc.createElement("directory") - text = doc.createTextNode(self.directory) - directoryNode.appendChild(text) - root.appendChild(directoryNode) - - for table in self.tables: - table.path = os.path.basename(table.path) - - # Add a node for each table - for table in self.tables: - node = table.to_xml_node(doc) - root.appendChild(node) - - return doc - - def find_table(self, name): - if name in self._table_dict: - return self._table_dict[name] - else: - return None - - -class XsdataTable(object): - - def __init__(self): - self.alias = [] - - def to_xml_node(self, doc): - node = doc.createElement("ace_table") - node.setAttribute("name", self.name) - for attribute in ["alias", "zaid", "type", "metastable", - "awr", "temperature", "binary", "path"]: - if hasattr(self, attribute): - # Join string for alias attribute - if attribute == "alias": - if not self.alias: - continue - string = " ".join(self.alias) - else: - string = "{0}".format(getattr(self, attribute)) - - # Skip metastable and binary if 0 - if attribute == "metastable" and self.metastable == 0: - continue - if attribute == "binary" and self.binary == 0: - continue - - # Create attribute node - # nodeAttr = doc.createElement(attribute) - # text = doc.createTextNode(string) - # nodeAttr.appendChild(text) - # node.appendChild(nodeAttr) - node.setAttribute(attribute, string) - return node - - -if __name__ == '__main__': - # Read command line arguments - if len(sys.argv) < 3: - sys.exit("Usage: convert_xsdata.py xsdataFile xmlFile") - xsdataFile = sys.argv[1] - xmlFile = sys.argv[2] - - # Read xsdata and create XML document object - xsdataObject = Xsdata(xsdataFile) - doc = xsdataObject.to_xml() - - # Reduce number of lines - lines = doc.toprettyxml(indent=' ') - lines = lines.replace('\n ', '') - lines = lines.replace('\n ', '') - lines = lines.replace('\n ', '') - lines = lines.replace('\n ', '') - lines = lines.replace('\n ', '') - lines = lines.replace('\n ', '') - lines = lines.replace('\n ', '') - lines = lines.replace('\n ', '') - lines = lines.replace('\n ', '') - lines = lines.replace('\n ', '') - lines = lines.replace('\n ', '') - lines = lines.replace('\n ', '') - lines = lines.replace('\n ', '') - lines = lines.replace('\n ', '') - lines = lines.replace('\n ', '') - lines = lines.replace('\n ', '') - - # Write document in pretty XML to specified file - f = open(xmlFile, 'w') - f.write(lines) - f.close() diff --git a/scripts/openmc-xsdir-to-xml b/scripts/openmc-xsdir-to-xml deleted file mode 100755 index 7e1606fc4..000000000 --- a/scripts/openmc-xsdir-to-xml +++ /dev/null @@ -1,288 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -from xml.dom.minidom import getDOMImplementation - -elements = [None, "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", - "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", - "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", - "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", - "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", - "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", - "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", - "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", - "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", - "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", - "Cn"] - - -class Xsdir(object): - - def __init__(self, filename): - self.f = open(filename, 'r') - self.filename = os.path.abspath(filename) - self.directory = os.path.dirname(filename) - self.awr = {} - self.tables = [] - - self.filetype = set() - self.recordlength = set() - self.entries = set() - - # Read first section (DATAPATH) - line = self.f.readline() - words = line.split() - if words: - if words[0].lower().startswith('datapath'): - if '=' in words[0]: - index = line.index('=') - self.datapath = line[index+1:].strip() - else: - if len(line.strip()) > 8: - self.datapath = line[8:].strip() - else: - self.f.seek(0) - - # Read second section - line = self.f.readline() - words = line.split() - assert len(words) == 3 - assert words[0].lower() == 'atomic' - assert words[1].lower() == 'weight' - assert words[2].lower() == 'ratios' - - while True: - line = self.f.readline() - words = line.split() - - # Check for end of second section - if len(words) % 2 != 0 or words[0] == 'directory': - break - - for zaid, awr in zip(words[::2], words[1::2]): - self.awr[zaid] = awr - - # Read third section - while words[0] != 'directory': - words = self.f.readline().split() - - while True: - words = self.f.readline().split() - if not words: - break - - # Handle continuation lines - while words[-1] == '+': - extraWords = self.f.readline().split() - words = words[:-1] + extraWords - assert len(words) >= 7 - - # Create XsdirTable object and add to line - table = XsdirTable(self.directory) - self.tables.append(table) - - # All tables have at least 7 attributes - table.name = words[0] - table.awr = float(words[1]) - table.filename = words[2] - table.access = words[3] - table.filetype = int(words[4]) - table.location = int(words[5]) - table.length = int(words[6]) - - self.filetype.add(table.filetype) - - if len(words) > 7: - table.recordlength = int(words[7]) - self.recordlength.add(table.recordlength) - if len(words) > 8: - table.entries = int(words[8]) - self.entries.add(table.entries) - if len(words) > 9: - table.temperature = float(words[9]) - if len(words) > 10: - table.ptable = (words[10] == 'ptable') - - if len(self.filetype) == 1: - if 1 in self.filetype: - self.filetype = 'ascii' - elif 2 in self.filetype: - self.filetype = 'binary' - else: - self.filetype = None - - if len(self.recordlength) == 1: - self.recordlength = list(self.recordlength)[0] - else: - self.recordlength = None - if len(self.entries) == 1: - self.entries = list(self.entries)[0] - else: - self.recordlength = None - - def to_xml(self): - # Create XML document - impl = getDOMImplementation() - doc = impl.createDocument(None, "cross_sections", None) - - # Get root element - root = doc.documentElement - - # Add a directory node - if self.directory: - directoryNode = doc.createElement("directory") - text = doc.createTextNode(self.directory) - directoryNode.appendChild(text) - root.appendChild(directoryNode) - - for table in self.tables: - table.path = os.path.basename(table.path) - - # Add filetype, record_length and entries nodes - if self.filetype: - node = doc.createElement("filetype") - text = doc.createTextNode(self.filetype) - node.appendChild(text) - root.appendChild(node) - if self.recordlength: - node = doc.createElement("record_length") - text = doc.createTextNode(str(self.recordlength)) - node.appendChild(text) - root.appendChild(node) - if self.entries: - node = doc.createElement("entries") - text = doc.createTextNode(str(self.entries)) - node.appendChild(text) - root.appendChild(node) - - # Add a node for each table - for table in self.tables: - if table.name[-1] in ['e', 'p', 'u', 'h', 'g', 'm', 'd']: - continue - node = table.to_xml_node(doc) - root.appendChild(node) - - return doc - - -class XsdirTable(object): - - def __init__(self, directory=None): - self.directory = None - self.name = None - self.awr = None - self.filename = None - self.access = None - self.filetype = None - self.location = None - self.length = None - self.recordlength = None - self.entries = None - self.temperature = None - self.ptable = False - - @property - def path(self): - if self.directory: - return os.path.join(self.directory, self.filename) - else: - return self.filename - - @path.setter - def path(self, value): - self.diretory = '' - self.filename = value - - @property - def metastable(self): - # Only valid for neutron cross-sections - if not self.name.endswith('c'): - return - - # Handle special case of Am-242 and Am-242m - if self.zaid == '95242': - return 1 - elif self.zaid == '95642': - return 0 - - # All other cases - A = int(self.zaid) % 1000 - if A > 300: - return 1 - else: - return 0 - - @property - def alias(self): - zaid = self.zaid - if zaid: - Z = int(zaid[:-3]) - A = zaid[-3:] - - if A == '000': - s = 'Nat' - elif zaid == '95242': - s = '242m' - elif zaid == '95642': - s = '242' - elif int(A) > 300: - s = str(int(A) - 400) + "m" - else: - s = str(int(A)) - - return "{0}-{1}.{2}".format(elements[Z], s, self.xs) - else: - return None - - @property - def zaid(self): - if self.name.endswith('c'): - return self.name[:self.name.find('.')] - else: - return 0 - - @property - def xs(self): - return self.name[self.name.find('.')+1:] - - def to_xml_node(self, doc): - node = doc.createElement("ace_table") - node.setAttribute("name", self.name) - for attribute in ["alias", "zaid", "type", "metastable", "awr", - "temperature", "path", "location"]: - if hasattr(self, attribute): - string = str(getattr(self, attribute)) - - # Skip metastable and binary if 0 - if attribute == "metastable" and self.metastable == 0: - continue - - # Skip any attribute that is none - if getattr(self, attribute) is None: - continue - - # Create attribute node - node.setAttribute(attribute, string) - - return node - - -if __name__ == '__main__': - # Read command line arguments - if len(sys.argv) < 3: - sys.exit("Usage: convert_xsdir.py xsdirFile xmlFile") - xsdirFile = sys.argv[1] - xmlFile = sys.argv[2] - - # Read xsdata and create XML document object - xsdirObject = Xsdir(xsdirFile) - doc = xsdirObject.to_xml() - - # Reduce number of lines - lines = doc.toprettyxml(indent=' ') - - # Write document in pretty XML to specified file - f = open(xmlFile, 'w') - f.write(lines) - f.close() diff --git a/src/reaction_header.F90 b/src/reaction_header.F90 index 8af75b3cf..74198dd78 100644 --- a/src/reaction_header.F90 +++ b/src/reaction_header.F90 @@ -38,7 +38,7 @@ contains integer(HSIZE_T) :: dims(1) call read_attribute(this % Q_value, group_id, 'Q_value') - call read_attribute(this % MT, group_id, 'MT') + call read_attribute(this % MT, group_id, 'mt') call read_attribute(this % threshold, group_id, 'threshold_idx') call read_attribute(cm, group_id, 'center_of_mass') this % scatter_in_cm = (cm == 1) diff --git a/src/relaxng/cross_sections.rnc b/src/relaxng/cross_sections.rnc index 75c0ea29c..7fbc610a2 100644 --- a/src/relaxng/cross_sections.rnc +++ b/src/relaxng/cross_sections.rnc @@ -1,25 +1,12 @@ element cross_sections { - element ace_table { - (element name { xsd:string { maxLength = "15" } } | - attribute name { xsd:string { maxLength = "15" } }) & - (element alias { xsd:string { maxLength = "15" } } | - attribute alias { xsd:string { maxLength = "15" } })? & - (element zaid { xsd:int } | attribute zaid { xsd:int }) & - (element metastable { xsd:int } | attribute metastable { xsd:int })? & - (element awr { xsd:double } | attribute awr { xsd:double }) & - (element temperature { xsd:double } | attribute temperature { xsd:double }) & - (element path { xsd:string { maxLength = "255" } } | - attribute path { xsd:string { maxLength = "255" } }) & - (element location { xsd:int } | attribute location { xsd:int })? & - (element filetype { ( "ascii" | "binary" ) } | - attribute filetype { ( "ascii" | "binary" ) })? + element library { + (element materials { xsd:string } | + attribute materials { xsd:string }) & + (element type { xsd:string } | + attribute type { xsd:string }) & + (element path { xsd:string } | + attribute path { xsd:string }) }* & - element directory { xsd:string { maxLength = "255" } }? & - - element filetype { ( "ascii" | "binary" ) } & - - element record_length { xsd:int }? & - - element entries { xsd:int }? + element directory { xsd:string { maxLength = "255" } }? } \ No newline at end of file diff --git a/src/relaxng/cross_sections.rng b/src/relaxng/cross_sections.rng index 5e531e013..435f7fa84 100644 --- a/src/relaxng/cross_sections.rng +++ b/src/relaxng/cross_sections.rng @@ -2,106 +2,32 @@ - + - - - 15 - + + - - - 15 - - - - - - - - 15 - - - - - 15 - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - - 255 - + - - 255 - + - - - - - - - - - - - - - - - ascii - binary - - - - - ascii - binary - - - - @@ -112,21 +38,5 @@ - - - ascii - binary - - - - - - - - - - - - From 436f88170dc1290a2e83ce0d47f5123629b4c292 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 13 Jul 2016 08:24:47 -0500 Subject: [PATCH 12/33] Use shared box.com link for NNDC HDF5 data in Travis runs --- .travis.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 46f5e91bf..86a2fbb4c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,7 @@ cache: - $HOME/mpich_install - $HOME/hdf5_install - $HOME/phdf5_install + - $HOME/nndc_hdf5 before_install: # ============== Handle Python third-party packages ============== @@ -40,11 +41,12 @@ before_install: install: true before_script: + - if [[ ! -e $HOME/nndc_hdf5/cross_sections.xml ]]; then + wget https://anl.box.com/shared/static/b3373ozjaiarcndy1ikotm4yuawxomwa.xz -O - | tar -C $HOME -xvJ; + fi + - export OPENMC_CROSS_SECTIONS=$HOME/nndc_hdf5/cross_sections.xml + - cd data - - git clone --branch=master git://github.com/paulromano/nndc-hdf5 - - cat nndc-hdf5/nndc_hdf5.tar.xz? | tar xJvf - - - rm -rf nndc-hdf5 - - export OPENMC_CROSS_SECTIONS=$PWD/nndc_hdf5/cross_sections.xml - git clone --branch=master git://github.com/smharper/windowed_multipole_library.git wmp_lib - tar xzvf wmp_lib/multipole_lib.tar.gz - export OPENMC_MULTIPOLE_LIBRARY=$PWD/multipole_lib From ef7eb3cc6495e170d63ba77c53c7705054daf104 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 8 Jun 2016 10:18:34 -0500 Subject: [PATCH 13/33] Add example notebook for nuclear data --- .../pythonapi/examples/nuclear-data.ipynb | 630 ++++++++++++++++++ .../pythonapi/examples/nuclear-data.rst | 13 + docs/source/pythonapi/index.rst | 1 + 3 files changed, 644 insertions(+) create mode 100644 docs/source/pythonapi/examples/nuclear-data.ipynb create mode 100644 docs/source/pythonapi/examples/nuclear-data.rst diff --git a/docs/source/pythonapi/examples/nuclear-data.ipynb b/docs/source/pythonapi/examples/nuclear-data.ipynb new file mode 100644 index 000000000..78a71cd29 --- /dev/null +++ b/docs/source/pythonapi/examples/nuclear-data.ipynb @@ -0,0 +1,630 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this notebook, we will go through the salient features of the `openmc.data` package in the Python API. This package enables inspection, analysis, and conversion of nuclear data from ACE files. Most importantly, the package provides a mean to generate HDF5 nuclear data libraries that are used by the transport solver." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import os\n", + "from pprint import pprint\n", + "\n", + "import h5py\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.cm\n", + "from matplotlib.patches import Rectangle\n", + "\n", + "import openmc.data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first thing we want to do is to read an ACE file into memory and instantiate a `IncidentNeutron` object. The easiest way to do this is with the `openmc.data.IncidentNeutron.from_ace(...)` factory method." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get filename for Gd-157\n", + "filename ='/opt/data/ace/nndc/293.6K/Gd_157_293.6K.ace'\n", + "\n", + "# Load ACE table into object\n", + "gd157 = openmc.data.IncidentNeutron.from_ace(filename)\n", + "gd157" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have our ACE table, we can look at its contents. Let's start off by plotting the total cross section." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "total = gd157.summed_reactions[1]\n", + "plt.loglog(total.xs.x, total.xs.y)\n", + "plt.xlabel('Energy (MeV)')\n", + "plt.ylabel('Cross section (b)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reaction Data\n", + "\n", + "Most of the interesting data for an `IncidentNeutron` instance is contained within the `reactions` attribute, which is a dictionary mapping MT values to `Reaction` objects." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ]\n" + ] + } + ], + "source": [ + "pprint(list(gd157.reactions.values())[:10])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's suppose we want to look more closely at the (n,2n) reaction." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Threshold = 6.400881 MeV\n" + ] + }, + { + "data": { + "image/png": "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\n9zC0aV7vrgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n2n = gd157.reactions[16]\n", + "plt.plot(n2n.xs.x, n2n.xs.y)\n", + "plt.xlabel('Energy (MeV)')\n", + "plt.ylabel('Cross section (b)')\n", + "plt.xlim((n2n.xs.x[0], n2n.xs.x[-1]))\n", + "print('Threshold = {} MeV'.format(n2n.threshold))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To get information on the energy and angle distribution of the neutrons emitted in the reaction, we need to look at the `products` attribute." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n2n.products" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "neutron = n2n.products[0]\n", + "neutron.distribution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We see that the neutrons emitted have a correlated angle-energy distribution. Let's look at the `energy_out` attribute to see what the outgoing energy distributions are." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dist = neutron.distribution[0]\n", + "dist.energy_out" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we see we have a tabulated outgoing energy distribution for each incoming energy. Note that the same probability distribution classes that we could use to create a source definition are also used within the `openmc.data` package. Let's plot every fifth distribution to get an idea of what they look like." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nMAzDMAyv/B9ZBCMoWOfF0wAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for e_in, e_out_dist in zip(dist.energy[::5], dist.energy_out[::5]):\n", + " plt.semilogy(e_out_dist.x, e_out_dist.p, label='E={:.2f} MeV'.format(e_in))\n", + "plt.ylim(ymax=10)\n", + "plt.legend()\n", + "plt.xlabel('Outgoing energy (MeV)')\n", + "plt.ylabel('Probability/MeV')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Unresolved resonance probability tables\n", + "\n", + "We can also look at unresolved resonance probability tables which are stored in a `ProbabilityTables` object. In the following example, we'll create a plot showing what the total cross section probability tables look like as a function of incoming energy." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "cm = matplotlib.cm.Spectral_r\n", + "\n", + "# Determine size of probability tables\n", + "urr = gd157.urr\n", + "n_energy = urr.table.shape[0]\n", + "n_band = urr.table.shape[2]\n", + "\n", + "for i in range(n_energy):\n", + " # Get bounds on energy\n", + " if i > 0:\n", + " e_left = urr.energy[i] - 0.5*(urr.energy[i] - urr.energy[i-1])\n", + " else:\n", + " e_left = urr.energy[i] - 0.5*(urr.energy[i+1] - urr.energy[i])\n", + "\n", + " if i < n_energy - 1:\n", + " e_right = urr.energy[i] + 0.5*(urr.energy[i+1] - urr.energy[i])\n", + " else:\n", + " e_right = urr.energy[i] + 0.5*(urr.energy[i] - urr.energy[i-1])\n", + " \n", + " for j in range(n_band):\n", + " # Determine maximum probability for a single band\n", + " max_prob = np.diff(urr.table[i,0,:]).max()\n", + " \n", + " # Determine bottom of band\n", + " if j > 0:\n", + " xs_bottom = urr.table[i,1,j] - 0.5*(urr.table[i,1,j] - urr.table[i,1,j-1])\n", + " value = (urr.table[i,0,j] - urr.table[i,0,j-1])/max_prob\n", + " else:\n", + " xs_bottom = urr.table[i,1,j] - 0.5*(urr.table[i,1,j+1] - urr.table[i,1,j])\n", + " value = urr.table[i,0,j]/max_prob\n", + "\n", + " # Determine top of band\n", + " if j < n_band - 1:\n", + " xs_top = urr.table[i,1,j] + 0.5*(urr.table[i,1,j+1] - urr.table[i,1,j])\n", + " else:\n", + " xs_top = urr.table[i,1,j] + 0.5*(urr.table[i,1,j] - urr.table[i,1,j-1])\n", + " \n", + " # Draw rectangle with appropriate color\n", + " ax.add_patch(Rectangle((e_left, xs_bottom), e_right - e_left, xs_top - xs_bottom,\n", + " color=cm(value)))\n", + "\n", + "# Overlay total cross section\n", + "ax.plot(total.xs.x, total.xs.y, 'k')\n", + "\n", + "# Make plot pretty and labeled\n", + "ax.set_xlim(1e-6, 1e-1)\n", + "ax.set_ylim(1e-1, 1e4)\n", + "ax.set_xscale('log')\n", + "ax.set_yscale('log')\n", + "ax.set_xlabel('Energy (MeV)')\n", + "ax.set_ylabel('Cross section(b)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exporting to HDF5\n", + "\n", + "To create an HDF5 nuclear data file for a nuclide, we can use the `export_to_hdf5()` method." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "gd157.export_to_hdf5('gd157.h5', 'w')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's see what's in the HDF5 file." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['Gd157.71c']" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "h5file = h5py.File('gd157.h5', 'r')\n", + "list(h5file)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "While the groups containing reaction data are only labeled sequentially, we can look at the group attributes to figure out what they actually are." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "reaction_0, MT=2 (n,elastic)\n", + "reaction_1, MT=16 (n,2n)\n", + "reaction_10, MT=54 (n,n4)\n", + "reaction_11, MT=55 (n,n5)\n", + "reaction_12, MT=56 (n,n6)\n", + "reaction_13, MT=57 (n,n7)\n", + "reaction_14, MT=58 (n,n8)\n", + "reaction_15, MT=59 (n,n9)\n", + "reaction_16, MT=60 (n,n10)\n" + ] + } + ], + "source": [ + "main_group = h5file['Gd157.71c']\n", + "for name, obj in list(main_group.items())[:10]:\n", + " if 'mt' in obj.attrs:\n", + " print('{}, MT={} {}'.format(name, obj.attrs['mt'],\n", + " obj.attrs['label'].decode()))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[,\n", + " ,\n", + " ]\n" + ] + } + ], + "source": [ + "n2n_group = main_group['reaction_1']\n", + "pprint(list(n2n_group.values()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So we see that the hierarchy of data within the HDF5 mirrors the hierarchy of Python objects that we manipulated before." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.00000000e+00, 3.02679600e-13, 1.29110100e-02,\n", + " 6.51111000e-02, 3.92627000e-01, 5.75226800e-01,\n", + " 6.96960000e-01, 7.39937800e-01, 9.63545000e-01,\n", + " 1.14213000e+00, 1.30802000e+00, 1.46350000e+00,\n", + " 1.55760000e+00, 1.64055000e+00, 1.68896000e+00,\n", + " 1.71140000e+00, 1.73945000e+00, 1.78207000e+00,\n", + " 1.81665000e+00, 1.84528000e+00, 1.86540900e+00,\n", + " 1.86724000e+00, 1.88155800e+00, 1.88156000e+00,\n", + " 1.88180000e+00, 1.89447000e+00, 1.86957000e+00,\n", + " 1.82120000e+00, 1.71600000e+00, 1.60054000e+00,\n", + " 1.43162000e+00, 1.28346000e+00, 1.10166000e+00,\n", + " 1.06530000e+00, 9.30730000e-01, 8.02980000e-01,\n", + " 7.77740000e-01])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n2n_group['xs'].value" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that we can go the other direction, converting data from an HDF5 file into a `NeutronTable` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gd157_reconstructed = openmc.data.IncidentNeutron.from_hdf5(main_group)\n", + "gd157.reactions[16].xs.y - gd157_reconstructed.reactions[16].xs.y" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.1" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/pythonapi/examples/nuclear-data.rst b/docs/source/pythonapi/examples/nuclear-data.rst new file mode 100644 index 000000000..aa048eeb3 --- /dev/null +++ b/docs/source/pythonapi/examples/nuclear-data.rst @@ -0,0 +1,13 @@ +.. _notebook_nuclear_data: + +============ +Nuclear Data +============ + +.. only:: html + + .. notebook:: nuclear-data.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 854c2bc4c..36f161b3c 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -27,6 +27,7 @@ Example Jupyter Notebooks examples/mgxs-part-ii examples/mgxs-part-iii examples/mgxs-part-iv + examples/nuclear-data ------------------------------------ :mod:`openmc` -- Basic Functionality From 495556a2f5ae9a2c13372322c41bbfc4bfb048f7 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 15 Jul 2016 08:21:57 -0500 Subject: [PATCH 14/33] Cleanup openmc.data based on pylint --- openmc/data/ace.py | 65 +++++++++++++----------------- openmc/data/angle_distribution.py | 6 +-- openmc/data/angle_energy.py | 2 - openmc/data/container.py | 6 +-- openmc/data/correlated.py | 15 ++++--- openmc/data/data.py | 12 +++--- openmc/data/energy_distribution.py | 21 +++++++--- openmc/data/kalbach_mann.py | 9 +++-- openmc/data/library.py | 2 +- openmc/data/neutron.py | 22 ++++------ openmc/data/reaction.py | 6 +-- openmc/data/thermal.py | 11 +++-- openmc/data/urr.py | 6 +-- 13 files changed, 89 insertions(+), 94 deletions(-) diff --git a/openmc/data/ace.py b/openmc/data/ace.py index 2a39e208a..1a56c165e 100644 --- a/openmc/data/ace.py +++ b/openmc/data/ace.py @@ -20,7 +20,6 @@ import io from os import SEEK_CUR import struct import sys -from warnings import warn import numpy as np @@ -170,7 +169,7 @@ class Library(object): sb = b''.join([fh.readline() for i in range(10)]) # Try to decode it with ascii - sd = sb.decode('ascii') + sb.decode('ascii') # No exception so proceed with ASCII - reopen in non-binary fh.close() @@ -182,13 +181,13 @@ class Library(object): fh = open(filename, 'rb') self._read_binary(fh, table_names, verbose) - def _read_binary(self, fh, table_names, verbose=False, + def _read_binary(self, ace_file, table_names, verbose=False, recl_length=4096, entries=512): """Read a binary (Type 2) ACE table. Parameters ---------- - fh : file + ace_file : file Open ACE file table_names : None, str, or iterable Tables from the file to read in. If None, reads in all of the @@ -204,25 +203,25 @@ class Library(object): """ while True: - start_position = fh.tell() + start_position = ace_file.tell() # Check for end-of-file - if len(fh.read(1)) == 0: + if len(ace_file.read(1)) == 0: return - fh.seek(start_position) + ace_file.seek(start_position) # Read name, atomic mass ratio, temperature, date, comment, and # material name, atomic_weight_ratio, temperature, date, comment, mat = \ - struct.unpack(str('=10sdd10s70s10s'), fh.read(116)) + struct.unpack(str('=10sdd10s70s10s'), ace_file.read(116)) name = name.decode().strip() # Read ZAID/awr combinations - data = struct.unpack(str('=' + 16*'id'), fh.read(192)) + data = struct.unpack(str('=' + 16*'id'), ace_file.read(192)) pairs = list(zip(data[::2], data[1::2])) # Read NXS - nxs = list(struct.unpack(str('=16i'), fh.read(64))) + nxs = list(struct.unpack(str('=16i'), ace_file.read(64))) # Determine length of XSS and number of records length = nxs[0] @@ -230,20 +229,20 @@ class Library(object): # verify that we are supposed to read this table in if (table_names is not None) and (name not in table_names): - fh.seek(start_position + recl_length*(n_records + 1)) + ace_file.seek(start_position + recl_length*(n_records + 1)) continue if verbose: - temperature_in_K = round(temperature * 1e6 / 8.617342e-5) - print("Loading nuclide {0} at {1} K".format(name, temperature_in_K)) + kelvin = round(temperature * 1e6 / 8.617342e-5) + print("Loading nuclide {0} at {1} K".format(name, kelvin)) # Read JXS - jxs = list(struct.unpack(str('=32i'), fh.read(128))) + jxs = list(struct.unpack(str('=32i'), ace_file.read(128))) # Read XSS - fh.seek(start_position + recl_length) + ace_file.seek(start_position + recl_length) xss = list(struct.unpack(str('={0}d'.format(length)), - fh.read(length*8))) + ace_file.read(length*8))) # Insert zeros at beginning of NXS, JXS, and XSS arrays so that the # indexing will be the same as Fortran. This makes it easier to @@ -263,14 +262,14 @@ class Library(object): self.tables.append(table) # Advance to next record - fh.seek(start_position + recl_length*(n_records + 1)) + ace_file.seek(start_position + recl_length*(n_records + 1)) - def _read_ascii(self, fh, table_names, verbose=False): + def _read_ascii(self, ace_file, table_names, verbose=False): """Read an ASCII (Type 1) ACE table. Parameters ---------- - fh : file + ace_file : file Open ACE file table_names : None, str, or iterable Tables from the file to read in. If None, reads in all of the @@ -282,26 +281,23 @@ class Library(object): tables_seen = set() - lines = [fh.readline() for i in range(13)] + lines = [ace_file.readline() for i in range(13)] - while (0 != len(lines)) and (lines[0] != ''): + while len(lines) != 0 and lines[0] != '': # Read name of table, atomic mass ratio, and temperature. If first # line is empty, we are at end of file # check if it's a 2.0 style header if lines[0].split()[0][1] == '.': words = lines[0].split() - version = words[0] name = words[1] - if len(words) == 3: - source = words[2] words = lines[1].split() atomic_weight_ratio = float(words[0]) temperature = float(words[1]) commentlines = int(words[3]) for i in range(commentlines): lines.pop(0) - lines.append(fh.readline()) + lines.append(ace_file.readline()) else: words = lines[0].split() name = words[0] @@ -325,24 +321,21 @@ class Library(object): # verify that we are suppossed to read this table in if (table_names is not None) and (name not in table_names): - fh.seek(n_bytes, SEEK_CUR) - fh.readline() - lines = [fh.readline() for i in range(13)] + ace_file.seek(n_bytes, SEEK_CUR) + ace_file.readline() + lines = [ace_file.readline() for i in range(13)] continue # read and fix over-shoot - lines += fh.readlines(n_bytes) + lines += ace_file.readlines(n_bytes) if 12 + n_lines < len(lines): goback = sum([len(line) for line in lines[12+n_lines:]]) lines = lines[:12+n_lines] - fh.seek(-goback, SEEK_CUR) + ace_file.seek(-goback, SEEK_CUR) if verbose: - temperature_in_K = round(temperature * 1e6 / 8.617342e-5) - print("Loading nuclide {0} at {1} K".format(name, temperature_in_K)) - - # Read comment - comment = lines[1].strip() + kelvin = round(temperature * 1e6 / 8.617342e-5) + print("Loading nuclide {0} at {1} K".format(name, kelvin)) # Insert zeros at beginning of NXS, JXS, and XSS arrays so that the # indexing will be the same as Fortran. This makes it easier to @@ -358,7 +351,7 @@ class Library(object): self.tables.append(table) # Read all data blocks - lines = [fh.readline() for i in range(13)] + lines = [ace_file.readline() for i in range(13)] class Table(object): diff --git a/openmc/data/angle_distribution.py b/openmc/data/angle_distribution.py index 3f086a99c..709be8496 100644 --- a/openmc/data/angle_distribution.py +++ b/openmc/data/angle_distribution.py @@ -5,7 +5,7 @@ import numpy as np import openmc.checkvalue as cv from openmc.stats import Univariate, Tabular, Uniform -from .container import interpolation_scheme +from .container import INTERPOLATION_SCHEME class AngleDistribution(object): @@ -125,7 +125,7 @@ class AngleDistribution(object): else: n = data.shape[1] - j - interp = interpolation_scheme[interpolation[i]] + interp = INTERPOLATION_SCHEME[interpolation[i]] mu_i = Tabular(data[0, j:j+n], data[1, j:j+n], interp) mu_i.c = data[2, j:j+n] @@ -189,7 +189,7 @@ class AngleDistribution(object): data = ace.xss[idx + 2:idx + 2 + 3*n_points] data.shape = (3, n_points) - mu_i = Tabular(data[0], data[1], interpolation_scheme[intt]) + mu_i = Tabular(data[0], data[1], INTERPOLATION_SCHEME[intt]) mu_i.c = data[2] else: # Isotropic angular distribution diff --git a/openmc/data/angle_energy.py b/openmc/data/angle_energy.py index ff9f41a44..c20c5f0ff 100644 --- a/openmc/data/angle_energy.py +++ b/openmc/data/angle_energy.py @@ -1,7 +1,5 @@ from abc import ABCMeta, abstractmethod -import numpy as np - import openmc.data diff --git a/openmc/data/container.py b/openmc/data/container.py index b2b323ddd..d9902794c 100644 --- a/openmc/data/container.py +++ b/openmc/data/container.py @@ -5,7 +5,7 @@ import numpy as np import openmc.checkvalue as cv -interpolation_scheme = {1: 'histogram', 2: 'linear-linear', 3: 'linear-log', +INTERPOLATION_SCHEME = {1: 'histogram', 2: 'linear-linear', 3: 'linear-log', 4: 'log-linear', 5: 'log-log'} @@ -262,8 +262,8 @@ class Tabulated1D(object): Function read from dataset """ - x = dataset.value[0,:] - y = dataset.value[1,:] + x = dataset.value[0, :] + y = dataset.value[1, :] breakpoints = dataset.attrs['breakpoints'] interpolation = dataset.attrs['interpolation'] return cls(x, y, breakpoints, interpolation) diff --git a/openmc/data/correlated.py b/openmc/data/correlated.py index f82a28b75..c93a0d706 100644 --- a/openmc/data/correlated.py +++ b/openmc/data/correlated.py @@ -1,11 +1,12 @@ from collections import Iterable from numbers import Real, Integral +from warnings import warn import numpy as np import openmc.checkvalue as cv -from openmc.stats import Tabular, Univariate, Discrete, Mixture -from .container import interpolation_scheme +from openmc.stats import Tabular, Univariate, Discrete, Mixture, Uniform +from .container import INTERPOLATION_SCHEME from .angle_energy import AngleEnergy @@ -237,7 +238,7 @@ class CorrelatedAngleEnergy(AngleEnergy): # Create continuous distribution if m < n: - interp = interpolation_scheme[interpolation[i]] + interp = INTERPOLATION_SCHEME[interpolation[i]] x = dset_eout[0, offset_e+m:offset_e+n] p = dset_eout[1, offset_e+m:offset_e+n] @@ -275,7 +276,7 @@ class CorrelatedAngleEnergy(AngleEnergy): if interp_code == 0: mu_ij = Discrete(x, p) else: - mu_ij = Tabular(x, p, interpolation_scheme[interp_code], + mu_ij = Tabular(x, p, INTERPOLATION_SCHEME[interp_code], ignore_negative=True) mu_ij.c = c mu_i.append(mu_ij) @@ -285,8 +286,6 @@ class CorrelatedAngleEnergy(AngleEnergy): energy_out.append(eout_i) mu.append(mu_i) - j += n - return cls(energy_breakpoints, energy_interpolation, energy, energy_out, mu) @@ -357,7 +356,7 @@ class CorrelatedAngleEnergy(AngleEnergy): # Create continuous distribution eout_continuous = Tabular(data[0][n_discrete_lines:], data[1][n_discrete_lines:], - interpolation_scheme[intt], + INTERPOLATION_SCHEME[intt], ignore_negative=True) eout_continuous.c = data[2][n_discrete_lines:] @@ -390,7 +389,7 @@ class CorrelatedAngleEnergy(AngleEnergy): data = ace.xss[idx + 2:idx + 2 + 3*n_cosine] data.shape = (3, n_cosine) - mu_ij = Tabular(data[0], data[1], interpolation_scheme[intt]) + mu_ij = Tabular(data[0], data[1], INTERPOLATION_SCHEME[intt]) mu_ij.c = data[2] else: # Isotropic distribution diff --git a/openmc/data/data.py b/openmc/data/data.py index e5aa55285..42c92cff9 100644 --- a/openmc/data/data.py +++ b/openmc/data/data.py @@ -150,9 +150,9 @@ reaction_name = {1: '(n,total)', 2: '(n,elastic)', 4: '(n,level)', 5: '(n,misc)' 198: '(n,n3p)', 199: '(n,3n2pa)', 200: '(n,5n2p)', 444: '(n,damage)', 649: '(n,pc)', 699: '(n,dc)', 749: '(n,tc)', 799: '(n,3Hec)', 849: '(n,ac)'} -reaction_name.update({i: '(n,n{})'.format(i-50) for i in range(50,91)}) -reaction_name.update({i: '(n,p{})'.format(i-600) for i in range(600,649)}) -reaction_name.update({i: '(n,d{})'.format(i-650) for i in range(650,699)}) -reaction_name.update({i: '(n,t{})'.format(i-700) for i in range(700,749)}) -reaction_name.update({i: '(n,3He{})'.format(i-750) for i in range(750,799)}) -reaction_name.update({i: '(n,a{})'.format(i-800) for i in range(800,849)}) +reaction_name.update({i: '(n,n{})'.format(i-50) for i in range(50, 91)}) +reaction_name.update({i: '(n,p{})'.format(i-600) for i in range(600, 649)}) +reaction_name.update({i: '(n,d{})'.format(i-650) for i in range(650, 699)}) +reaction_name.update({i: '(n,t{})'.format(i-700) for i in range(700, 749)}) +reaction_name.update({i: '(n,3He{})'.format(i-750) for i in range(750, 799)}) +reaction_name.update({i: '(n,a{})'.format(i-800) for i in range(800, 849)}) diff --git a/openmc/data/energy_distribution.py b/openmc/data/energy_distribution.py index 09b0c6ebf..a82a6c64a 100644 --- a/openmc/data/energy_distribution.py +++ b/openmc/data/energy_distribution.py @@ -3,10 +3,9 @@ from collections import Iterable from numbers import Integral, Real from warnings import warn -import h5py import numpy as np -from openmc.data.container import Tabulated1D, interpolation_scheme +from openmc.data.container import Tabulated1D, INTERPOLATION_SCHEME from openmc.stats.univariate import Univariate, Tabular, Discrete, Mixture import openmc.checkvalue as cv @@ -78,11 +77,12 @@ class ArbitraryTabulated(EnergyDistribution): """ def __init__(self, energy, pdf): + super(ArbitraryTabulated, self).__init__() self.energy = energy self.pdf = pdf def to_hdf5(self, group): - NotImplementedError + raise NotImplementedError class GeneralEvaporation(EnergyDistribution): @@ -114,6 +114,7 @@ class GeneralEvaporation(EnergyDistribution): """ def __init__(self, theta, g, u): + super(GeneralEvaporation, self).__init__() self.theta = theta self.g = g self.u = u @@ -121,6 +122,10 @@ class GeneralEvaporation(EnergyDistribution): def to_hdf5(self, group): raise NotImplementedError + @classmethod + def from_ace(cls, ace, idx=0): + raise NotImplementedError + class MaxwellEnergy(EnergyDistribution): r"""Simple Maxwellian fission spectrum represented as @@ -147,6 +152,7 @@ class MaxwellEnergy(EnergyDistribution): """ def __init__(self, theta, u): + super(MaxwellEnergy, self).__init__() self.theta = theta self.u = u @@ -254,6 +260,7 @@ class Evaporation(EnergyDistribution): """ def __init__(self, theta, u): + super(Evaporation, self).__init__() self.theta = theta self.u = u @@ -364,6 +371,7 @@ class WattEnergy(EnergyDistribution): """ def __init__(self, a, b, u): + super(WattEnergy, self).__init__() self.a = a self.b = b self.u = u @@ -504,6 +512,7 @@ class MadlandNix(EnergyDistribution): """ def __init__(self, efl, efh, tm): + super(MadlandNix, self).__init__() self.efl = efl self.efh = efh self.tm = tm @@ -966,7 +975,7 @@ class ContinuousTabular(EnergyDistribution): # Create continuous distribution if m < n: - interp = interpolation_scheme[interpolation[i]] + interp = INTERPOLATION_SCHEME[interpolation[i]] eout_continuous = Tabular(data[0, j+m:j+n], data[1, j+m:j+n], interp) eout_continuous.c = data[2, j+m:j+n] @@ -1048,8 +1057,8 @@ class ContinuousTabular(EnergyDistribution): # Create continuous distribution eout_continuous = Tabular(data[0][n_discrete_lines:], - data[1][n_discrete_lines:], - interpolation_scheme[intt]) + data[1][n_discrete_lines:], + INTERPOLATION_SCHEME[intt]) eout_continuous.c = data[2][n_discrete_lines:] # If discrete lines are present, create a mixture distribution diff --git a/openmc/data/kalbach_mann.py b/openmc/data/kalbach_mann.py index 7899ae2a6..8799831bf 100644 --- a/openmc/data/kalbach_mann.py +++ b/openmc/data/kalbach_mann.py @@ -1,11 +1,12 @@ from collections import Iterable from numbers import Real, Integral +from warnings import warn import numpy as np import openmc.checkvalue as cv from openmc.stats import Tabular, Univariate, Discrete, Mixture -from .container import Tabulated1D, interpolation_scheme +from .container import Tabulated1D, INTERPOLATION_SCHEME from .angle_energy import AngleEnergy @@ -228,7 +229,7 @@ class KalbachMann(AngleEnergy): # Create continuous distribution if m < n: - interp = interpolation_scheme[interpolation[i]] + interp = INTERPOLATION_SCHEME[interpolation[i]] eout_continuous = Tabular(data[0, j+m:j+n], data[1, j+m:j+n], interp) eout_continuous.c = data[2, j+m:j+n] @@ -318,8 +319,8 @@ class KalbachMann(AngleEnergy): # Create continuous distribution eout_continuous = Tabular(data[0][n_discrete_lines:], - data[1][n_discrete_lines:], - interpolation_scheme[intt]) + data[1][n_discrete_lines:], + INTERPOLATION_SCHEME[intt]) eout_continuous.c = data[2][n_discrete_lines:] # If discrete lines are present, create a mixture distribution diff --git a/openmc/data/library.py b/openmc/data/library.py index 58f32609e..748a01889 100644 --- a/openmc/data/library.py +++ b/openmc/data/library.py @@ -13,7 +13,7 @@ class DataLibrary(object): h5file = h5py.File(filename, 'r') materials = [] - for name, group in h5file.items(): + for name in h5file: materials.append(name) library = {'path': filename, 'type': filetype, 'materials': materials} diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index ad5e370f1..463aa26bb 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -1,25 +1,17 @@ from __future__ import division, unicode_literals -import io import sys -from warnings import warn from collections import OrderedDict, Iterable, Mapping -from copy import deepcopy from numbers import Integral, Real -import sys import numpy as np -from numpy.polynomial import Polynomial import h5py -from . import atomic_number, atomic_symbol +from . import atomic_symbol from .ace import Table, get_table from .container import Tabulated1D -from .energy_distribution import * from .product import Product from .reaction import Reaction, _get_photon_products -from .thermal import CoherentElastic from .urr import ProbabilityTables -from openmc.stats import Tabular, Discrete, Uniform, Mixture import openmc.checkvalue as cv if sys.version_info[0] >= 3: @@ -243,7 +235,7 @@ class IncidentNeutron(object): f.close() @classmethod - def from_hdf5(self, group_or_filename): + def from_hdf5(cls, group_or_filename): """Generate continuous-energy neutron interaction data from HDF5 group Parameters @@ -255,7 +247,7 @@ class IncidentNeutron(object): Returns ------- - openmc.data.ace.IncidentNeutron + openmc.data.IncidentNeutron Continuous-energy neutron interaction data """ @@ -272,8 +264,8 @@ class IncidentNeutron(object): atomic_weight_ratio = group.attrs['atomic_weight_ratio'] temperature = group.attrs['temperature'] - data = IncidentNeutron(name, atomic_number, mass_number, metastable, - atomic_weight_ratio, temperature) + data = cls(name, atomic_number, mass_number, metastable, + atomic_weight_ratio, temperature) # Read energy grid data.energy = group['energy'].value @@ -362,8 +354,8 @@ class IncidentNeutron(object): else: name = '{}{}.{}'.format(element, mass_number, xs) - data = IncidentNeutron(name, Z, mass_number, metastable, - ace.atomic_weight_ratio, ace.temperature) + data = cls(name, Z, mass_number, metastable, + ace.atomic_weight_ratio, ace.temperature) # Read energy grid n_energy = ace.nxs[3] diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index 40e0910ba..195dcc341 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -103,7 +103,7 @@ def _get_fission_products(ace): idx = ace.jxs[25] n_group = ace.nxs[8] total_group_probability = 0. - for i, group in enumerate(range(n_group)): + for group in range(n_group): delayed_neutron = Product('neutron') delayed_neutron.emission_mode = 'delayed' delayed_neutron.decay_rate = ace.xss[idx] @@ -201,14 +201,14 @@ def _get_photon_products(ace, mt): n_energy = int(ace.xss[idx + 1]) photon._xs = ace.xss[idx + 2:idx + 2 + n_energy] - # Determine yield based on ratio of cross sections + # TODO: Determine yield based on ratio of cross sections energy = ace.xss[ace.jxs[1] + threshold_idx: ace.jxs[1] + threshold_idx + n_energy] photon.yield_ = Tabulated1D(energy, photon._xs) else: raise ValueError("MFTYPE must be 12, 13, 16. Got {0}".format( - mftype)) + mftype)) # ================================================================== # Photon energy distribution diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 63e573a01..71ef190ab 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -8,7 +8,10 @@ import h5py import openmc.checkvalue as cv from .ace import Table, get_table +from .angle_energy import AngleEnergy from .container import Tabulated1D +from .correlated import CorrelatedAngleEnergy +from openmc.stats import Discrete, Tabular _THERMAL_NAMES = {'al': 'c_Al27', 'al27': 'c_Al27', @@ -37,7 +40,7 @@ _THERMAL_NAMES = {'al': 'c_Al27', 'al27': 'c_Al27', class CoherentElastic(object): - """Coherent elastic scattering data from a crystalline material + r"""Coherent elastic scattering data from a crystalline material Parameters ---------- @@ -212,7 +215,7 @@ class ThermalScattering(object): self.inelastic_dist.to_hdf5(inelastic_group) @classmethod - def from_hdf5(self, group): + def from_hdf5(cls, group): """Generate thermal scattering data from HDF5 group Parameters @@ -229,7 +232,7 @@ class ThermalScattering(object): name = group.name[1:] atomic_weight_ratio = group.attrs['atomic_weight_ratio'] temperature = group.attrs['temperature'] - table = ThermalScattering(name, atomic_weight_ratio, temperature) + table = cls(name, atomic_weight_ratio, temperature) table.zaids = group.attrs['zaids'] # Read thermal elastic scattering @@ -363,7 +366,7 @@ class ThermalScattering(object): # Create correlated angle-energy distribution breakpoints = [n_energy] interpolation = [2] - energy = inelastic_xs.x + energy = table.inelastic_xs.x table.inelastic_dist = CorrelatedAngleEnergy( breakpoints, interpolation, energy, energy_out, mu_out) diff --git a/openmc/data/urr.py b/openmc/data/urr.py index b010a6c47..052da6612 100644 --- a/openmc/data/urr.py +++ b/openmc/data/urr.py @@ -7,7 +7,7 @@ import openmc.checkvalue as cv class ProbabilityTables(object): - """Unresolved resonance region probability tables. + r"""Unresolved resonance region probability tables. Parameters ---------- @@ -18,7 +18,7 @@ class ProbabilityTables(object): where N is the number of energies and M is the number of bands. The second dimension indicates whether the value is for the cumulative probability (0), total (1), elastic (2), fission (3), :math:`(n,\gamma)` - (4), or heating number (6). + (4), or heating number (5). interpolation : {2, 5} Interpolation scheme between tables inelastic_flag : int @@ -45,7 +45,7 @@ class ProbabilityTables(object): where N is the number of energies and M is the number of bands. The second dimension indicates whether the value is for the cumulative probability (0), total (1), elastic (2), fission (3), :math:`(n,\gamma)` - (4), or heating number (6). + (4), or heating number (5). interpolation : {2, 5} Interpolation scheme between tables inelastic_flag : int From e9acaba58ce431f249cde83419cc86b721214bd5 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 18 Jul 2016 11:00:37 -0500 Subject: [PATCH 15/33] Respond to @smharper comments on #684 --- openmc/data/library.py | 3 ++- src/angle_distribution.F90 | 13 ++++++------ src/endf_header.F90 | 39 +++++++++++++++++----------------- src/energy_distribution.F90 | 3 ++- src/hdf5_interface.F90 | 6 +++--- src/input_xml.F90 | 15 +++++-------- src/nuclide_header.F90 | 5 +++-- src/product_header.F90 | 3 ++- src/reaction_header.F90 | 1 + src/secondary_correlated.F90 | 3 ++- src/secondary_kalbach.F90 | 3 ++- src/secondary_nbody.F90 | 3 ++- src/secondary_uncorrelated.F90 | 5 +++-- 13 files changed, 54 insertions(+), 48 deletions(-) diff --git a/openmc/data/library.py b/openmc/data/library.py index 748a01889..dba5eabc1 100644 --- a/openmc/data/library.py +++ b/openmc/data/library.py @@ -23,7 +23,8 @@ class DataLibrary(object): root = ET.Element('cross_sections') # Determine common directory for library paths - common_dir = os.path.commonpath([lib['path'] for lib in self.libraries]) + common_dir = os.path.dirname(os.path.commonprefix( + [lib['path'] for lib in self.libraries])) if common_dir == '': common_dir = '.' diff --git a/src/angle_distribution.F90 b/src/angle_distribution.F90 index 830ba836c..a4fea6ff7 100644 --- a/src/angle_distribution.F90 +++ b/src/angle_distribution.F90 @@ -1,8 +1,9 @@ module angle_distribution + use hdf5, only: HID_T, HSIZE_T + use constants, only: ZERO, ONE, HISTOGRAM, LINEAR_LINEAR use distribution_univariate, only: DistributionContainer, Tabular - use hdf5, only: HID_T, HSIZE_T use hdf5_interface, only: read_attribute, get_shape, read_dataset, & open_dataset, close_dataset use random_lcg, only: prn @@ -81,9 +82,9 @@ contains dset_id = open_dataset(group_id, 'energy') call get_shape(dset_id, dims) n_energy = int(dims(1), 4) - allocate(this%energy(n_energy)) - allocate(this%distribution(n_energy)) - call read_dataset(this%energy, dset_id) + allocate(this % energy(n_energy)) + allocate(this % distribution(n_energy)) + call read_dataset(this % energy, dset_id) call close_dataset(dset_id) ! Get outgoing energy distribution data @@ -105,8 +106,8 @@ contains end if ! Create and initialize tabular distribution - allocate(Tabular :: this%distribution(i)%obj) - select type (mudist => this%distribution(i)%obj) + allocate(Tabular :: this % distribution(i) % obj) + select type (mudist => this % distribution(i) % obj) type is (Tabular) mudist % interpolation = interp(i) allocate(mudist % x(n), mudist % p(n), mudist % c(n)) diff --git a/src/endf_header.F90 b/src/endf_header.F90 index 8b6ad63f1..c4b4ef3ad 100644 --- a/src/endf_header.F90 +++ b/src/endf_header.F90 @@ -1,9 +1,10 @@ module endf_header + use hdf5, only: HID_T, HSIZE_T + use constants, only: ZERO, HISTOGRAM, LINEAR_LINEAR, LINEAR_LOG, & LOG_LINEAR, LOG_LOG use hdf5_interface - use hdf5, only: HID_T, HSIZE_T use search, only: binary_search implicit none @@ -157,25 +158,25 @@ contains ! Determine number of regions nr = nint(xss(idx)) - this%n_regions = nr + this % n_regions = nr ! Read interpolation region data if (nr > 0) then - allocate(this%nbt(nr)) - allocate(this%int(nr)) - this%nbt(:) = nint(xss(idx + 1 : idx + nr)) - this%int(:) = nint(xss(idx + nr + 1 : idx + 2*nr)) + allocate(this % nbt(nr)) + allocate(this % int(nr)) + this % nbt(:) = nint(xss(idx + 1 : idx + nr)) + this % int(:) = nint(xss(idx + nr + 1 : idx + 2*nr)) end if ! Determine number of pairs ne = int(XSS(idx + 2*nr + 1)) - this%n_pairs = ne + this % n_pairs = ne ! Read (x,y) pairs - allocate(this%x(ne)) - allocate(this%y(ne)) - this%x(:) = xss(idx + 2*nr + 2 : idx + 2*nr + 1 + ne) - this%y(:) = xss(idx + 2*nr + 2 + ne : idx + 2*nr + 1 + 2*ne) + allocate(this % x(ne)) + allocate(this % y(ne)) + this % x(:) = xss(idx + 2*nr + 2 : idx + 2*nr + 1 + ne) + this % y(:) = xss(idx + 2*nr + 2 + ne : idx + 2*nr + 1 + 2*ne) end subroutine tabulated1d_from_ace subroutine tabulated1d_from_hdf5(this, dset_id) @@ -185,19 +186,19 @@ contains real(8), allocatable :: xy(:,:) integer(HSIZE_T) :: dims(2) - call read_attribute(this%nbt, dset_id, 'breakpoints') - call read_attribute(this%int, dset_id, 'interpolation') - this%n_regions = size(this%nbt) + call read_attribute(this % nbt, dset_id, 'breakpoints') + call read_attribute(this % int, dset_id, 'interpolation') + this % n_regions = size(this % nbt) call get_shape(dset_id, dims) - this%n_pairs = int(dims(1), 4) - allocate(this%x(this%n_pairs)) - allocate(this%y(this%n_pairs)) + this % n_pairs = int(dims(1), 4) + allocate(this % x(this % n_pairs)) + allocate(this % y(this % n_pairs)) allocate(xy(dims(1), dims(2))) call read_dataset(xy, dset_id) - this%x(:) = xy(:,1) - this%y(:) = xy(:,2) + this % x(:) = xy(:,1) + this % y(:) = xy(:,2) end subroutine tabulated1d_from_hdf5 pure function tabulated1d_evaluate(this, x) result(y) diff --git a/src/energy_distribution.F90 b/src/energy_distribution.F90 index 54ae3f90c..c45762bb0 100644 --- a/src/energy_distribution.F90 +++ b/src/energy_distribution.F90 @@ -1,9 +1,10 @@ module energy_distribution + use hdf5 + use constants, only: ZERO, ONE, HALF, TWO, PI, HISTOGRAM, LINEAR_LINEAR use endf_header, only: Tabulated1D use hdf5_interface - use hdf5 use math, only: maxwell_spectrum, watt_spectrum use random_lcg, only: prn use search, only: binary_search diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 0bfe04051..d745f3201 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -10,13 +10,13 @@ module hdf5_interface ! can be combined into one simply accepting an assumed-shape array. !============================================================================== - use error, only: fatal_error - use tally_header, only: TallyResult + use, intrinsic :: ISO_C_BINDING use hdf5 use h5lt - use, intrinsic :: ISO_C_BINDING + use error, only: fatal_error + use tally_header, only: TallyResult #ifdef PHDF5 use message_passing, only: MPI_COMM_WORLD, MPI_INFO_NULL #endif diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 0fc96ef4b..3c8291e9c 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1,5 +1,7 @@ module input_xml + use hdf5 + use cmfd_input, only: configure_cmfd use constants use dict_header, only: DictIntInt, ElemKeyValueCI @@ -10,6 +12,7 @@ module input_xml use error, only: fatal_error, warning use geometry_header, only: Cell, Lattice, RectLattice, HexLattice use global + use hdf5_interface use list_header, only: ListChar, ListInt, ListReal use mesh_header, only: RegularMesh use multipole, only: multipole_read @@ -25,9 +28,6 @@ module input_xml use tally_initialize, only: add_tallies use xml_interface - use hdf5 - use hdf5_interface - implicit none save @@ -2087,14 +2087,14 @@ contains call read_materials_xml(libraries, library_dict) ! Read continuous-energy cross sections - if (run_CE) then + if (run_CE .and. run_mode /= MODE_PLOTTING) then call time_read_xs%start() call read_ce_cross_sections(libraries, library_dict) call time_read_xs%stop() end if ! Normalize atom/weight percents - call normalize_ao() + if (run_mode /= MODE_PLOTTING) call normalize_ao() ! Clear dictionary call library_dict % clear() @@ -3295,11 +3295,6 @@ contains ! If a specific nuclide was specified word = to_lower(sarray(j)) -!!$ ! Append default_xs specifier to nuclide if needed -!!$ if ((default_xs /= '') .and. (.not. ends_with(sarray(j), 'c'))) then -!!$ word = trim(word) // "." // trim(default_xs) -!!$ end if - ! Search through nuclides pair_list => nuclide_dict % keys() do while (associated(pair_list)) diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index be61ff8b9..9cff8a5d5 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -2,13 +2,14 @@ module nuclide_header use, intrinsic :: ISO_FORTRAN_ENV + use hdf5, only: HID_T, HSIZE_T, SIZE_T, h5iget_name_f + use h5lt, only: h5ltpath_valid_f + use constants use dict_header, only: DictIntInt use endf, only: reaction_name, is_fission, is_disappearance use endf_header, only: Function1D, Constant1D, Polynomial, Tabulated1D use error, only: fatal_error, warning - use hdf5, only: HID_T, HSIZE_T, SIZE_T, h5iget_name_f - use h5lt, only: h5ltpath_valid_f use hdf5_interface, only: read_attribute, open_group, close_group, & open_dataset, read_dataset, close_dataset, get_shape use list_header, only: ListInt diff --git a/src/product_header.F90 b/src/product_header.F90 index fbe0ee71f..f20adf0d4 100644 --- a/src/product_header.F90 +++ b/src/product_header.F90 @@ -1,10 +1,11 @@ module product_header + use hdf5, only: HID_T + use angleenergy_header, only: AngleEnergyContainer use constants, only: ZERO, MAX_WORD_LEN, EMISSION_PROMPT, EMISSION_DELAYED, & EMISSION_TOTAL, NEUTRON, PHOTON use endf_header, only: Tabulated1D, Function1D, Constant1D, Polynomial - use hdf5, only: HID_T use hdf5_interface, only: read_attribute, open_group, close_group, & open_dataset, close_dataset, read_dataset use random_lcg, only: prn diff --git a/src/reaction_header.F90 b/src/reaction_header.F90 index 74198dd78..9829f6e8f 100644 --- a/src/reaction_header.F90 +++ b/src/reaction_header.F90 @@ -1,6 +1,7 @@ module reaction_header use hdf5, only: HID_T, HSIZE_T + use hdf5_interface, only: read_attribute, open_group, close_group, & open_dataset, read_dataset, close_dataset, get_shape use product_header, only: ReactionProduct diff --git a/src/secondary_correlated.F90 b/src/secondary_correlated.F90 index 0576b28f6..e163fdcc2 100644 --- a/src/secondary_correlated.F90 +++ b/src/secondary_correlated.F90 @@ -1,9 +1,10 @@ module secondary_correlated + use hdf5, only: HID_T, HSIZE_T + use angleenergy_header, only: AngleEnergy use constants, only: ZERO, ONE, HALF, TWO, HISTOGRAM, LINEAR_LINEAR use distribution_univariate, only: DistributionContainer, Tabular - use hdf5, only: HID_T, HSIZE_T use hdf5_interface, only: get_shape, read_attribute, open_dataset, & read_dataset, close_dataset use random_lcg, only: prn diff --git a/src/secondary_kalbach.F90 b/src/secondary_kalbach.F90 index 920d17869..4b5e690b5 100644 --- a/src/secondary_kalbach.F90 +++ b/src/secondary_kalbach.F90 @@ -1,8 +1,9 @@ module secondary_kalbach + use hdf5, only: HID_T, HSIZE_T + use angleenergy_header, only: AngleEnergy use constants, only: ZERO, HALF, ONE, TWO, HISTOGRAM, LINEAR_LINEAR - use hdf5, only: HID_T, HSIZE_T use hdf5_interface, only: read_attribute, read_dataset, open_dataset, & close_dataset, get_shape use random_lcg, only: prn diff --git a/src/secondary_nbody.F90 b/src/secondary_nbody.F90 index d45c59879..14ae949a9 100644 --- a/src/secondary_nbody.F90 +++ b/src/secondary_nbody.F90 @@ -1,8 +1,9 @@ module secondary_nbody + use hdf5, only: HID_T + use angleenergy_header, only: AngleEnergy use constants, only: ONE, TWO, PI - use hdf5, only: HID_T use hdf5_interface, only: read_attribute use math, only: maxwell_spectrum use random_lcg, only: prn diff --git a/src/secondary_uncorrelated.F90 b/src/secondary_uncorrelated.F90 index 3158913cc..fc215484a 100644 --- a/src/secondary_uncorrelated.F90 +++ b/src/secondary_uncorrelated.F90 @@ -1,13 +1,14 @@ module secondary_uncorrelated + use h5lt, only: h5ltpath_valid_f + use hdf5, only: HID_T + use angle_distribution, only: AngleDistribution use angleenergy_header, only: AngleEnergy use constants, only: ONE, TWO, MAX_WORD_LEN use energy_distribution, only: EnergyDistribution, LevelInelastic, & ContinuousTabular, MaxwellEnergy, Evaporation, WattEnergy, DiscretePhoton use error, only: warning - use h5lt, only: h5ltpath_valid_f - use hdf5, only: HID_T use hdf5_interface, only: read_attribute, open_group, close_group use random_lcg, only: prn From 202bdfab3df03508864b980c7b9885624354e625 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 18 Jul 2016 17:56:27 -0500 Subject: [PATCH 16/33] Use libver='latest' for opening HDF5 files --- openmc/data/neutron.py | 2 +- openmc/data/thermal.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 463aa26bb..d9d822231 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -203,7 +203,7 @@ class IncidentNeutron(object): """ - f = h5py.File(path, mode) + f = h5py.File(path, mode, libver='latest') # Write basic data g = f.create_group(self.name) diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 71ef190ab..8cad81417 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -188,7 +188,7 @@ class ThermalScattering(object): """ - f = h5py.File(path, mode) + f = h5py.File(path, mode, libver='latest') # Write basic data g = f.create_group(self.name) From 65f1c4baaf62971a56d64d4ccf8d145a8819f98b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 19 Jul 2016 08:45:28 -0500 Subject: [PATCH 17/33] When installing OpenMC locally, set PYTHONPATH to avoid error --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 73f0afccc..dcaf30a1d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -317,6 +317,7 @@ if(PYTHONINTERP_FOUND) --root=debian/openmc --install-layout=deb WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})") else() + install(CODE "set(ENV{PYTHONPATH} \"${CMAKE_INSTALL_PREFIX}/lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages\")") install(CODE "execute_process( COMMAND ${PYTHON_EXECUTABLE} setup.py install --prefix=${CMAKE_INSTALL_PREFIX} From 5647db18b60d6d80b685835adc8585785e7e5735 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 19 Jul 2016 12:02:07 -0500 Subject: [PATCH 18/33] Some fixes for JEFF 3.2 data (most notably supporting energy-dependent delayed neutron group probabilities) --- .gitignore | 6 ++++++ openmc/data/correlated.py | 3 +++ openmc/data/kalbach_mann.py | 6 +++++- openmc/data/reaction.py | 30 +++++++++++++++++++++++++++--- 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 959717130..ca58065a2 100644 --- a/.gitignore +++ b/.gitignore @@ -60,8 +60,14 @@ src/install_manifest.txt # Nuclear data data/nndc +data/nndc_hdf5 data/wmp data/multipole_lib.tar.gz +data/ENDF-B-VII.1-*.tar.gz +data/JEFF32-ACE-*.tar.gz +data/TSLs.tar.gz +data/jeff-3.2 +data/jeff-3.2-hdf5 # Images *.ppm diff --git a/openmc/data/correlated.py b/openmc/data/correlated.py index c93a0d706..45ad42ced 100644 --- a/openmc/data/correlated.py +++ b/openmc/data/correlated.py @@ -359,6 +359,9 @@ class CorrelatedAngleEnergy(AngleEnergy): INTERPOLATION_SCHEME[intt], ignore_negative=True) eout_continuous.c = data[2][n_discrete_lines:] + if np.any(data[1][n_discrete_lines:] < 0.0): + warn("Correlated angle-energy distribution has negative " + "probabilities.") # If discrete lines are present, create a mixture distribution if n_discrete_lines > 0: diff --git a/openmc/data/kalbach_mann.py b/openmc/data/kalbach_mann.py index 8799831bf..5a5dc073c 100644 --- a/openmc/data/kalbach_mann.py +++ b/openmc/data/kalbach_mann.py @@ -320,8 +320,12 @@ class KalbachMann(AngleEnergy): # Create continuous distribution eout_continuous = Tabular(data[0][n_discrete_lines:], data[1][n_discrete_lines:], - INTERPOLATION_SCHEME[intt]) + INTERPOLATION_SCHEME[intt], + ignore_negative=True) eout_continuous.c = data[2][n_discrete_lines:] + if np.any(data[1][n_discrete_lines:] < 0.0): + warn("Kalbach-Mann energy distribution has negative " + "probabilities.") # If discrete lines are present, create a mixture distribution if n_discrete_lines > 0: diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index 195dcc341..53d399b6e 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -2,6 +2,7 @@ from __future__ import division, unicode_literals from collections import Iterable from copy import deepcopy from numbers import Real +from warnings import warn import numpy as np from numpy.polynomial import Polynomial @@ -114,8 +115,15 @@ def _get_fission_products(ace): delayed_neutron.yield_.y *= group_probability.y[0] total_group_probability += group_probability.y[0] else: - raise NotImplementedError( - 'Delayed neutron with energy-dependent group probability') + # Get union energy grid and ensure energies are within + # interpolable range of both functions + max_energy = min(yield_delayed.x[-1], group_probability.x[-1]) + energy = np.union1d(yield_delayed.x, group_probability.x) + energy = energy[energy <= max_energy] + + # Calculate group yield + group_yield = yield_delayed(energy) * group_probability(energy) + delayed_neutron.yield_ = Tabulated1D(energy, group_yield) # Advance position nr = int(ace.xss[idx + 1]) @@ -132,7 +140,8 @@ def _get_fission_products(ace): # Renormalize delayed neutron yields to reflect fact that in ACE # file, the sum of the group probabilities is not exactly one for product in products[1:]: - product.yield_.y /= total_group_probability + if total_group_probability > 0.: + product.yield_.y /= total_group_probability return products, derived_products @@ -427,6 +436,13 @@ class Reaction(object): # Read reaction cross section xs = ace.xss[ace.jxs[7] + loc + 1:ace.jxs[7] + loc + 1 + n_energy] + + # Fix negatives -- known issue for Y89 in JEFF 3.2 + if np.any(xs < 0.0): + warn("Negative cross sections found for MT={} in {}. Setting " + "to zero.".format(rx.mt, ace.name)) + xs[xs < 0.0] = 0.0 + rx.xs = Tabulated1D(energy, xs) # ================================================================== @@ -476,7 +492,15 @@ class Reaction(object): mt = 2 rx = cls(mt) + # Get elastic cross section values elastic_xs = ace.xss[ace.jxs[1] + 3*n_grid:ace.jxs[1] + 4*n_grid] + + # Fix negatives -- known issue for Ti46,49,50 in JEFF 3.2 + if np.any(elastic_xs < 0.0): + warn("Negative elastic scattering cross section found for {}. " + "Setting to zero.".format(ace.name)) + elastic_xs[elastic_xs < 0.0] = 0.0 + rx.xs = Tabulated1D(grid, elastic_xs) # No energy distribution for elastic scattering From cf59208f349a875102d414357e5f7da4ce49b3e5 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 19 Jul 2016 21:41:41 -0500 Subject: [PATCH 19/33] Rename openmc.data.container to openmc.data.function --- openmc/data/__init__.py | 2 +- openmc/data/angle_distribution.py | 2 +- openmc/data/correlated.py | 2 +- openmc/data/energy_distribution.py | 2 +- openmc/data/{container.py => function.py} | 0 openmc/data/kalbach_mann.py | 2 +- openmc/data/neutron.py | 2 +- openmc/data/product.py | 2 +- openmc/data/reaction.py | 2 +- openmc/data/thermal.py | 2 +- 10 files changed, 9 insertions(+), 9 deletions(-) rename openmc/data/{container.py => function.py} (100%) diff --git a/openmc/data/__init__.py b/openmc/data/__init__.py index c6a1baf9d..ae8ea8191 100644 --- a/openmc/data/__init__.py +++ b/openmc/data/__init__.py @@ -3,7 +3,7 @@ from .neutron import * from .reaction import * from .ace import * from .angle_distribution import * -from .container import * +from .function import * from .energy_distribution import * from .product import * from .angle_energy import * diff --git a/openmc/data/angle_distribution.py b/openmc/data/angle_distribution.py index 709be8496..316559c50 100644 --- a/openmc/data/angle_distribution.py +++ b/openmc/data/angle_distribution.py @@ -5,7 +5,7 @@ import numpy as np import openmc.checkvalue as cv from openmc.stats import Univariate, Tabular, Uniform -from .container import INTERPOLATION_SCHEME +from .function import INTERPOLATION_SCHEME class AngleDistribution(object): diff --git a/openmc/data/correlated.py b/openmc/data/correlated.py index 45ad42ced..97a96c17c 100644 --- a/openmc/data/correlated.py +++ b/openmc/data/correlated.py @@ -6,7 +6,7 @@ import numpy as np import openmc.checkvalue as cv from openmc.stats import Tabular, Univariate, Discrete, Mixture, Uniform -from .container import INTERPOLATION_SCHEME +from .function import INTERPOLATION_SCHEME from .angle_energy import AngleEnergy diff --git a/openmc/data/energy_distribution.py b/openmc/data/energy_distribution.py index a82a6c64a..677d31af2 100644 --- a/openmc/data/energy_distribution.py +++ b/openmc/data/energy_distribution.py @@ -5,7 +5,7 @@ from warnings import warn import numpy as np -from openmc.data.container import Tabulated1D, INTERPOLATION_SCHEME +from .function import Tabulated1D, INTERPOLATION_SCHEME from openmc.stats.univariate import Univariate, Tabular, Discrete, Mixture import openmc.checkvalue as cv diff --git a/openmc/data/container.py b/openmc/data/function.py similarity index 100% rename from openmc/data/container.py rename to openmc/data/function.py diff --git a/openmc/data/kalbach_mann.py b/openmc/data/kalbach_mann.py index 5a5dc073c..5aca17ba9 100644 --- a/openmc/data/kalbach_mann.py +++ b/openmc/data/kalbach_mann.py @@ -6,7 +6,7 @@ import numpy as np import openmc.checkvalue as cv from openmc.stats import Tabular, Univariate, Discrete, Mixture -from .container import Tabulated1D, INTERPOLATION_SCHEME +from .function import Tabulated1D, INTERPOLATION_SCHEME from .angle_energy import AngleEnergy diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index d9d822231..94e1b2aad 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -8,7 +8,7 @@ import h5py from . import atomic_symbol from .ace import Table, get_table -from .container import Tabulated1D +from .function import Tabulated1D from .product import Product from .reaction import Reaction, _get_photon_products from .urr import ProbabilityTables diff --git a/openmc/data/product.py b/openmc/data/product.py index 6a331dc24..dd276daac 100644 --- a/openmc/data/product.py +++ b/openmc/data/product.py @@ -6,7 +6,7 @@ import numpy as np from numpy.polynomial.polynomial import Polynomial import openmc.checkvalue as cv -from .container import Tabulated1D +from .function import Tabulated1D from .angle_energy import AngleEnergy if sys.version_info[0] >= 3: diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index 53d399b6e..069298216 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -11,7 +11,7 @@ import openmc.checkvalue as cv from openmc.stats import Uniform from .angle_distribution import AngleDistribution from .angle_energy import AngleEnergy -from .container import Tabulated1D +from .function import Tabulated1D from .data import reaction_name from .product import Product from .uncorrelated import UncorrelatedAngleEnergy diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 8cad81417..158ce3985 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -9,7 +9,7 @@ import h5py import openmc.checkvalue as cv from .ace import Table, get_table from .angle_energy import AngleEnergy -from .container import Tabulated1D +from .function import Tabulated1D from .correlated import CorrelatedAngleEnergy from openmc.stats import Discrete, Tabular From 20a2499587c6f933f5add9811327ae7b88b89627 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 19 Jul 2016 21:49:05 -0500 Subject: [PATCH 20/33] Make module-level variables in openmc.data.data uppercase --- openmc/data/data.py | 20 ++++++++++---------- openmc/data/neutron.py | 4 ++-- openmc/data/reaction.py | 10 +++++----- openmc/element.py | 4 ++-- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/openmc/data/data.py b/openmc/data/data.py index 42c92cff9..52043e392 100644 --- a/openmc/data/data.py +++ b/openmc/data/data.py @@ -1,7 +1,7 @@ # Isotopic abundances from M. Berglund and M. E. Wieser, "Isotopic compositions # of the elements 2009 (IUPAC Technical Report)", Pure. Appl. Chem. 83 (2), # pp. 397--410 (2011). -natural_abundance = { +NATURAL_ABUNDANCE = { 'H-1': 0.999885, 'H-2': 0.000115, 'He-3': 1.34e-06, 'He-4': 0.99999866, 'Li-6': 0.0759, 'Li-7': 0.9241, 'Be-9': 1.0, 'B-10': 0.199, 'B-11': 0.801, @@ -100,7 +100,7 @@ natural_abundance = { 'U-234': 5.4e-05, 'U-235': 0.007204, 'U-238': 0.992742 } -atomic_symbol = {1: 'H', 2: 'He', 3: 'Li', 4: 'Be', 5: 'B', 6: 'C', 7: 'N', +ATOMIC_SYMBOL = {1: 'H', 2: 'He', 3: 'Li', 4: 'Be', 5: 'B', 6: 'C', 7: 'N', 8: 'O', 9: 'F', 10: 'Ne', 11: 'Na', 12: 'Mg', 13: 'Al', 14: 'Si', 15: 'P', 16: 'S', 17: 'Cl', 18: 'Ar', 19: 'K', 20: 'Ca', 21: 'Sc', 22: 'Ti', 23: 'V', 24: 'Cr', 25: 'Mn', @@ -120,9 +120,9 @@ atomic_symbol = {1: 'H', 2: 'He', 3: 'Li', 4: 'Be', 5: 'B', 6: 'C', 7: 'N', 103: 'Lr', 104: 'Rf', 105: 'Db', 106: 'Sg', 107: 'Bh', 108: 'Hs', 109: 'Mt', 110: 'Ds', 111: 'Rg', 112: 'Cn', 114: 'Fl', 116: 'Lv'} -atomic_number = {value: key for key, value in atomic_symbol.items()} +ATOMIC_NUMBER = {value: key for key, value in ATOMIC_SYMBOL.items()} -reaction_name = {1: '(n,total)', 2: '(n,elastic)', 4: '(n,level)', 5: '(n,misc)', 11: '(n,2nd)', +REACTION_NAME = {1: '(n,total)', 2: '(n,elastic)', 4: '(n,level)', 5: '(n,misc)', 11: '(n,2nd)', 16: '(n,2n)', 17: '(n,3n)', 18: '(n,fission)', 19: '(n,f)', 20: '(n,nf)', 21: '(n,2nf)', 22: '(n,na)', 23: '(n,n3a)', 24: '(n,2na)', 25: '(n,3na)', 28: '(n,np)', 29: '(n,n2a)', @@ -150,9 +150,9 @@ reaction_name = {1: '(n,total)', 2: '(n,elastic)', 4: '(n,level)', 5: '(n,misc)' 198: '(n,n3p)', 199: '(n,3n2pa)', 200: '(n,5n2p)', 444: '(n,damage)', 649: '(n,pc)', 699: '(n,dc)', 749: '(n,tc)', 799: '(n,3Hec)', 849: '(n,ac)'} -reaction_name.update({i: '(n,n{})'.format(i-50) for i in range(50, 91)}) -reaction_name.update({i: '(n,p{})'.format(i-600) for i in range(600, 649)}) -reaction_name.update({i: '(n,d{})'.format(i-650) for i in range(650, 699)}) -reaction_name.update({i: '(n,t{})'.format(i-700) for i in range(700, 749)}) -reaction_name.update({i: '(n,3He{})'.format(i-750) for i in range(750, 799)}) -reaction_name.update({i: '(n,a{})'.format(i-800) for i in range(800, 849)}) +REACTION_NAME.update({i: '(n,n{})'.format(i-50) for i in range(50, 91)}) +REACTION_NAME.update({i: '(n,p{})'.format(i-600) for i in range(600, 649)}) +REACTION_NAME.update({i: '(n,d{})'.format(i-650) for i in range(650, 699)}) +REACTION_NAME.update({i: '(n,t{})'.format(i-700) for i in range(700, 749)}) +REACTION_NAME.update({i: '(n,3He{})'.format(i-750) for i in range(750, 799)}) +REACTION_NAME.update({i: '(n,a{})'.format(i-800) for i in range(800, 849)}) diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 94e1b2aad..30c1dbb5b 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -6,7 +6,7 @@ from numbers import Integral, Real import numpy as np import h5py -from . import atomic_symbol +from . import ATOMIC_SYMBOL from .ace import Table, get_table from .function import Tabulated1D from .product import Product @@ -348,7 +348,7 @@ class IncidentNeutron(object): mass_number -= 100 # Determine name for group - element = atomic_symbol[Z] + element = ATOMIC_SYMBOL[Z] if metastable > 0: name = '{}{}_m{}.{}'.format(element, mass_number, metastable, xs) else: diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index 069298216..91d18bdce 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -12,7 +12,7 @@ from openmc.stats import Uniform from .angle_distribution import AngleDistribution from .angle_energy import AngleEnergy from .function import Tabulated1D -from .data import reaction_name +from .data import REACTION_NAME from .product import Product from .uncorrelated import UncorrelatedAngleEnergy @@ -298,8 +298,8 @@ class Reaction(object): self.derived_products = [] def __repr__(self): - if self.mt in reaction_name: - return "".format(self.mt, reaction_name[self.mt]) + if self.mt in REACTION_NAME: + return "".format(self.mt, REACTION_NAME[self.mt]) else: return "".format(self.mt) @@ -356,8 +356,8 @@ class Reaction(object): """ group.attrs['mt'] = self.mt - if self.mt in reaction_name: - group.attrs['label'] = np.string_(reaction_name[self.mt]) + if self.mt in REACTION_NAME: + group.attrs['label'] = np.string_(REACTION_NAME[self.mt]) else: group.attrs['label'] = np.string_(self.mt) group.attrs['Q_value'] = self.q_value diff --git a/openmc/element.py b/openmc/element.py index c877c27a1..f116c43eb 100644 --- a/openmc/element.py +++ b/openmc/element.py @@ -2,7 +2,7 @@ import sys import openmc from openmc.checkvalue import check_type, check_length -from openmc.data import natural_abundance +from openmc.data import NATURAL_ABUNDANCE if sys.version_info[0] >= 3: basestring = str @@ -123,7 +123,7 @@ class Element(object): """ isotopes = [] - for isotope, abundance in sorted(natural_abundance.items()): + for isotope, abundance in sorted(NATURAL_ABUNDANCE.items()): if isotope.startswith(self.name + '-'): nuc = openmc.Nuclide(isotope, self.xs) isotopes.append((nuc, abundance)) From 976349cb516d0f950e9391bfe0f1039f30bcf9f4 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 19 Jul 2016 22:32:24 -0500 Subject: [PATCH 21/33] Calculate photon production yields properly for MF=13 data --- openmc/data/data.py | 18 ++++++++++++ openmc/data/function.py | 37 +++++++++++++++++++++++- openmc/data/neutron.py | 62 ++++++++++++++++++++++++++++++++++++++--- openmc/data/reaction.py | 39 +++++++++++++++----------- 4 files changed, 134 insertions(+), 22 deletions(-) diff --git a/openmc/data/data.py b/openmc/data/data.py index 52043e392..5f83d31c0 100644 --- a/openmc/data/data.py +++ b/openmc/data/data.py @@ -156,3 +156,21 @@ REACTION_NAME.update({i: '(n,d{})'.format(i-650) for i in range(650, 699)}) REACTION_NAME.update({i: '(n,t{})'.format(i-700) for i in range(700, 749)}) REACTION_NAME.update({i: '(n,3He{})'.format(i-750) for i in range(750, 799)}) REACTION_NAME.update({i: '(n,a{})'.format(i-800) for i in range(800, 849)}) + +SUM_RULES = {1: [2, 3], + 3: [4, 5, 11, 16, 17, 22, 23, 24, 25, 27, 28, 29, 30, 32, 33, 34, 35, + 36, 37, 41, 42, 44, 45, 152, 153, 154, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 183, 184, 185, + 186, 187, 188, 189, 190, 194, 195, 196, 198, 199, 200], + 4: list(range(50, 92)), + 16: list(range(875, 892)), + 18: [19, 20, 21, 38], + 27: [18, 101], + 101: [102, 103, 104, 105, 106, 107, 108, 109, 111, 112, 113, 114, + 115, 116, 117, 155, 182, 191, 192, 193, 197], + 103: list(range(600, 650)), + 104: list(range(650, 700)), + 105: list(range(700, 750)), + 106: list(range(750, 800)), + 107: list(range(800, 850))} diff --git a/openmc/data/function.py b/openmc/data/function.py index d9902794c..e2efb4c10 100644 --- a/openmc/data/function.py +++ b/openmc/data/function.py @@ -1,4 +1,4 @@ -from collections import Iterable +from collections import Iterable, Callable from numbers import Real, Integral import numpy as np @@ -306,3 +306,38 @@ class Tabulated1D(object): y = ace.xss[idx + n_pairs:idx + 2*n_pairs] return Tabulated1D(x, y, breakpoints, interpolation) + + +class Sum(object): + """Sum of multiple functions. + + This class allows you to create a callable object which represents the sum + of other callable objects. This is used for summed reactions whereby the + cross section is defined as the sum of other cross sections. + + Parameters + ---------- + functions : Iterable of Callable + Functions which are to be added together + + Attributes + ---------- + functions : Iterable of Callable + Functions which are to be added together + + """ + + def __init__(self, functions): + self.functions = functions + + def __call__(self, x): + return sum(f(x) for f in self.functions) + + @property + def functions(self): + return self._functions + + @functions.setter + def functions(self, functions): + cv.check_type('functions', functions, Iterable, Callable) + self._functions = functions diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 30c1dbb5b..c77ea86a1 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -2,13 +2,14 @@ from __future__ import division, unicode_literals import sys from collections import OrderedDict, Iterable, Mapping from numbers import Integral, Real +from warnings import warn import numpy as np import h5py -from . import ATOMIC_SYMBOL +from .data import ATOMIC_SYMBOL, SUM_RULES from .ace import Table, get_table -from .function import Tabulated1D +from .function import Tabulated1D, Sum from .product import Product from .reaction import Reaction, _get_photon_products from .urr import ProbabilityTables @@ -84,6 +85,17 @@ class IncidentNeutron(object): self.summed_reactions = OrderedDict() self.urr = None + def __contains__(self, mt): + return mt in self.reactions or mt in self.summed_reactions + + def __getitem__(self, mt): + if mt in self.reactions: + return self.reactions[mt] + elif mt in self.summed_reactions: + return self.summed_reactions[mt] + else: + raise KeyError('No reaction with MT={}.'.format(mt)) + def __repr__(self): return "".format(self.name) @@ -190,6 +202,38 @@ class IncidentNeutron(object): (ProbabilityTables, type(None))) self._urr = urr + def get_reaction_components(self, mt): + """Determine what reactions make up summed reaction. + + Parameters + ---------- + mt : int + ENDF MT number of the reaction to find components of. + + Returns + ------- + mts : list of int + ENDF MT numbers of reactions that make up the summed reaction and + have cross sections provided. + + """ + if mt in self.reactions: + return [mt] + elif mt in SUM_RULES: + mts = SUM_RULES[mt] + complete = False + while not complete: + new_mts = [] + complete = True + for i, mt_i in enumerate(mts): + if mt_i in self.reactions: + new_mts.append(mt_i) + elif mt_i in SUM_RULES: + new_mts += SUM_RULES[mt_i] + complete = False + mts = new_mts + return mts + def export_to_hdf5(self, path, mode='a'): """Export table to an HDF5 file. @@ -386,9 +430,19 @@ class IncidentNeutron(object): n_photon_reactions].astype(int) for mt in np.unique(photon_mts // 1000): - if mt not in data.reactions: + if mt not in data: + if mt not in SUM_RULES: + warn('Photon production is present for MT={} but no ' + 'cross section is given.'.format(mt)) + continue + + # Create summed reaction with appropriate cross section rx = Reaction(mt) - rx.products += _get_photon_products(ace, mt) + mts = data.get_reaction_components(mt) + rx.xs = Sum([data.reactions[mt_i].xs for mt_i in mts]) + + # Determine summed cross section + rx.products += _get_photon_products(ace, rx) data.summed_reactions[mt] = rx # Read unresolved resonance probability tables diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index 91d18bdce..8fb79f109 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -1,5 +1,5 @@ from __future__ import division, unicode_literals -from collections import Iterable +from collections import Iterable, Callable from copy import deepcopy from numbers import Real from warnings import warn @@ -146,15 +146,15 @@ def _get_fission_products(ace): return products, derived_products -def _get_photon_products(ace, mt): +def _get_photon_products(ace, rx): """Generate photon products from an ACE table Parameters ---------- ace : openmc.data.ace.Table ACE table to read from - mt : int - MT number for the desired reaction + rx : openmc.data.Reaction + Reaction that generates photons Returns ------- @@ -176,9 +176,9 @@ def _get_photon_products(ace, mt): # MT=19,20,21,38, we assign the photon product to each of the individual # reactions if neutron_mt == 18: - if mt not in (18, 19, 20, 21, 38): + if rx.mt not in (18, 19, 20, 21, 38): continue - elif neutron_mt != mt: + elif neutron_mt != rx.mt: continue # Create photon product and assign to reactions @@ -205,15 +205,19 @@ def _get_photon_products(ace, mt): # Energy grid index at which data starts threshold_idx = int(ace.xss[idx]) - 1 - - # Get photon production cross section n_energy = int(ace.xss[idx + 1]) - photon._xs = ace.xss[idx + 2:idx + 2 + n_energy] - - # TODO: Determine yield based on ratio of cross sections energy = ace.xss[ace.jxs[1] + threshold_idx: ace.jxs[1] + threshold_idx + n_energy] - photon.yield_ = Tabulated1D(energy, photon._xs) + + # Get photon production cross section + photon_prod_xs = ace.xss[idx + 2:idx + 2 + n_energy] + neutron_xs = rx.xs(energy) + idx = np.where(neutron_xs > 0.) + + # Calculate photon yield + yield_ = np.zeros_like(photon_prod_xs) + yield_[idx] = photon_prod_xs[idx] / neutron_xs[idx] + photon.yield_ = Tabulated1D(energy, yield_) else: raise ValueError("MFTYPE must be 12, 13, 16. Got {0}".format( @@ -277,7 +281,7 @@ class Reaction(object): threshold_idx : int The index on the energy grid corresponding to the threshold of this reaction. - xs : openmc.data.Tabulated1D + xs : callable Microscopic cross section for this reaction as a function of incident energy products : Iterable of openmc.data.Product @@ -340,9 +344,10 @@ class Reaction(object): @xs.setter def xs(self, xs): - cv.check_type('reaction cross section', xs, Tabulated1D) - for y in xs.y: - cv.check_greater_than('reaction cross section', y, 0.0, True) + cv.check_type('reaction cross section', xs, Callable) + if isinstance(xs, Tabulated1D): + for y in xs.y: + cv.check_greater_than('reaction cross section', y, 0.0, True) self._xs = xs def to_hdf5(self, group): @@ -531,6 +536,6 @@ class Reaction(object): # ====================================================================== # PHOTON PRODUCTION - rx.products += _get_photon_products(ace, mt) + rx.products += _get_photon_products(ace, rx) return rx From 3d68c07625e33cd64188df03ee03e9c31b3d4b74 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 20 Jul 2016 21:38:57 -0500 Subject: [PATCH 22/33] Add script to download and setup JEFF 3.2 multi-temp library --- .gitignore | 1 + data/get_jeff_data.py | 200 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100755 data/get_jeff_data.py diff --git a/.gitignore b/.gitignore index ca58065a2..2ca1c7d14 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,7 @@ data/wmp data/multipole_lib.tar.gz data/ENDF-B-VII.1-*.tar.gz data/JEFF32-ACE-*.tar.gz +data/JEFF32-ACE-*.zip data/TSLs.tar.gz data/jeff-3.2 data/jeff-3.2-hdf5 diff --git a/data/get_jeff_data.py b/data/get_jeff_data.py new file mode 100755 index 000000000..59023d9a2 --- /dev/null +++ b/data/get_jeff_data.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python + +from __future__ import print_function +import os +import shutil +import subprocess +import sys +import tarfile +import zipfile +import glob +import hashlib +import argparse + +import openmc.data + +try: + from urllib.request import urlopen +except ImportError: + from urllib2 import urlopen + + +thermal_suffix = {20: '01t', 100: '02t', 293: '03t', 296: '03t', 323: '04t', + 350: '05t', 373: '06t', 400: '07t', 423: '08t', 473: '09t', + 500: '10t', 523: '11t', 573: '12t', 600: '13t', 623: '14t', + 643: '15t', 647: '15t', 700: '16t', 773: '17t', 800: '18t', + 1000: '19t', 1200: '20t', 1600: '21t', 2000: '22t', + 3000: '23t'} + + + +parser = argparse.ArgumentParser() +parser.add_argument('-b', '--batch', action='store_true', + help='supresses standard in') +args = parser.parse_args() + +base_url = 'https://www.oecd-nea.org/dbforms/data/eva/evatapes/jeff_32/Processed/' +files = ['JEFF32-ACE-293K.tar.gz', + 'JEFF32-ACE-400K.tar.gz', + 'JEFF32-ACE-500K.tar.gz', + 'JEFF32-ACE-600K.tar.gz', + 'JEFF32-ACE-700K.tar.gz', + 'JEFF32-ACE-800K.zip', + 'JEFF32-ACE-900K.tar.gz', + 'JEFF32-ACE-1000K.tar.gz', + 'JEFF32-ACE-1200K.tar.gz', + 'JEFF32-ACE-1500K.tar.gz', + 'JEFF32-ACE-1800K.tar.gz', + 'TSLs.tar.gz'] + +block_size = 16384 + +# ============================================================================== +# DOWNLOAD FILES FROM OECD SITE + +files_complete = [] +for f in files: + # Establish connection to URL + url = base_url + f + req = urlopen(url) + + # Get file size from header + if sys.version_info[0] < 3: + file_size = int(req.info().getheaders('Content-Length')[0]) + else: + file_size = req.length + downloaded = 0 + + # Check if file already downloaded + if os.path.exists(f): + if os.path.getsize(f) == file_size: + print('Skipping {}, already downloaded'.format(f)) + files_complete.append(f) + continue + else: + if sys.version_info[0] < 3: + overwrite = raw_input('Overwrite {}? ([y]/n) '.format(f)) + else: + overwrite = input('Overwrite {}? ([y]/n) '.format(f)) + if overwrite.lower().startswith('n'): + continue + + # Copy file to disk + print('Downloading {}... '.format(f), end='') + with open(f, 'wb') as fh: + while True: + chunk = req.read(block_size) + if not chunk: break + fh.write(chunk) + downloaded += len(chunk) + status = '{:10} [{:3.2f}%]'.format(downloaded, downloaded * 100. / file_size) + print(status + chr(8)*len(status), end='') + print('') + files_complete.append(f) + +# ============================================================================== +# EXTRACT FILES FROM TGZ + +for f in files: + if f not in files_complete: + continue + + # Extract files + if f.endswith('.zip'): + with zipfile.ZipFile(f, 'r') as zipf: + print('Extracting {}...'.format(f)) + zipf.extractall('jeff-3.2') + + else: + suffix = 'ACEs_293K' if '293' in f else '' + with tarfile.open(f, 'r') as tgz: + print('Extracting {}...'.format(f)) + tgz.extractall(os.path.join('jeff-3.2', suffix)) + + # Remove thermal scattering tables from 293K data since they are + # redundant + if '293' in f: + for path in glob.glob(os.path.join('jeff-3.2', 'ACEs_293K', '*-293.ACE')): + os.remove(path) + +# ============================================================================== +# FIX ERRORS + +# A few nuclides at 400K has 03c instead of 04c +print('Assigning new cross section identifiers...') +wrong_nuclides = ['Mn55', 'Mo95', 'Nb93', 'Pd105', 'Pu239', 'Pu240', 'U235', + 'U238', 'Y89'] +for nuc in wrong_nuclides: + path = os.path.join('jeff-3.2', 'ACEs_400K', nuc + '.ACE') + print(' Fixing {} (03c --> 04c)...'.format(path)) + if os.path.isfile(path): + text = open(path, 'r').read() + text = text[:7] + '04c' + text[10:] + open(path, 'w').write(text) + +# ============================================================================== +# CHANGE ZAID FOR METASTABLES + +metastables = glob.glob(os.path.join('jeff-3.2', '**', '*M.ACE')) +for path in metastables: + print(' Fixing {} (ensure metastable)...'.format(path)) + text = open(path, 'r').read() + mass_first_digit = int(text[3]) + if mass_first_digit <= 2: + text = text[:3] + str(mass_first_digit + 4) + text[4:] + open(path, 'w').write(text) + +# ============================================================================== +# CHANGE IDENTIFIER FOR S(A,B) TABLES + +thermals = glob.glob(os.path.join('jeff-3.2', 'ANNEX_6_3_STLs', '**', '*.ace')) +for path in thermals: + print(' Fixing {} (unique suffix)...'.format(path)) + basename = os.path.basename(path) + temperature = int(basename.split('-')[1][:-4]) + text = open(path, 'r').read() + text = text[:7] + thermal_suffix[temperature] + text[10:] + open(path, 'w').write(text) + +# ============================================================================== +# CONVERT TO BINARY TO SAVE DISK SPACE + +# get a list of all ACE files +ace_files = (glob.glob(os.path.join('jeff-3.2', '**', '*.ACE')) + + glob.glob(os.path.join('jeff-3.2', 'ANNEX_6_3_STLs', '**', '*.ace'))) + +# Ask user to convert +if not args.batch: + if sys.version_info[0] < 3: + response = raw_input('Convert ACE files to binary? ([y]/n) ') + else: + response = input('Convert ACE files to binary? ([y]/n) ') +else: + response = 'y' + +# Convert files if requested +if not response or response.lower().startswith('y'): + for f in ace_files: + print(' Converting {}...'.format(f)) + openmc.data.ace.ascii_to_binary(f, f) + +# ============================================================================== +# PROMPT USER TO GENERATE HDF5 LIBRARY + +# Ask user to convert +if not args.batch: + if sys.version_info[0] < 3: + response = raw_input('Generate HDF5 library? ([y]/n) ') + else: + response = input('Generate HDF5 library? ([y]/n) ') +else: + response = 'y' + +# Convert files if requested +if not response or response.lower().startswith('y'): + # Ensure 'import openmc.data' works in the openmc-ace-to-xml script + env = os.environ.copy() + env['PYTHONPATH'] = os.path.join(os.getcwd(), os.pardir) + + subprocess.call(['../scripts/openmc-ace-to-hdf5', '-d', 'jeff-3.2-hdf5'] + + sorted(ace_files), env=env) From 5d4bd3079cb6fc6e68599775ff5f39adcb517e06 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 20 Jul 2016 22:20:41 -0500 Subject: [PATCH 23/33] Ensure offset argument in h5tinsert_f is integer(SIZE_T) --- src/hdf5_interface.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 0bfe04051..44541a50e 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -2383,8 +2383,8 @@ contains ! Insert the 'r' and 'i' identifiers call h5tcreate_f(H5T_COMPOUND_F, size_double, dtype_real, hdf5_err) call h5tcreate_f(H5T_COMPOUND_F, size_double, dtype_imag, hdf5_err) - call h5tinsert_f(dtype_real, "r", 0_8, H5T_NATIVE_DOUBLE, hdf5_err) - call h5tinsert_f(dtype_imag, "i", 0_8, H5T_NATIVE_DOUBLE, hdf5_err) + call h5tinsert_f(dtype_real, "r", 0_SIZE_T, H5T_NATIVE_DOUBLE, hdf5_err) + call h5tinsert_f(dtype_imag, "i", 0_SIZE_T, H5T_NATIVE_DOUBLE, hdf5_err) ! Set up collective vs. independent I/O data_xfer_mode = H5FD_MPIO_COLLECTIVE_F From 9b1292fc1523fdc45b075a16c9f9b2d8b453157a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 21 Jul 2016 09:52:47 -0500 Subject: [PATCH 24/33] Remove -flto flag for GCC optimize=on. Apparently causes trouble with gcc 5.4 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dcaf30a1d..64eee2e9f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,7 +126,7 @@ if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU) list(APPEND ldflags -pg) endif() if(optimize) - list(APPEND f90flags -O3 -flto -fuse-linker-plugin) + list(APPEND f90flags -O3) list(APPEND cflags -O3) endif() if(openmp) From 8952865c099c2d710ede4033aaf174182bd6d2bf Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 22 Jul 2016 15:35:17 -0500 Subject: [PATCH 25/33] Remove n_reaction and n_product attributes in HDF5 data. Add /nuclide/reactions/ group, change reaction group names (reaction_MT). --- docs/source/io_formats/nuclear_data.rst | 9 ++++--- openmc/data/neutron.py | 26 +++++++++---------- openmc/data/reaction.py | 12 +++++---- src/multipole.F90 | 2 +- src/nuclide_header.F90 | 34 ++++++++++++++++++------- src/physics.F90 | 2 +- src/reaction_header.F90 | 22 +++++++++++++--- 7 files changed, 70 insertions(+), 37 deletions(-) diff --git a/docs/source/io_formats/nuclear_data.rst b/docs/source/io_formats/nuclear_data.rst index e7d4f2d32..ba6a54eb1 100644 --- a/docs/source/io_formats/nuclear_data.rst +++ b/docs/source/io_formats/nuclear_data.rst @@ -12,15 +12,16 @@ Incident Neutron Data **//** :Attributes: - **Z** (*int*) -- Atomic number - - **A** (*int*) -- Mass number - - **metastable** (*int*) -- Metastable state + - **A** (*int*) -- Mass number. For a natural element, A=0 is given. + - **metastable** (*int*) -- Metastable state (0=ground, 1=first + excited, etc.) - **atomic_weight_ratio** (*double*) -- Mass in units of neutron masses - **temperature** (*double*) -- Temperature in MeV - **n_reaction** (*int*) -- Number of reactions :Datasets: - **energy** (*double[]*) -- Energy points at which cross sections are tabulated -**//reaction_/** +**//reactions/reaction_/** :Attributes: - **mt** (*int*) -- ENDF MT reaction number - **label** (*char[]*) -- Name of the reaction @@ -33,7 +34,7 @@ Incident Neutron Data :Datasets: - **xs** (*double[]*) -- Cross section values tabulated against the nuclide energy grid -**//reaction_/product_/** +**//reactions/reaction_/product_/** Reaction product data is described in :ref:`product`. diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index c77ea86a1..b6a4f03b5 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -256,14 +256,14 @@ class IncidentNeutron(object): g.attrs['metastable'] = self.metastable g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio g.attrs['temperature'] = self.temperature - g.attrs['n_reaction'] = len(self.reactions) # Write energy grid g.create_dataset('energy', data=self.energy) # Write reaction data - for i, rx in enumerate(self.reactions.values()): - rx_group = g.create_group('reaction_{}'.format(i)) + rxs_group = g.create_group('reactions') + for rx in self.reactions.values(): + rx_group = rxs_group.create_group('reaction_{:03}'.format(rx.mt)) rx.to_hdf5(rx_group) # Write total nu data if available @@ -315,18 +315,16 @@ class IncidentNeutron(object): data.energy = group['energy'].value # Read reaction data - n_reaction = group.attrs['n_reaction'] + rxs_group = group['reactions'] + for name, obj in sorted(rxs_group.items()): + if name.startswith('reaction_'): + rx = Reaction.from_hdf5(obj, data.energy) + data.reactions[rx.mt] = rx - # Write reaction data - for i in range(n_reaction): - rx_group = group['reaction_{}'.format(i)] - rx = Reaction.from_hdf5(rx_group, data.energy) - data.reactions[rx.mt] = rx - - # Read total nu data if available - if 'total_nu' in rx_group: - tgroup = rx_group['total_nu'] - rx.derived_products = [Product.from_hdf5(tgroup)] + # Read total nu data if available + if rx.mt in (18, 19, 20, 21, 38) and 'total_nu' in group: + tgroup = group['total_nu'] + rx.derived_products.append(Product.from_hdf5(tgroup)) # Read unresolved resonance probability tables if 'urr' in group: diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index 8fb79f109..cadab0bf7 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -368,7 +368,6 @@ class Reaction(object): group.attrs['Q_value'] = self.q_value group.attrs['threshold_idx'] = self.threshold_idx + 1 group.attrs['center_of_mass'] = 1 if self.center_of_mass else 0 - group.attrs['n_product'] = len(self.products) if self.xs is not None: group.create_dataset('xs', data=self.xs.y) for i, p in enumerate(self.products): @@ -403,13 +402,16 @@ class Reaction(object): xs = group['xs'].value rx.xs = Tabulated1D(energy, xs) + # Determine number of products + n_product = 0 + for name in group: + if name.startswith('product_'): + n_product += 1 + # Read reaction products - n_product = group.attrs['n_product'] - products = [] for i in range(n_product): pgroup = group['product_{}'.format(i)] - products.append(Product.from_hdf5(pgroup)) - rx.products = products + rx.products.append(Product.from_hdf5(pgroup)) return rx diff --git a/src/multipole.F90 b/src/multipole.F90 index 382002536..770121b9d 100644 --- a/src/multipole.F90 +++ b/src/multipole.F90 @@ -133,7 +133,7 @@ contains accumulated_fission = .true. case default ! Search through all of our secondary reactions - do j = 1, nuc % n_reaction + do j = 1, size(nuc % reactions) if (nuc % reactions(j) % MT == MT(i)) then ! Match found diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index 9cff8a5d5..9f5594138 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -1,8 +1,9 @@ module nuclide_header use, intrinsic :: ISO_FORTRAN_ENV + use, intrinsic :: ISO_C_BINDING - use hdf5, only: HID_T, HSIZE_T, SIZE_T, h5iget_name_f + use hdf5 use h5lt, only: h5ltpath_valid_f use constants @@ -82,7 +83,6 @@ module nuclide_header type(MultipoleArray), pointer :: multipole => null() ! Reactions - integer :: n_reaction ! # of reactions type(Reaction), allocatable :: reactions(:) type(DictIntInt) :: reaction_index ! map MT values to index in reactions ! array; used at tally-time @@ -182,15 +182,20 @@ module nuclide_header integer :: i integer :: Z integer :: A - integer :: n_reaction + integer :: storage_type + integer :: max_corder + integer :: n_links integer :: hdf5_err integer(HID_T) :: urr_group, nu_group integer(HID_T) :: energy_dset + integer(HID_T) :: rxs_group integer(HID_T) :: rx_group integer(HID_T) :: total_nu integer(SIZE_T) :: name_len, name_file_len + integer(HSIZE_T) :: j integer(HSIZE_T) :: dims(1) character(MAX_WORD_LEN) :: temp + type(VectorInt) :: MTs logical :: exists ! Get name of nuclide from group @@ -206,8 +211,6 @@ module nuclide_header this % zaid = 1000*Z + A + 400*this % metastable call read_attribute(this % awr, group_id, 'atomic_weight_ratio') call read_attribute(this % kT, group_id, 'temperature') - call read_attribute(n_reaction, group_id, 'n_reaction') - this % n_reaction = n_reaction ! Read energy grid energy_dset = open_dataset(group_id, 'energy') @@ -217,13 +220,26 @@ module nuclide_header call read_dataset(this % energy, energy_dset) call close_dataset(energy_dset) + ! Get MT values based on group names + rxs_group = open_group(group_id, 'reactions') + call h5gget_info_f(rxs_group, storage_type, n_links, max_corder, hdf5_err) + do j = 0, n_links - 1 + call h5lget_name_by_idx_f(rxs_group, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, & + j, temp, hdf5_err, name_len) + if (starts_with(temp, "reaction_")) then + call MTs % push_back(int(str_to_int(temp(10:12)))) + end if + end do + ! Read reactions - allocate(this % reactions(n_reaction)) + allocate(this % reactions(MTs % size())) do i = 1, size(this % reactions) - rx_group = open_group(group_id, 'reaction_' // trim(to_str(i - 1))) + rx_group = open_group(rxs_group, 'reaction_' // trim(& + zero_padded(MTs % data(i), 3))) call this % reactions(i) % from_hdf5(rx_group) call close_group(rx_group) end do + call close_group(rxs_group) ! Read unresolved resonance probability tables if present call h5ltpath_valid_f(group_id, 'urr', .true., exists, hdf5_err) @@ -513,11 +529,11 @@ module nuclide_header write(unit_,*) ' # of grid points = ' // trim(to_str(this % n_grid)) write(unit_,*) ' Fissionable = ', this % fissionable write(unit_,*) ' # of fission reactions = ' // trim(to_str(this % n_fission)) - write(unit_,*) ' # of reactions = ' // trim(to_str(this % n_reaction)) + write(unit_,*) ' # of reactions = ' // trim(to_str(size(this % reactions))) ! Information on each reaction write(unit_,*) ' Reaction Q-value COM IE' - do i = 1, this % n_reaction + do i = 1, size(this % reactions) associate (rxn => this % reactions(i)) write(unit_,'(3X,A11,1X,F8.3,3X,L1,3X,I6)') & reaction_name(rxn % MT), rxn % Q_value, rxn % scatter_in_cm, & diff --git a/src/physics.F90 b/src/physics.F90 index 09a43aa99..a9f226395 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -346,7 +346,7 @@ contains i = i + 1 ! Check to make sure inelastic scattering reaction sampled - if (i > nuc % n_reaction) then + if (i > size(nuc % reactions)) then call write_particle_restart(p) call fatal_error("Did not sample any reaction for nuclide " & &// trim(nuc % name)) diff --git a/src/reaction_header.F90 b/src/reaction_header.F90 index 9829f6e8f..185945563 100644 --- a/src/reaction_header.F90 +++ b/src/reaction_header.F90 @@ -1,11 +1,12 @@ module reaction_header - use hdf5, only: HID_T, HSIZE_T + use hdf5 + use constants, only: MAX_WORD_LEN use hdf5_interface, only: read_attribute, open_group, close_group, & open_dataset, read_dataset, close_dataset, get_shape use product_header, only: ReactionProduct - use string, only: to_str + use string, only: to_str, starts_with implicit none @@ -34,9 +35,16 @@ contains integer :: i integer :: cm integer :: n_product + integer :: storage_type + integer :: max_corder + integer :: n_links + integer :: hdf5_err integer(HID_T) :: pgroup integer(HID_T) :: xs + integer(SIZE_T) :: name_len integer(HSIZE_T) :: dims(1) + integer(HSIZE_T) :: j + character(MAX_WORD_LEN) :: name call read_attribute(this % Q_value, group_id, 'Q_value') call read_attribute(this % MT, group_id, 'mt') @@ -51,8 +59,16 @@ contains call read_dataset(this % sigma, xs) call close_dataset(xs) + ! Determine number of products + call h5gget_info_f(group_id, storage_type, n_links, max_corder, hdf5_err) + n_product = 0 + do j = 0, n_links - 1 + call h5lget_name_by_idx_f(group_id, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, & + j, name, hdf5_err, name_len) + if (starts_with(name, "product_")) n_product = n_product + 1 + end do + ! Read products - call read_attribute(n_product, group_id, 'n_product') allocate(this % products(n_product)) do i = 1, n_product pgroup = open_group(group_id, 'product_' // trim(to_str(i - 1))) From e2112b86ae1caca7cfddbc5674a6cb595ad7fba2 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 25 Jul 2016 06:33:37 -0500 Subject: [PATCH 26/33] Respond to @smharper comments on #684 --- data/get_jeff_data.py | 35 +- .../pythonapi/examples/mgxs-part-i.ipynb | 95 ++- .../pythonapi/examples/mgxs-part-ii.ipynb | 752 +++++++++--------- .../pythonapi/examples/mgxs-part-iii.ipynb | 214 ++--- .../pythonapi/examples/mgxs-part-iv.ipynb | 110 ++- .../pythonapi/examples/nuclear-data.ipynb | 144 ++-- .../examples/pandas-dataframes.ipynb | 577 +++++++------- .../pythonapi/examples/post-processing.ipynb | 78 +- .../pythonapi/examples/tally-arithmetic.ipynb | 152 ++-- openmc/data/angle_energy.py | 4 +- openmc/data/data.py | 192 ++--- openmc/data/energy_distribution.py | 3 + openmc/data/neutron.py | 2 +- openmc/data/reaction.py | 4 +- openmc/element.py | 4 +- openmc/opencg_compatible.py | 2 +- 16 files changed, 1183 insertions(+), 1185 deletions(-) diff --git a/data/get_jeff_data.py b/data/get_jeff_data.py index 59023d9a2..fa9394850 100755 --- a/data/get_jeff_data.py +++ b/data/get_jeff_data.py @@ -18,6 +18,20 @@ try: except ImportError: from urllib2 import urlopen +if sys.version_info[0] < 3: + askuser = raw_input +else: + askuser = input + + +download_warning = """ +WARNING: This script will download approximately 9 GB of data. Extracting and +processing the data may require as much as 30 GB of additional free disk +space. Note that if you don't need all 11 temperatures, you can modify the +'files' list in the script to download only the data you want. + +Are you sure you want to continue? ([y]/n) +""" thermal_suffix = {20: '01t', 100: '02t', 293: '03t', 296: '03t', 323: '04t', 350: '05t', 373: '06t', 400: '07t', 423: '08t', 473: '09t', @@ -26,13 +40,15 @@ thermal_suffix = {20: '01t', 100: '02t', 293: '03t', 296: '03t', 323: '04t', 1000: '19t', 1200: '20t', 1600: '21t', 2000: '22t', 3000: '23t'} - - parser = argparse.ArgumentParser() parser.add_argument('-b', '--batch', action='store_true', help='supresses standard in') args = parser.parse_args() +response = askuser(download_warning) if not args.batch else 'y' +if response.lower().startswith('n'): + sys.exit() + base_url = 'https://www.oecd-nea.org/dbforms/data/eva/evatapes/jeff_32/Processed/' files = ['JEFF32-ACE-293K.tar.gz', 'JEFF32-ACE-400K.tar.gz', @@ -72,10 +88,7 @@ for f in files: files_complete.append(f) continue else: - if sys.version_info[0] < 3: - overwrite = raw_input('Overwrite {}? ([y]/n) '.format(f)) - else: - overwrite = input('Overwrite {}? ([y]/n) '.format(f)) + overwrite = askuser('Overwrite {}? ([y]/n) '.format(f)) if overwrite.lower().startswith('n'): continue @@ -165,10 +178,7 @@ ace_files = (glob.glob(os.path.join('jeff-3.2', '**', '*.ACE')) + # Ask user to convert if not args.batch: - if sys.version_info[0] < 3: - response = raw_input('Convert ACE files to binary? ([y]/n) ') - else: - response = input('Convert ACE files to binary? ([y]/n) ') + response = askuser('Convert ACE files to binary? ([y]/n) ') else: response = 'y' @@ -183,10 +193,7 @@ if not response or response.lower().startswith('y'): # Ask user to convert if not args.batch: - if sys.version_info[0] < 3: - response = raw_input('Generate HDF5 library? ([y]/n) ') - else: - response = input('Generate HDF5 library? ([y]/n) ') + response = askuser('Generate HDF5 library? ([y]/n) ') else: response = 'y' diff --git a/docs/source/pythonapi/examples/mgxs-part-i.ipynb b/docs/source/pythonapi/examples/mgxs-part-i.ipynb index ea75bec72..b95bea462 100644 --- a/docs/source/pythonapi/examples/mgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-i.ipynb @@ -165,11 +165,11 @@ "outputs": [], "source": [ "# Instantiate some Nuclides\n", - "h1 = openmc.Nuclide('H-1')\n", - "o16 = openmc.Nuclide('O-16')\n", - "u235 = openmc.Nuclide('U-235')\n", - "u238 = openmc.Nuclide('U-238')\n", - "zr90 = openmc.Nuclide('Zr-90')" + "h1 = openmc.Nuclide('H1')\n", + "o16 = openmc.Nuclide('O16')\n", + "u235 = openmc.Nuclide('U235')\n", + "u238 = openmc.Nuclide('U238')\n", + "zr90 = openmc.Nuclide('Zr90')" ] }, { @@ -419,24 +419,22 @@ "data": { "text/plain": [ "OrderedDict([('flux', Tally\n", - "\tID =\t10000\n", - "\tName =\t\n", - "\tFilters =\t\n", - " \t\tcell\t[1]\n", - " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t['flux']\n", - "\tEstimator =\ttracklength\n", - "), ('absorption', Tally\n", - "\tID =\t10001\n", - "\tName =\t\n", - "\tFilters =\t\n", - " \t\tcell\t[1]\n", - " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t['absorption']\n", - "\tEstimator =\ttracklength\n", - ")])" + " \tID =\t10000\n", + " \tName =\t\n", + " \tFilters =\t\n", + " \t\tcell\t[1]\n", + " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", + " \tNuclides =\ttotal \n", + " \tScores =\t['flux']\n", + " \tEstimator =\ttracklength), ('absorption', Tally\n", + " \tID =\t10001\n", + " \tName =\t\n", + " \tFilters =\t\n", + " \t\tcell\t[1]\n", + " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", + " \tNuclides =\ttotal \n", + " \tScores =\t['absorption']\n", + " \tEstimator =\ttracklength)])" ] }, "execution_count": 13, @@ -513,26 +511,25 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.7.1\n", - " Git SHA1: 19feb55e6d5e8350398627f39fb55ee8e2e63011\n", - " Date/Time: 2016-05-13 10:19:16\n", - " MPI Processes: 1\n", + " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", + " Date/Time: 2016-07-22 21:03:18\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", " ===========================================================================\n", "\n", " Reading settings XML file...\n", - " Reading cross sections XML file...\n", " Reading geometry XML file...\n", + " Reading cross sections XML file...\n", " Reading materials XML file...\n", + " Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n", + " Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n", + " Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n", + " Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n", + " Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for H1.71c\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", - " Loading ACE cross section table: 1001.71c\n", - " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 92235.71c\n", - " Loading ACE cross section table: 92238.71c\n", - " Loading ACE cross section table: 40090.71c\n", - " Maximum neutron transport energy: 20.0000 MeV for 1001.71c\n", " Initializing source particles...\n", "\n", " ===========================================================================\n", @@ -600,20 +597,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.2300E-01 seconds\n", - " Reading cross sections = 9.3000E-02 seconds\n", - " Total time in simulation = 1.6549E+01 seconds\n", - " Time in transport only = 1.6535E+01 seconds\n", - " Time in inactive batches = 2.3650E+00 seconds\n", - " Time in active batches = 1.4184E+01 seconds\n", - " Time synchronizing fission bank = 5.0000E-03 seconds\n", - " Sampling source sites = 3.0000E-03 seconds\n", + " Total time for initialization = 3.2300E-01 seconds\n", + " Reading cross sections = 1.6900E-01 seconds\n", + " Total time in simulation = 1.9882E+01 seconds\n", + " Time in transport only = 1.9869E+01 seconds\n", + " Time in inactive batches = 2.6590E+00 seconds\n", + " Time in active batches = 1.7223E+01 seconds\n", + " Time synchronizing fission bank = 4.0000E-03 seconds\n", + " Sampling source sites = 4.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 1.6981E+01 seconds\n", - " Calculation Rate (inactive) = 10570.8 neutrons/second\n", - " Calculation Rate (active) = 7050.20 neutrons/second\n", + " Total time elapsed = 2.0217E+01 seconds\n", + " Calculation Rate (inactive) = 9402.03 neutrons/second\n", + " Calculation Rate (active) = 5806.19 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1167,21 +1164,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" + "pygments_lexer": "ipython3", + "version": "3.5.2" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb index b882e949c..cb4df0fad 100644 --- a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb @@ -8,9 +8,9 @@ "\n", "* Creation of multi-group cross sections on a **heterogeneous geometry**\n", "* Calculation of cross sections on a **nuclide-by-nuclide basis**\n", - "* The use of **[tally precision triggers](https://mit-crpg.github.io/openmc/usersguide/input.html#trigger-element)** with multi-group cross sections\n", + "* The use of **[tally precision triggers](http://openmc.readthedocs.io/en/latest/usersguide/input.html#trigger-element)** with multi-group cross sections\n", "* Built-in features for **energy condensation** in downstream data processing\n", - "* The use of **[PyNE](http://pyne.io/) to plot** continuous-energy vs. multi-group cross sections\n", + "* The use of the **`openmc.data`** module to plot continuous-energy vs. multi-group cross sections\n", "* **Validation** of multi-group cross sections with **[OpenMOC](https://mit-crpg.github.io/OpenMOC/)**\n", "\n", "**Note:** This Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook in its entirety, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries. In addition, this Notebook illustrates the use of [Pandas](http://pandas.pydata.org/) `DataFrames` to containerize multi-group cross section data." @@ -34,16 +34,12 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python2.7/dist-packages/matplotlib-1.5.1+1178.ga40c9ec-py2.7-linux-x86_64.egg/matplotlib/__init__.py:884: UserWarning: axes.color_cycle is deprecated and replaced with axes.prop_cycle; please use the latter.\n", - " warnings.warn(self.msg_depr % (key, alt_key))\n", - "/usr/local/lib/python2.7/dist-packages/matplotlib-1.5.1+1178.ga40c9ec-py2.7-linux-x86_64.egg/matplotlib/__init__.py:1362: UserWarning: This call to matplotlib.use() has no effect\n", + "/home/romano/miniconda3/envs/default/lib/python3.5/site-packages/matplotlib/__init__.py:1350: UserWarning: This call to matplotlib.use() has no effect\n", "because the backend has already been chosen;\n", "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", "or matplotlib.backends is imported for the first time.\n", "\n", - " warnings.warn(_use_error_msg)\n", - "/usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:9: QAWarning: pyne.rxname is not yet QA compliant.\n", - "/usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:9: QAWarning: pyne.ace is not yet QA compliant.\n" + " warnings.warn(_use_error_msg)\n" ] } ], @@ -52,11 +48,12 @@ "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", - "import openmc\n", - "import openmc.mgxs as mgxs\n", "import openmoc\n", "from openmoc.opencg_compatible import get_openmoc_geometry\n", - "import pyne.ace\n", + "\n", + "import openmc\n", + "import openmc.mgxs as mgxs\n", + "import openmc.data\n", "\n", "%matplotlib inline" ] @@ -77,11 +74,11 @@ "outputs": [], "source": [ "# Instantiate some Nuclides\n", - "h1 = openmc.Nuclide('H-1')\n", - "o16 = openmc.Nuclide('O-16')\n", - "u235 = openmc.Nuclide('U-235')\n", - "u238 = openmc.Nuclide('U-238')\n", - "zr90 = openmc.Nuclide('Zr-90')" + "h1 = openmc.Nuclide('H1')\n", + "o16 = openmc.Nuclide('O16')\n", + "u235 = openmc.Nuclide('U235')\n", + "u238 = openmc.Nuclide('U238')\n", + "zr90 = openmc.Nuclide('Zr90')" ] }, { @@ -444,26 +441,25 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.7.1\n", - " Git SHA1: 19feb55e6d5e8350398627f39fb55ee8e2e63011\n", - " Date/Time: 2016-05-13 10:13:48\n", - " MPI Processes: 1\n", + " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", + " Date/Time: 2016-07-22 21:32:41\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", " ===========================================================================\n", "\n", " Reading settings XML file...\n", - " Reading cross sections XML file...\n", " Reading geometry XML file...\n", + " Reading cross sections XML file...\n", " Reading materials XML file...\n", + " Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n", + " Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n", + " Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n", + " Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n", + " Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", - " Loading ACE cross section table: 92235.71c\n", - " Loading ACE cross section table: 92238.71c\n", - " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 1001.71c\n", - " Loading ACE cross section table: 40090.71c\n", - " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", " Initializing source particles...\n", "\n", " ===========================================================================\n", @@ -522,7 +518,7 @@ " 48/1 1.21610 1.22612 +/- 0.00251\n", " 49/1 1.22199 1.22602 +/- 0.00245\n", " 50/1 1.20860 1.22558 +/- 0.00243\n", - " Triggers unsatisfied, max unc./thresh. is 1.25496 for flux in tally 10051\n", + " Triggers unsatisfied, max unc./thresh. is 1.25496 for flux in tally 10054\n", " The estimated number of batches is 73\n", " Creating state point statepoint.050.h5...\n", " 51/1 1.21850 1.22541 +/- 0.00237\n", @@ -548,7 +544,7 @@ " 71/1 1.19720 1.22444 +/- 0.00195\n", " 72/1 1.23770 1.22465 +/- 0.00193\n", " 73/1 1.23894 1.22488 +/- 0.00191\n", - " Triggers unsatisfied, max unc./thresh. is 1.00243 for flux in tally 10051\n", + " Triggers unsatisfied, max unc./thresh. is 1.00243 for flux in tally 10054\n", " The estimated number of batches is 74\n", " 74/1 1.22437 1.22487 +/- 0.00188\n", " Triggers satisfied for batch 74\n", @@ -561,20 +557,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 5.7400E-01 seconds\n", - " Reading cross sections = 1.2600E-01 seconds\n", - " Total time in simulation = 2.6256E+02 seconds\n", - " Time in transport only = 2.6250E+02 seconds\n", - " Time in inactive batches = 2.2890E+01 seconds\n", - " Time in active batches = 2.3967E+02 seconds\n", - " Time synchronizing fission bank = 3.4000E-02 seconds\n", - " Sampling source sites = 2.1000E-02 seconds\n", + " Total time for initialization = 4.3000E-01 seconds\n", + " Reading cross sections = 2.6000E-01 seconds\n", + " Total time in simulation = 3.4077E+02 seconds\n", + " Time in transport only = 3.4068E+02 seconds\n", + " Time in inactive batches = 2.3968E+01 seconds\n", + " Time in active batches = 3.1680E+02 seconds\n", + " Time synchronizing fission bank = 3.0000E-02 seconds\n", + " Sampling source sites = 1.7000E-02 seconds\n", " SEND/RECV source sites = 1.3000E-02 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 1.3000E-02 seconds\n", - " Total time elapsed = 2.6320E+02 seconds\n", - " Calculation Rate (inactive) = 4368.72 neutrons/second\n", - " Calculation Rate (active) = 1668.93 neutrons/second\n", + " Time accumulating tallies = 3.0000E-03 seconds\n", + " Total time for finalization = 1.6000E-02 seconds\n", + " Total time elapsed = 3.4129E+02 seconds\n", + " Calculation Rate (inactive) = 4172.23 neutrons/second\n", + " Calculation Rate (active) = 1262.62 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -685,7 +681,7 @@ "\tReaction Type =\tnu-fission\n", "\tDomain Type =\tcell\n", "\tDomain ID =\t10000\n", - "\tNuclide =\tU-235\n", + "\tNuclide =\tU235\n", "\tCross Sections [barns]:\n", " Group 1 [0.821 - 20.0 MeV]:\t3.30e+00 +/- 2.19e-01%\n", " Group 2 [0.00553 - 0.821 MeV]:\t3.96e+00 +/- 1.32e-01%\n", @@ -696,7 +692,7 @@ " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.87e+02 +/- 2.97e-01%\n", " Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 2.91e-01%\n", "\n", - "\tNuclide =\tU-238\n", + "\tNuclide =\tU238\n", "\tCross Sections [barns]:\n", " Group 1 [0.821 - 20.0 MeV]:\t1.06e+00 +/- 2.56e-01%\n", " Group 2 [0.00553 - 0.821 MeV]:\t1.21e-03 +/- 2.55e-01%\n", @@ -714,7 +710,7 @@ ], "source": [ "nufission = xs_library[fuel_cell.id]['nu-fission']\n", - "nufission.print_xs(xs_type='micro', nuclides=['U-235', 'U-238'])" + "nufission.print_xs(xs_type='micro', nuclides=['U235', 'U238'])" ] }, { @@ -795,7 +791,7 @@ " 10002\n", " 1\n", " 1\n", - " H-1\n", + " H1\n", " 0.234115\n", " 0.003568\n", " \n", @@ -804,7 +800,7 @@ " 10002\n", " 1\n", " 1\n", - " O-16\n", + " O16\n", " 1.563707\n", " 0.005953\n", " \n", @@ -813,7 +809,7 @@ " 10002\n", " 1\n", " 2\n", - " H-1\n", + " H1\n", " 1.594129\n", " 0.002369\n", " \n", @@ -822,7 +818,7 @@ " 10002\n", " 1\n", " 2\n", - " O-16\n", + " O16\n", " 0.285761\n", " 0.001676\n", " \n", @@ -831,7 +827,7 @@ " 10002\n", " 1\n", " 3\n", - " H-1\n", + " H1\n", " 0.011089\n", " 0.000248\n", " \n", @@ -840,7 +836,7 @@ " 10002\n", " 1\n", " 3\n", - " O-16\n", + " O16\n", " 0.000000\n", " 0.000000\n", " \n", @@ -849,7 +845,7 @@ " 10002\n", " 1\n", " 4\n", - " H-1\n", + " H1\n", " 0.000000\n", " 0.000000\n", " \n", @@ -858,7 +854,7 @@ " 10002\n", " 1\n", " 4\n", - " O-16\n", + " O16\n", " 0.000000\n", " 0.000000\n", " \n", @@ -867,7 +863,7 @@ " 10002\n", " 1\n", " 5\n", - " H-1\n", + " H1\n", " 0.000000\n", " 0.000000\n", " \n", @@ -876,7 +872,7 @@ " 10002\n", " 1\n", " 5\n", - " O-16\n", + " O16\n", " 0.000000\n", " 0.000000\n", " \n", @@ -886,16 +882,16 @@ ], "text/plain": [ " cell group in group out nuclide mean std. dev.\n", - "126 10002 1 1 H-1 0.234115 0.003568\n", - "127 10002 1 1 O-16 1.563707 0.005953\n", - "124 10002 1 2 H-1 1.594129 0.002369\n", - "125 10002 1 2 O-16 0.285761 0.001676\n", - "122 10002 1 3 H-1 0.011089 0.000248\n", - "123 10002 1 3 O-16 0.000000 0.000000\n", - "120 10002 1 4 H-1 0.000000 0.000000\n", - "121 10002 1 4 O-16 0.000000 0.000000\n", - "118 10002 1 5 H-1 0.000000 0.000000\n", - "119 10002 1 5 O-16 0.000000 0.000000" + "126 10002 1 1 H1 0.234115 0.003568\n", + "127 10002 1 1 O16 1.563707 0.005953\n", + "124 10002 1 2 H1 1.594129 0.002369\n", + "125 10002 1 2 O16 0.285761 0.001676\n", + "122 10002 1 3 H1 0.011089 0.000248\n", + "123 10002 1 3 O16 0.000000 0.000000\n", + "120 10002 1 4 H1 0.000000 0.000000\n", + "121 10002 1 4 O16 0.000000 0.000000\n", + "118 10002 1 5 H1 0.000000 0.000000\n", + "119 10002 1 5 O16 0.000000 0.000000" ] }, "execution_count": 19, @@ -953,17 +949,17 @@ "\tReaction Type =\ttransport\n", "\tDomain Type =\tcell\n", "\tDomain ID =\t10000\n", - "\tNuclide =\tU-235\n", + "\tNuclide =\tU235\n", "\tCross Sections [cm^-1]:\n", " Group 1 [6.25e-07 - 20.0 MeV]:\t7.73e-03 +/- 5.06e-01%\n", " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 2.05e-01%\n", "\n", - "\tNuclide =\tU-238\n", + "\tNuclide =\tU238\n", "\tCross Sections [cm^-1]:\n", " Group 1 [6.25e-07 - 20.0 MeV]:\t2.17e-01 +/- 1.44e-01%\n", " Group 2 [0.0 - 6.25e-07 MeV]:\t2.53e-01 +/- 2.57e-01%\n", "\n", - "\tNuclide =\tO-16\n", + "\tNuclide =\tO16\n", "\tCross Sections [cm^-1]:\n", " Group 1 [6.25e-07 - 20.0 MeV]:\t1.46e-01 +/- 1.60e-01%\n", " Group 2 [0.0 - 6.25e-07 MeV]:\t1.75e-01 +/- 2.94e-01%\n", @@ -1004,7 +1000,7 @@ " 3\n", " 10000\n", " 1\n", - " U-235\n", + " U235\n", " 20.611692\n", " 0.104237\n", " \n", @@ -1012,7 +1008,7 @@ " 4\n", " 10000\n", " 1\n", - " U-238\n", + " U238\n", " 9.585358\n", " 0.013808\n", " \n", @@ -1020,7 +1016,7 @@ " 5\n", " 10000\n", " 1\n", - " O-16\n", + " O16\n", " 3.164190\n", " 0.005049\n", " \n", @@ -1028,7 +1024,7 @@ " 0\n", " 10000\n", " 2\n", - " U-235\n", + " U235\n", " 485.413426\n", " 0.996410\n", " \n", @@ -1036,7 +1032,7 @@ " 1\n", " 10000\n", " 2\n", - " U-238\n", + " U238\n", " 11.190386\n", " 0.028731\n", " \n", @@ -1044,7 +1040,7 @@ " 2\n", " 10000\n", " 2\n", - " O-16\n", + " O16\n", " 3.794859\n", " 0.011139\n", " \n", @@ -1054,12 +1050,12 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "3 10000 1 U-235 20.611692 0.104237\n", - "4 10000 1 U-238 9.585358 0.013808\n", - "5 10000 1 O-16 3.164190 0.005049\n", - "0 10000 2 U-235 485.413426 0.996410\n", - "1 10000 2 U-238 11.190386 0.028731\n", - "2 10000 2 O-16 3.794859 0.011139" + "3 10000 1 U235 20.611692 0.104237\n", + "4 10000 1 U238 9.585358 0.013808\n", + "5 10000 1 O16 3.164190 0.005049\n", + "0 10000 2 U235 485.413426 0.996410\n", + "1 10000 2 U238 11.190386 0.028731\n", + "2 10000 2 O16 3.794859 0.011139" ] }, "execution_count": 22, @@ -1166,81 +1162,81 @@ "[ NORMAL ] Iteration 0:\tk_eff = 0.574672\tres = 0.000E+00\n", "[ NORMAL ] Iteration 1:\tk_eff = 0.679815\tres = 4.253E-01\n", "[ NORMAL ] Iteration 2:\tk_eff = 0.660826\tres = 1.830E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.658940\tres = 2.793E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.643012\tres = 2.853E-03\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.658941\tres = 2.793E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.643012\tres = 2.852E-03\n", "[ NORMAL ] Iteration 5:\tk_eff = 0.625810\tres = 2.417E-02\n", "[ NORMAL ] Iteration 6:\tk_eff = 0.606678\tres = 2.675E-02\n", "[ NORMAL ] Iteration 7:\tk_eff = 0.587485\tres = 3.057E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.569028\tres = 3.164E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.569029\tres = 3.164E-02\n", "[ NORMAL ] Iteration 9:\tk_eff = 0.551707\tres = 3.142E-02\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.536034\tres = 3.044E-02\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.536035\tres = 3.044E-02\n", "[ NORMAL ] Iteration 11:\tk_eff = 0.522274\tres = 2.841E-02\n", "[ NORMAL ] Iteration 12:\tk_eff = 0.510609\tres = 2.567E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.501105\tres = 2.234E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.501106\tres = 2.234E-02\n", "[ NORMAL ] Iteration 14:\tk_eff = 0.493831\tres = 1.861E-02\n", "[ NORMAL ] Iteration 15:\tk_eff = 0.488780\tres = 1.452E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.485922\tres = 1.023E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.485209\tres = 5.846E-03\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.485923\tres = 1.023E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.485210\tres = 5.846E-03\n", "[ NORMAL ] Iteration 18:\tk_eff = 0.486569\tres = 1.467E-03\n", "[ NORMAL ] Iteration 19:\tk_eff = 0.489903\tres = 2.801E-03\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.495102\tres = 6.853E-03\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.495103\tres = 6.852E-03\n", "[ NORMAL ] Iteration 21:\tk_eff = 0.502053\tres = 1.061E-02\n", "[ NORMAL ] Iteration 22:\tk_eff = 0.510627\tres = 1.404E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.520692\tres = 1.708E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.532116\tres = 1.971E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.544763\tres = 2.194E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.558500\tres = 2.377E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.520693\tres = 1.708E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.532117\tres = 1.971E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.544764\tres = 2.194E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.558501\tres = 2.377E-02\n", "[ NORMAL ] Iteration 27:\tk_eff = 0.573195\tres = 2.522E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.588717\tres = 2.631E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.604945\tres = 2.708E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.588718\tres = 2.631E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.604946\tres = 2.708E-02\n", "[ NORMAL ] Iteration 30:\tk_eff = 0.621759\tres = 2.756E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.639046\tres = 2.779E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.656701\tres = 2.780E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.639047\tres = 2.779E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.656702\tres = 2.780E-02\n", "[ NORMAL ] Iteration 33:\tk_eff = 0.674624\tres = 2.763E-02\n", "[ NORMAL ] Iteration 34:\tk_eff = 0.692722\tres = 2.729E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.710909\tres = 2.683E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.729109\tres = 2.626E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.710910\tres = 2.683E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.729109\tres = 2.625E-02\n", "[ NORMAL ] Iteration 37:\tk_eff = 0.747248\tres = 2.560E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.765262\tres = 2.488E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.783093\tres = 2.411E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.800689\tres = 2.330E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.818004\tres = 2.247E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.765263\tres = 2.488E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.783094\tres = 2.411E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.800690\tres = 2.330E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.818005\tres = 2.247E-02\n", "[ NORMAL ] Iteration 42:\tk_eff = 0.834999\tres = 2.163E-02\n", "[ NORMAL ] Iteration 43:\tk_eff = 0.851638\tres = 2.078E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.867891\tres = 1.993E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.883735\tres = 1.909E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.899148\tres = 1.826E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.914114\tres = 1.744E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.928621\tres = 1.664E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.867892\tres = 1.993E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.883736\tres = 1.909E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.899149\tres = 1.826E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.914115\tres = 1.744E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.928622\tres = 1.664E-02\n", "[ NORMAL ] Iteration 49:\tk_eff = 0.942659\tres = 1.587E-02\n", "[ NORMAL ] Iteration 50:\tk_eff = 0.956221\tres = 1.512E-02\n", "[ NORMAL ] Iteration 51:\tk_eff = 0.969305\tres = 1.439E-02\n", "[ NORMAL ] Iteration 52:\tk_eff = 0.981909\tres = 1.368E-02\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.994034\tres = 1.300E-02\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.994035\tres = 1.300E-02\n", "[ NORMAL ] Iteration 54:\tk_eff = 1.005685\tres = 1.235E-02\n", "[ NORMAL ] Iteration 55:\tk_eff = 1.016866\tres = 1.172E-02\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.027583\tres = 1.112E-02\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.037845\tres = 1.054E-02\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.027584\tres = 1.112E-02\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.037846\tres = 1.054E-02\n", "[ NORMAL ] Iteration 58:\tk_eff = 1.047661\tres = 9.986E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.057040\tres = 9.458E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.065993\tres = 8.952E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.057040\tres = 9.457E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.065994\tres = 8.953E-03\n", "[ NORMAL ] Iteration 61:\tk_eff = 1.074533\tres = 8.470E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.082670\tres = 8.011E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.082671\tres = 8.011E-03\n", "[ NORMAL ] Iteration 63:\tk_eff = 1.090418\tres = 7.573E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.097789\tres = 7.156E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.104796\tres = 6.760E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.111452\tres = 6.383E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.097790\tres = 7.156E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.104797\tres = 6.760E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.111453\tres = 6.383E-03\n", "[ NORMAL ] Iteration 67:\tk_eff = 1.117770\tres = 6.025E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.123764\tres = 5.685E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.129445\tres = 5.362E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.123764\tres = 5.684E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.129446\tres = 5.362E-03\n", "[ NORMAL ] Iteration 70:\tk_eff = 1.134828\tres = 5.056E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.139924\tres = 4.766E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.139924\tres = 4.765E-03\n", "[ NORMAL ] Iteration 72:\tk_eff = 1.144746\tres = 4.491E-03\n", "[ NORMAL ] Iteration 73:\tk_eff = 1.149306\tres = 4.230E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.153617\tres = 3.984E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.157689\tres = 3.750E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.153617\tres = 3.983E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.157688\tres = 3.751E-03\n", "[ NORMAL ] Iteration 76:\tk_eff = 1.161534\tres = 3.530E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.165163\tres = 3.321E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.165163\tres = 3.322E-03\n", "[ NORMAL ] Iteration 78:\tk_eff = 1.168586\tres = 3.124E-03\n", "[ NORMAL ] Iteration 79:\tk_eff = 1.171813\tres = 2.938E-03\n", "[ NORMAL ] Iteration 80:\tk_eff = 1.174855\tres = 2.762E-03\n", @@ -1248,84 +1244,84 @@ "[ NORMAL ] Iteration 82:\tk_eff = 1.180419\tres = 2.439E-03\n", "[ NORMAL ] Iteration 83:\tk_eff = 1.182960\tres = 2.291E-03\n", "[ NORMAL ] Iteration 84:\tk_eff = 1.185350\tres = 2.152E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.187598\tres = 2.021E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.189712\tres = 1.897E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.191699\tres = 1.780E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.187599\tres = 2.021E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.189713\tres = 1.897E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.191700\tres = 1.780E-03\n", "[ NORMAL ] Iteration 88:\tk_eff = 1.193567\tres = 1.670E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.195320\tres = 1.567E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.195321\tres = 1.567E-03\n", "[ NORMAL ] Iteration 90:\tk_eff = 1.196967\tres = 1.469E-03\n", "[ NORMAL ] Iteration 91:\tk_eff = 1.198513\tres = 1.378E-03\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.199964\tres = 1.292E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.199964\tres = 1.291E-03\n", "[ NORMAL ] Iteration 93:\tk_eff = 1.201326\tres = 1.211E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.202602\tres = 1.134E-03\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.203800\tres = 1.063E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.204922\tres = 9.955E-04\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.205974\tres = 9.323E-04\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.206959\tres = 8.730E-04\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.207883\tres = 8.173E-04\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.208747\tres = 7.649E-04\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.209557\tres = 7.159E-04\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.210315\tres = 6.698E-04\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.211024\tres = 6.266E-04\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.211688\tres = 5.861E-04\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.212309\tres = 5.481E-04\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.212890\tres = 5.125E-04\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.213433\tres = 4.791E-04\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.213941\tres = 4.479E-04\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.214416\tres = 4.186E-04\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.214860\tres = 3.912E-04\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.215275\tres = 3.655E-04\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.215662\tres = 3.414E-04\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.216024\tres = 3.189E-04\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.216362\tres = 2.979E-04\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.216678\tres = 2.781E-04\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.216973\tres = 2.597E-04\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.217249\tres = 2.425E-04\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.217506\tres = 2.263E-04\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.217746\tres = 2.112E-04\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.217970\tres = 1.971E-04\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.218179\tres = 1.840E-04\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.218374\tres = 1.716E-04\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.218556\tres = 1.601E-04\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.218726\tres = 1.494E-04\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.218884\tres = 1.393E-04\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.219032\tres = 1.299E-04\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.219170\tres = 1.212E-04\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.219298\tres = 1.130E-04\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.219418\tres = 1.053E-04\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.219529\tres = 9.821E-05\n", - "[ NORMAL ] Iteration 131:\tk_eff = 1.219633\tres = 9.155E-05\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.219730\tres = 8.534E-05\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.219821\tres = 7.954E-05\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.219905\tres = 7.412E-05\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.219984\tres = 6.907E-05\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.220057\tres = 6.436E-05\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.220125\tres = 5.997E-05\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.220188\tres = 5.587E-05\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.220248\tres = 5.205E-05\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.220303\tres = 4.848E-05\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.220354\tres = 4.516E-05\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.220402\tres = 4.206E-05\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.220446\tres = 3.917E-05\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.220488\tres = 3.648E-05\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.220526\tres = 3.397E-05\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.220562\tres = 3.163E-05\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.220596\tres = 2.945E-05\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.220627\tres = 2.742E-05\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.220656\tres = 2.552E-05\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.220683\tres = 2.376E-05\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.220708\tres = 2.212E-05\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.220732\tres = 2.059E-05\n", - "[ NORMAL ] Iteration 153:\tk_eff = 1.220753\tres = 1.916E-05\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.220774\tres = 1.783E-05\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.220792\tres = 1.660E-05\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.220810\tres = 1.545E-05\n", - "[ NORMAL ] Iteration 157:\tk_eff = 1.220826\tres = 1.437E-05\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.220841\tres = 1.337E-05\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.220856\tres = 1.244E-05\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.220869\tres = 1.158E-05\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.220881\tres = 1.077E-05\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.220892\tres = 1.002E-05\n" + "[ NORMAL ] Iteration 94:\tk_eff = 1.202602\tres = 1.135E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.203800\tres = 1.062E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.204922\tres = 9.959E-04\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.205974\tres = 9.321E-04\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.206961\tres = 8.732E-04\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.207884\tres = 8.175E-04\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.208748\tres = 7.646E-04\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.209558\tres = 7.159E-04\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.210316\tres = 6.699E-04\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.211025\tres = 6.262E-04\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.211689\tres = 5.864E-04\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.212310\tres = 5.481E-04\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.212891\tres = 5.124E-04\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.213434\tres = 4.792E-04\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.213942\tres = 4.477E-04\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.214416\tres = 4.189E-04\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.214861\tres = 3.907E-04\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.215275\tres = 3.660E-04\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.215663\tres = 3.414E-04\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.216025\tres = 3.188E-04\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.216363\tres = 2.981E-04\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.216679\tres = 2.776E-04\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.216974\tres = 2.599E-04\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.217250\tres = 2.427E-04\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.217507\tres = 2.263E-04\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.217747\tres = 2.115E-04\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.217970\tres = 1.970E-04\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.218180\tres = 1.834E-04\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.218375\tres = 1.718E-04\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.218557\tres = 1.602E-04\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.218726\tres = 1.496E-04\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.218885\tres = 1.387E-04\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.219032\tres = 1.301E-04\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.219169\tres = 1.211E-04\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.219298\tres = 1.127E-04\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.219418\tres = 1.058E-04\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.219529\tres = 9.828E-05\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.219633\tres = 9.100E-05\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.219730\tres = 8.530E-05\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.219820\tres = 7.940E-05\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.219904\tres = 7.409E-05\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.219983\tres = 6.876E-05\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.220056\tres = 6.455E-05\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.220124\tres = 5.969E-05\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.220187\tres = 5.603E-05\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.220246\tres = 5.166E-05\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.220301\tres = 4.829E-05\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.220352\tres = 4.510E-05\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.220400\tres = 4.199E-05\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.220445\tres = 3.939E-05\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.220486\tres = 3.630E-05\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.220525\tres = 3.362E-05\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.220561\tres = 3.181E-05\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.220594\tres = 2.977E-05\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.220626\tres = 2.745E-05\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.220655\tres = 2.569E-05\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.220682\tres = 2.376E-05\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.220707\tres = 2.201E-05\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.220730\tres = 2.071E-05\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.220752\tres = 1.925E-05\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.220772\tres = 1.793E-05\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.220791\tres = 1.669E-05\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.220809\tres = 1.554E-05\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.220826\tres = 1.457E-05\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.220841\tres = 1.372E-05\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.220855\tres = 1.249E-05\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.220868\tres = 1.138E-05\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.220881\tres = 1.104E-05\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.220892\tres = 1.028E-05\n" ] } ], @@ -1436,22 +1432,22 @@ "[ NORMAL ] Computing the eigenvalue...\n", "[ NORMAL ] Iteration 0:\tk_eff = 0.495816\tres = 0.000E+00\n", "[ NORMAL ] Iteration 1:\tk_eff = 0.557477\tres = 5.042E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.518300\tres = 1.244E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.509211\tres = 7.027E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.496489\tres = 1.754E-02\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.518301\tres = 1.244E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.509212\tres = 7.027E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.496490\tres = 1.754E-02\n", "[ NORMAL ] Iteration 5:\tk_eff = 0.488581\tres = 2.498E-02\n", "[ NORMAL ] Iteration 6:\tk_eff = 0.482897\tres = 1.593E-02\n", "[ NORMAL ] Iteration 7:\tk_eff = 0.479775\tres = 1.163E-02\n", "[ NORMAL ] Iteration 8:\tk_eff = 0.478834\tres = 6.465E-03\n", "[ NORMAL ] Iteration 9:\tk_eff = 0.479871\tres = 1.960E-03\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.482684\tres = 2.166E-03\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.487084\tres = 5.861E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.482684\tres = 2.165E-03\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.487084\tres = 5.860E-03\n", "[ NORMAL ] Iteration 12:\tk_eff = 0.492900\tres = 9.116E-03\n", "[ NORMAL ] Iteration 13:\tk_eff = 0.499971\tres = 1.194E-02\n", "[ NORMAL ] Iteration 14:\tk_eff = 0.508153\tres = 1.435E-02\n", "[ NORMAL ] Iteration 15:\tk_eff = 0.517312\tres = 1.637E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.527324\tres = 1.802E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.538079\tres = 1.935E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.527325\tres = 1.802E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.538079\tres = 1.936E-02\n", "[ NORMAL ] Iteration 18:\tk_eff = 0.549472\tres = 2.039E-02\n", "[ NORMAL ] Iteration 19:\tk_eff = 0.561410\tres = 2.117E-02\n", "[ NORMAL ] Iteration 20:\tk_eff = 0.573807\tres = 2.173E-02\n", @@ -1471,200 +1467,200 @@ "[ NORMAL ] Iteration 34:\tk_eff = 0.762510\tres = 1.812E-02\n", "[ NORMAL ] Iteration 35:\tk_eff = 0.775514\tres = 1.759E-02\n", "[ NORMAL ] Iteration 36:\tk_eff = 0.788326\tres = 1.705E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.800934\tres = 1.652E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.800935\tres = 1.652E-02\n", "[ NORMAL ] Iteration 38:\tk_eff = 0.813328\tres = 1.599E-02\n", "[ NORMAL ] Iteration 39:\tk_eff = 0.825497\tres = 1.547E-02\n", "[ NORMAL ] Iteration 40:\tk_eff = 0.837433\tres = 1.496E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.849131\tres = 1.446E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.860584\tres = 1.397E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.871789\tres = 1.349E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.849130\tres = 1.446E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.860583\tres = 1.397E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.871788\tres = 1.349E-02\n", "[ NORMAL ] Iteration 44:\tk_eff = 0.882742\tres = 1.302E-02\n", "[ NORMAL ] Iteration 45:\tk_eff = 0.893442\tres = 1.256E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.903888\tres = 1.212E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.914078\tres = 1.169E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.924013\tres = 1.127E-02\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.933694\tres = 1.087E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.903887\tres = 1.212E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.914077\tres = 1.169E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.924012\tres = 1.127E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.933693\tres = 1.087E-02\n", "[ NORMAL ] Iteration 50:\tk_eff = 0.943122\tres = 1.048E-02\n", "[ NORMAL ] Iteration 51:\tk_eff = 0.952299\tres = 1.010E-02\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.961228\tres = 9.731E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.969911\tres = 9.376E-03\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.961228\tres = 9.730E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.969911\tres = 9.377E-03\n", "[ NORMAL ] Iteration 54:\tk_eff = 0.978351\tres = 9.033E-03\n", "[ NORMAL ] Iteration 55:\tk_eff = 0.986552\tres = 8.702E-03\n", "[ NORMAL ] Iteration 56:\tk_eff = 0.994517\tres = 8.382E-03\n", "[ NORMAL ] Iteration 57:\tk_eff = 1.002250\tres = 8.074E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.009756\tres = 7.776E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.009755\tres = 7.776E-03\n", "[ NORMAL ] Iteration 59:\tk_eff = 1.017037\tres = 7.488E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.024100\tres = 7.211E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.030948\tres = 6.944E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.037585\tres = 6.687E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.044017\tres = 6.438E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.050248\tres = 6.199E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.056282\tres = 5.968E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.024099\tres = 7.211E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.030947\tres = 6.944E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.037584\tres = 6.687E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.044016\tres = 6.438E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.050247\tres = 6.199E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.056282\tres = 5.969E-03\n", "[ NORMAL ] Iteration 66:\tk_eff = 1.062125\tres = 5.746E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.067782\tres = 5.532E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.073256\tres = 5.325E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.078553\tres = 5.127E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.083677\tres = 4.935E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.088633\tres = 4.751E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.067781\tres = 5.531E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.073255\tres = 5.326E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.078552\tres = 5.126E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.083676\tres = 4.936E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.088632\tres = 4.751E-03\n", "[ NORMAL ] Iteration 72:\tk_eff = 1.093425\tres = 4.573E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.098059\tres = 4.402E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.102538\tres = 4.238E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.106867\tres = 4.079E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.111050\tres = 3.926E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.115091\tres = 3.779E-03\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.118996\tres = 3.638E-03\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.122767\tres = 3.501E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.098058\tres = 4.403E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.102537\tres = 4.237E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.106866\tres = 4.079E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.111049\tres = 3.926E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.115090\tres = 3.779E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.118995\tres = 3.638E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.122766\tres = 3.501E-03\n", "[ NORMAL ] Iteration 80:\tk_eff = 1.126408\tres = 3.370E-03\n", "[ NORMAL ] Iteration 81:\tk_eff = 1.129925\tres = 3.244E-03\n", "[ NORMAL ] Iteration 82:\tk_eff = 1.133320\tres = 3.122E-03\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.136598\tres = 3.005E-03\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.139762\tres = 2.892E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.142815\tres = 2.784E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.145762\tres = 2.679E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.148605\tres = 2.578E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.136597\tres = 3.005E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.139761\tres = 2.892E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.142815\tres = 2.783E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.145761\tres = 2.679E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.148605\tres = 2.579E-03\n", "[ NORMAL ] Iteration 88:\tk_eff = 1.151348\tres = 2.482E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.153995\tres = 2.388E-03\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.156548\tres = 2.299E-03\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.159010\tres = 2.212E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.153994\tres = 2.388E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.156547\tres = 2.299E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.159009\tres = 2.212E-03\n", "[ NORMAL ] Iteration 92:\tk_eff = 1.161384\tres = 2.129E-03\n", "[ NORMAL ] Iteration 93:\tk_eff = 1.163674\tres = 2.049E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.165883\tres = 1.972E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.165882\tres = 1.972E-03\n", "[ NORMAL ] Iteration 95:\tk_eff = 1.168012\tres = 1.898E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.170064\tres = 1.826E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.170064\tres = 1.827E-03\n", "[ NORMAL ] Iteration 97:\tk_eff = 1.172043\tres = 1.757E-03\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.173951\tres = 1.691E-03\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.173951\tres = 1.692E-03\n", "[ NORMAL ] Iteration 99:\tk_eff = 1.175790\tres = 1.628E-03\n", "[ NORMAL ] Iteration 100:\tk_eff = 1.177562\tres = 1.566E-03\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.179270\tres = 1.507E-03\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.179269\tres = 1.507E-03\n", "[ NORMAL ] Iteration 102:\tk_eff = 1.180916\tres = 1.450E-03\n", "[ NORMAL ] Iteration 103:\tk_eff = 1.182502\tres = 1.396E-03\n", "[ NORMAL ] Iteration 104:\tk_eff = 1.184030\tres = 1.343E-03\n", "[ NORMAL ] Iteration 105:\tk_eff = 1.185503\tres = 1.292E-03\n", "[ NORMAL ] Iteration 106:\tk_eff = 1.186922\tres = 1.244E-03\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.188289\tres = 1.197E-03\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.189605\tres = 1.152E-03\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.188288\tres = 1.197E-03\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.189606\tres = 1.151E-03\n", "[ NORMAL ] Iteration 109:\tk_eff = 1.190874\tres = 1.108E-03\n", "[ NORMAL ] Iteration 110:\tk_eff = 1.192096\tres = 1.066E-03\n", "[ NORMAL ] Iteration 111:\tk_eff = 1.193273\tres = 1.026E-03\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.194407\tres = 9.873E-04\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.195498\tres = 9.500E-04\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.196550\tres = 9.141E-04\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.197563\tres = 8.796E-04\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.198538\tres = 8.464E-04\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.199477\tres = 8.144E-04\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.200381\tres = 7.836E-04\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.201252\tres = 7.539E-04\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.202091\tres = 7.254E-04\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.202898\tres = 6.980E-04\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.203675\tres = 6.715E-04\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.204423\tres = 6.461E-04\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.194407\tres = 9.870E-04\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.195499\tres = 9.504E-04\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.196550\tres = 9.140E-04\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.197563\tres = 8.792E-04\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.198538\tres = 8.468E-04\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.199477\tres = 8.140E-04\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.200382\tres = 7.837E-04\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.201253\tres = 7.539E-04\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.202091\tres = 7.257E-04\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.202898\tres = 6.979E-04\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.203676\tres = 6.716E-04\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.204424\tres = 6.465E-04\n", "[ NORMAL ] Iteration 124:\tk_eff = 1.205144\tres = 6.217E-04\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.205837\tres = 5.981E-04\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.206505\tres = 5.755E-04\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.207148\tres = 5.537E-04\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.207766\tres = 5.327E-04\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.208362\tres = 5.125E-04\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.208935\tres = 4.931E-04\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.205838\tres = 5.979E-04\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.206505\tres = 5.760E-04\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.207148\tres = 5.532E-04\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.207767\tres = 5.325E-04\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.208363\tres = 5.125E-04\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.208936\tres = 4.935E-04\n", "[ NORMAL ] Iteration 131:\tk_eff = 1.209487\tres = 4.744E-04\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.210018\tres = 4.564E-04\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.210529\tres = 4.391E-04\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.211021\tres = 4.225E-04\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.211495\tres = 4.064E-04\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.211950\tres = 3.910E-04\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.212389\tres = 3.762E-04\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.212811\tres = 3.619E-04\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.213217\tres = 3.482E-04\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.213608\tres = 3.349E-04\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.213984\tres = 3.222E-04\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.214346\tres = 3.100E-04\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.214695\tres = 2.982E-04\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.215030\tres = 2.869E-04\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.215353\tres = 2.760E-04\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.215663\tres = 2.655E-04\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.215962\tres = 2.554E-04\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.216249\tres = 2.457E-04\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.216526\tres = 2.364E-04\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.216792\tres = 2.274E-04\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.217048\tres = 2.187E-04\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.217294\tres = 2.104E-04\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.210018\tres = 4.559E-04\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.210529\tres = 4.392E-04\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.211021\tres = 4.223E-04\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.211495\tres = 4.060E-04\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.211951\tres = 3.914E-04\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.212390\tres = 3.763E-04\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.212812\tres = 3.623E-04\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.213217\tres = 3.480E-04\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.213608\tres = 3.344E-04\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.213984\tres = 3.223E-04\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.214347\tres = 3.097E-04\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.214695\tres = 2.985E-04\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.215031\tres = 2.869E-04\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.215352\tres = 2.763E-04\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.215663\tres = 2.648E-04\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.215962\tres = 2.552E-04\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.216249\tres = 2.460E-04\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.216526\tres = 2.362E-04\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.216792\tres = 2.279E-04\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.217048\tres = 2.188E-04\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.217294\tres = 2.100E-04\n", "[ NORMAL ] Iteration 153:\tk_eff = 1.217531\tres = 2.024E-04\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.217759\tres = 1.947E-04\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.217979\tres = 1.873E-04\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.218190\tres = 1.802E-04\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.217759\tres = 1.948E-04\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.217978\tres = 1.872E-04\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.218189\tres = 1.799E-04\n", "[ NORMAL ] Iteration 157:\tk_eff = 1.218393\tres = 1.733E-04\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.218588\tres = 1.667E-04\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.218776\tres = 1.604E-04\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.218957\tres = 1.543E-04\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.219131\tres = 1.484E-04\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.219298\tres = 1.427E-04\n", - "[ NORMAL ] Iteration 163:\tk_eff = 1.219459\tres = 1.373E-04\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.218588\tres = 1.668E-04\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.218776\tres = 1.600E-04\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.218957\tres = 1.544E-04\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.219131\tres = 1.485E-04\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.219298\tres = 1.428E-04\n", + "[ NORMAL ] Iteration 163:\tk_eff = 1.219459\tres = 1.374E-04\n", "[ NORMAL ] Iteration 164:\tk_eff = 1.219614\tres = 1.321E-04\n", "[ NORMAL ] Iteration 165:\tk_eff = 1.219763\tres = 1.270E-04\n", - "[ NORMAL ] Iteration 166:\tk_eff = 1.219907\tres = 1.222E-04\n", - "[ NORMAL ] Iteration 167:\tk_eff = 1.220045\tres = 1.176E-04\n", - "[ NORMAL ] Iteration 168:\tk_eff = 1.220177\tres = 1.131E-04\n", - "[ NORMAL ] Iteration 169:\tk_eff = 1.220305\tres = 1.088E-04\n", - "[ NORMAL ] Iteration 170:\tk_eff = 1.220428\tres = 1.046E-04\n", - "[ NORMAL ] Iteration 171:\tk_eff = 1.220546\tres = 1.006E-04\n", - "[ NORMAL ] Iteration 172:\tk_eff = 1.220660\tres = 9.680E-05\n", - "[ NORMAL ] Iteration 173:\tk_eff = 1.220769\tres = 9.311E-05\n", - "[ NORMAL ] Iteration 174:\tk_eff = 1.220874\tres = 8.956E-05\n", - "[ NORMAL ] Iteration 175:\tk_eff = 1.220975\tres = 8.614E-05\n", - "[ NORMAL ] Iteration 176:\tk_eff = 1.221073\tres = 8.286E-05\n", - "[ NORMAL ] Iteration 177:\tk_eff = 1.221166\tres = 7.970E-05\n", - "[ NORMAL ] Iteration 178:\tk_eff = 1.221256\tres = 7.666E-05\n", - "[ NORMAL ] Iteration 179:\tk_eff = 1.221343\tres = 7.373E-05\n", - "[ NORMAL ] Iteration 180:\tk_eff = 1.221426\tres = 7.092E-05\n", - "[ NORMAL ] Iteration 181:\tk_eff = 1.221506\tres = 6.822E-05\n", - "[ NORMAL ] Iteration 182:\tk_eff = 1.221583\tres = 6.562E-05\n", - "[ NORMAL ] Iteration 183:\tk_eff = 1.221658\tres = 6.311E-05\n", - "[ NORMAL ] Iteration 184:\tk_eff = 1.221729\tres = 6.070E-05\n", - "[ NORMAL ] Iteration 185:\tk_eff = 1.221797\tres = 5.839E-05\n", - "[ NORMAL ] Iteration 186:\tk_eff = 1.221863\tres = 5.616E-05\n", - "[ NORMAL ] Iteration 187:\tk_eff = 1.221927\tres = 5.402E-05\n", - "[ NORMAL ] Iteration 188:\tk_eff = 1.221988\tres = 5.196E-05\n", - "[ NORMAL ] Iteration 189:\tk_eff = 1.222047\tres = 4.997E-05\n", - "[ NORMAL ] Iteration 190:\tk_eff = 1.222103\tres = 4.807E-05\n", - "[ NORMAL ] Iteration 191:\tk_eff = 1.222158\tres = 4.623E-05\n", - "[ NORMAL ] Iteration 192:\tk_eff = 1.222210\tres = 4.447E-05\n", - "[ NORMAL ] Iteration 193:\tk_eff = 1.222260\tres = 4.277E-05\n", - "[ NORMAL ] Iteration 194:\tk_eff = 1.222308\tres = 4.114E-05\n", - "[ NORMAL ] Iteration 195:\tk_eff = 1.222355\tres = 3.957E-05\n", - "[ NORMAL ] Iteration 196:\tk_eff = 1.222400\tres = 3.805E-05\n", - "[ NORMAL ] Iteration 197:\tk_eff = 1.222443\tres = 3.660E-05\n", - "[ NORMAL ] Iteration 198:\tk_eff = 1.222484\tres = 3.520E-05\n", - "[ NORMAL ] Iteration 199:\tk_eff = 1.222524\tres = 3.386E-05\n", - "[ NORMAL ] Iteration 200:\tk_eff = 1.222562\tres = 3.257E-05\n", - "[ NORMAL ] Iteration 201:\tk_eff = 1.222599\tres = 3.132E-05\n", - "[ NORMAL ] Iteration 202:\tk_eff = 1.222635\tres = 3.013E-05\n", - "[ NORMAL ] Iteration 203:\tk_eff = 1.222669\tres = 2.898E-05\n", - "[ NORMAL ] Iteration 204:\tk_eff = 1.222701\tres = 2.787E-05\n", - "[ NORMAL ] Iteration 205:\tk_eff = 1.222733\tres = 2.680E-05\n", - "[ NORMAL ] Iteration 206:\tk_eff = 1.222763\tres = 2.578E-05\n", - "[ NORMAL ] Iteration 207:\tk_eff = 1.222792\tres = 2.480E-05\n", - "[ NORMAL ] Iteration 208:\tk_eff = 1.222820\tres = 2.385E-05\n", - "[ NORMAL ] Iteration 209:\tk_eff = 1.222847\tres = 2.294E-05\n", - "[ NORMAL ] Iteration 210:\tk_eff = 1.222873\tres = 2.206E-05\n", - "[ NORMAL ] Iteration 211:\tk_eff = 1.222898\tres = 2.122E-05\n", - "[ NORMAL ] Iteration 212:\tk_eff = 1.222922\tres = 2.041E-05\n", - "[ NORMAL ] Iteration 213:\tk_eff = 1.222945\tres = 1.963E-05\n", - "[ NORMAL ] Iteration 214:\tk_eff = 1.222968\tres = 1.888E-05\n", - "[ NORMAL ] Iteration 215:\tk_eff = 1.222989\tres = 1.816E-05\n", - "[ NORMAL ] Iteration 216:\tk_eff = 1.223009\tres = 1.746E-05\n", - "[ NORMAL ] Iteration 217:\tk_eff = 1.223029\tres = 1.680E-05\n", - "[ NORMAL ] Iteration 218:\tk_eff = 1.223048\tres = 1.615E-05\n", - "[ NORMAL ] Iteration 219:\tk_eff = 1.223067\tres = 1.554E-05\n", - "[ NORMAL ] Iteration 220:\tk_eff = 1.223084\tres = 1.494E-05\n", - "[ NORMAL ] Iteration 221:\tk_eff = 1.223101\tres = 1.437E-05\n", - "[ NORMAL ] Iteration 222:\tk_eff = 1.223117\tres = 1.382E-05\n", - "[ NORMAL ] Iteration 223:\tk_eff = 1.223133\tres = 1.329E-05\n", - "[ NORMAL ] Iteration 224:\tk_eff = 1.223148\tres = 1.279E-05\n", - "[ NORMAL ] Iteration 225:\tk_eff = 1.223162\tres = 1.230E-05\n", - "[ NORMAL ] Iteration 226:\tk_eff = 1.223176\tres = 1.183E-05\n", - "[ NORMAL ] Iteration 227:\tk_eff = 1.223190\tres = 1.137E-05\n", - "[ NORMAL ] Iteration 228:\tk_eff = 1.223203\tres = 1.094E-05\n", - "[ NORMAL ] Iteration 229:\tk_eff = 1.223215\tres = 1.052E-05\n", - "[ NORMAL ] Iteration 230:\tk_eff = 1.223227\tres = 1.012E-05\n" + "[ NORMAL ] Iteration 166:\tk_eff = 1.219906\tres = 1.221E-04\n", + "[ NORMAL ] Iteration 167:\tk_eff = 1.220044\tres = 1.175E-04\n", + "[ NORMAL ] Iteration 168:\tk_eff = 1.220177\tres = 1.130E-04\n", + "[ NORMAL ] Iteration 169:\tk_eff = 1.220304\tres = 1.084E-04\n", + "[ NORMAL ] Iteration 170:\tk_eff = 1.220427\tres = 1.045E-04\n", + "[ NORMAL ] Iteration 171:\tk_eff = 1.220545\tres = 1.007E-04\n", + "[ NORMAL ] Iteration 172:\tk_eff = 1.220659\tres = 9.678E-05\n", + "[ NORMAL ] Iteration 173:\tk_eff = 1.220768\tres = 9.304E-05\n", + "[ NORMAL ] Iteration 174:\tk_eff = 1.220874\tres = 8.984E-05\n", + "[ NORMAL ] Iteration 175:\tk_eff = 1.220975\tres = 8.640E-05\n", + "[ NORMAL ] Iteration 176:\tk_eff = 1.221073\tres = 8.326E-05\n", + "[ NORMAL ] Iteration 177:\tk_eff = 1.221166\tres = 7.985E-05\n", + "[ NORMAL ] Iteration 178:\tk_eff = 1.221256\tres = 7.662E-05\n", + "[ NORMAL ] Iteration 179:\tk_eff = 1.221343\tres = 7.371E-05\n", + "[ NORMAL ] Iteration 180:\tk_eff = 1.221426\tres = 7.091E-05\n", + "[ NORMAL ] Iteration 181:\tk_eff = 1.221506\tres = 6.827E-05\n", + "[ NORMAL ] Iteration 182:\tk_eff = 1.221583\tres = 6.560E-05\n", + "[ NORMAL ] Iteration 183:\tk_eff = 1.221657\tres = 6.320E-05\n", + "[ NORMAL ] Iteration 184:\tk_eff = 1.221729\tres = 6.067E-05\n", + "[ NORMAL ] Iteration 185:\tk_eff = 1.221797\tres = 5.829E-05\n", + "[ NORMAL ] Iteration 186:\tk_eff = 1.221863\tres = 5.641E-05\n", + "[ NORMAL ] Iteration 187:\tk_eff = 1.221927\tres = 5.382E-05\n", + "[ NORMAL ] Iteration 188:\tk_eff = 1.221987\tres = 5.196E-05\n", + "[ NORMAL ] Iteration 189:\tk_eff = 1.222046\tres = 4.968E-05\n", + "[ NORMAL ] Iteration 190:\tk_eff = 1.222102\tres = 4.810E-05\n", + "[ NORMAL ] Iteration 191:\tk_eff = 1.222157\tres = 4.617E-05\n", + "[ NORMAL ] Iteration 192:\tk_eff = 1.222209\tres = 4.456E-05\n", + "[ NORMAL ] Iteration 193:\tk_eff = 1.222260\tres = 4.287E-05\n", + "[ NORMAL ] Iteration 194:\tk_eff = 1.222308\tres = 4.122E-05\n", + "[ NORMAL ] Iteration 195:\tk_eff = 1.222355\tres = 3.971E-05\n", + "[ NORMAL ] Iteration 196:\tk_eff = 1.222399\tres = 3.805E-05\n", + "[ NORMAL ] Iteration 197:\tk_eff = 1.222442\tres = 3.657E-05\n", + "[ NORMAL ] Iteration 198:\tk_eff = 1.222484\tres = 3.521E-05\n", + "[ NORMAL ] Iteration 199:\tk_eff = 1.222523\tres = 3.381E-05\n", + "[ NORMAL ] Iteration 200:\tk_eff = 1.222561\tres = 3.262E-05\n", + "[ NORMAL ] Iteration 201:\tk_eff = 1.222598\tres = 3.107E-05\n", + "[ NORMAL ] Iteration 202:\tk_eff = 1.222634\tres = 2.985E-05\n", + "[ NORMAL ] Iteration 203:\tk_eff = 1.222668\tres = 2.902E-05\n", + "[ NORMAL ] Iteration 204:\tk_eff = 1.222700\tres = 2.804E-05\n", + "[ NORMAL ] Iteration 205:\tk_eff = 1.222732\tres = 2.639E-05\n", + "[ NORMAL ] Iteration 206:\tk_eff = 1.222762\tres = 2.577E-05\n", + "[ NORMAL ] Iteration 207:\tk_eff = 1.222792\tres = 2.487E-05\n", + "[ NORMAL ] Iteration 208:\tk_eff = 1.222820\tres = 2.400E-05\n", + "[ NORMAL ] Iteration 209:\tk_eff = 1.222847\tres = 2.291E-05\n", + "[ NORMAL ] Iteration 210:\tk_eff = 1.222872\tres = 2.200E-05\n", + "[ NORMAL ] Iteration 211:\tk_eff = 1.222897\tres = 2.121E-05\n", + "[ NORMAL ] Iteration 212:\tk_eff = 1.222921\tres = 2.040E-05\n", + "[ NORMAL ] Iteration 213:\tk_eff = 1.222944\tres = 1.964E-05\n", + "[ NORMAL ] Iteration 214:\tk_eff = 1.222967\tres = 1.882E-05\n", + "[ NORMAL ] Iteration 215:\tk_eff = 1.222988\tres = 1.821E-05\n", + "[ NORMAL ] Iteration 216:\tk_eff = 1.223009\tres = 1.763E-05\n", + "[ NORMAL ] Iteration 217:\tk_eff = 1.223029\tres = 1.690E-05\n", + "[ NORMAL ] Iteration 218:\tk_eff = 1.223048\tres = 1.630E-05\n", + "[ NORMAL ] Iteration 219:\tk_eff = 1.223067\tres = 1.572E-05\n", + "[ NORMAL ] Iteration 220:\tk_eff = 1.223084\tres = 1.507E-05\n", + "[ NORMAL ] Iteration 221:\tk_eff = 1.223101\tres = 1.427E-05\n", + "[ NORMAL ] Iteration 222:\tk_eff = 1.223117\tres = 1.394E-05\n", + "[ NORMAL ] Iteration 223:\tk_eff = 1.223133\tres = 1.330E-05\n", + "[ NORMAL ] Iteration 224:\tk_eff = 1.223148\tres = 1.298E-05\n", + "[ NORMAL ] Iteration 225:\tk_eff = 1.223163\tres = 1.241E-05\n", + "[ NORMAL ] Iteration 226:\tk_eff = 1.223177\tres = 1.167E-05\n", + "[ NORMAL ] Iteration 227:\tk_eff = 1.223190\tres = 1.151E-05\n", + "[ NORMAL ] Iteration 228:\tk_eff = 1.223203\tres = 1.073E-05\n", + "[ NORMAL ] Iteration 229:\tk_eff = 1.223215\tres = 1.050E-05\n", + "[ NORMAL ] Iteration 230:\tk_eff = 1.223227\tres = 1.000E-05\n" ] } ], @@ -1732,7 +1728,7 @@ "source": [ "It is often insightful to generate visual depictions of multi-group cross sections. There are many different types of plots which may be useful for multi-group cross section visualization, only a few of which will be shown here for enrichment and inspiration.\n", "\n", - "One particularly useful visualization is a comparison of the continuous-energy and multi-group cross sections for a particular nuclide and reaction type. We illustrate one option for generating such plots with the use of the open source [PyNE](http://pyne.io/) library to parse continuous-energy cross sections from the cross section data library provided with OpenMC. First, we instantiate a `pyne.ace.Library` object for U-235 as follows." + "One particularly useful visualization is a comparison of the continuous-energy and multi-group cross sections for a particular nuclide and reaction type. We illustrate one option for generating such plots with the use of the `openmc.data` module to parse continuous-energy cross sections from an openly available ACE cross section library distributed by NNDC. First, we instantiate a `openmc.data.IncidentNeutron` object for U-235 as follows." ] }, { @@ -1743,15 +1739,11 @@ }, "outputs": [], "source": [ - "# Instantiate a PyNE ACE continuous-energy cross sections library\n", - "pyne_lib = pyne.ace.Library('../../../../data/nndc/293.6K/U_235_293.6K.ace')\n", - "pyne_lib.read('92235.71c')\n", - "\n", - "# Extract the U-235 data from the library\n", - "u235 = pyne_lib.tables['92235.71c']\n", + "# Parse ACE data into memory\n", + "u235 = openmc.data.IncidentNeutron.from_ace('../../../../data/nndc/293.6K/U_235_293.6K.ace')\n", "\n", "# Extract the continuous-energy U-235 fission cross section data\n", - "fission = u235.reactions[18]" + "fission = u235[18]" ] }, { @@ -1780,9 +1772,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\nRK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1791,16 +1783,16 @@ ], "source": [ "# Create a loglog plot of the U-235 continuous-energy fission cross section \n", - "plt.loglog(u235.energy, fission.sigma, color='b', linewidth=1)\n", + "plt.loglog(fission.xs.x, fission.xs.y, color='b', linewidth=1)\n", "\n", "# Extract energy group bounds and MGXS values to plot\n", "nufission = xs_library[fuel_cell.id]['fission']\n", "energy_groups = nufission.energy_groups\n", "x = energy_groups.group_edges\n", - "y = nufission.get_xs(nuclides=['U-235'], order_groups='decreasing', xs_type='micro')\n", + "y = nufission.get_xs(nuclides=['U235'], order_groups='decreasing', xs_type='micro')\n", "\n", "# Fix low energy bound to the value defined by the ACE library\n", - "x[0] = u235.energy[0]\n", + "x[0] = fission.xs.x[0]\n", "\n", "# Extend the mgxs values array for matplotlib's step plot\n", "y = np.insert(y, 0, y[0])\n", @@ -1835,8 +1827,8 @@ "df = nuscatter.get_pandas_dataframe(xs_type='micro')\n", "\n", "# Slice DataFrame in two for each nuclide's mean values\n", - "h1 = df[df['nuclide'] == 'H-1']['mean']\n", - "o16 = df[df['nuclide'] == 'O-16']['mean']\n", + "h1 = df[df['nuclide'] == 'H1']['mean']\n", + "o16 = df[df['nuclide'] == 'O16']['mean']\n", "\n", "# Cast DataFrames as NumPy arrays\n", "h1 = h1.as_matrix()\n", @@ -1863,9 +1855,9 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\nfn35+EIOpHUAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1905,21 +1897,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" + "pygments_lexer": "ipython3", + "version": "3.5.2" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb index 5f0acde3f..789366d3a 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -32,7 +32,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/wboyd/anaconda2/lib/python2.7/site-packages/matplotlib/__init__.py:1350: UserWarning: This call to matplotlib.use() has no effect\n", + "/home/romano/miniconda3/envs/default/lib/python3.5/site-packages/matplotlib/__init__.py:1350: UserWarning: This call to matplotlib.use() has no effect\n", "because the backend has already been chosen;\n", "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", "or matplotlib.backends is imported for the first time.\n", @@ -75,12 +75,12 @@ "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')" + "h1 = openmc.Nuclide('H1')\n", + "b10 = openmc.Nuclide('B10')\n", + "o16 = openmc.Nuclide('O16')\n", + "u235 = openmc.Nuclide('U235')\n", + "u238 = openmc.Nuclide('U238')\n", + "zr90 = openmc.Nuclide('Zr90')" ] }, { @@ -458,7 +458,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -725,27 +725,26 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.7.1\n", - " Git SHA1: 47ef320ad517612376e181ec6a6bc42ca0db98ce\n", - " Date/Time: 2016-05-14 12:29:07\n", - " MPI Processes: 1\n", + " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", + " Date/Time: 2016-07-23 16:42:32\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", " ===========================================================================\n", "\n", " Reading settings XML file...\n", - " Reading cross sections XML file...\n", " Reading geometry XML file...\n", + " Reading cross sections XML file...\n", " Reading materials XML file...\n", + " Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n", + " Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n", + " Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n", + " Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n", + " Reading B10.71c from /home/romano/openmc/data/nndc_hdf5/B10_71c.h5\n", + " Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", - " Loading ACE cross section table: 92235.71c\n", - " Loading ACE cross section table: 92238.71c\n", - " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 1001.71c\n", - " Loading ACE cross section table: 5010.71c\n", - " Loading ACE cross section table: 40090.71c\n", - " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", " Initializing source particles...\n", "\n", " ===========================================================================\n", @@ -813,20 +812,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 5.7700E-01 seconds\n", - " Reading cross sections = 1.3400E-01 seconds\n", - " Total time in simulation = 8.0461E+01 seconds\n", - " Time in transport only = 8.0422E+01 seconds\n", - " Time in inactive batches = 6.4060E+00 seconds\n", - " Time in active batches = 7.4055E+01 seconds\n", - " Time synchronizing fission bank = 6.0000E-03 seconds\n", - " Sampling source sites = 2.0000E-03 seconds\n", - " SEND/RECV source sites = 3.0000E-03 seconds\n", + " Total time for initialization = 4.3400E-01 seconds\n", + " Reading cross sections = 2.7900E-01 seconds\n", + " Total time in simulation = 6.1121E+01 seconds\n", + " Time in transport only = 6.1101E+01 seconds\n", + " Time in inactive batches = 5.0660E+00 seconds\n", + " Time in active batches = 5.6055E+01 seconds\n", + " Time synchronizing fission bank = 5.0000E-03 seconds\n", + " Sampling source sites = 3.0000E-03 seconds\n", + " SEND/RECV source sites = 2.0000E-03 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 8.1067E+01 seconds\n", - " Calculation Rate (inactive) = 3902.59 neutrons/second\n", - " Calculation Rate (active) = 1350.35 neutrons/second\n", + " Total time elapsed = 6.1576E+01 seconds\n", + " Calculation Rate (inactive) = 4934.86 neutrons/second\n", + " Calculation Rate (active) = 1783.96 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -953,7 +952,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/wboyd/Documents/NSE-CRPG-Codes/openmc/openmc/tallies.py:1988: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1941: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] }, @@ -977,7 +976,7 @@ " 3\n", " 10000\n", " 1\n", - " U-235\n", + " U235\n", " 8.055246e-03\n", " 2.857567e-05\n", " \n", @@ -985,7 +984,7 @@ " 4\n", " 10000\n", " 1\n", - " U-238\n", + " U238\n", " 7.339215e-03\n", " 4.349466e-05\n", " \n", @@ -993,7 +992,7 @@ " 5\n", " 10000\n", " 1\n", - " O-16\n", + " O16\n", " 0.000000e+00\n", " 0.000000e+00\n", " \n", @@ -1001,7 +1000,7 @@ " 0\n", " 10000\n", " 2\n", - " U-235\n", + " U235\n", " 3.615565e-01\n", " 2.050486e-03\n", " \n", @@ -1009,7 +1008,7 @@ " 1\n", " 10000\n", " 2\n", - " U-238\n", + " U238\n", " 6.742638e-07\n", " 3.795256e-09\n", " \n", @@ -1017,7 +1016,7 @@ " 2\n", " 10000\n", " 2\n", - " O-16\n", + " O16\n", " 0.000000e+00\n", " 0.000000e+00\n", " \n", @@ -1027,12 +1026,12 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "3 10000 1 U-235 8.055246e-03 2.857567e-05\n", - "4 10000 1 U-238 7.339215e-03 4.349466e-05\n", - "5 10000 1 O-16 0.000000e+00 0.000000e+00\n", - "0 10000 2 U-235 3.615565e-01 2.050486e-03\n", - "1 10000 2 U-238 6.742638e-07 3.795256e-09\n", - "2 10000 2 O-16 0.000000e+00 0.000000e+00" + "3 10000 1 U235 8.055246e-03 2.857567e-05\n", + "4 10000 1 U238 7.339215e-03 4.349466e-05\n", + "5 10000 1 O16 0.000000e+00 0.000000e+00\n", + "0 10000 2 U235 3.615565e-01 2.050486e-03\n", + "1 10000 2 U238 6.742638e-07 3.795256e-09\n", + "2 10000 2 O16 0.000000e+00 0.000000e+00" ] }, "execution_count": 30, @@ -1067,17 +1066,17 @@ "\tReaction Type =\tnu-fission\n", "\tDomain Type =\tcell\n", "\tDomain ID =\t10000\n", - "\tNuclide =\tU-235\n", + "\tNuclide =\tU235\n", "\tCross Sections [cm^-1]:\n", " Group 1 [6.25e-07 - 20.0 MeV]:\t8.06e-03 +/- 3.55e-01%\n", " Group 2 [0.0 - 6.25e-07 MeV]:\t3.62e-01 +/- 5.67e-01%\n", "\n", - "\tNuclide =\tU-238\n", + "\tNuclide =\tU238\n", "\tCross Sections [cm^-1]:\n", " Group 1 [6.25e-07 - 20.0 MeV]:\t7.34e-03 +/- 5.93e-01%\n", " Group 2 [0.0 - 6.25e-07 MeV]:\t6.74e-07 +/- 5.63e-01%\n", "\n", - "\tNuclide =\tO-16\n", + "\tNuclide =\tO16\n", "\tCross Sections [cm^-1]:\n", " Group 1 [6.25e-07 - 20.0 MeV]:\t0.00e+00 +/- nan%\n", " Group 2 [0.0 - 6.25e-07 MeV]:\t0.00e+00 +/- nan%\n", @@ -1190,7 +1189,7 @@ " 0\n", " 10000\n", " 1\n", - " U-235\n", + " U235\n", " 0.074860\n", " 0.000303\n", " \n", @@ -1198,7 +1197,7 @@ " 1\n", " 10000\n", " 1\n", - " U-238\n", + " U238\n", " 0.005952\n", " 0.000035\n", " \n", @@ -1206,7 +1205,7 @@ " 2\n", " 10000\n", " 1\n", - " O-16\n", + " O16\n", " 0.000000\n", " 0.000000\n", " \n", @@ -1216,9 +1215,9 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "0 10000 1 U-235 0.074860 0.000303\n", - "1 10000 1 U-238 0.005952 0.000035\n", - "2 10000 1 O-16 0.000000 0.000000" + "0 10000 1 U235 0.074860 0.000303\n", + "1 10000 1 U238 0.005952 0.000035\n", + "2 10000 1 O16 0.000000 0.000000" ] }, "execution_count": 36, @@ -1298,7 +1297,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ NORMAL ] Importing ray tracing data from file...\n", + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", "[ NORMAL ] Computing the eigenvalue...\n", "[ NORMAL ] Iteration 0:\tk_eff = 0.854370\tres = 0.000E+00\n", "[ NORMAL ] Iteration 1:\tk_eff = 0.801922\tres = 1.521E-01\n", @@ -1311,42 +1311,42 @@ "[ NORMAL ] Iteration 8:\tk_eff = 0.683124\tres = 6.142E-03\n", "[ NORMAL ] Iteration 9:\tk_eff = 0.685943\tres = 7.897E-04\n", "[ NORMAL ] Iteration 10:\tk_eff = 0.691322\tres = 4.180E-03\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.698747\tres = 7.873E-03\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.698746\tres = 7.873E-03\n", "[ NORMAL ] Iteration 12:\tk_eff = 0.707777\tres = 1.076E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.718040\tres = 1.295E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.718039\tres = 1.295E-02\n", "[ NORMAL ] Iteration 14:\tk_eff = 0.729218\tres = 1.452E-02\n", "[ NORMAL ] Iteration 15:\tk_eff = 0.741045\tres = 1.559E-02\n", "[ NORMAL ] Iteration 16:\tk_eff = 0.753296\tres = 1.624E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.765785\tres = 1.655E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.765784\tres = 1.655E-02\n", "[ NORMAL ] Iteration 18:\tk_eff = 0.778355\tres = 1.659E-02\n", "[ NORMAL ] Iteration 19:\tk_eff = 0.790879\tres = 1.643E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.803254\tres = 1.610E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.803253\tres = 1.610E-02\n", "[ NORMAL ] Iteration 21:\tk_eff = 0.815394\tres = 1.566E-02\n", "[ NORMAL ] Iteration 22:\tk_eff = 0.827235\tres = 1.513E-02\n", "[ NORMAL ] Iteration 23:\tk_eff = 0.838724\tres = 1.453E-02\n", "[ NORMAL ] Iteration 24:\tk_eff = 0.849823\tres = 1.390E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.860503\tres = 1.324E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.860502\tres = 1.324E-02\n", "[ NORMAL ] Iteration 26:\tk_eff = 0.870744\tres = 1.258E-02\n", "[ NORMAL ] Iteration 27:\tk_eff = 0.880535\tres = 1.191E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.889870\tres = 1.125E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.898748\tres = 1.061E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.889869\tres = 1.125E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.898747\tres = 1.061E-02\n", "[ NORMAL ] Iteration 30:\tk_eff = 0.907172\tres = 9.985E-03\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.915151\tres = 9.382E-03\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.922693\tres = 8.802E-03\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.929811\tres = 8.248E-03\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.915150\tres = 9.382E-03\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.922692\tres = 8.802E-03\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.929810\tres = 8.248E-03\n", "[ NORMAL ] Iteration 34:\tk_eff = 0.936517\tres = 7.720E-03\n", "[ NORMAL ] Iteration 35:\tk_eff = 0.942827\tres = 7.219E-03\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.948757\tres = 6.744E-03\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.954322\tres = 6.295E-03\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.948756\tres = 6.744E-03\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.954321\tres = 6.295E-03\n", "[ NORMAL ] Iteration 38:\tk_eff = 0.959539\tres = 5.871E-03\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.964425\tres = 5.472E-03\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.968996\tres = 5.096E-03\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.964424\tres = 5.472E-03\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.968995\tres = 5.096E-03\n", "[ NORMAL ] Iteration 41:\tk_eff = 0.973268\tres = 4.744E-03\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.977259\tres = 4.413E-03\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.980982\tres = 4.104E-03\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.984454\tres = 3.814E-03\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.977258\tres = 4.413E-03\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.980981\tres = 4.104E-03\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.984453\tres = 3.814E-03\n", "[ NORMAL ] Iteration 45:\tk_eff = 0.987689\tres = 3.543E-03\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.990702\tres = 3.289E-03\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.990701\tres = 3.289E-03\n", "[ NORMAL ] Iteration 47:\tk_eff = 0.993505\tres = 3.053E-03\n", "[ NORMAL ] Iteration 48:\tk_eff = 0.996112\tres = 2.832E-03\n", "[ NORMAL ] Iteration 49:\tk_eff = 0.998536\tres = 2.627E-03\n", @@ -1366,12 +1366,12 @@ "[ NORMAL ] Iteration 63:\tk_eff = 1.018721\tres = 8.864E-04\n", "[ NORMAL ] Iteration 64:\tk_eff = 1.019490\tres = 8.187E-04\n", "[ NORMAL ] Iteration 65:\tk_eff = 1.020201\tres = 7.560E-04\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.020858\tres = 6.980E-04\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.021464\tres = 6.444E-04\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.020857\tres = 6.980E-04\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.021464\tres = 6.443E-04\n", "[ NORMAL ] Iteration 68:\tk_eff = 1.022024\tres = 5.947E-04\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.022541\tres = 5.488E-04\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.022540\tres = 5.488E-04\n", "[ NORMAL ] Iteration 70:\tk_eff = 1.023017\tres = 5.063E-04\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.023458\tres = 4.670E-04\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.023457\tres = 4.670E-04\n", "[ NORMAL ] Iteration 72:\tk_eff = 1.023863\tres = 4.308E-04\n", "[ NORMAL ] Iteration 73:\tk_eff = 1.024238\tres = 3.972E-04\n", "[ NORMAL ] Iteration 74:\tk_eff = 1.024583\tres = 3.663E-04\n", @@ -1386,38 +1386,38 @@ "[ NORMAL ] Iteration 83:\tk_eff = 1.026697\tres = 1.753E-04\n", "[ NORMAL ] Iteration 84:\tk_eff = 1.026849\tres = 1.614E-04\n", "[ NORMAL ] Iteration 85:\tk_eff = 1.026989\tres = 1.487E-04\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.027118\tres = 1.369E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.027118\tres = 1.368E-04\n", "[ NORMAL ] Iteration 87:\tk_eff = 1.027237\tres = 1.260E-04\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.027347\tres = 1.160E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.027346\tres = 1.159E-04\n", "[ NORMAL ] Iteration 89:\tk_eff = 1.027447\tres = 1.067E-04\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.027540\tres = 9.823E-05\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.027625\tres = 9.039E-05\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.027704\tres = 8.317E-05\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.027776\tres = 7.652E-05\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.027843\tres = 7.040E-05\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.027904\tres = 6.476E-05\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.027960\tres = 5.957E-05\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.028012\tres = 5.479E-05\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.028059\tres = 5.039E-05\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.028103\tres = 4.635E-05\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.028143\tres = 4.262E-05\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.028180\tres = 3.919E-05\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.028214\tres = 3.603E-05\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.028245\tres = 3.313E-05\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.028274\tres = 3.046E-05\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.027540\tres = 9.821E-05\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.027625\tres = 9.040E-05\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.027703\tres = 8.316E-05\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.027775\tres = 7.652E-05\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.027842\tres = 7.039E-05\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.027903\tres = 6.480E-05\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.027959\tres = 5.959E-05\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.028011\tres = 5.479E-05\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.028058\tres = 5.043E-05\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.028102\tres = 4.633E-05\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.028142\tres = 4.265E-05\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.028180\tres = 3.921E-05\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.028214\tres = 3.605E-05\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.028245\tres = 3.315E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.028273\tres = 3.047E-05\n", "[ NORMAL ] Iteration 105:\tk_eff = 1.028300\tres = 2.800E-05\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.028324\tres = 2.574E-05\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.028347\tres = 2.366E-05\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.028367\tres = 2.175E-05\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.028386\tres = 1.999E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.028324\tres = 2.575E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.028346\tres = 2.368E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.028367\tres = 2.176E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.028386\tres = 2.003E-05\n", "[ NORMAL ] Iteration 110:\tk_eff = 1.028403\tres = 1.837E-05\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.028419\tres = 1.688E-05\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.028434\tres = 1.551E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.028419\tres = 1.690E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.028434\tres = 1.553E-05\n", "[ NORMAL ] Iteration 113:\tk_eff = 1.028447\tres = 1.426E-05\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.028460\tres = 1.310E-05\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.028471\tres = 1.204E-05\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.028481\tres = 1.106E-05\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.028491\tres = 1.016E-05\n" + "[ NORMAL ] Iteration 114:\tk_eff = 1.028459\tres = 1.309E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.028471\tres = 1.202E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.028481\tres = 1.107E-05\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.028491\tres = 1.015E-05\n" ] } ], @@ -1559,7 +1559,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 43, @@ -1568,9 +1568,9 @@ }, { "data": { - "image/png": "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\n2ajR7Q6wgAAAAABJRU5ErkJggg==\n", + "image/png": "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\nSUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1610,7 +1610,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.5.2" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/mgxs-part-iv.ipynb b/docs/source/pythonapi/examples/mgxs-part-iv.ipynb index e5c80c192..ae015b0a6 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iv.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iv.ipynb @@ -59,12 +59,12 @@ "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')" + "h1 = openmc.Nuclide('H1')\n", + "b10 = openmc.Nuclide('B10')\n", + "o16 = openmc.Nuclide('O16')\n", + "u235 = openmc.Nuclide('U235')\n", + "u238 = openmc.Nuclide('U238')\n", + "zr90 = openmc.Nuclide('Zr90')" ] }, { @@ -432,7 +432,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -578,8 +578,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/mgxs/library.py:320: RuntimeWarning: The P0 correction will be ignored since the scattering order 0 is greater than zero\n", - " warnings.warn(msg, RuntimeWarning)\n" + "/home/romano/openmc/openmc/mgxs/library.py:312: RuntimeWarning: The P0 correction will be ignored since the scattering order 0 is greater than zero\n", + " warn(msg, RuntimeWarning)\n" ] } ], @@ -722,27 +722,26 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.7.1\n", - " Git SHA1: 826d5a43d85eaec1b6c7b4ce22e1a8f5e9336a4f\n", - " Date/Time: 2016-06-08 19:33:38\n", - " OpenMP Threads: 4\n", + " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", + " Date/Time: 2016-07-23 16:50:57\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", " ===========================================================================\n", "\n", " Reading settings XML file...\n", - " Reading cross sections XML file...\n", " Reading geometry XML file...\n", + " Reading cross sections XML file...\n", " Reading materials XML file...\n", + " Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n", + " Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n", + " Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n", + " Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n", + " Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n", + " Reading B10.71c from /home/romano/openmc/data/nndc_hdf5/B10_71c.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", - " Loading ACE cross section table: 92235.71c\n", - " Loading ACE cross section table: 92238.71c\n", - " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 40090.71c\n", - " Loading ACE cross section table: 1001.71c\n", - " Loading ACE cross section table: 5010.71c\n", - " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", " Initializing source particles...\n", "\n", " ===========================================================================\n", @@ -810,20 +809,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 1.4220E+00 seconds\n", - " Reading cross sections = 1.1320E+00 seconds\n", - " Total time in simulation = 1.6571E+01 seconds\n", - " Time in transport only = 1.6501E+01 seconds\n", - " Time in inactive batches = 2.1010E+00 seconds\n", - " Time in active batches = 1.4470E+01 seconds\n", - " Time synchronizing fission bank = 5.0000E-03 seconds\n", - " Sampling source sites = 4.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Total time for initialization = 3.6600E-01 seconds\n", + " Reading cross sections = 2.1400E-01 seconds\n", + " Total time in simulation = 7.0360E+01 seconds\n", + " Time in transport only = 7.0341E+01 seconds\n", + " Time in inactive batches = 9.6400E+00 seconds\n", + " Time in active batches = 6.0720E+01 seconds\n", + " Time synchronizing fission bank = 7.0000E-03 seconds\n", + " Sampling source sites = 5.0000E-03 seconds\n", + " SEND/RECV source sites = 2.0000E-03 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 1.8002E+01 seconds\n", - " Calculation Rate (inactive) = 23798.2 neutrons/second\n", - " Calculation Rate (active) = 13821.7 neutrons/second\n", + " Total time elapsed = 7.0764E+01 seconds\n", + " Calculation Rate (inactive) = 5186.72 neutrons/second\n", + " Calculation Rate (active) = 3293.81 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -966,11 +965,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1990: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1941: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1991: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1942: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1992: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1943: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } @@ -1098,17 +1097,16 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.7.1\n", - " Git SHA1: 826d5a43d85eaec1b6c7b4ce22e1a8f5e9336a4f\n", - " Date/Time: 2016-06-08 19:33:56\n", - " OpenMP Threads: 4\n", + " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", + " Date/Time: 2016-07-23 16:52:09\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", " ===========================================================================\n", "\n", " Reading settings XML file...\n", - " Reading cross sections XML file...\n", " Reading geometry XML file...\n", + " Reading cross sections XML file...\n", " Reading materials XML file...\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", @@ -1183,20 +1181,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.1000E-02 seconds\n", - " Reading cross sections = 5.0000E-03 seconds\n", - " Total time in simulation = 1.1867E+01 seconds\n", - " Time in transport only = 1.1830E+01 seconds\n", - " Time in inactive batches = 1.2670E+00 seconds\n", - " Time in active batches = 1.0600E+01 seconds\n", - " Time synchronizing fission bank = 7.0000E-03 seconds\n", - " Sampling source sites = 7.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for initialization = 4.6000E-02 seconds\n", + " Reading cross sections = 8.0000E-03 seconds\n", + " Total time in simulation = 5.5889E+01 seconds\n", + " Time in transport only = 5.5863E+01 seconds\n", + " Time in inactive batches = 7.1040E+00 seconds\n", + " Time in active batches = 4.8785E+01 seconds\n", + " Time synchronizing fission bank = 1.6000E-02 seconds\n", + " Sampling source sites = 1.0000E-02 seconds\n", + " SEND/RECV source sites = 6.0000E-03 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 1.1907E+01 seconds\n", - " Calculation Rate (inactive) = 39463.3 neutrons/second\n", - " Calculation Rate (active) = 18867.9 neutrons/second\n", + " Total time elapsed = 5.5976E+01 seconds\n", + " Calculation Rate (inactive) = 7038.29 neutrons/second\n", + " Calculation Rate (active) = 4099.62 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1383,7 +1381,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 40, @@ -1392,9 +1390,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1453,7 +1451,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.5.2" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/nuclear-data.ipynb b/docs/source/pythonapi/examples/nuclear-data.ipynb index 78a71cd29..0c24079cf 100644 --- a/docs/source/pythonapi/examples/nuclear-data.ipynb +++ b/docs/source/pythonapi/examples/nuclear-data.ipynb @@ -66,7 +66,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now that we have our ACE table, we can look at its contents. Let's start off by plotting the total cross section." + "Now that we have our ACE table, we can look at its contents. Let's start off by plotting the total cross section. Reactions are indexed using their \"MT\" number -- a unique identifier for each reaction defined by the ENDF-6 format. The MT number for the total cross section is 1." ] }, { @@ -79,7 +79,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 3, @@ -90,7 +90,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEWCAYAAAB1xKBvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmYFNXV+PHvGXaIirixI8o2qKCoCAFlNBhEwiJgBAwa\n3NBETN68KuQnGlzeqNEYoyhoopAYRhSBoCKIRoGAAREXlGFzY1EDLqCyyHp+f9xup6eZpbq7qquX\n83mefqa7qqvOrVn6zK27iapijDHGVKUg7AIYY4zJDpYwjDHGeGIJwxhjjCeWMIwxxnhiCcMYY4wn\nljCMMcZ4YgnDGGOMJ5YwjDHGeFI97ALEE5HuwMW4shWqaveQi2SMMQaQTB3pLSL9gaNV9S9hl8UY\nY0wabkmJyGMisllEVsRtP09EVovIWhEZXc6hw4DioMtnjDHGm3S0YUwCesVuEJECYHxk+wnAUBFp\nF7O/GbBNVXekoXzGGGM8CDxhqOoiYGvc5s7AOlVdr6p7galA/5j9l+MSjTHGmAwRVqN3E2BjzOtN\nuCQCgKqOq+xgEcnMhhdjjMlwqirJHpu13WrbtFH691fWr1dUg3m0a9cusHNbnMyPYXEyN4bFSe6R\nqrASxidA85jXTSPbPFuxAk49FTp1gnvugb17fS0fAEcddZT/J7U4WRPD4mRuDIsTjnQlDIk8opYB\nrUSkhYjUBIYAzyZywjvvHMeZZ85nyRJ4+WWXOBYv9rHE5N4vSi7FyaVrybU4uXQtuRJn/vz5jBs3\nLuXzpKNbbTHwGtBGRDaIyAhV3Q+MAuYBK4GpqroqkfOOGzeOoqIiWrWCuXNh7Fj46U/hyivhyy/9\nKXthYaE/J7I4WRnD4mRuDIuTmKKiouxIGKo6TFUbq2otVW2uqpMi2+eoaltVba2qd6USQwQuughK\nSqBOHTjhBJg8GVK9Zde+ffvUTmBxsjqGxcncGBYnHFnb6F2eww6DBx6A2bPhoYegqMglEWOMManL\n2oQxbtw45s+fX+6+U0+FJUvcLaoePeC3v4WdO9NbPmOMyRRZ04YRlGgbRkWqVYNf/tL1pvr4Y3eb\navbstBXPGGMyRta0YYStUSN48kl49FH49a9h4EDYuLHq44wxxpSV8wkj6txz4d13oUMHOOUUuO8+\n2Lcv7FIZY0z2yJuEAVC7NowbB6+9BnPmwGmnwX/+E3apjDEmO+RVwohq0wbmzYPRo2HQIBg5Er76\nKuxSGWNMZsvahFFZLykvRGDoUNfttkYN1yj+97+nPnbDGGMyjfWSqqKXlFf168P48fDss/DnP8M5\n58CqhMacG2NMZrNeUj47/XR4/XXXi+qss9xUI3v2VAu7WMYYkzEsYcSoVg1GjYJ33oF16+DGG/vw\nwgthl8oYYzKDJYxyNG4MTz0Fl122jOuugwsvhE8SmnzdGGNyjyWMSnTo8BnvvguFhdCxI9x/v43d\nMMbkL0sYVahTB267za218dxzrq1j6dKwS2WMMelnCcOjtm3dQk3XXw8DBsA118DWrWGXyhhj0scS\nRgJE4OKLS6dMb98epkyxsRvGmPxgCSMJhx8OEybAP/8J994LPXvCmjVhl8oYY4KVtQkj1ZHefjjj\nDFi2DPr2hW7d4JZbYNeuUItkjDEHsZHePo30TlX16m7a9HfecSPETzoJXnwx7FIZY0wpG+mdYZo0\ngWnT3BKx11zj1hj/9NOwS2WMMf7JuIQhzh0i8oCIDA+7PIk6/3x47z1o3dqN3XjgAdi/P+xSGWNM\n6jIuYQD9gabAHmBTyGVJSt26cMcdsHAhzJgBnTu7tg5jjMlmgScMEXlMRDaLyIq47eeJyGoRWSsi\no2N2tQUWq+r1wC+CLl+QCgvh1VddG0ffvm6N8W3bwi6VMcYkJx01jElAr9gNIlIAjI9sPwEYKiLt\nIrs3AdEhcVl/M0cEhg93Yzf27XNJZPJkOHAg7JIZY0xiAk8YqrqI0gQQ1RlYp6rrVXUvMBV3Kwpg\nBnCeiPwZWBB0+dKlQQN45BG37saECdC9O7z5ZtilMsYY76qHFLcJsDHm9SZcEkFVdwFXhFGodDj9\ndLeO+OOPQ+/ebonYk0+uGXaxjDGmSmEljJQNGjTo++eFhYW0b9/e9xiLFy/2/ZxRdevC7bfXZNq0\nDkye/GNef30pRUUfUBBgnS/I60l3nFy6llyLk0vXku1xSkpKWOXjEqJhJYxPgOYxr5tGtnk2ffp0\nXwtUkWHDhgV6/quugt//fg7PP9+bFSvO4KGHXC0kKEFfTzrj5NK15FqcXLqWXIojIikdn65utRJ5\nRC0DWolICxGpCQwBnk1TWTLOscduZdEi14uqXz+XRL74IuxSGWNMWenoVlsMvAa0EZENIjJCVfcD\no4B5wEpgqqomVG/KhLmk/FRQAJde6qYXqVvXzYQ7YYIN+jPGpC5r5pJS1WGq2lhVa6lqc1WdFNk+\nR1XbqmprVb0r0fNmylxSfqtf363s9/LL8OST7vbUwoVhl8oYk81sLqkc16EDLFgAN94Il1zielN9\n8EHYpTLG5DNLGBlMBIYMcbepTjvNTad+ww3w9ddhl8wYk4+yNmHkWhtGZerUgd/+1k1quG2bWy52\nwgQ3ctwYY6qSNW0YQcnVNozKNGwIf/mLW2/jmWfcbLhz59oSscaYylkbRh7r2NE1it91l5vY8Jxz\n3OhxY4wJkiWMLCXiZsB97z3XKD5kiBvDsWJF1ccaY0wyLGFkuerVYcQIWLsWevaEXr1g2DBYty7s\nkhljco0ljBxRqxZcd51LFCecAF27lg4ENMYYP2RtwsinXlKJ+MEP4Kab4P33oU0bKCpyYziWLw+7\nZMaYsFgvqTzsJZWI+vVd4vjwQzjrLBgwAO6+u4j5861XlTH5xnpJGU/q1YNf/crVODp33sjIkdCl\nC0yfbvNUGWMSYwkjT9SqBWef/QElJTBmDNxzj1su9tFH4bvvwi6dMSYbWMLIM9WqwQUXuHEbf/2r\nWzK2ZUv4/e9ha/xCusYYE8MSRp4ScW0bzz8PL73kuuUefzz87//Cxo1VH2+MyT+WMAwnngiTJ8M7\n77jXHTu6Lrk2lsMYE8sShvles2bwxz+6adTbtHFjOf70J2scN8Y4ljDMQQ4/3HXJXboUZs6EPn1s\nSnVjTBYnDBu4F7zjj4dXXoHWraFbN9iyJewSGWOSYQP3bOBeWlSvDg8+6EaL9+xpPamMyUY2cM+k\n1bhx0KOHm9jQ2jSMyU+WMIwnInDffbBrF9x+e9ilMcaEIeMShoj0EJGFIjJBRM4KuzymVI0aUFwM\nDz8Mb78ddmmMMemWcQkDUOBboBawKeSymDiNG7uV/i6/3G5NGZNvAk8YIvKYiGwWkRVx288TkdUi\nslZERke3q+pCVe0DjAFuC7p8JnEjRkCdOvDEE2GXxBiTTumoYUwCesVuEJECYHxk+wnAUBFpF3fc\nNqBmGspnEiTiJi+8+WbXpmGMyQ+BJwxVXQTEd8bsDKxT1fWquheYCvQHEJELRGQi8DdcUjEZqGtX\n6NwZJkwIuyTGmHSpHlLcJkDsFHebcEkEVZ0JzAyjUCYxN90E/fvDtddCTasLGpPzwkoYKRs0aND3\nzwsLC2nfvr3vMRYvXuz7OXMtTv36ZzNq1Mf06PFRoHHiZfP3LNfj5NK1ZHuckpISVq1a5dv5wkoY\nnwDNY143jWzzbPr06b4WqCLDhg2zOJU45hi47rpGTJzYFZHg4pQnW79n+RAnl64ll+JI7B9pEtLV\nrVYij6hlQCsRaSEiNYEhwLNpKovx0TnnuEbwBQvCLokxJmjp6FZbDLwGtBGRDSIyQlX3A6OAecBK\nYKqqJlRvsskHM4MIXH01TJwYdkmMMRXxa/LBwG9JqWq5dSxVnQPMSfa8fly88cfPfua62G7ZAkcf\nHXZpjDHxioqKKCoq4tZbb03pPJk40ttkmfr1YeBAmDQp7JIYY4JkCcP44vLL3TKvqmGXxBgTlKxN\nGNaGkVm6doU9e+Ctt8IuiTEmXtoWUBKRriLykIisEJHPIw3XL4jIL0XksJRLkCRbQCmziLi2jH/8\nI+ySGGPipWUBJRGZA1wBvAicBzQC2gNjgdrALBHpl3IpTE64+GJ48knYvz+1vt7GmMxUVS+p4ar6\nRdy27cCbkccfReTIQEpmsk6bNtC8OaxceUzYRTHGBKDShBGbLESkIW6+JwWWqep/499jzMUXw7Rp\nLcMuhjEmAJ4avUXkCuB1YCAwGFgiIpcFWTCTnQYPhjffbMLu3WGXxBjjN6+9pG4ATlHVn6vqpcCp\nwOgqjgmU9ZLKTI0bQ7Nm23j55bBLYoyJSlsvqYgvccumRn0b2RYa6yWVuTp33sAzz4RdCmNMlF+9\npCptwxCR30Sevg8sFZFZuDaM/sCKCg80ee300zcybtxp7Nlj62QYk0uqqmEcEnl8APwTlywAZgEf\nVXSQyW9HHLGLtm3hlVfCLokxxk9V9ZJKbaYqk7cGD4ZnnoHzzgu7JMYYv1Q1cO8vInJiBfvqichl\nInJxMEUz2WzQIPjnP2Hv3rBLYozxS1UD9x4CbhGRk4D3gM9xI7xbA4cCjwNTAi2hyUotWsBxx8H8\n+XDuuWGXxhjjh6puSb0N/FREfgCchpsaZBewSlXXpKF8JosNHOhqGZYwjMkNnhZQUtXtwPxgi2Jy\nzYAB0LMnjB8PKS4lbIzJADa9uQlMu3ZQrx4sXx52SYzJb+keuJdxbOBedujfH2bNCrsUxuS3tExv\nbkyqLGEYkzs8tWGISBvcfFItYo9R1XMCKpfJEV26wObN8OGHrteUMSZ7ea1hTMOtfzEWlziij0CI\nSF0RWSYi5wcVw6RHtWrQt6/VMozJBV4Txj5VnaCqr6vq8ugjwHKNBp4K8Pwmjey2lDG5wWvCeE5E\nfiEijUSkQfTh5UAReUxENovIirjt54nIahFZKyKjY7b3BEpwgwStM2YO6NkT3noLvrCltozJal4T\nxqW4W1CvAcsjjzc8HjsJ6BW7QUQKgPGR7ScAQ0WkXWR3EXAGMAy3nrjJcnXqwI9+BLNnh10SY0wq\nvA7cS3rNTVVdJCIt4jZ3Btap6noAEZmKmzJ9taqOjWy7BLD/SXNE9LbUpZeGXRJjTLK89pKqAVwD\nnBXZNB94RFWTnVquCbAx5vUmXBL5nqr+PclzmwzUpw9cdx3s2uVqHMaY7OMpYQATgBrAw5HXwyPb\nQrtlNGjQoO+fFxYW0r59e99jLF682Pdz5nOcJk1+xM03r6ZTp08Ci+E3i5OZMSyONyUlJaxatcq3\n83lNGKeraseY16+IyDspxP0EaB7zumlkm2fTp09PIbx3w4YNszg+xdm8GVauPAa/ipAP37NsjZNL\n15JLcSTFSd28NnrvF5HjY4IeB+xPII5QtsfTMqCViLQQkZrAEODZBM5nslD//vDcc7A/kd8cY0zG\n8JowbgBeFZH5IrIAeAX4Xy8HikgxrndVGxHZICIjVHU/MAqYB6wEpqpqQvUmm3ww+xx3HBx9NCxZ\nEnZJjMkvfk0+6LWX1L9EpDXQNrJpjaru9nhsuXUsVZ0DzPFUynL4cfEm/QYMcL2lunULuyTJe+cd\nOP54+MEPwi6JMd4UFRVRVFTErbemtup2VUu0nhP5OhDoA7SKPPpEthmTkFwY9X3yyTB2bNilMCb9\nqqph9MDdfupbzj4FZvheIpPTTj0VduyA1avdehnZateusEtgTPpVtUTr7yJPb1PVj2L3iUjSg/n8\nEF0Pw9bEyC4i0K+fq2Vkc8KwhnuTTebPn+9Lm6/XRu/y+rA+k3L0FNgCStmrf3+31nc2O3Ag7BIY\n451fCyhVWsOIzO90AnBYXJvFoUDtlKObvHT22TBkCPz3v9CwYdilSY5q2CUwJv2qqmG0BX4C1Me1\nY0QfnYArgy2ayVU1a0KvXm5MRrZShenT4Z57wi6JMelTVRvGLGCWiHRV1f+kqUwmD/TvD1OmwJVZ\n/G/HmDHw/vtwQ2BLiRmTWby2YVwtIvWjL0TkcBF5PKAymTzQuzcsXAjbt4ddkuSlOMvCQTZvdj3I\njMlUXhNGB1XdFn2hqluBU4Ipkjc20ju71a/v1vt+8cWwS5IcVf8TRsOGMHy4v+c0Bvwb6e01YRSI\nyOHRF5HV9rxOXBgI6yWV/bJ9EJ/fCQPgs8/8P6cxaeklFeOPwH9EZFrk9YXA/6Uc3eS1fv3gd7+D\nffugeqj/fiQuiBqGMZnOUw0jspjRQGBz5DFQVZ8IsmAm9zVrBi1awKJFYZckOV4TxksvwbffBlsW\nY9LB6y0pgAbADlUdD3we9khvkxuy+baU14Tx4x/D/fcHWxZj0sFTwhCR3wGjgd9GNtUA/hFUoUz+\nGDDAjfrOtoFwyZR38GB4+23/y2JMunitYVwA9AN2AKjqp8AhQRXK5I+TTnJf33033HIkI5E2jOhA\nv2ytTRkD3hPGHlVV3Ay1iEi94Ipk8olI9t6WskZvk2+8JoynReQRoL6IXAm8DPwluGKZfJKNCSPb\nbqEZ4wevK+7dKyLnAt/g5pe6RVVfCrRkVbDpzXPHmWfCRx/Bxo2u51S2sBqGyRZpnd48cgvqFVW9\nAVezqCMiNVKOngIbuJc7qleHPn3g2WfDLol3VsMw2cSvgXteb0ktBGqJSBNgLjAcmJxydGMigrwt\nNWUKvP66v+f0e+De2rVH+ncyYwLiNWGIqu7EDd6boKoX4tbJMMYXvXrBkiXw9df+n/tnP4Nrr/X/\nvIn2kqrMrbf++PvnZ54JM2eW7nv/ffjwQ7d9374EC2mMjzwnDBHpClwMzI5sqxZEgUSknYhMEJGn\nReTqIGKYzPODH7gPxDlzgjl/Ji+p+t13pc9V3cj32NtzrVvDySe77baWuAmT14TxK9ygvZmqulJE\njgNeDaJAqrpaVa8BLgJ+GEQMk5kGDAjutpTfCSPRNoxobaS842Jn7I2OR4l/3+7dicUzJghe55Ja\nqKr9VPXuyOsPVfU6L8eKyGMisllEVsRtP09EVovIWhEZHbevL/A88IK3yzC5oG9fmDsX9uzx/9xh\nrcFdWaKI2rix9PnOncGWx5hUJDKXVLImAb1iN4hIATA+sv0EYGhk/XAAVPU5Ve0D/CwN5TMZomFD\naNcOgljmJIheTck0epd3zKhR/pzbmKAFnjBUdRGwNW5zZ2Cdqq5X1b3AVKA/gIj0EJE/i8hESttL\nTJ7IlkF8yfaS8pq4Knqfdec1YQprFYImQExFnE24JIKqLgAWhFEoE74BA+Dcc2H8eH//y7YPWmNS\n5ylhiMgfgDuAXbhxGB2A/1HV0GasHTRo0PfPCwsLad++ve8xFi9e7Ps5LU7V9u//Cb///WJatoyv\nmCYbYxhff72N4uLEm8TKjzOMDRs+ZuvWQ4EGFBcXVxobYMWKFUAH3n13BcXF75X7nlgffvghxcVL\nvt9/4MB+oBrTpj1NnTrJ961Nx+9Atvye5UOckpISVq1a5d8JVbXKB/B25OsFwGPAYcA7Xo6NHNcC\nWBHzugswN+b1GGB0AufTdJgyZYrFCSHODTeojh3rXwxQbd8+ubKUFwdUhwxR7dTJPa8qNqiOG1f6\ntaL3xD4uvbTs/lq13Nevv07uOiq7Hr9ly+9ZPsaJfHZ6+pwt7+G1DSNaE+kDTFPVRIdXSeQRtQxo\nJSItRKQmMATIookhTJCia2RkskRvlyV7S2z79uSOMyYIXhPG8yKyGjgV+JeIHAV8V8UxAIhIMfAa\n0EZENojICFXdD4wC5gErgamqmlC9ady4cb5MpmUyT5cu8MUXsG5d2CWpWLLtKy+/7AbheTV2bHJx\njIk1f/58X+aS8jpb7ZhIO8bXqrpfRHYQ6dXk4diDb9C67XOApMf1+nHxJjMVFMAFF7gFh8aM8eec\nfjd6iySWNKLvja5fvmcP1KpVdblsZLfxQ3Rm71tvvTWl83idrfZCYG8kWYzFLc/aOKXIxlRi0CCX\nMPwSdsKwkdsmF3i9JXWzqn4rIt2BnriG7wnBFcvkux494OOPYf16f84XRMKIPffcuf6e35hM5DVh\nRGfi6QM8qqqzgZrBFMkba8PIbdWrQ79+ZWdtzSSxNYyNG6F378rfH5+wosd++WXF77/jDoj2iLSR\n3yYVfrVheE0Yn0SWaL0IeEFEaiVwbCBsAaXcN3Cgv7elwhSfMKKvj6xkGYybb4Z//zu4Mpn8ke4F\nlH4KvAj0UtVtQAPghpSjG1OJnj3hvffgv/9N/hzRWWr9nq020TaMRP3978Gd25hkeZ2tdifwAdBL\nRK4FjlbVeYGWzOS9WrXg/PNTuy21d6/7GsQMuFFeEofXNpRatVIrizFB8tpL6lfAFODoyOMfIlLO\nHJvG+GvQIJgxI/njo4nC715JQdUwrK3CZDKvt6QuB85Q1VtU9Rbc1B5XBlcsY5xevdx63BU1Dlcl\nmjD8rmGE9cG+erWLbeMzTBg8L9FKaU8pIs9D/V/Ieknlh3r1XFvGs0lOHLN3r1v+NciEkcwtqYpu\nUVV1rjfecF9vsBZEk4B095KaBCwVkXEiMg5YghuLERrrJZU/UhnEt3u3Sxhh35LyK2FEPfSQ99jG\npLWXlKreB4wAvoo8Rqjq/SlHN8aDn/wEFi6Eb75J/Nhowti3z59lWqPniP3AT8ftKVvPw2SCKueS\nEpFqwEpVbQe8GXyRjCnr0EPhzDNh9mwYOjSxY6NzNtWs6Z7Xrp1aWWITRhA1DGMyWZU1jMjMsmtE\npHkaymNMuZK9LbV7d9mEkaroeI4DB0o/9K1nk8kXXpdoPRxYKSKvAzuiG1W1XyClMiZO//7wP/8D\nO3dC3brej4smjFq1/EkY0RpG7O2taOJIpNaR7JrdVjMxYfKaMG4OtBTGVOGII+D002HOHFfb8Cq2\nhuFHw3d5NYzo1wMHoFq18o/z+kFvCcFkskoThoi0Ao5R1QVx27sDnwVZMGPiXXQRPPVU8gkjHTUM\nryp6b0UN85ZITCaoqg3jfqC8vilfR/YZkzYDB8KLLya2bGm00duvW1LRGkZ09e3o89iv5fH6gV9V\nTy5LHCZMVSWMY1T13fiNkW3HBlIij2zgXv454gjo1g2ee877MUHekoqKvSVVEa+9pCwhmCCka+Be\n/Ur21Uk5egps4F5+uugimDrV+/vT3eidKksYJgjpGrj3hogcNGeUiFwBLE85ujEJGjAA5s+HHTtq\neHp/Ohq9W7Ys3eZVom0YUaNsyk8Toqp6Sf0amCkiF1OaIE7DrbZ3QZAFM6Y8hx0G55wDb7zRlCs9\nTH+5e7dLFkE2ekf50YYR1PHG+KHShKGqm4EfisjZwImRzbNV9ZUgCyUi/XHLwR4CPK6qLwUZz2SX\niy6CO+9s4em9ft+SKq/RO8qPGoZf7zcmCJ7GYajqq8CrAZclNt4sYJaI1AfuASxhmO/17QuXXXYk\nn38ORx1V+Xt37nQz3vp1SyqRGsbixanHi7LR5CYTpGVdbhF5TEQ2i8iKuO3nichqEVkrIqPLOXQs\nYPNymjLq1YOOHT/ztLDS9u1u8kG/axjlJYz4bd27lz5PdS4pq2GYTJCWhIGbHr1X7AYRKQDGR7af\nAAwVkXYx++8CXlDVt9NURpNFunRZz5NPVv2+aMIIooaRyC2pVGfKtYRhMkFaEoaqLgK2xm3uDKxT\n1fWquheYCvQHiCz/+iNgsIhclY4ymuzSseOnvPsubNhQ+ftiE4bfbRjxKvtQj7+llGgC2L+/6vcY\nE7R01TDK0wTYGPN6U2Qbqvqgqp6uqr9Q1UdDKZ3JaDVrHuDCC+GJJyp/344dwd2SSqSGYW0QJhd4\nnXww4wyKmVCosLCQ9u3b+x5jsZ+tlhbH9xiNGh3B+PFdOfbY5yv8QF67tohly9bw8ceN2bXrWw45\nZG3CcWJt2HAY0IdPP/2M7dtrAQ2+3/fMM9M57LDY+17Dvn+2alUJUPo7OmPGDGBgQmWJV1xcnPAx\n6frZpIPFqVpJSQmrVq3y74SqmpYH0AJYEfO6CzA35vUYYLTHc2k6TJkyxeJkaJwpU6bogQOqbdqo\nvvZaxe/r3l114ULV3/xG9Z57kosT6623XIfac85RPeWUaOda9/jss7LHxu67/vqD3xv7OplHMtL1\ns0kHi5O4yGdn0p/j6bwlJZFH1DKglYi0EJGawBDg2TSWx2Q5Ebj0Uvjb3yp+z7ZtbrBfrVrp71Yb\ny25JmVyQrm61xcBrQBsR2SAiI9St5DcKmAesBKaqque6k00+aACGD4dp0+C778rf/8UXbqxGECvu\nxQty4J4xqfBr8sG0tGGo6rAKts8B5iRzTj8u3mS/Zs3glFNg1iw3AjyWKnz5pZvltlYt+Ka8ifoT\nFE0Ke/ZA9bi/HksCJlMVFRVRVFTErbfemtJ5wuwlZYwvrrgCHnnk4O3ffAO1a5fOJeXX5IPR21u1\napXdZzUMk+ssYZisN3AgrFoFJSVlt3/5JRx5pHtep46bJiRVBw64c+3efXCCSHcbxtrEOnwZk7Ks\nTRjWhmGiatZ0tYyHHy67fdMmaNTIPa9fH77+OvVY+/eXJoy9e8vuS3cNo1s3GDkSPvkk9XOZ3Jau\nBZQyli2gZGKNHAnFxWXbKT76CI47zj0//HDYGj/XQBL27IFDDnFf9+51ySoq3beZ1qxxifCkk+A3\nv4EtW9Ib32SPdC2gZExWaNoUeveG8eNLt334YeniRvXr+5Mw9u51I8ejNYzYhJHISG8/kkuDBnD3\n3bByJezbB4WFMGaMuxVnTBAsYZiccfPNcP/9pbWMt95y/32Dq2Fs25Z6jGgNI5owasQs/BdWQ3aj\nRvDAA/D22+4a27SBW27x53qNiWUJw+SMdu2gTx/3Ybl3L7z2GnTt6vb5fUsqmjBie0qF3UuqWTOY\nOBHeeMO137RuDXfcAd9+638sk5+yNmFYo7cpzx//CNOnu7W/TzrJ3aqC0hpGqh/Uld2Sij13mN1m\nW7aExx93CXP1ajj+ePi//7MaRz6zRm9r9DblaNAAFi6ETp3KThkSHYuR6n/be/a4sR3VqsGuXRW3\nYcQnjCDaMKrSujX84x+wYAGsW+cSx9SpHdm8OfjYJrNYo7cxFWjZEm6/HZo3L7u9cWP49NPUzr1n\nj0sStWp0PSKxAAASnElEQVS5tTYysYYRr7AQJk+G5cvhu+9qUFgI114L69eHXTKTbSxhmLzRpEnq\nCSN6Gyo62ju20buyGkYig/yCcuyx8POfv0FJibut1qkT/PznbtCjMV5YwjB5o3Hj1Ae57dnjkkTt\n2u517HxSlSWBTFoxr2FDuOsu+OADd9uqqAjOPx9efDGzakYm81jCMHnDjxpG9JbUoYe61xX1kor/\n4N23r+zrTPhgrl8fbroJPv4YBg+GG2+E9u1hwgS3UqEx8SxhmLzRpEnVa4BXJXpLKlrDqFatdF9l\nbRjxCSOT1KkDl13mxnFMmADz5kGLFi6BWDuHiWUJw+SNtm1Tn7Dvu+9crSJ6K6og5i+oshpG/LxT\nmVDDiCfibk/NnAnLlrnbaJ06uS7K8+YlNs7E5CZLGCZvtGvnxiWkYscOqFevtLH7kENK92VrDaM8\nLVu6MS0bNrjBkDfeCK1awW23Wa0jn1nCMHmjeXP46qvUxmJEE0Z0XEVswsi2Ngwv6tWDK69006w8\n/TRs3uxqHT17wpQpbiyKyR9ZmzBspLdJVEGBq2W8917y54gmjOgcVSefXLqvsiQQf0sq24jAaafB\nQw+5nmZXXglPPOHahUaOhFdfzb5aVD6xkd420tsk4Yc/hMWLkz9+xw6oWxf+/Gf47DM3rXhUZTWM\n+PXEs6WGUZ7atd1yuHPnwooV7vbV9de7bstXXQUrVjTM+gSZa2yktzFJ6NYt9YRRr55r+G7YsOw4\njNixFlUljFzRtKmbUn35cliyxI3reOaZDjRs6HpezZ7tz9K4JjNYwjB55cwz4d//Tv72STRhlOe7\n70qfxyeM2H3l7c8Fxx0HN9wAt902j7fegg4d4M47XWIdPhxmzPBn1UMTnoxLGCLSUkT+KiJPh10W\nk3uaNHEfbMk2f23f7qbVKE/sYLf4hBD/X3YuJoxYzZvDr38Nixa5BZ66dHFTrzdtCt27u7m+Xn89\ns0bAm6plXMJQ1Y9U9Yqwy2Fy109/Ck89ldyxX37pZsSNFW0AryxhbN9e9nU+fVA2bgy//KUby7Fl\ni1voautWGDECjjkGhgyBxx5zKyTmeiLNdoEnDBF5TEQ2i8iKuO3nichqEVkrIqODLocxUUOGuDUz\nEl0fQtUljCOOKLv9mWfg3HNh586y740VHytfB8HVqQO9esF997max1tvue/dyy+79qUWLeCSS2DS\nJLcmuyWQzJKOGsYkoFfsBhEpAMZHtp8ADBWRdnHHxa0gYIw/out/P/JIYsft2OGmAqlTp+z2Nm1c\nd93K5l/64ouyr/M1YcRr1gwuvxyefNLN8xVNHPPmuR5t/fqFXUITK/CEoaqLgPjFMTsD61R1varu\nBaYC/QFEpIGITABOtpqHCcrYsXDvvfD5596P+eqrg2sXUYccUrqWOBz8n/E335SdqDDVW1IPPpja\n8ZlIxCXfkSNdAnnxRRtVnmnCasNoAmyMeb0psg1V/UpVr1HV1qp6dyilMzmvsBCGDoXRCfxLsmUL\nHHVU+fuaNoWNMb/R5d1KOfzw0uext6/Ks25d2Xmq4v3855Ufb0wQqlf9lsw0aNCg758XFhbSvn17\n32MsTqXDvsXJ+BgdOlRn7NjejBq1gq5dy/9XNjbO0qXNqFbtWIqL/33Q+z76qDFLlrSluPhVAL79\ntiYwuMx7tm/fDbhqxqxZrwJnl9k/ceIzXH21O+b114t57LFqjBhxUZn3nHHGepYubcHUqdOoWzfx\n0XHZ8rMB2LTpUNau7UX37pto1mwbzZtvo1GjbzjyyJ0UFGhO/T4HFaekpIRVfq6QpaqBP4AWwIqY\n112AuTGvxwCjEzifpsOUKVMsTobG8SvG8uWqRx6punhx1XHuvlv1N78p/32bNqkecYTq/v3u9X//\nq+rqGaozZpQ+jz6efvrgbapln8e+jj5+8Qv3de/e5K43m342Bw6oLlmiOmmS6q9/rdqzp2rz5qq1\na6uecILqGWd8rHfeqTp3ruqWLb6ELFcu/d1EPjuT/ixPVw1DKNuIvQxoJSItgM+AIcDQNJXFmO91\n6uTmRLrgAvjnP6Fr14rfu3o1nH56+fuaNHG3nN5+250zdmqMCy5wbR9ffunWm7jmmoMbwWMdffTB\n2yZNct15TzzRTdNePWvvDXgnAmec4R6xdu50t+weffQTPv+8BXffDW++6b7/J5/sxtkcd5ybsqRl\nS7c0bXxHBZOcwH/tRKQYKAKOEJENwO9UdZKIjALm4dpRHlPVhOpN0bmkbD4pk6rzzoPJk6F/f/jD\nH+DSS0tno421ZAlce23F5xk+3A1Oe/TRgycbbNDAJYyrr3aNuevWVXye2MbzNWvgyCPLjv247jpP\nl5Wz6taFjh2hW7ePGTbsh4DrdbZunZvb6qOP3ASTzz3nnq9f775/TZu6QZd165Z91Kzper/FPgoK\nSp+vWtWOvXtd+9Uxx7jpT6IrLmaL+fPn+zJZa+AJQ1WHVbB9DjAn2fP6MZGWMVG9e8Mrr7iG8Bkz\nYPx4N1o5as0a10uqQ4eKz3HNNW6J01/9yn0Ixbr3XojeSm7Vyn2gtWzpPtBi1axZdhqRNm1Su658\nUVDgal5t2x6878AB12V30yZXO4l/7N7teq1FHwcOlD7fswe2bq3Dv/7letR99plLTIcf7mbvLSpy\njw4dKu+kELboP9e33nprSufJg4qtMd6ceCK88Yab/+iUU9ytpKOPPoY1a1wSGDmy8ltBRx3lFhi6\n9NLSMR7R9TL69SsdU9C1K9x/P/To4RLGEUfAmDHPAz+hWTP44INALzPvFBS42kXTpskdX1z8FsOG\nFX7/+sABV2tZutRNMTNxoutBd9ZZ8KMfufXRGzXyp+yZJoNzojHpV6sWjBvn2itatXIzr/bu7W5D\n/L//V/XxV1/tag5DhrjXs2cf/J4ePdzkh9H1wOvUgcaN3X2oBQvg/ff9uRYTjIKC0p/xxInud2Xl\nSvf6jTdcLXPwYPjPf8Iuqf+ytoZhbRgmSEcd5abtbt78JYYNK/euarlE4PHH4ZxzXK3kzDMPfk90\n8F90ffEtW0r3NWmSQqFNaBo1cgljyBDXBvXEEzBsmEssN93kfh/KaxdLl6xpwwiKtWGYTHXIIbBs\nWeXvWbrUdZQdPPjgiQlNdjv0UDfZ4lVXQXGx6yhRUODm0Dr1VNeLrkkTV7Pcu9f1mNuyxY3z+eQT\nd5vyww/dba86ddyttLPOcotUJcvaMIzJYp07u6/PP+8aua3dIvfUqOHasy65xC3atXgxzJoFv/ud\nWxv9u+9cm9iRR7pH9erHcuaZbhaCPn1cd+Bdu9wMApmydrolDGNC1LGj+2oJI3eJuDVAunev/H3F\nxf8u9/bnaacFVLAkWKO3McYYT7I2YYwbN86XRhxjjMl18+fP96XdN2tvSVmjtzHGeONXo3fW1jCM\nMcaklyUMY4wxnljCMMYY44klDGOMMZ5YwjDGGOOJJQxjjDGeWMIwxhjjiSUMY4wxnmRtwrCR3sYY\n442N9LaR3sYY44mN9DbGGJNWljCMMcZ4knG3pESkLvAwsBtYoKrFIRfJGGMMmVnDGAhMU9WRQL8w\nC1JSUmJxMjROLl1LrsXJpWvJxTipCDxhiMhjIrJZRFbEbT9PRFaLyFoRGR2zqymwMfJ8f9Dlq8yq\nVassTobGyaVrybU4uXQtuRgnFemoYUwCesVuEJECYHxk+wnAUBFpF9m9EZc0ACQN5avQ559/bnEy\nNE4uXUuuxcmla8nFOKkIPGGo6iJga9zmzsA6VV2vqnuBqUD/yL6ZwGAReQh4LujyVSbXflFyKU4u\nXUuuxcmla8nFOKkIq9G7CaW3nQA24ZIIqroTuKyqE4ikp/JhcTI3Ti5dS67FyaVrycU4ycq4XlJe\nqGpmf1eNMSYHhdVL6hOgeczrppFtxhhjMlS6EoZQtgF7GdBKRFqISE1gCPBsmspijDEmCenoVlsM\nvAa0EZENIjJCVfcDo4B5wEpgqqpmfp8yY4zJY6KqYZfBGGNMFsjEkd4JEZGWIvJXEXm6sm0Bxakr\nIpNF5BERGeZXrMi5C0XkKRF5SEQG+XnuuDjNRGRm5NpGV31E0nG6i8gEEfmLiCwKKIaIyB0i8oCI\nDA8iRiRODxFZGLmes4KKE4lVV0SWicj5AcZoF7mWp0Xk6gDj9BeRR0XkSRE5N6AYvv/tlxMjsL/7\nuDiBX0skjuefS9YnDFX9SFWvqGpbEHEIdhqT3sADqvpL4BKfzx3rJNw1XAGcHFQQVV2kqtcAzwN/\nCyhMf1wHij24rtpBUeBboFbAcQBGA08FGUBVV0d+NhcBPwwwzixVvQq4BvhpQDF8/9svR1qmL0rT\ntST0c8mYhJHEFCKZEKfKaUxSiPcEMERE/gA0qKogKcRZAlwhIi8DcwOMEzUMqHRCyRRitAUWq+r1\nwC+CuhZVXaiqfYAxwG1BxRGRnkAJ8DkeZj1I5WcjIn1xyfyFIONEjAUeCjiGZ0nESmr6oiz4jKvy\n54KqZsQD6I77D3dFzLYC4H2gBVADeBtoF9k3HLgPaBR5Pa2cc5a3zbc4wMXA+ZHnxQFdVwEwM6Dv\n35+Am4HuFX2//LweoBnwSIAxhgODI9umpuF3ribwdIA/m8ci8V4M8Hfg++uJbHs+wDiNgbuAc8L4\nPPAxVpV/937EiXmP52tJNo7nn0siBQn6EbmY2IvsAsyJeT0GGB13TANgArAuuq+8bQHFqQs8jsvK\nQ32+rhbAI7iaxg8D/P6dAEyLXNsfgooT2T4O6BLgtdQB/gr8GbgmwDgXABOBJ4GzgvyeRfZdQuQD\nKqDr6RH5nk0M+Ps2Ctel/mHgqoBiVPq370csPP7d+xAnqWtJIo7nn0umj/SucAqRKFX9CnfvrdJt\nAcXxNI1JkvHWAyOTOHeicVYCFwYdJxJrXJAxVHUXkOo9Xy9xZuLmPAs0Tky8vwcZR1UXAAtSiOE1\nzoPAgwHHSPRvP+FYKfzdJxrHr2upKo7nn0vGtGEYY4zJbJmeMNI1hUi6pyrJtetKR5xcuhaLk7kx\n0h0rq+JkWsJI1xQi6Z6qJNeuKx1xculaLE7mxkh3rOyOk0hDSpAPXFfLT3FreW8ARkS29wbW4Bp+\nxmRLnFy9rnTEyaVrsTiZGyMXv29Bx7GpQYwxxniSabekjDHGZChLGMYYYzyxhGGMMcYTSxjGGGM8\nsYRhjDHGE0sYxhhjPLGEYYwxxhNLGCaniMh+EXlTRN6KfL0x7DJFicg0ETk28vxjEVkQt//t+DUM\nyjnHByLSOm7bn0TkBhE5UUQm+V1uY6IyfbZaYxK1Q1U7+XlCEammqp4XyqngHO2BAlX9OLJJgUNE\npImqfiIi7SLbqvIkblqH2yPnFWAw0FVVN4lIExFpqqpBrwRo8pDVMEyuKXdlOhH5SETGichyEXlH\nRNpEtteNrFC2JLKvb2T7pSIyS0T+BbwszsMiUiIi80RktogMFJGzRWRmTJyeIjKjnCJcDMyK2/Y0\n7sMfYCgxKxGKSIGI/EFElkZqHldGdk2NOQbgLODjmATxfNx+Y3xjCcPkmjpxt6Ri1/rYoqqn4hYK\nuj6y7SbgX6raBTgHuFdE6kT2nQIMVNWzces4N1fV9rjV3boCqOqrQFsROSJyzAjcSnnxugHLY14r\nMB23GBNAX+C5mP2XA9tU9QzcugVXiUgLVX0P2C8iJ0XeNwRX64h6Azizsm+QMcmyW1Im1+ys5JZU\ntCawnNIP6h8DfUXkhsjrmpROA/2Sqn4ded4dtzIhqrpZRF6NOe8TwM9EZDJuZbPh5cRuhFubO9aX\nwFYRuQi3dveumH0/Bk6KSXiHAq2B9URqGSJSAgwAbok5bgtuKVRjfGcJw+ST3ZGv+yn93RdgkKqu\ni32jiHQBdng872Rc7WA3bv3lA+W8ZydQu5ztT+OW+rwkbrsAo1T1pXKOmQrMAxYC76hqbCKqTdnE\nY4xv7JaUyTXltmFU4kXguu8PFjm5gvctBgZF2jKOAYqiO1T1M9x00jcBFfVSWgW0KqecM4G7cQkg\nvly/EJHqkXK1jt4qU9UPgS+Auyh7OwqgDfBeBWUwJiWWMEyuqR3XhvH7yPaKeiDdDtQQkRUi8h5w\nWwXvm45bB3kl8Hfcba2vY/ZPATaq6poKjn8BODvmtQKo6nZVvUdV98W9/6+421Rvisi7uHaX2DsC\nTwJtgfgG9rOB2RWUwZiU2HoYxngkIvVUdYeINACWAt1UdUtk34PAm6pabg1DRGoDr0SOCeSPLrKS\n2nygewW3xYxJiSUMYzyKNHTXB2oAd6vqE5HtbwDbgXNVdW8lx58LrApqjISItAIaq+rCIM5vjCUM\nY4wxnlgbhjHGGE8sYRhjjPHEEoYxxhhPLGEYY4zxxBKGMcYYTyxhGGOM8eT/A1MGbSxcd/bBAAAA\nAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -98,7 +98,7 @@ } ], "source": [ - "total = gd157.summed_reactions[1]\n", + "total = gd157[1]\n", "plt.loglog(total.xs.x, total.xs.y)\n", "plt.xlabel('Energy (MeV)')\n", "plt.ylabel('Cross section (b)')" @@ -124,16 +124,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "[,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ]\n" + "[,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ]\n" ] } ], @@ -166,7 +166,7 @@ "data": { "image/png": "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\n9zC0aV7vrgAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -174,7 +174,7 @@ } ], "source": [ - "n2n = gd157.reactions[16]\n", + "n2n = gd157[16]\n", "plt.plot(n2n.xs.x, n2n.xs.y)\n", "plt.xlabel('Energy (MeV)')\n", "plt.ylabel('Cross section (b)')\n", @@ -222,7 +222,7 @@ { "data": { "text/plain": [ - "[]" + "[]" ] }, "execution_count": 7, @@ -252,36 +252,36 @@ { "data": { "text/plain": [ - "[,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ]" + "[,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ]" ] }, "execution_count": 8, @@ -312,7 +312,7 @@ "data": { "image/png": "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\nMAzDMAyv/B9ZBCMoWOfF0wAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -348,7 +348,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 10, @@ -359,7 +359,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -476,7 +476,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "While the groups containing reaction data are only labeled sequentially, we can look at the group attributes to figure out what they actually are." + "All reaction data is contained in the `reactions` group under a nuclide. While the group for each reaction is only labeled by its MT value, we can look at the group attributes to get a label for the reaction." ] }, { @@ -490,24 +490,24 @@ "name": "stdout", "output_type": "stream", "text": [ - "reaction_0, MT=2 (n,elastic)\n", - "reaction_1, MT=16 (n,2n)\n", - "reaction_10, MT=54 (n,n4)\n", - "reaction_11, MT=55 (n,n5)\n", - "reaction_12, MT=56 (n,n6)\n", - "reaction_13, MT=57 (n,n7)\n", - "reaction_14, MT=58 (n,n8)\n", - "reaction_15, MT=59 (n,n9)\n", - "reaction_16, MT=60 (n,n10)\n" + "reaction_002, (n,elastic)\n", + "reaction_016, (n,2n)\n", + "reaction_017, (n,3n)\n", + "reaction_022, (n,na)\n", + "reaction_024, (n,2na)\n", + "reaction_028, (n,np)\n", + "reaction_041, (n,2np)\n", + "reaction_051, (n,n1)\n", + "reaction_052, (n,n2)\n", + "reaction_053, (n,n3)\n" ] } ], "source": [ - "main_group = h5file['Gd157.71c']\n", - "for name, obj in list(main_group.items())[:10]:\n", - " if 'mt' in obj.attrs:\n", - " print('{}, MT={} {}'.format(name, obj.attrs['mt'],\n", - " obj.attrs['label'].decode()))" + "main_group = h5file['Gd157.71c/reactions']\n", + "for name, obj in sorted(list(main_group.items()))[:10]:\n", + " if 'reaction_' in name:\n", + " print('{}, {}'.format(name, obj.attrs['label'].decode()))" ] }, { @@ -521,14 +521,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "[,\n", - " ,\n", - " ]\n" + "[,\n", + " ,\n", + " ]\n" ] } ], "source": [ - "n2n_group = main_group['reaction_1']\n", + "n2n_group = main_group['reaction_016']\n", "pprint(list(n2n_group.values()))" ] }, @@ -601,8 +601,8 @@ } ], "source": [ - "gd157_reconstructed = openmc.data.IncidentNeutron.from_hdf5(main_group)\n", - "gd157.reactions[16].xs.y - gd157_reconstructed.reactions[16].xs.y" + "gd157_reconstructed = openmc.data.IncidentNeutron.from_hdf5('gd157.h5')\n", + "gd157[16].xs.y - gd157_reconstructed[16].xs.y" ] } ], @@ -622,7 +622,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.5.2" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index 2c222ad6e..412013f2f 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -23,6 +23,7 @@ "import matplotlib.pyplot as plt\n", "import scipy.stats\n", "import numpy as np\n", + "import pandas as pd\n", "\n", "import openmc" ] @@ -50,12 +51,12 @@ "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')" + "h1 = openmc.Nuclide('H1')\n", + "b10 = openmc.Nuclide('B10')\n", + "o16 = openmc.Nuclide('O16')\n", + "u235 = openmc.Nuclide('U235')\n", + "u238 = openmc.Nuclide('U238')\n", + "zr90 = openmc.Nuclide('Zr90')" ] }, { @@ -369,7 +370,7 @@ "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+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA1LTA5VDIzOjAx\nOjE4LTA0OjAw/mF/xQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNS0wOVQyMzowMToxOC0wNDow\nMI88x3kAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AHFxUkA9dy05MAAAPZSURBVGje7Zs7buMwEIZ9iey5\n0gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwgwIcgg8Cc4fCTSK5W4OeF\nkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7E08mlia+rn7VcKXP8sRs\nzFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WBzfiz20hXORmP9fi/bM9E\neUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4lXju8K3DKv9NThOZ3q2K\nmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3OafPX40NGgST2r+uvQkXXp6\ncKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcublfKGt6apotG/NVx3SInW\ntLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJbf8qlPynYmpKCh7OB1fzN\nalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utrJTy8/06TXh0r/5JOa2Jm\nYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU4YuBTPa/8P67l/6r44ds\n+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m/65n+S8p/itN15v0UkW3\n/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB6R3Cqn55U4rv4kfH3zaS\ngQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6bjT6rym9I/v/03/b+LHS\n4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv6h9B/Bfxr9j1Hz2eN/hO\n8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wXfP8Mvf9G37/D/ovuP8Se\nP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7+O+E8zdP/8XOf8Hnz9Dz\nb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589jz5/Y8ej9h4D+W7qQmf57\nefqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m4fwXuH+M3n+OO3++AX9c\nlR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTIzVDE2OjM2OjAzLTA1OjAwxjuLbgAA\nACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0yM1QxNjozNjowMy0wNTowMLdmM9IAAAAASUVORK5C\nYII=\n", "text/plain": [ "" ] @@ -553,27 +554,26 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.7.1\n", - " Git SHA1: ae588276014a905ecc6e0967bf08288ecec5b550\n", - " Date/Time: 2016-05-09 23:01:18\n", - " MPI Processes: 1\n", + " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", + " Date/Time: 2016-07-23 16:36:04\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", " ===========================================================================\n", "\n", " Reading settings XML file...\n", - " Reading cross sections XML file...\n", " Reading geometry XML file...\n", + " Reading cross sections XML file...\n", " Reading materials XML file...\n", + " Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n", + " Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n", + " Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n", + " Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n", + " Reading B10.71c from /home/romano/openmc/data/nndc_hdf5/B10_71c.h5\n", + " Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", - " Loading ACE cross section table: 92235.71c\n", - " Loading ACE cross section table: 92238.71c\n", - " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 1001.71c\n", - " Loading ACE cross section table: 5010.71c\n", - " Loading ACE cross section table: 40090.71c\n", - " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", " Initializing source particles...\n", "\n", " ===========================================================================\n", @@ -618,20 +618,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.9000E-01 seconds\n", - " Reading cross sections = 8.6000E-02 seconds\n", - " Total time in simulation = 1.0830E+01 seconds\n", - " Time in transport only = 1.0818E+01 seconds\n", - " Time in inactive batches = 1.3590E+00 seconds\n", - " Time in active batches = 9.4710E+00 seconds\n", - " Time synchronizing fission bank = 3.0000E-03 seconds\n", - " Sampling source sites = 2.0000E-03 seconds\n", + " Total time for initialization = 4.2600E-01 seconds\n", + " Reading cross sections = 2.9500E-01 seconds\n", + " Total time in simulation = 1.1986E+01 seconds\n", + " Time in transport only = 1.1977E+01 seconds\n", + " Time in inactive batches = 1.8370E+00 seconds\n", + " Time in active batches = 1.0149E+01 seconds\n", + " Time synchronizing fission bank = 2.0000E-03 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", " SEND/RECV source sites = 1.0000E-03 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 1.1234E+01 seconds\n", - " Calculation Rate (inactive) = 9197.94 neutrons/second\n", - " Calculation Rate (active) = 3959.46 neutrons/second\n", + " Total time elapsed = 1.2431E+01 seconds\n", + " Calculation Rate (inactive) = 6804.57 neutrons/second\n", + " Calculation Rate (active) = 3694.95 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -710,7 +710,7 @@ " \t\tmesh\t[1]\n", " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", "\tNuclides =\ttotal \n", - "\tScores =\t[u'fission', u'nu-fission']\n", + "\tScores =\t['fission', 'nu-fission']\n", "\tEstimator =\ttracklength\n", "\n" ] @@ -742,13 +742,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.1508711 ]]\n", + "[[[ 0.1501735 ]]\n", "\n", - " [[ 0.05389822]]\n", + " [[ 0.05936257]]\n", "\n", - " [[ 0.19633 ]]\n", + " [[ 0.21402727]]\n", "\n", - " [[ 0.12963172]]]\n" + " [[ 0.13436703]]]\n" ] } ], @@ -804,8 +804,8 @@ " 0.00e+00\n", " 6.25e-07\n", " fission\n", - " 2.34e-04\n", - " 3.54e-05\n", + " 2.20e-04\n", + " 3.31e-05\n", " \n", " \n", " 1\n", @@ -815,8 +815,8 @@ " 0.00e+00\n", " 6.25e-07\n", " nu-fission\n", - " 5.71e-04\n", - " 8.62e-05\n", + " 5.37e-04\n", + " 8.06e-05\n", " \n", " \n", " 2\n", @@ -826,8 +826,8 @@ " 6.25e-07\n", " 2.00e+01\n", " fission\n", - " 7.03e-05\n", - " 7.05e-06\n", + " 7.43e-05\n", + " 7.91e-06\n", " \n", " \n", " 3\n", @@ -837,8 +837,8 @@ " 6.25e-07\n", " 2.00e+01\n", " nu-fission\n", - " 1.87e-04\n", - " 1.76e-05\n", + " 1.97e-04\n", + " 1.96e-05\n", " \n", " \n", " 4\n", @@ -848,8 +848,8 @@ " 0.00e+00\n", " 6.25e-07\n", " fission\n", - " 3.67e-04\n", - " 3.61e-05\n", + " 3.52e-04\n", + " 3.39e-05\n", " \n", " \n", " 5\n", @@ -859,8 +859,8 @@ " 0.00e+00\n", " 6.25e-07\n", " nu-fission\n", - " 8.94e-04\n", - " 8.80e-05\n", + " 8.57e-04\n", + " 8.26e-05\n", " \n", " \n", " 6\n", @@ -870,8 +870,8 @@ " 6.25e-07\n", " 2.00e+01\n", " fission\n", - " 1.04e-04\n", - " 5.36e-06\n", + " 1.02e-04\n", + " 6.16e-06\n", " \n", " \n", " 7\n", @@ -881,8 +881,8 @@ " 6.25e-07\n", " 2.00e+01\n", " nu-fission\n", - " 2.76e-04\n", - " 1.40e-05\n", + " 2.70e-04\n", + " 1.61e-05\n", " \n", " \n", " 8\n", @@ -892,8 +892,8 @@ " 0.00e+00\n", " 6.25e-07\n", " fission\n", - " 6.04e-04\n", - " 5.57e-05\n", + " 6.09e-04\n", + " 6.55e-05\n", " \n", " \n", " 9\n", @@ -903,8 +903,8 @@ " 0.00e+00\n", " 6.25e-07\n", " nu-fission\n", - " 1.47e-03\n", - " 1.36e-04\n", + " 1.48e-03\n", + " 1.60e-04\n", " \n", " \n", " 10\n", @@ -914,8 +914,8 @@ " 6.25e-07\n", " 2.00e+01\n", " fission\n", - " 1.41e-04\n", - " 6.69e-06\n", + " 1.38e-04\n", + " 6.74e-06\n", " \n", " \n", " 11\n", @@ -925,8 +925,8 @@ " 6.25e-07\n", " 2.00e+01\n", " nu-fission\n", - " 3.72e-04\n", - " 1.82e-05\n", + " 3.65e-04\n", + " 1.88e-05\n", " \n", " \n", " 12\n", @@ -936,8 +936,8 @@ " 0.00e+00\n", " 6.25e-07\n", " fission\n", - " 6.45e-04\n", - " 4.59e-05\n", + " 6.23e-04\n", + " 5.16e-05\n", " \n", " \n", " 13\n", @@ -947,8 +947,8 @@ " 0.00e+00\n", " 6.25e-07\n", " nu-fission\n", - " 1.57e-03\n", - " 1.12e-04\n", + " 1.52e-03\n", + " 1.26e-04\n", " \n", " \n", " 14\n", @@ -958,8 +958,8 @@ " 6.25e-07\n", " 2.00e+01\n", " fission\n", - " 1.82e-04\n", - " 9.37e-06\n", + " 1.74e-04\n", + " 9.99e-06\n", " \n", " \n", " 15\n", @@ -969,8 +969,8 @@ " 6.25e-07\n", " 2.00e+01\n", " nu-fission\n", - " 4.76e-04\n", - " 2.47e-05\n", + " 4.58e-04\n", + " 2.68e-05\n", " \n", " \n", " 16\n", @@ -980,8 +980,8 @@ " 0.00e+00\n", " 6.25e-07\n", " fission\n", - " 7.28e-04\n", - " 7.49e-05\n", + " 6.94e-04\n", + " 8.68e-05\n", " \n", " \n", " 17\n", @@ -991,8 +991,8 @@ " 0.00e+00\n", " 6.25e-07\n", " nu-fission\n", - " 1.77e-03\n", - " 1.83e-04\n", + " 1.69e-03\n", + " 2.12e-04\n", " \n", " \n", " 18\n", @@ -1002,8 +1002,8 @@ " 6.25e-07\n", " 2.00e+01\n", " fission\n", - " 1.81e-04\n", - " 1.04e-05\n", + " 1.75e-04\n", + " 1.10e-05\n", " \n", " \n", " 19\n", @@ -1013,8 +1013,8 @@ " 6.25e-07\n", " 2.00e+01\n", " nu-fission\n", - " 4.72e-04\n", - " 2.67e-05\n", + " 4.55e-04\n", + " 2.80e-05\n", " \n", " \n", "\n", @@ -1023,49 +1023,49 @@ "text/plain": [ " mesh 1 energy low [MeV] energy high [MeV] score mean \\\n", " x y z \n", - "0 1 1 1 0.00e+00 6.25e-07 fission 2.34e-04 \n", - "1 1 1 1 0.00e+00 6.25e-07 nu-fission 5.71e-04 \n", - "2 1 1 1 6.25e-07 2.00e+01 fission 7.03e-05 \n", - "3 1 1 1 6.25e-07 2.00e+01 nu-fission 1.87e-04 \n", - "4 1 2 1 0.00e+00 6.25e-07 fission 3.67e-04 \n", - "5 1 2 1 0.00e+00 6.25e-07 nu-fission 8.94e-04 \n", - "6 1 2 1 6.25e-07 2.00e+01 fission 1.04e-04 \n", - "7 1 2 1 6.25e-07 2.00e+01 nu-fission 2.76e-04 \n", - "8 1 3 1 0.00e+00 6.25e-07 fission 6.04e-04 \n", - "9 1 3 1 0.00e+00 6.25e-07 nu-fission 1.47e-03 \n", - "10 1 3 1 6.25e-07 2.00e+01 fission 1.41e-04 \n", - "11 1 3 1 6.25e-07 2.00e+01 nu-fission 3.72e-04 \n", - "12 1 4 1 0.00e+00 6.25e-07 fission 6.45e-04 \n", - "13 1 4 1 0.00e+00 6.25e-07 nu-fission 1.57e-03 \n", - "14 1 4 1 6.25e-07 2.00e+01 fission 1.82e-04 \n", - "15 1 4 1 6.25e-07 2.00e+01 nu-fission 4.76e-04 \n", - "16 1 5 1 0.00e+00 6.25e-07 fission 7.28e-04 \n", - "17 1 5 1 0.00e+00 6.25e-07 nu-fission 1.77e-03 \n", - "18 1 5 1 6.25e-07 2.00e+01 fission 1.81e-04 \n", - "19 1 5 1 6.25e-07 2.00e+01 nu-fission 4.72e-04 \n", + "0 1 1 1 0.00e+00 6.25e-07 fission 2.20e-04 \n", + "1 1 1 1 0.00e+00 6.25e-07 nu-fission 5.37e-04 \n", + "2 1 1 1 6.25e-07 2.00e+01 fission 7.43e-05 \n", + "3 1 1 1 6.25e-07 2.00e+01 nu-fission 1.97e-04 \n", + "4 1 2 1 0.00e+00 6.25e-07 fission 3.52e-04 \n", + "5 1 2 1 0.00e+00 6.25e-07 nu-fission 8.57e-04 \n", + "6 1 2 1 6.25e-07 2.00e+01 fission 1.02e-04 \n", + "7 1 2 1 6.25e-07 2.00e+01 nu-fission 2.70e-04 \n", + "8 1 3 1 0.00e+00 6.25e-07 fission 6.09e-04 \n", + "9 1 3 1 0.00e+00 6.25e-07 nu-fission 1.48e-03 \n", + "10 1 3 1 6.25e-07 2.00e+01 fission 1.38e-04 \n", + "11 1 3 1 6.25e-07 2.00e+01 nu-fission 3.65e-04 \n", + "12 1 4 1 0.00e+00 6.25e-07 fission 6.23e-04 \n", + "13 1 4 1 0.00e+00 6.25e-07 nu-fission 1.52e-03 \n", + "14 1 4 1 6.25e-07 2.00e+01 fission 1.74e-04 \n", + "15 1 4 1 6.25e-07 2.00e+01 nu-fission 4.58e-04 \n", + "16 1 5 1 0.00e+00 6.25e-07 fission 6.94e-04 \n", + "17 1 5 1 0.00e+00 6.25e-07 nu-fission 1.69e-03 \n", + "18 1 5 1 6.25e-07 2.00e+01 fission 1.75e-04 \n", + "19 1 5 1 6.25e-07 2.00e+01 nu-fission 4.55e-04 \n", "\n", " std. dev. \n", " \n", - "0 3.54e-05 \n", - "1 8.62e-05 \n", - "2 7.05e-06 \n", - "3 1.76e-05 \n", - "4 3.61e-05 \n", - "5 8.80e-05 \n", - "6 5.36e-06 \n", - "7 1.40e-05 \n", - "8 5.57e-05 \n", - "9 1.36e-04 \n", - "10 6.69e-06 \n", - "11 1.82e-05 \n", - "12 4.59e-05 \n", - "13 1.12e-04 \n", - "14 9.37e-06 \n", - "15 2.47e-05 \n", - "16 7.49e-05 \n", - "17 1.83e-04 \n", - "18 1.04e-05 \n", - "19 2.67e-05 " + "0 3.31e-05 \n", + "1 8.06e-05 \n", + "2 7.91e-06 \n", + "3 1.96e-05 \n", + "4 3.39e-05 \n", + "5 8.26e-05 \n", + "6 6.16e-06 \n", + "7 1.61e-05 \n", + "8 6.55e-05 \n", + "9 1.60e-04 \n", + "10 6.74e-06 \n", + "11 1.88e-05 \n", + "12 5.16e-05 \n", + "13 1.26e-04 \n", + "14 9.99e-06 \n", + "15 2.68e-05 \n", + "16 8.68e-05 \n", + "17 2.12e-04 \n", + "18 1.10e-05 \n", + "19 2.80e-05 " ] }, "execution_count": 24, @@ -1078,8 +1078,7 @@ "df = tally.get_pandas_dataframe(nuclides=False)\n", "\n", "# Set the Pandas float display settings\n", - "import pandas as pd\n", - "pd.set_option('display.float_format', '{:.2e}'.format)\n", + "pd.options.display.float_format = '{:.2e}'.format\n", "\n", "# Print the first twenty rows in the dataframe\n", "df.head(20)" @@ -1094,9 +1093,9 @@ "outputs": [ { "data": { - "image/png": "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\nSWry/wHxFqsYpaO7aQAAAABJRU5ErkJggg==\n", + "image/png": "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\n/wf1F+RhutXrZwAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1119,7 +1118,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 26, @@ -1128,9 +1127,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\nJ/KLgSwAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1175,8 +1174,8 @@ "\tName =\tcell tally\n", "\tFilters =\t\n", " \t\tcell\t[10000]\n", - "\tNuclides =\tU-235 U-238 \n", - "\tScores =\t[u'scatter-Y0,0', u'scatter-Y1,-1', u'scatter-Y1,0', u'scatter-Y1,1', u'scatter-Y2,-2', u'scatter-Y2,-1', u'scatter-Y2,0', u'scatter-Y2,1', u'scatter-Y2,2']\n", + "\tNuclides =\tU235 U238 \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" ] @@ -1216,146 +1215,146 @@ " \n", " 0\n", " 10000\n", - " U-235\n", + " U235\n", " scatter-Y0,0\n", - " 3.86e-02\n", - " 1.11e-03\n", + " 3.84e-02\n", + " 1.32e-03\n", " \n", " \n", " 1\n", " 10000\n", - " U-235\n", + " U235\n", " scatter-Y1,-1\n", - " 2.75e-04\n", - " 2.96e-04\n", + " 3.61e-04\n", + " 3.13e-04\n", " \n", " \n", " 2\n", " 10000\n", - " U-235\n", + " U235\n", " scatter-Y1,0\n", - " -5.55e-05\n", - " 4.33e-04\n", + " -2.38e-04\n", + " 4.69e-04\n", " \n", " \n", " 3\n", " 10000\n", - " U-235\n", + " U235\n", " scatter-Y1,1\n", - " -4.22e-04\n", - " 3.51e-04\n", + " -5.08e-04\n", + " 3.83e-04\n", " \n", " \n", " 4\n", " 10000\n", - " U-235\n", + " U235\n", " scatter-Y2,-2\n", - " 5.88e-05\n", - " 2.04e-04\n", + " 6.68e-05\n", + " 2.46e-04\n", " \n", " \n", " 5\n", " 10000\n", - " U-235\n", + " U235\n", " scatter-Y2,-1\n", - " 1.00e-04\n", - " 2.49e-04\n", + " 6.47e-06\n", + " 2.84e-04\n", " \n", " \n", " 6\n", " 10000\n", - " U-235\n", + " U235\n", " scatter-Y2,0\n", - " -8.09e-05\n", - " 1.59e-04\n", + " -1.41e-04\n", + " 1.75e-04\n", " \n", " \n", " 7\n", " 10000\n", - " U-235\n", + " U235\n", " scatter-Y2,1\n", - " 1.93e-04\n", - " 2.14e-04\n", + " 1.61e-04\n", + " 2.33e-04\n", " \n", " \n", " 8\n", " 10000\n", - " U-235\n", + " U235\n", " scatter-Y2,2\n", - " 1.12e-04\n", - " 1.86e-04\n", + " -1.80e-05\n", + " 1.97e-04\n", " \n", " \n", " 9\n", " 10000\n", - " U-238\n", + " U238\n", " scatter-Y0,0\n", - " 2.34e+00\n", - " 1.34e-02\n", + " 2.33e+00\n", + " 1.35e-02\n", " \n", " \n", " 10\n", " 10000\n", - " U-238\n", + " U238\n", " scatter-Y1,-1\n", - " 2.32e-02\n", - " 2.97e-03\n", + " 2.53e-02\n", + " 3.23e-03\n", " \n", " \n", " 11\n", " 10000\n", - " U-238\n", + " U238\n", " scatter-Y1,0\n", - " 7.50e-04\n", - " 2.55e-03\n", + " 7.10e-04\n", + " 2.92e-03\n", " \n", " \n", " 12\n", " 10000\n", - " U-238\n", + " U238\n", " scatter-Y1,1\n", - " -2.73e-02\n", - " 3.28e-03\n", + " -2.49e-02\n", + " 3.52e-03\n", " \n", " \n", " 13\n", " 10000\n", - " U-238\n", + " U238\n", " scatter-Y2,-2\n", - " -2.36e-03\n", - " 1.21e-03\n", + " -1.43e-03\n", + " 1.17e-03\n", " \n", " \n", " 14\n", " 10000\n", - " U-238\n", + " U238\n", " scatter-Y2,-1\n", - " -1.80e-04\n", - " 1.49e-03\n", + " 6.84e-04\n", + " 1.63e-03\n", " \n", " \n", " 15\n", " 10000\n", - " U-238\n", + " U238\n", " scatter-Y2,0\n", - " 3.23e-03\n", - " 2.25e-03\n", + " 2.85e-03\n", + " 2.63e-03\n", " \n", " \n", " 16\n", " 10000\n", - " U-238\n", + " U238\n", " scatter-Y2,1\n", - " 3.75e-03\n", - " 1.97e-03\n", + " 3.97e-03\n", + " 2.24e-03\n", " \n", " \n", " 17\n", " 10000\n", - " U-238\n", + " U238\n", " scatter-Y2,2\n", - " 2.07e-03\n", - " 1.60e-03\n", + " 2.26e-03\n", + " 1.85e-03\n", " \n", " \n", "\n", @@ -1363,24 +1362,24 @@ ], "text/plain": [ " cell nuclide score mean std. dev.\n", - "0 10000 U-235 scatter-Y0,0 3.86e-02 1.11e-03\n", - "1 10000 U-235 scatter-Y1,-1 2.75e-04 2.96e-04\n", - "2 10000 U-235 scatter-Y1,0 -5.55e-05 4.33e-04\n", - "3 10000 U-235 scatter-Y1,1 -4.22e-04 3.51e-04\n", - "4 10000 U-235 scatter-Y2,-2 5.88e-05 2.04e-04\n", - "5 10000 U-235 scatter-Y2,-1 1.00e-04 2.49e-04\n", - "6 10000 U-235 scatter-Y2,0 -8.09e-05 1.59e-04\n", - "7 10000 U-235 scatter-Y2,1 1.93e-04 2.14e-04\n", - "8 10000 U-235 scatter-Y2,2 1.12e-04 1.86e-04\n", - "9 10000 U-238 scatter-Y0,0 2.34e+00 1.34e-02\n", - "10 10000 U-238 scatter-Y1,-1 2.32e-02 2.97e-03\n", - "11 10000 U-238 scatter-Y1,0 7.50e-04 2.55e-03\n", - "12 10000 U-238 scatter-Y1,1 -2.73e-02 3.28e-03\n", - "13 10000 U-238 scatter-Y2,-2 -2.36e-03 1.21e-03\n", - "14 10000 U-238 scatter-Y2,-1 -1.80e-04 1.49e-03\n", - "15 10000 U-238 scatter-Y2,0 3.23e-03 2.25e-03\n", - "16 10000 U-238 scatter-Y2,1 3.75e-03 1.97e-03\n", - "17 10000 U-238 scatter-Y2,2 2.07e-03 1.60e-03" + "0 10000 U235 scatter-Y0,0 3.84e-02 1.32e-03\n", + "1 10000 U235 scatter-Y1,-1 3.61e-04 3.13e-04\n", + "2 10000 U235 scatter-Y1,0 -2.38e-04 4.69e-04\n", + "3 10000 U235 scatter-Y1,1 -5.08e-04 3.83e-04\n", + "4 10000 U235 scatter-Y2,-2 6.68e-05 2.46e-04\n", + "5 10000 U235 scatter-Y2,-1 6.47e-06 2.84e-04\n", + "6 10000 U235 scatter-Y2,0 -1.41e-04 1.75e-04\n", + "7 10000 U235 scatter-Y2,1 1.61e-04 2.33e-04\n", + "8 10000 U235 scatter-Y2,2 -1.80e-05 1.97e-04\n", + "9 10000 U238 scatter-Y0,0 2.33e+00 1.35e-02\n", + "10 10000 U238 scatter-Y1,-1 2.53e-02 3.23e-03\n", + "11 10000 U238 scatter-Y1,0 7.10e-04 2.92e-03\n", + "12 10000 U238 scatter-Y1,1 -2.49e-02 3.52e-03\n", + "13 10000 U238 scatter-Y2,-2 -1.43e-03 1.17e-03\n", + "14 10000 U238 scatter-Y2,-1 6.84e-04 1.63e-03\n", + "15 10000 U238 scatter-Y2,0 2.85e-03 2.63e-03\n", + "16 10000 U238 scatter-Y2,1 3.97e-03 2.24e-03\n", + "17 10000 U238 scatter-Y2,2 2.26e-03 1.85e-03" ] }, "execution_count": 28, @@ -1414,8 +1413,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.00159927 0.01341406]\n", - " [ 0.00018637 0.00111048]]]\n" + "[[[ 0.00185463 0.01350521]\n", + " [ 0.00019723 0.00131654]]]\n" ] } ], @@ -1423,7 +1422,7 @@ "# 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", + " nuclides=['U238', 'U235'], value='std_dev')\n", "print(data)" ] }, @@ -1451,7 +1450,7 @@ "\tFilters =\t\n", " \t\tdistribcell\t[10002]\n", "\tNuclides =\ttotal \n", - "\tScores =\t[u'absorption', u'scatter']\n", + "\tScores =\t['absorption', 'scatter']\n", "\tEstimator =\ttracklength\n", "\n" ] @@ -1483,7 +1482,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.05767856]]]\n" + "[[[ 0.05468423]]]\n" ] } ], @@ -1566,8 +1565,8 @@ " 10002\n", " 279\n", " absorption\n", - " 8.19e-05\n", - " 7.82e-06\n", + " 8.72e-05\n", + " 8.13e-06\n", " \n", " \n", " 559\n", @@ -1581,8 +1580,8 @@ " 10002\n", " 279\n", " scatter\n", - " 1.33e-02\n", - " 6.19e-04\n", + " 1.37e-02\n", + " 6.98e-04\n", " \n", " \n", " 560\n", @@ -1596,8 +1595,8 @@ " 10002\n", " 280\n", " absorption\n", - " 1.00e-04\n", - " 7.93e-06\n", + " 1.03e-04\n", + " 9.17e-06\n", " \n", " \n", " 561\n", @@ -1611,8 +1610,8 @@ " 10002\n", " 280\n", " scatter\n", - " 1.40e-02\n", - " 5.61e-04\n", + " 1.41e-02\n", + " 6.26e-04\n", " \n", " \n", " 562\n", @@ -1626,8 +1625,8 @@ " 10002\n", " 281\n", " absorption\n", - " 9.52e-05\n", - " 7.08e-06\n", + " 9.41e-05\n", + " 8.40e-06\n", " \n", " \n", " 563\n", @@ -1641,8 +1640,8 @@ " 10002\n", " 281\n", " scatter\n", - " 1.51e-02\n", - " 6.50e-04\n", + " 1.50e-02\n", + " 6.92e-04\n", " \n", " \n", " 564\n", @@ -1656,8 +1655,8 @@ " 10002\n", " 282\n", " absorption\n", - " 9.85e-05\n", - " 9.47e-06\n", + " 9.56e-05\n", + " 1.03e-05\n", " \n", " \n", " 565\n", @@ -1671,8 +1670,8 @@ " 10002\n", " 282\n", " scatter\n", - " 1.53e-02\n", - " 4.63e-04\n", + " 1.52e-02\n", + " 5.37e-04\n", " \n", " \n", " 566\n", @@ -1686,8 +1685,8 @@ " 10002\n", " 283\n", " absorption\n", - " 1.08e-04\n", - " 1.34e-05\n", + " 1.06e-04\n", + " 1.49e-05\n", " \n", " \n", " 567\n", @@ -1701,8 +1700,8 @@ " 10002\n", " 283\n", " scatter\n", - " 1.65e-02\n", - " 7.04e-04\n", + " 1.64e-02\n", + " 8.14e-04\n", " \n", " \n", " 568\n", @@ -1716,8 +1715,8 @@ " 10002\n", " 284\n", " absorption\n", - " 1.13e-04\n", - " 7.91e-06\n", + " 1.16e-04\n", + " 9.02e-06\n", " \n", " \n", " 569\n", @@ -1731,8 +1730,8 @@ " 10002\n", " 284\n", " scatter\n", - " 1.67e-02\n", - " 5.51e-04\n", + " 1.64e-02\n", + " 6.00e-04\n", " \n", " \n", " 570\n", @@ -1746,8 +1745,8 @@ " 10002\n", " 285\n", " absorption\n", - " 1.23e-04\n", - " 9.53e-06\n", + " 1.25e-04\n", + " 1.12e-05\n", " \n", " \n", " 571\n", @@ -1761,8 +1760,8 @@ " 10002\n", " 285\n", " scatter\n", - " 1.88e-02\n", - " 7.25e-04\n", + " 1.87e-02\n", + " 8.26e-04\n", " \n", " \n", " 572\n", @@ -1776,8 +1775,8 @@ " 10002\n", " 286\n", " absorption\n", - " 1.44e-04\n", - " 1.34e-05\n", + " 1.47e-04\n", + " 1.49e-05\n", " \n", " \n", " 573\n", @@ -1791,8 +1790,8 @@ " 10002\n", " 286\n", " scatter\n", - " 1.90e-02\n", - " 7.07e-04\n", + " 1.94e-02\n", + " 7.71e-04\n", " \n", " \n", " 574\n", @@ -1806,8 +1805,8 @@ " 10002\n", " 287\n", " absorption\n", - " 1.26e-04\n", - " 8.66e-06\n", + " 1.31e-04\n", + " 9.84e-06\n", " \n", " \n", " 575\n", @@ -1822,7 +1821,7 @@ " 287\n", " scatter\n", " 1.97e-02\n", - " 7.23e-04\n", + " 7.93e-04\n", " \n", " \n", " 576\n", @@ -1836,8 +1835,8 @@ " 10002\n", " 288\n", " absorption\n", - " 1.25e-04\n", - " 9.59e-06\n", + " 1.23e-04\n", + " 1.07e-05\n", " \n", " \n", " 577\n", @@ -1851,8 +1850,8 @@ " 10002\n", " 288\n", " scatter\n", - " 2.01e-02\n", - " 6.75e-04\n", + " 1.97e-02\n", + " 7.34e-04\n", " \n", " \n", "\n", @@ -1886,26 +1885,26 @@ " mean std. dev. \n", " \n", " \n", - "558 8.19e-05 7.82e-06 \n", - "559 1.33e-02 6.19e-04 \n", - "560 1.00e-04 7.93e-06 \n", - "561 1.40e-02 5.61e-04 \n", - "562 9.52e-05 7.08e-06 \n", - "563 1.51e-02 6.50e-04 \n", - "564 9.85e-05 9.47e-06 \n", - "565 1.53e-02 4.63e-04 \n", - "566 1.08e-04 1.34e-05 \n", - "567 1.65e-02 7.04e-04 \n", - "568 1.13e-04 7.91e-06 \n", - "569 1.67e-02 5.51e-04 \n", - "570 1.23e-04 9.53e-06 \n", - "571 1.88e-02 7.25e-04 \n", - "572 1.44e-04 1.34e-05 \n", - "573 1.90e-02 7.07e-04 \n", - "574 1.26e-04 8.66e-06 \n", - "575 1.97e-02 7.23e-04 \n", - "576 1.25e-04 9.59e-06 \n", - "577 2.01e-02 6.75e-04 " + "558 8.72e-05 8.13e-06 \n", + "559 1.37e-02 6.98e-04 \n", + "560 1.03e-04 9.17e-06 \n", + "561 1.41e-02 6.26e-04 \n", + "562 9.41e-05 8.40e-06 \n", + "563 1.50e-02 6.92e-04 \n", + "564 9.56e-05 1.03e-05 \n", + "565 1.52e-02 5.37e-04 \n", + "566 1.06e-04 1.49e-05 \n", + "567 1.64e-02 8.14e-04 \n", + "568 1.16e-04 9.02e-06 \n", + "569 1.64e-02 6.00e-04 \n", + "570 1.25e-04 1.12e-05 \n", + "571 1.87e-02 8.26e-04 \n", + "572 1.47e-04 1.49e-05 \n", + "573 1.94e-02 7.71e-04 \n", + "574 1.31e-04 9.84e-06 \n", + "575 1.97e-02 7.93e-04 \n", + "576 1.23e-04 1.07e-05 \n", + "577 1.97e-02 7.34e-04 " ] }, "execution_count": 32, @@ -1958,38 +1957,38 @@ " \n", " \n", " mean\n", - " 4.19e-04\n", - " 2.24e-05\n", + " 4.16e-04\n", + " 2.42e-05\n", " \n", " \n", " std\n", - " 2.42e-04\n", - " 9.14e-06\n", + " 2.39e-04\n", + " 1.03e-05\n", " \n", " \n", " min\n", " 1.90e-05\n", - " 3.44e-06\n", + " 3.80e-06\n", " \n", " \n", " 25%\n", - " 2.02e-04\n", - " 1.56e-05\n", + " 1.99e-04\n", + " 1.61e-05\n", " \n", " \n", " 50%\n", - " 4.05e-04\n", - " 2.20e-05\n", + " 4.09e-04\n", + " 2.37e-05\n", " \n", " \n", " 75%\n", - " 6.07e-04\n", - " 2.89e-05\n", + " 6.00e-04\n", + " 3.08e-05\n", " \n", " \n", " max\n", - " 9.19e-04\n", - " 4.95e-05\n", + " 9.07e-04\n", + " 5.38e-05\n", " \n", " \n", "\n", @@ -2000,13 +1999,13 @@ " \n", " \n", "count 2.89e+02 2.89e+02\n", - "mean 4.19e-04 2.24e-05\n", - "std 2.42e-04 9.14e-06\n", - "min 1.90e-05 3.44e-06\n", - "25% 2.02e-04 1.56e-05\n", - "50% 4.05e-04 2.20e-05\n", - "75% 6.07e-04 2.89e-05\n", - "max 9.19e-04 4.95e-05" + "mean 4.16e-04 2.42e-05\n", + "std 2.39e-04 1.03e-05\n", + "min 1.90e-05 3.80e-06\n", + "25% 1.99e-04 1.61e-05\n", + "50% 4.09e-04 2.37e-05\n", + "75% 6.00e-04 3.08e-05\n", + "max 9.07e-04 5.38e-05" ] }, "execution_count": 33, @@ -2041,7 +2040,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Mann-Whitney Test p-value: 0.303583331507\n" + "Mann-Whitney Test p-value: 0.7234916721800682\n" ] } ], @@ -2079,7 +2078,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Mann-Whitney Test p-value: 6.038663783e-42\n" + "Mann-Whitney Test p-value: 3.5054120724573393e-41\n" ] } ], @@ -2115,7 +2114,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:4: SettingWithCopyWarning: \n", + "/home/romano/miniconda3/envs/default/lib/python3.5/site-packages/ipykernel/__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", @@ -2125,7 +2124,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 36, @@ -2134,9 +2133,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEdCAYAAAAb9oCRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XuYXHWd5/H3tzsdIVFMIDgDCRDSBBB1hQ4EL8REeARB\nV5CZ3VFnFCKKYQAvAzg6s7uGmXUenxHW28ZkHJTL6Mg6igzjMAvKJYsXICTgBQKhu0kgCTPkajAB\nknR9949zqjl1+tSpc6rqVFdVf17P009yblW/U931+57f3dwdERGRrHrGOwEiItJZFDhERCQXBQ4R\nEclFgUNERHJR4BARkVwUOEREJBcFDpECmNlfmNl1450OkSIocEjHMLPTzOznZvZbM9tuZj8zs1Ma\nfM0LzeynsX03mNn/bOR13f1v3P0jjbxGNWbmZrbbzH5nZpvN7Gtm1pfx2kVmtrGIdMnEocAhHcHM\nDgJ+BHwNOBiYCVwNvDSe6UpiZpNa8DZvdPdXAm8DzgcubsF7igAKHNI5jgVw9++6+4i7v+Dud7r7\nr8onmNlHzWytmT1vZo+Z2UC4/zNmNhTZ/95w/2uBFcCbw6f3nWZ2MfDHwKfDff8Snnu4mf3AzLaY\n2VNm9vHI+y41s++b2bfNbBdwYbjv2+Hx2WEp4QIze9rMtprZX0auP9DMbjSzHWH6P521VODug8DP\ngNdFXm9x5HMYNrOPhfunAv8GHB7e2+/C++qJfEbbzOx7ZnZweM0B4X1tCz+fVWb2e7l/e9JVFDik\nU6wDRsIM9mwzmx49aGb/BVgKfAg4CHgPsC08PAQsAF5NUEr5tpkd5u5rgSXAL9z9le4+zd2/AXwH\n+Ntw3382sx7gX4BfEpR0zgA+aWZnRZJwLvB9YFp4fZLTgOPC6/9HGLgAPgfMBuYA7wD+JOuHYmbH\nh/f2YGT3c8C7w89hMfAlMxtw993A2cDm8N5e6e6bgcuB84CFwOHADmBZ+FoXhJ/bEcAh4ef1Qtb0\nSXdS4JCO4O67CDJeB/4e2GJmt0Wefj9CkNmv8sCgu28Ir/0nd9/s7iV3/z/Ak8D8HG9/CnCou/+V\nu+919+EwDe+LnPMLd781fI9qGevVYUnplwRB6I3h/v8K/I2773D3jcBXM6RpjZntBtYCP3D3G8oH\n3P1f3X0o/BxWAncSBJdqlgB/6e4b3f0lggD8h2GV2z6CgHFMWNJbHf4uZAJT4JCO4e5r3f1Cd58F\nvJ7g6fjL4eEjCEoWY5jZh8zskbCqZWd47Ywcb30UQfXOzshr/AUQrbJ5JsPr/Hvk/3uAV4b/Pzx2\nfZbXGgiv/yPgg2Y2u3wgLJHdH3Yg2AmcQ/r9HgX8MHJva4ERgvv7B+AO4OawIf5vszbES/dS4JCO\n5O6PAzcQBAEIMtv++HlmdhRB6eAy4BB3nwb8BrDySyW9fGz7GeCpsCqr/PMqdz8n5Zo8ngVmRbaP\nyHJRWKL4HkGngaUAZvYK4AfANcDvhfd7O+n3+wxwduz+DnD3Te6+z92vdvcTgLcQVIF9KP8tSjdR\n4JCOYGbHm9kVZjYr3D4CeD9wf3jKdcCVZjbPAseEQWMqQWa5JbxuMS8HG4D/AGaZ2eTYvjmR7QeB\n583sz8OG7F4ze32jXYEjvgd81symm9lMgiCXxxeA94efyWTgFQT3u9/MzgbOjJz7H8AhZvbqyL4V\nwOfDzwszO9TMzg3//3Yze4OZ9QK7CKquSvlvUbqJAod0iueBU4EHwrr9+wlKDldA0I4BfB74x/Dc\nW4GD3f0x4FrgFwSZ5hsIeiGV3Q08Cvy7mW0N930TOCGsurnV3UcInrRPBJ4CthIEqmjm24i/AjaG\nr/0Tgkb2zN2M3f3X4X1c4e7PAx8nCEY7gA8At0XOfRz4LjAc3t/hwFfCc+40s+cJPttTw0t+P0zP\nLoIqrJUE1VcygZkWchJpL2Z2CfA+d1843mkRSaISRw1mtnS809Asupf2ZGbXmNlbw/EUxxGUon44\n3umqR5f9XpaOdxqapdn3ohJHDWbm7m61z2x/upf2ZGZOUF12NLATuBn4rLvvHdeE1aHbfi+6l2St\nmBpBRGpw99fXPkukPaiqSkREcunKqqqw6C8iIjlkrc7q2qqqbgyIIiJFMcveBKKqKhERyaXwwGFm\n7zSzJ8xs0Mw+k3D8eDP7hZm9ZGZX5rlWRERar9A2jnCagnUEU0VvBFYB7w9H85bPeQ3BJGvnATvc\n/Zqs16a8r6uqSkQkOzPL3MZRdIljPjDo7sNhn/SbCdYtGOXuz7n7KoI5cHJdKyIirVd04JhJ5RTR\nG8N9RV8rIiIF6YrGcQuW6fTyz3inR0SkE0Xz0bRpSorujruJyrUFZoX7mnqtuy8lXI8ANI5DRKQe\n7dLGsQqYa2ZHh+sdvI/IFM8FXisiIgUptMTh7vvN7DKCpSd7gW+5+6NmtiQ8vsLMfh94CDgIKJnZ\nJ4ET3H1X0rVFpldERGrr2ilHuvG+RESK0k7dcUVEpMsocIiISC4KHCIikosCh4iI5KLAISIiuShw\niIhILgocIiKSiwKHiIjkosAhIiK5KHCIiEguChwiIpJL0dOqd62RkrNi5RBrNuxg4KjpXLKwn56e\nTNO8iIh0NAWOOq1YOcQX73gCgLsefw6AS99+zHgmSUSkJVRVVac1G3akbouIdCsFjjoNHDU9dVtE\npFupqqpOlyzsB6ho4xARmQi0kJOIiGghJxERKY4Ch4iI5KI2jibS2A4RmQgUOJpIYztEZCJQVVUT\naWyHiEwEChxNpLEdIjIRqKqqiTS2Q0QmAo3jEBERjeMQEZHiKHCIiEguChwiIpKLAoeIiOSiwCEi\nIrkocIiISC4KHCIikosCh4iI5KLAISIiuRQeOMzsnWb2hJkNmtlnEo6bmX01PP4rMxuIHPusmT1m\nZr8xs++a2QFFp1dERNIVGjjMrBdYBpwNnAC838xOiJ12NjA3/LkYWB5eOzvcnufurwd6gfcVmV4R\nEamt6BLHfGDQ3YfdfS9wM3Bu7JxzgZs8cD8wzcwOA3YB+4ADzWwSMAXYXHB6RUSkhqIDx0zgmcj2\nxnBfzXPcfTtwDfA08CzwW3e/s8C0iohIBm3bOG5m/cCngKOBw4GpZvYnVc5damZe/mllOkVEukU0\nHzWzpdXOKzpwbAKOiGzPCvdlOedk4OfuvsXd9wG3AG9JehN3X+ruVv5pWupFRCaQaD7q7kurnVd0\n4FgFzDWzo81sMkHj9m2xc24DPhT2rnoTQZXUs8ATwJvMbIqZGXAGsLbg9IqISA2FrgDo7vvN7DLg\nDoJeUd9y90fNbEl4fAVwO3AOMAjsARaHxx4xs5uAh4AS8DDwjSLT2ywjJWfFyqGKlQB7elQQEpHu\noBUAC7DsnkG+eMcTo9tXnXUcl779mHFLj4hILVoBcJyt2bAjdVtEpJMpcBRg4KjpqdsiIp2s0DaO\nieqShf0AFW0cIiLdQm0cLaRGcxFpV3naOFTiaLK04PD1ewe59s51ANz1+HOU3Ln89LnjmVwRkdwU\nOJpsxcqh0R5Vdz3+HMBoj6pbH64c+3jrw5sUOESk46hxvMlSe1TFa8/arzZNRKQmBY4mS+tR9d6B\nyvkd49siIp1AVVVNltaj6mNv6+eBp7azdvMuXnv4QSx5m3pbiUjnUa+qFtKIchFpVxo53qY0olxE\nuoECRwtpRLmIdAO1cbSQRpSLSDdQG4eIiKiNQ0REiqPAISIiuShwiIhILgocIiKSiwKHiIjkosAh\nIiK5KHCIiEguGgDYxrRioIi0IwWONpa2KJSIyHhRVVUb06SIItKOFDjamCZFFJF2pKqqNqZJEUWk\nHWmSQxER0SSHIiJSHAUOERHJRYFDRERyUeN4F9LAQREpkgJHF9LAQREpkgLHOCuidKCBgyJSJAWO\ncVZE6WDgqOmjr1XeFhFplsIDh5m9E/gK0Atc5+5fiB238Pg5wB7gQndfEx6bBlwHvB5w4MPu/oui\n09xKRZQONHBQRIpUaOAws15gGfAOYCOwysxuc/fHIqedDcwNf04Flof/QhBQ/q+7/6GZTQamFJne\n8VBE6aCnx9SmISKFKbrEMR8YdPdhADO7GTgXiAaOc4GbwqHe95vZNDM7jKD08TbgQgB33wvsLTi9\nLafSgYh0mqIDx0zgmcj2Rl4uTaSdMxPYD2wBrjezNwKrgU+4++7iktt6Kh2ISKdp5wGAk4ABYLm7\nnwTsBj6TdKKZLTUzL/+0MpGtMlJylt0zyEU3rGLZPYOUSl15myIyjqL5qJktrXZe0SWOTcARke1Z\n4b4s5ziw0d0fCPd/nyqBw92XAkvL250UPLJ2x9XYDBEpWtZJDusKHGa2xt0HMpy6CphrZkcTBIP3\nAR+InXMbcFnY/nEq8Ft3fzZ8n2fM7Dh3fwI4g8q2ka6QNSBobIaItIu6AkfGoIG77zezy4A7CLrj\nfsvdHzWzJeHxFcDtBF1xBwkaxBdHXuJy4Dthj6rh2LGukDUg5O19pWlHRKQoqYEj7E77E3d/e71v\n4O63EwSH6L4Vkf87cGmVax8BTq73vTtB1oCQt/eVqrZEpCipgcPdR8ysZGavdvfftipRE0G5RLB6\n/XYWzJ1BX28P81ICQt7eV6raEpGiZKmq+h3wazP7MUHPJgDc/eOFpWoCiJYIAK4667imlgjiJZm9\nIyVKJVd1lYg0LEt33FuA/w78P4KxFOUfaUDRJYJLFvazYO6M0e37ntzK8pVDTX0PEZmYsrRxnOnu\nf9yi9EwYRU9E2NNjTO6tfC5QdZWINEOWNo6jzGxyOOWHNEkrphrRLLkiUgQLOjWlnGB2E/BagvEW\n0TaO/1Vs0upnZl7rviaCUslZri65IpKBmWUeAJglcHwuab+7X11H2lqiGwKHxmGISCs1NXBEXnSK\nu+9pKGUt0g2B42t3P8m1d64b3b7izGO5/PS545giEelmeQJHzV5VZvZmM3sMeDzcfqOZfb3BNEoN\ntz68KXW7XSc9bNd0iUjzZBnH8WXgLII2Dtz9l2b2tkJT1SUaqm6K57ex7XYdGd6u6RKR5sk0rbq7\nPxPbNVJAWrpOORO96/Hn+OIdT+QaR/HegZmp2+06Mrxd0yUizZOlxPGMmb0FcDPrAz4BrC02Wd2h\nkUz0Txcdg5lV7a7brl1t2zVdItI8WQLHEoK1v2cSTI1+J1UmJZRKjWSiteamShsHMlJyvn7vILeu\n2QQG5500k0sXHdOSXllaClek+2XuVdVJ2qVXVa1xFEV1uV12z2DFPFjQ/LmwRKS75OlVVfQKgBNa\nrVJDUQ3JSVViamsQkWZp5zXHu17WNpC8XVyTqsTU1iAizaISxzjK2gaSt2RyycJ+3J0fRto41NYg\nIs1SVxuHmQ24+5oC0tMU7dLGUUu5DWT1+u3sK3nFYk7Rto6LblhVEWDOOP41fPPCU8YjyZoKRaRL\nNXXkeBWX1HmdRJTbQObNPpj7ntzK3VXGe8RLIuNZ7dTI2BQR6Q51VVW5+0ebnZCJrFZbRzt1cdUA\nPxGpGjjMbCDtwnauquo0tdo68q43XqSkJWkvumGVqq1EJpC0Ese1KcccOL3JaZmw6i1RjEd7QzSt\ne0dK3PfkVkDzUolMJFUDh7u/vZUJmcjqbcYfjwkFo6Wfi25YVXFM1VYiE0PNNg4zmwL8GXCku19s\nZnOB49z9R4WnboJICwBppYp4Rn3Lmo0tLX1oXiqRiSlL4/j1wGrgLeH2JuCfAAWOJqnW4DxSci68\n/sEx1UFLFvazYuUQ67furrhuaMtuhrbsblnpo50a7UWkdbIEjn53/yMzez+Au+8xM7WANlG1J/cV\nK4dGg0bZmg07KkooAP2HTgWHoUggaUW1UTs12otI62QJHHvN7EDCqngz6wdeKjRVE0y1J/ekzH/g\nqOlj9s8+ZCoDR02vCCZp1UZ5GtU14E9E4mqOHDezdwD/DTiBYEr1twIXuvu9haeuTp0ycjwunkm7\nO9dE1h1fMHcGNy6ez/KEEsd5J83EgIef3lkzg4/Pnps2c26ec0WkczVtdtywSupx4HzgTYABn3D3\nrWnXSX3ijeRXnHksV511XMXTvgMld/oPncqO3XvZvmcfQ1t2c+2d67jqrOMyTUWSZxCfBvyJSFxq\n4HB3N7Pb3f0NwL+2KE0TVjxTfuTpnWMCwbJ7Brk2UgpJu76aPL2h1HNKROKytHGsMbNT3H1V7VOl\nEVky6dXrt6den0W0DeXEI6fh7lVHfye1v6jdQ2RiyxI4TgX+2Mw2ALsJqqvc3f9ToSmbgLJ0b90X\nW4vjyIMPpK+nByyowiqVvGYmHu0NFW3DSOrGm9RzqtY1ItLdsgSOswpPhQDZurf29VZOaDypp2e0\nG+61d66jx7J3kR0pObes3lixL0t1l9o9RCa2mtOqu/uGpJ9WJE7Gmherjtr5wt6K7TyZ+IqVQxVj\nPwDWb9tdc5XBeJVYeaLDWtflXclQRNpT4SsAmtk7ga8AvcB17v6F2HELj58D7CHo6rsmcrwXeAjY\n5O7vLjq97e6Shf3cP7xtdGDg9t37Ko7nabxOCjJDW3aPVkNVK7nUO9HheMytJSLNV2jgCDP9ZcA7\ngI3AKjO7zd0fi5x2NjA3/DkVWB7+W/YJYC1wUJFp7RQ9PcbkWHVV/4ypzJ4xNfe0H/HG+Ki0kku9\nEx2qikukO9S7AmBW84FBdx92973AzcC5sXPOBW7ywP3ANDM7DMDMZgHvAq4rOJ1tLV7Fc9KR0yqO\nnzcwc3RE+fKVQ4lVQEnVRJcs7Oeqs47jjONfw4K5MyrOz1pyybM6YTutZCgi9Su6qmom8ExkeyOV\npYlq58wEngW+DHwaeFWBaWx7tQYGunvNKqBq1UTl88rrn+edsDDPRIeaFFGkOxTexlEvM3s38Jy7\nrzazRTXOXQp8rhXpGg+1BgZmqS6qVU1U74SFea7TpIgi7c3MotUVV7v70qTziq6q2gQcEdmeFe7L\ncs5bgfeY2XqCKq7TzezbSW/i7kvd3co/zUp8u6hVxZPUy2nf/lJq9VaR1UTd0HuqG+5BJK9oPlot\naECGSQ4bYWaTgHXAGQTBYBXwAXd/NHLOu4DLCHpVnQp81d3nx15nEXBl1l5VnTrJYTVJ1UjRQX6l\nknNBZN0OCCZEjG5fceax9JiNmfeqiBHg3TAxYjfcg0geTZvksFHuvt/MLgPuIOiO+y13f9TMloTH\nVwC3EwSNQYLuuIuLTFMnqlXFk9TTau3mXRXbtz68iR9/amFFYChqBHjSyoSdNi2JeoCJVFd0VRXu\nfru7H+vu/e7++XDfijBoEPamujQ8/gZ3fyjhNe7VGI508aqn4w+r7E8wtGU3y1cOVeyLZ4arN+xo\nSvVMPC1J793u1ANMpLq2bRyXfOI9lkZGnJ8Obqs455bVlU/+8XEce/ePVJRA3J3LTp+bKx0jJcfd\nObCvlxf2jYzuX91hT+zqASZSXaFtHOOl29o46nHRDasSB/dF6+pLJWfZvYPc+vAmcNi+ey87Xnh5\nJHr/jKncdeWiXO8bbxsoWzB3Bv9wUbwntoi0i7Zp45DmyzqlebVR4dHqqZ4eo8eMoS27x5wHBPMg\n51StLaAvlsa0+9C07SLtTYGjw2Sd76lctXLL6o0VExnuHSlVTL2e1uh73kkzc6evWsCaN/vgiu20\n+2jXOa0U0EQCChwdJmtvn3JPrEsW9ld01b3vya0sXznEkoX9rFg5xPptlaWNBXNnMLm3p+56/fI1\nqzfsYN9Iib4eY97sg8e8Vtp9tGuPpnYNaCKtpsDRYfIu5ZrUVXfNhh0VmSAE7Rnnz5uV+hSd5Yk7\n6+jwtPto1+Vqx/RCW7+dZfcMqgQiE44CR4ep1tsnLVNPyojjmeDsGVNrZvhZn7izBJi0XkvxpW1L\nKUvbNluez3FfqfYcYSLdSIGjw1R7ok/L1C9eMIf7h7exdvMuXnv4QXxswRz+juHcT/VZq5CyBJi0\nkkmepW2bLS3t8WAX72LcLlVqIkVT4Ohw5Sfk63/6VMX+8vYlC/v5xn3DFW0cf3ffcF3jFOJP3Ou3\nBqsFxksBzWyjiGfORY8HSUt7PNgtu2eQu5tcpTaeDfBq/JesFDg63NfvHeTaO9eN2b91997RJ+ek\nzLBWW0Q5E1m9fjt7R0ps3vkiuHPaMYeweeeLDG/dzdDWYLXA+4e3cePi+alVY3mV3/+RpyvTvnf/\nSKHtCnnS3sggwWqZ9Hg2wKvxX7JS4Ohwtz5cOdlwj0F0ppByxhTPDGs9XcYbz8uGt+2h/9CpFfvu\ne3IrF1z/4GhvrI8tmFPx3lkz1GiaXto/MmbkO8DmHS80lLnVuu88waCRaeKrZdLj2aOsXXuzSftR\n4Oh0sQHy0w7sY/uel0d/RzO/aGa4vMbTZWqmkTAoP+u642kZd7VgFWWx0kXezC2eYd8/vK2i+3E8\nGJSnV292CadaJp21xFNEtVK79mbrFt1UFajA0eHeOzCTayJVVYvfOpuenp4xf5zxjLzW02XaeuTv\nHZjJA09tr5i2Pf5a9VTFpAWBKX29XHr6MZTcK6rmsmRu0bTEx63UCnhFVd9Uy6SzlniKSJfm5ypW\nN1UFKnB0uD9ddAwWW2cjy1NMrafLcqZx3X1D7Nizf3T/EdMPwAmmEFkwdwZ9vT3sGylVBJGBo6bX\nVRVz4pHTqgarJYuC6q+Hn94ZvG+VgYVJspRk4mmpti++Xe9TZLVMOmv1VxHVSlqhsVjdVBWowNGB\nmlHkrfV0Wc5EVq/fzt1PbBnd39fbU/HEf9VZx41WfUVf66M3Vc6On6UqJj4x5Vv7D+aAvkmceOQ0\nHhjeVtHmkWdhpXhPrDkzpnL0jKnsTQh4cbUCbN6nyGing30lp6+3vpUNVK3UefL8ztq9WkuBowM1\no8ib9ely3uyDKwKH2dg2hqTXqqcq5p8f2VzxGv++6yXuuuLNLLtncExDedLTWrUv276RUuV57vz9\nh05mpOR8+MZVFeNb4moF2LyjyZNKP3fX8TtUtVLnyfM7a/dqLQWODtTKIm/8jz1rG0O1L0nqZPfx\ng+F20v0ljSGp9mWLz8y7Ydselt07yIORdpr7ntzK4htXVXQrhtoBttZo8njje7XfVZ5AmCVd0lzN\nKAHk+Z21e7WWAkcHamU1RfyPvVTyMWuXZ7muLO1JKt7Q/96BYHbepIb68hiS6PXVvmzxUhME3Zjj\n08nf9+RW3n7tvdz1qYVMmvRyFdLe/SUuipRMrr/glNHjtUaTRxvf3b1qp4Ok32Ezp3iRxtRbAqj3\nd9PuVZEKHB1oPKspGn3STXuSSmroh8r7Xb9td0WGH70+rXrs/uFtlb3AqhR9NmzbwxlfWsk9Vywa\n/YJfdOOqMSWT8qJUtUaTR/1wzSZ+/GcLx6RlwdwZib/DtM8qmiFF22ruevw5Sj42uCuQNKbeEkC9\nAafdqyIVODpQp1VTxDO5qOiTVLX7qjZ3Vfz6tJ5KNy6eX9GA7+4VpZuoDdv2sHzl0Oh7rt28q+J4\ndDt6byceOQ13Z86MKezcs4/nX9zPvuhoTEtOS9bFuKL3mtZTLFqaKleXxavgJJ8xyyzH1rWppt6A\n0+7fcQUOyS1v8TueyTWy5kfak1j0yzZS8jGZc7zKzcxYvX47a57eyc7Ikrnl1y/fZynW2+v4w141\n2gAef9pPU14YK2umkHavaRmQlyrTW16DJf6equLKLl5qve/JrbzjSys5fyB9KYJ2r3KqlwKH5BYv\nfteqGolncn09Njq1+/KVQ7kyrJ4eG12EKun6cmZ4y5qNFU/dUFlFEM289+8vccaXVrJh257R4/Gx\nKABTJvcy76jpzJ89PdO4kLIZUyez+LSjuWRhf67MOi3ApA3QPHz6gQxH7gWSA02799xpJ0nr2gxt\nGdvOFtfuVU71UuCQ3Fav316x/cM1GxneGmRUSRlQs9axGA0KkeVw05adjUp7Qp80qYd7rlhUcyzK\nm+ccwjcvPIWLblhVM61Ri087uunTxKe1+0ye1MuCuTNqjlFp55477Vgaqhas0z63dq9yqpcCh+S2\nL1YVklTNE9WsdSyyBIVqr1WriiDPWJT4/nLV24lHTsPCNJQH982rUcVUb2ad1u5Tfs94IIxr52qU\ndiwNlT/D6IMLtNfn1ioKHJJbfLTztAMns3135cSKUc1axyJLUIhnhgdP6ePDYTVRXtWqGZL2Z30a\nrpVZxxvbjWCalWrvM1Jy3J3+GVPBgnaUavOTZb2/dtCOpaHyZ1oOyuXR/6s37KgYU9SOpaVmU+CQ\n3OYdNb0i4z9/YGZiN9pq6s2w4plu/6FTRxsno68dbcTcvmcfZlbXF7dWY3s9a7On3ftIybnw+gcT\nG9vTJmGM9g7ryXGv5fsrp/ejNz3UNhldq0pD1X5XIyXn6/cOBssWeDCm6E8XHUNPj41+btGS3t2R\ntr5a7WvdQIFDcmvkiRvqr/dNel+HMRl6vBGzvBrixQvm8I37hutKd56qk6Sp28vdYdPufcXKoaoz\nDpfvG2Kz/W7dnXhOHvH03rJ6I+fPS+8tVLS8Dxf1PuVX+72uWDlUMUPCNXeuw6zydxf/rJMGlSad\n1w0UOCS3Rhr86v2Cx0dvf2zBHHp6LLGxOf60Wl4NMVoSyfskmKfqJH6sWnfYWtfFlZ+608ZwRJ/M\nkz5rD6+P7ou/b9Ko/FbL+zdWb5tItd9r2kzJ5c81HrSrDSod3PI7Tv7rH4+ZdaCTKXBIS9X7Ba82\nejvpi//3HzoZCEoaW3fvHT0WH8h3y+qNmQNYPBideOS0qpMZJvW+yfLUGb9u+pQ+Xnf4QUye1FvR\nyB5/rf5DpzL7kKljnsyjywqXpzwxs5qBNprmtCqbdlJvm0jWDhDRY/HAXa4yjQ8q7Z8xlf3uo928\n47MOdDIFDmmppC94llJItdHbSV/86NNq9As+9YBJFYFkKFw3Pcs8UKvXbx9df2ReOPK8WgBMmuIk\nSx19vNfOjj37+OngtjFTyMfv+fyBWYlpv3VN5bLCP1yzidkzKpf9jQbaaN18+X2yVNm0g3rbRNI6\nQJTcKwJmtcA9+5CpXPr2Y0YHlUZfa/7nf1JxbvzvuFMpcEhLJX3Bs5RCXnv4QRUZ8WsPPwhIrwuP\nZ+Abtu0KWCmhAAAPaElEQVQZ7TqbNudVVPzpspyJx8dyRK+vNq1ILeWAt2bDjorunrW6N8dfuxzs\nnt31YuUbWHqgjXbhLU+fcsPP1o9JZzvW2dfb4SJtmpvLT5/L5afPHXOsWpBKeq343+3UAyZlmqqk\n3SlwSEslfcGrLfoUdf0Fp7A4NkMtpNeFJ432ndzbwzcvPCV1zqu0tJS3a81dlJaucvXPD9dsYuee\nvUyb0sd7B2ZxaVgFVOvpuVb9f7U2EPdgsawrzjyWRyJdfJNeN/75RNXTwylre0u9GWr8M9m7v8RF\n1z+YOKNx3nTG05QnSF1/wSkVsxLE50HrVAoc0lJ5BtpFTZrUU1E3PFLy1AWTar121i9/1hl3szaA\nA2Oqf7bv2ce1d66jx15+8s+Stmoeio3sP6DXeHHEGd66m2vuXMf0Aydx0YI5qRl1PGBO6evlsFcf\nUFFlk0dST7P5Rx9c0QYD2VZPTPqdx4/9Ymjr6OJf0baFWoEhS+k3T8P9pEk9HHPoKyums0nqHdcu\n3aCzUuCQlkr6stSTUWZtZE+bMbeRiQaTSjNZq3CqnVfe3+g0FcOx3j77Y719drywv2ZbRTxgzps9\nncm9PWNWgEyS9DtO6mm2eecLFftuWb0xNfNM+53Hj02Z3FtxbbltodbfTVoje9aOAvH7P/HIaYkP\nH+04Oj6rwgOHmb0T+ArQC1zn7l+IHbfw+DnAHuBCd19jZkcANwG/R9DR7Rvu/pWi0yv1yfr0VO3L\nkvcLk7UXTaOZcJ6JBtdvG7sqYdxIycdMLR99vWb43Yv7K7bjs/uWpQW6aMBMmgE4a1VZWs+t+Cy+\nQ1t3p5ba0n7n8WMHTOphz96R0e1ym1itv5u00m/WjgLx+7/yzGO56qzjxjx8tOPo+KwKDRxm1gss\nA94BbARWmdlt7v5Y5LSzgbnhz6nA8vDf/cAVYRB5FbDazH4cu1baRFJVRHTq9HJG2qwvSzvMsxTv\nBZVlttT4IL8D+3rCKqBZuWfPreaEWIPsEdMPZMP2F8acV2vMR/kekjoCjPY227CDfSMl+nqMebMP\nTixdlHtufe+hZyqqbA6ffiDWY5k6KZTTW+13Hj/22sNehZnx+LPPV7SJxZ/+TzpyWsV7pJV+45N7\nVktvfN/DT+/kmxeekut+2l3RJY75wKC7DwOY2c3AuUA08z8XuMndHbjfzKaZ2WHu/izwLIC7P29m\na4GZsWulTSRVRcDYJ9RmfFmqzc/Uall7QUXFj72lf0ZFplJr9tx4Bp80Gj7ekeCbHzyZD9+0arTO\nH+C0Yw6p+MzSqk2SMtukBvjy8rzVem71x+r6J0/q5fyBWZk6KUC+HnQ/G9rOVWcdx7c/8qaK14iX\nvqLbtYJ2fHLPaunN+jfeznOF1VJ04JgJPBPZ3khQmqh1zkzCoAFgZrOBk4AHikikNK7aIDKozCyb\n8WVpZH6mIuQJhrXOrVUiSyrZJQXp+CCzV0zqHbOdtmZKWvBz4OGUdpryuJD47zg+x1l8UGP53GoZ\neFK14Wi7w5pNPPvbyu7HSfdw28ObK7b/+eHNfPyMY4H0qWJg7OSec2ZMTfz7zfo33slTrrd947iZ\nvRL4AfBJd++O0TNdqFqdOGRbHjaPdqsbzhMMa52bN7DEB5RV+yxqvW7a8Uee3llxbrkrb9KDQrl0\nUV5sa/X67VwwvI2+3h4Gjpw2pitw0t9DnjVL4u0O8bSMEX++iGzXmiomHvj+YN6sxAeWTg4IWRUd\nODYBR0S2Z4X7Mp1jZn0EQeM77n5LtTcxs6XA55qQXqlT9MtSSphJtpnGs2642tNw1oyi1rnlz6rc\ndrB6/XaW3TM4WiUVnx8pPsCs3mqRtCf/+HuWBwdO6etlz76XG6D7D53KxQvm8LW7n+T6nz1VMdU+\nBDPIlgdgpskyu0D58yhPYBkVXXEx7ryTZlYEmvJyvlB7qphOrlrKysyi9XFXu/vSxPO8So+LJiVi\nErAOOIMgGKwCPuDuj0bOeRdwGUGvqlOBr7r7/LC31Y3Adnf/ZM739SLvS8ZXUmBqVVVVfGBcfDqQ\not4nvqJfeX6kjy2Yw9/VOeNv3jRUm5Op7KqzjgOoOnAw6fykzy7pM46/bvzziLrizGOrLmWc9rdT\nKjkXRKa1T0tjNzIz3D3TH0+hJQ53329mlwF3EHTH/Za7P2pmS8LjK4DbCYLGIEF33MXh5W8FPgj8\n2sweCff9hbvfXmSapf2NZ1VAq6rJalVJledHguL6/lebkyneyyr6hB+fBSDP65cllbo2bK9cQ/3+\n4W0V21P6ejls2gGcd9JMDBKrumo1flebKqaTB+oVpfA2jjCjvz22b0Xk/w5cmnDdTxlbIykyrlpV\nTTame2nGKqki01B+z6S0rdmwg+Urh8b0wKr1+kmSFkqK2zdSWaNw6enHpHYfhuSeY+W2mPL8XNEV\nFy9eMIflK4cmxMJMebV947hII5r9tNiqeu74+yRVSRUtbebY8v744MArzzyWK848dnR0teMMb325\ntFBtCviytEWqDp7Sx/Y9le0m5dLOxQvmjE5BEx9gWQ5QSaXFpGBS/n98huPodROdAod0tVrTOuQN\nLK2qJkt6n1a8b5bPI5q2+NN9ebBbeVbZeKmh2hTwZWmLVE2fOnlM4Fh82tGJpZNyI3w0QCWVoNKC\nQLUp0DtpoF5RFDikq+UdFwETuxoi7+dRrTorOrJ8wdwZFSPL08R/P9ESSsm9okfUgrkzqk7fUZ4F\nOSqpBLV85VDVqrV49WD/jKmjS+pOdAoc0tUaHXA30eT9PKpVZ1Vbx6SW+O8rWkIplbxqb6ksbU9J\npbjRaWNii1gtmDuD6y84pbAea51OgUO6WqMD7iaavJ9Htaq7egNy2u+r2sjxpBUa8y7kFF3Eqp7x\nORNNoeM4xovGcXS/ZjV6j+eYkGZrxmfSrM+j0fEuWe+lVeNqJoK2GcchUpRmtU1001NlMz6TZn0e\njfY+y3ovqmocHwoc0pGUYYzVTp9JWrVSNJhUWz42672oqnF8KHBIR1KGMVa7fybVxkwklSwmwtTk\nnUyBQzqSMoyx2v0zyVKKKO+bCFOTdzIFDulIyjDGavfPpFopImlfu9/LRKfAISINydoDKq0U0a6l\nJEmm7rgi0hB1ie0Oebrjpq+oIiJSQzv15pLWUOAQkYYkLUMr3U1tHCLSkHbvzSXNpzYOERFRG4eI\niBRHgUNERHJR4BARkVwUOEREJBcFDhERyUWBQ0REclHgEBGRXBQ4REQkFwUOERHJRYFDRERyUeAQ\nEZFcFDhERCQXBQ4REclFgUNERHJR4BARkVwUOEREJBcFDhERyaXwwGFm7zSzJ8xs0Mw+k3DczOyr\n4fFfmdlA1mtFRKT1Cg0cZtYLLAPOBk4A3m9mJ8ROOxuYG/5cDCzPca2IiLRY0SWO+cCguw+7+17g\nZuDc2DnnAjd54H5gmpkdlvFaERFpsaIDx0zgmcj2xnBflnOyXCsiIi2mxnEREcllUsGvvwk4IrI9\nK9yX5Zy+DNcCYGZLgc/F9tWVYBGRicrMPLJ5tbsvTTzP3ZP2NysRk4B1wBkEmf4q4APu/mjknHcB\nlwHnAKcCX3X3+VmubQUzc3fviiike2lPupf2pHuprtASh7vvN7PLgDuAXuBb7v6omS0Jj68AbicI\nGoPAHmBx2rVFpldERGortMTRDfTU0Z50L+1J99Kemn0vahyv7erxTkAT6V7ak+6lPeleqlCJQ0RE\nclGJQ0REclHgEBGRXCZs4OimyRfrvRczO8LM7jGzx8zsUTP7ROtTPyatdf9ewuO9Zvawmf2odamu\nrsG/s2lm9n0ze9zM1prZm1ub+jFpbeRePhv+nf3GzL5rZge0NvVj0lrrXo43s1+Y2UtmdmWea1ut\n3ntp6Pvv7hPuh6B77xAwB5gM/BI4IXbOOcC/AQa8CXgg67UddC+HAQPh/19FMG6mI+8lcvzPgH8E\nftTJf2fhsRuBj4T/nwxM68R7AWYDTwEHhtvfAy5s83t5DXAK8HngyjzXdtC91P39n6gljm6afLHu\ne3H3Z919DYC7Pw+sZXznA2vk94KZzQLeBVzXykSnqPt+zOzVwNuAbwK4+15339nKxMc08rvZBewD\nDrRgYO8UYHML0x5X817c/Tl3X0WQ7lzXtljd99LI93+iBo5umnyxkXsZZWazgZOAB5qewuwavZcv\nA58GSkUlMKdG7udoYAtwfVj1dp2ZTS0ysTXUfS/uvh24BngaeBb4rbvfWWBaa2nkO9yJ3/+a8n7/\nJ2rgkAgzeyXwA+CT7r5rvNNTDzN7N/Ccu68e77Q0ySRgAFju7icBu4Fxr0+vh5n1A58iCIaHA1PN\n7E/GN1VSVs/3f6IGjkYmX8xybSs1ci+YWR/BH8133P2WAtOZRSP38lbgPWa2nqC4frqZfbu4pGbS\nyP1sBDa6e/kJ8PsEgWS8NHIvJwM/d/ct7r4PuAV4S4FpraWR73Anfv+rqvv7P16NOuP5Q/A0N0zw\nBFRuUHpd7Jx3UdnQ92DWazvoXgy4CfjyeP9OGr2X2DmLaI/G8YbuB7gPOC78/1Lgi514L8CJwKME\nbRtG0Oh/eTvfS+TcpVQ2KHfc9z/lXur+/o/LzbbDD0EPkHUEPRL+Mty3BFgS+VCXhcd/DZycdm0n\n3gtwGuDAr4BHwp9zOvFeYq+xiDYIHE34OzsReCj8/dwKTO/ge/lz4DHgN8A/AK9o83v5fYJS3y5g\nZ/j/g6pd24n30sj3X1OOiIhILhO1jUNEROqkwCEiIrkocIiISC4KHCIikosCh4iI5KLAISIiuShw\niIhILgocIiKSiwKHSJ3MbHa4yNINZrbOzP7RzM40s5+b2ZNmNt/MpprZt8zswXCW23Mj195nZmvC\nn7eE+xeZ2b2RBZy+Y2Y2vncqUkkjx0XqFE5FPUgwHfWjwCqC6Rs+DLwHWEwwzcZj7v5tM5sGPBie\n70DJ3V80s7nAd939ZDNbBPwz8DqCNSt+Blzl7j9t4a2JpJo03gkQ6XBPufuvAczsUeAn7u5m9muC\nle9mEczaW16y8wDgSIKg8L/N7ERgBDg28poPuvvG8DUfCV9HgUPahgKHSGNeivy/FNkuEXy/RoA/\ncPcnoheZ2VLgP4A3ElQZv1jlNUfQ91TajNo4RIp1B3B5uZ3CzE4K978aeNbdS8AHCdaOFukIChwi\nxfproA/4VViV9dfh/q8DF5jZL4HjCVb4E+kIahwXEZFcVOIQEZFcFDhERCQXBQ4REclFgUNERHJR\n4BARkVwUOEREJBcFDhERyUWBQ0REcvn/LoeoUWOZMN0AAAAASUVORK5CYII=\n", + "image/png": "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\nSUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2163,7 +2162,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 37, @@ -2172,9 +2171,9 @@ }, { "data": { - "image/png": "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\n9OnTh2bNmtGmTRsuu+wyioqKSt/PzLjvvvvYdddd2W677fjDH/7A3Llz6dOnD02bNmXo0KEbrZ8J\nSggi0mBcccUVXHHFFaxatYq5c+dy8sknA/Dmm28CsGLFClavXk2fPn0YOXIkI0eO5LXXXuOrr75i\n9erVXHbZZQB89tlnXHLJJTz++OMsXryYlStXlna8s97YsWMZMmQIK1as4LTTTiMej3PXXXexfPly\npkyZwqRJk7jvvvs22ubll1/mo48+4t133+WOO+7gvPPO4/HHH+ebb75hxowZjBo1KqPlo4QgIvXe\n4MGDadasWelwySWXlLteTk4Oc+bMYfny5eTn57P//vtv8T0ff/xxrr76ajp37kx+fj5/+ctfGD16\nNCUlJTz11FMce+yx9OvXj9zcXG6++ebNemnr06cPgwcPJhaL0bhxY/bee2/2339/EokEHTt25MIL\nL+SNN97YaJvrrruOJk2a0K1bN7p3786RRx5J586dadq0KYMGDWLatGnVL6wKKCGISL337LPPsmLF\nitJh01/e640YMYJZs2bRpUsX9tlnH55//vktvueiRYvo0KFD6XSHDh0oKSlhyZIlLFq0iPbt25cu\n22abbWjRosVG25ddDjBr1iyOOeYYWrduTZMmTbjxxhtZvnz5Ruu0atWqdLxx48abTa9evbqCUqg+\nJQQRaTB22203Ro0axdKlS7n++usZMmQIa9asKbcP5rZt2zJ//vzS6W+++YZEIkGrVq1o06YNCxYs\nKF22bt06vv/++4223/Q9L774Yrp06cLs2bNZtWoVf/7zn+tcHxNKCCLSYDz22GMsW7aMWCxGs2bN\nAIjFYuy4447EYjG++uqr0nVPPfVU7rrrLr7++mtWr17NjTfeyNChQ0kkEgwZMoRx48YxefJkioqK\nKCgoqPTL/aeffqJJkybk5+fzxRdfVNjvc1Qa7g23IlIt9fG5kPHjx3P11Vezdu1aOnTowOjRo2nc\nuDEAw4YNo2/fvhQXFzN+/HjOPfdcFi1aRP/+/fn555854ogjuOeee4DgYbd77rmHU045hTVr1nDl\nlVfSsmVL8vLytrjvO++8kwsuuIA77riDnj17MnToUF599dVaOe50qQtNybiqPmimB9PqHnWhWbHV\nq1fTrFkzZs+eTadOnSKLQ11oiohEYNy4caxdu5Y1a9ZwzTXX0KNHDzp27Bh1WNWiKiOpEZluxkCk\nrhk7dixnnHEG7k7v3r0ZPXp0uRen6xMlBBGRrTB8+HCGDx8edRg1SlVGIiICKCGISBpisVjG29GR\n6lm3bl21W2pVQhCRSvXq1Ys777xTSaEOKikpYe7cuZxyyikceuih1XovJQQRqdSYMWMYM2YMjRs3\nxsw01KEhLy+Pfv360b17d8aOHVutv7MuKotIpdq1a8f7778fdRiSYTpDEBERQAlBRERCSggiIgIo\nIYiISEgJQUREACUEEREJKSGIiAighCAiIiElBBERAZQQREQklNGEYGYPmdlSM/u0zLwCM1toZh+H\nw1GZjEFERNKT6TOEkcCR5cy/y933CocXMxyDiIikIaMJwd3fBH7I5D5ERKRmRHUN4Tdm9klYpbR9\nRDGIiEgZUTR/fT9wC+Dh69+Bc8tb0cwKgD/VWmRSp3W84YVy58+7/eh6sb5IlMzMy0ze5O4Fm65T\n6wnB3ZesHzezfwPPV7BuAVBQZn3f0roiIrJl7m6VrVPrVUZm1qbM5AnAp1taV0REak9GzxDMbBRw\nMLCDmS0gqP452Mz2IqgymgdcmMkYREQkPRlNCO5+ajmzR2RynyIisnX0pLKIiABKCCIiElJCEBER\nQAlBRERCSggiIgIoIYiISCiKpitEGqQtNXUBau5C6gadIYiICKCEICIiISUEEREBlBBERCSkhCAi\nIoASgoiIhJQQREQEUEIQEZGQEoKIiABKCCIiElLTFSKSti01v6GmN7KDzhBERARQQhARkZASgoiI\nAEoIIiISUkIQERFACUFEREJKCCIiAighiIhISAlBRESANJ9UNrNngBHAS+6eymxIIplVUWf3Ig1Z\numcI9wG/Bmab2e1mtnsGYxIRkQiklRDcfaK7nwb0AuYBE81sspmdY2Y5mQxQRERqR9rXEMysBXA2\ncB4wDfgnQYKYkJHIRESkVqV7DWEMsDvwKHCsuy8OF/3PzD7IVHAiIlJ70m3++t/u/mLZGWaW5+6F\n7t47A3GJiEgtS7fK6NZy5k2pyUBEKF4Hy2fT3b6iky0ml+KoIxJpUCo8QzCz1sBOQGMz6wlYuKgJ\nsE2GY5OGoPhnmP5fmP4/WDAVPMXzecGiIo8z29vxZuqXjE/uw3TfhQ0fQRGpaZVVGR1BcCG5HfCP\nMvN/Am7MUEzSUMyZBOOugJXflrs415J0s/l0i83n4sQ4Zqd24pHkQJ5JHsgaGtdysCLZr8KE4O4P\nAw+b2Unu/nQtxSRZz7kkPhYee2LDrKbtYY/joVU3LnhiFtuxjl/EvmXf2Jf0jM0BYLfYQm6JjeS6\nxP94PHkYw0uOYjlNIzoGkexTWZXR6e7+GNDRzK7edLm7/6OczUQqdH1iNBcnxgUTuflwWAHsfTbE\ng0daXhkdPkkcPhPfih84Pv4Op8cnsnNsGdvZOi5KjOPs+HhGJQ+BlXtB051q+zBEsk5lVUbbhq/5\nmQ5EGoaz4+M3JIOm7eG0J6Fl1wq3WUJzHkwey/Dk0QyITePCxPPsG/uSRlbMOYmX4Z97Qs/ToO+V\n0LxTjcdcF5u6UGf3kgmVVRn9X/h6U+2EI9msp81mWOJxAJZ4M1qd/Txs3zHt7VPEmJTam0lFe7Ov\nfc5liWfpH58BqWL4cCR89EhQ7XTA5bBTr8wchEgWS+u2UzO7w8yamFmOmU0ys2Vmdnqmg5PssR1r\nuTvnXnIsSZHHOa/omiolg01N9a6cWfw7BhfeDL8YFMz0FMwcA/8eACOP4eDYxxhqi1EkXek+h3C4\nu68CjiFoy2hX4NpMBSXZ56rEU7SPLQPgryWnMsM718j7fuy7wq9Hw0XvwC+HQiw86Z33FiNz7+DV\n3N9yYXwcLVhZI/sTyWbpJoT1VUtHA0+6u/67JG1d7BvOjL8CwHupLoxIDqr5nbTuDic+CFdMhz6X\nBRergU6xJfwuZxRT8i7j3py7OSg2nTjJmt+/SBZINyE8b2ZfAHsDk8xsR+DnzIUl2eSPiUdIWIoS\nj/HH4rPJ6MNlTdvBEbfBVTO5qfgMZqeCu49yLckx8Xd5OPevvJd3KQWJkfSyWYBnLhaReibd5q9v\nAA4Aert7MbAGOL6y7czsITNbamaflpnX3MwmmNns8HX7rQ1e6r4+sZkcEP8MgEeTA/nSd66dHTdu\nxn+SgxhYdAdDCv/IM8l+FHpwW+sOtoqzE6/wTF4Bb+ZeyW8TT7CrLaiduETqsKp0odkFGGpmZwJD\ngMPT2GYkcOQm824AJrn7bsCkcFqyknNlIniecZ3n8q+SwRHEYHzgXbi6+BJ6F97PNcUX8mayB0kP\nzlJ2ji3jN4lnmZh3HS/l3sBF8efYiWURxCkSvXSbv34U2AX4GEorYB14pKLt3P1NM+u4yezjgYPD\n8YeB14Hr04lD6pf9Y5+zX+wLAB5JDoz8qeKf2IankgfxVPIgdmQFR8ffZXD8HfaKzQWga+wbusa+\n4Yac0UxN7c5zyQN4MbkfP9Ak0rhFaku6zV/3BvZw95qocG1Vpj+F74BWNfCeUgedEx8PwM+ew4Ml\nx0QczcaW0YyRySMZmTySDvYdx8amMDj+DrvGFgGwb+xL9o19SUHiYd5K9WBssi8TUnurDSXJaukm\nhE+B1sDiylasCnd3M9NVvSzUzpZyWOxDAJ5N9uX7Otzm0Hxvzb3JE7g3OZg9bD7HxadwbHwyO9n3\nJCzFgPh0BsSns8bzGJfsw/+SA5jmu6KWVyXbpJsQdgA+M7OpQOH6me5+3Fbsc4mZtXH3xWbWBli6\npRXNrAD401bsQzIk3WYczohPIB7m+oeTR1TrvWqP8Zl35LOSjvy1ZCi9bRbHx9/hqPh7NLfVbGuF\nnJJ4nVMSr/Nlqh3/Sw5gTLIvP9ZAlVJNlUXdK1OpKzb58X2Tuxdsuk66CWGzDavhOeAs4PbwdeyW\nVgwDLt23zibqh8b8zCnx1wB4N9WVz71DxBFVnRPjfe/C+yVdKCg5i/6xTxgaf51DYx+RsBS7xxbw\nx9ijXJ8YxSup3oxKHsLkVDd01iB1lbtX+uFMKyG4+xtm1gHYzd0nmtk2QLyy7cxsFMEF5B3MbAHB\nr/3bgSfM7P8D5gMnpxOD1B9Hxt6nqa0F4OGSdG5Gq9tKSPBqqhevpnqxIys4Kf4mQ+Ov0Sm2hDwr\n4dj4uxwbf5c5qbY8mhwIP/eDRnW3ikxkS9K9y+h84AKgOcHdRjsBDwCHVrSdu5+6hUUVbif120nx\nNwH4wfOZmNo74mhq1jKa8UDyOB5IHst+9gVDE69xVOw9Glkxu8YWcVPsYfj7U7DnUNjnfGi1R9Qh\ni6Qt3ecQLgX6AqsA3H020DJTQUn91YbvOSAWPIg2NtmX4rRrJesb4z3vytXFl7Bf4b+4tfg05qfC\nf4niNfDBQ3B/H/jPUfDpM5BU/9BS96X731ro7kVmQRWUmSXQM/9SjhPibxELL/U8lewfcTS1YyX5\nDE8ezYjkIA6KfcLIbtNh9iuAw/x3giG/NVfE+/JocqCea5A6K90zhDfM7EagsZkNBJ4ExmUuLKmf\nnJPibwHwRao9M71jtOHUMifG66m94LQn4PJpQb8MjcOWWVZ/x1U5TzM57zfclhhBJ6vRO7hFakS6\nCeEGYBkwA7gQeBH4faaCkvqpq33DLrHgi+6ZZD8a9B03zTvB4bfA1Z/D8fdBm70AaGTFnJaYxKTc\na3gw5+/0ti/QybbUFek2bpcCngUucfch7v7vGnpqWbLIoPh7peMvpvaPMJI6JKdx0L3nBa9zcuEf\nmJAMenKLmXN4/EOeyruZMbl/4vDY++rMRyJXYUKwQIGZLQe+BL4Me0v7Y+2EJ/WHc3QsSAjTU51Z\n4DtGHE8dY8ZU78r5xddwaOHf+G/JgNLWV3vG5vBg7l28mHsjR8XeVWKQyFhFP/TN7GpgEHCBu38d\nzusM3A+Md/e7aiXKDfHoxCRiW3oSdjdbwIS86wC4vfgUHkhuzUPsDcsOrOTMxMucFX+l9LkNgFmp\nnbi3ZDDPp/qQqlKDxNGZd/vRUYcgFTCztB5Mq+zTdgZw6vpkAODuXwGnA2dWL0TJJkfFNlQXvZTa\nN8JI6o/lNOUfJSfTt/Bu7ig+mR886OXtF7GF3J37LybmXsNJsTdJUBJxpNJQVJYQctx9+aYz3X0Z\nkJOZkKQ+GhSfCsDMVAfme+uIo6lfVrMN9yUH06/wbm4r/jXLPLgttXPsO/6e+wCv5v6WX8cnkUdR\nxJFKtqssIVT0CdSnUwDoaIvpEvsWgJeSOjvYWmtpxL+Tx3Bg4T+5qfgMvvPgltWdY8v4c84I3sq7\nkvPjz7Mt6yKOVLJVZQlhTzNbVc7wE9CjNgKUuu+Q2Mel4y+n9okwkuzwM3n8JzmIgwrv4vfF57DA\ndwCgpa1gWM5/eSfvcq5KPMn2QcMBIjWmwoTg7nF3b1LOsJ27q8pIADgk9hEAC3wHZvtOEUeTPQrJ\n5bHkQA4u/AdXFV3M7FRQts1sDVckxvBO3hUUJEayiy2MOFLJFvXjFgaps/JZy75hN5mTkj1p0A+j\nZUgJCcakDuTwor9yQdFVfJzqDMA2VsjZiVeYlHctj+fcxhGxqcRLe7gVqbpsbXlMakm/2KfkWvAl\n9FqqZ8TRZDcnxiupfXilqDcHxGZyUXwc/eMzAOgbn0nf+EwWe3OeSfbjmeSBzNXZmlSREoJUyyGx\naQCs9TympNTUc+0wJqe6MznVnY4lizk9PpFfxd+gqa2ljf3ApYnnuDTxHB+nOvNM8kDGJfvUSK9u\nkv0qfDCtrtGDadEr+2CakWJq3iXsaKuYkOzF+cXXRBhZw9aYnzkuPoWh8dfoFZuz0bJij/NqqidP\nJA/i9dReJCvv26rK9GBa3Zbug2k6Q5Ct1sO+ZkcL7nRRdVG01tGI/yUH8L/kADrZYgbH3+ak+Fu0\ns+XkWJIj4h9wRPwDlnoznkkeyJPJ/qpSks3oorJstUPi00rHX03uFWEkUtbX3oa7Sn7FgYX/j5ML\n/8ATJQexxvOA4NbVixLjmJR3Lf/J+Sv72BcRRyt1iRKCbLV+sU8B+DzVnu9oEXE0siknxlTvynUl\nF7JP4f1cW3wBU1O7ly4fEJ/Ok3k3MyrnVrra/AgjlbpCCUG2Sj5r2cuCuuq3U3pGsa5bSyOeTB7M\nyUV/4pDCO3m05LDS1lb7xD/j+dwbuSXxENvwc8SRSpSUEGSr7B/7nIQFzTS/k+oecTRSFV95W/5Q\nci79Cv/JQyVHUuxx4uackZjIi7m/Y0+bU/mbSFZSQpCt0jesLiryOO+lukQcjWyNZTTj5pIzObLo\ndt5NdQWgY2wJT+TezHGxdyKOTqKghCBbZf31g4/8F6yjUcTRSHXM9Z04tWgYfy4+lWKPk2cl3J37\nLy6OPxd1aFLLlBCkylrxA7vFgvZz3k6quigbODEeTB7LmcU3sNK3AeD6nNFcpKTQoCghSJWtPzsA\nXT/INlNS3TipqIBl3hSAG3JGc2b85YijktqihCBV1jceJIRVvg2feOeIo5GaNsfbcWrRMJaHHfX8\nKfEIB8Y+iTgqqQ1KCFJFXnqGMCW1R0aaQZDozfF2nF10Hes8l7g5/8q5m062OOqwJMPUdIVUyS9s\nAS1tBQBvq7ooq33qnbm2+ELuzb2HJraWf+bcy0lFN1FcztdG2TauylIbR/WLzhCkSspeP9ADadnv\n+VQfHiwJvtR/GfuaKxNPRRyRZJISglTJ+ucPFnoLvvbWEUcjteHOkpOZmeoAwMXxcfSyWRFHJJmi\nhCDpKyli/9hnALyT7I56R2sYisjh8uLLKPQcYubcljOCBCVRhyUZoIQg6Vv4AdtaIaDqooZmru/E\nPSWDAega+5Zz4uMjjkgyQQlB0vfV66Wjk1PdootDIvFg8hjmptoAcFXiaVrxQ8QRSU1TQpD0zX0N\ngM9TO7OcphEHI7WtiBx+X3IuANtYIVckno44IqlpSgiSnp9XwsIPAXhL1UUN1pRUNyYlg97xhsZf\nZxdbGHFEUpOUECQ9894BTwJqrqKh+2vJKSTdiJtzfWJ01OFIDVJCkPR8FVQXFXpio163pOGZ5e15\nOtkfgMPjH9LTZkcckdQUJQRJT3hB+aOUmrsW+EfJEAo9eGL5ssSzEUcjNUUJQSq3ciEsDx5GUnMV\nAvAdLXgyeRAAh8an0c3mRRuQ1AglBKlcmdtNdf1A1nsgeRwlHnyFXKqzhKyghCCVW58Q8pqquWsp\ntcB3ZEw7uJUTAAAO0klEQVSyHwBHxaeyqy2IOCKpLiUEqZj7hoTQ6UBS+shIGfcljyflQRMm58df\njDgaqS79d0vFlsyENUuD8c4HRxmJ1EFfexsmpPYGYHD8HVqwMuKIpDqUEKRi4e2mAOxySHRxSJ01\nomQQAHlWzGnxSRFHI9URWUIws3lmNsPMPjazD6KKQyoRNldB052hua4fyOamehdmpDoCcEZiArkU\nRxuQbLWozxAGuPte7t474jikPMU/w/zJwfguB4OpuWspjzGi5CgAdrSVHBefHHE8srWiTghSl337\nHpSsC8Y7D4g2FqnTXkjtzxJvBsC58fGARxuQbJUoE4IDE83sQzO7IMI4ZEtKrx+YLihLhYpJ8EjJ\n4QDsEZtPLzVnUS9FmRD6uftewCDgUjPrH2EssonJc5ez4tNXAFjRbA+em/0zz01fFHFUUpc9kTyY\nYo8DcFpiYsTRyNaILCG4+8LwdSkwBth303XMrMDMfP1Q2zE2ZP+Z8BFNfgy6y/zv8l24fNQ0Lh81\nLeKopC5bRjNeTgWXA4+JvUczfoo4Iimr7HepmRWUt04kCcHMtjWz7daPA4cDn266nrsXuLutH2o7\nzoase+E0YmEOVv8Hkq7Hk4cBwS2ov4q/EXE0UlbZ71J3LyhvnajOEFoBb5vZdGAq8IK7q5PWOqRH\n4UcArPNcPkz9IuJopL6YktqDOam2APw6PglSqYgjkqqIJCG4+1fuvmc4dHP326KIQ7bAnR6FQfXQ\n1FQXisiJOCCpP4zHk4cC0Cm2BL5+PdpwpEp026ls7oev2DG5BFB1kVTd08kDWee5wcT7I6INRqpE\nCUE2N2dD8wNvKyFIFa0in3HJPsHEly8F/WlIvaCEIJubHdxuutib84W3jzgYqY8eCy8u40mY9mi0\nwUjalBBkY0VrYd5bALyW3BPQzV1SdZ/4LqXtG/HRI5AsiTQeSY8Sgmxs3ltQ8jMAr6V6RhyM1Gfr\nb0Fl1cLSs06p25QQZGPhP24JCXWXKdXyXPIAyN0umPjgoWiDkbQoIcgG7qUJ4fPcHqylUcQBSX22\nlkaw59BgYs5E+HFepPFI5ZQQZIPls2DFNwBMa7RZSyIiVbf3OeGIw4cPRxqKVE4JQTYoU8/7caN9\nIgxEskbr7tB+v2B82qNQUhRtPFIhJQTZYNbLwev2nVgcbxdtLJI9ep8bvK5ZBl88H20sUiElBAms\n+R7mvxOM/+JI9Y4mNWeP46Hx9sG4Li7XaUoIEpj1EnjYEFnXY6ONRbJLTmPY67RgfN5bsGxWtPHI\nFikhSODz8FR+mx1g5/2jjUWyz95nbxj/cGRUUUgllBAECn+Cua8G47sPglg82ngk++ywG3Q8MBj/\n+HEoXhdtPFIuJQQJ7hFPFgbjqi6STFl/cfnnFTDz2WhjkXIpIciG6qLcfOh0ULSxSPbqcgxsu2Mw\nrovLdZISQkNXvA5mhZ3V7TYQcvR0smRIIhd6nhGML5gK382INh7ZTCLqACRiX74ERauD8e4nRRuL\nZJ2ON7yw0XQ725k3cy3or/uD/8Ax/4goMimPzhAauhlPBa95TWHXgdHGIllvgbfkjdQvg4lPnghu\naJA6QwmhIVv344bmKvY4VtVFUitKm8Uu+gk+/m+0wchGlBAass/GQqo4GO/xq2hjkQbj1VRP2L5T\nMDHlX+o8pw5RQmjI1lcX5bfecI+4SIaliEGfS4OJFfPhi3HRBiSllBAaqh/nwby3g/HuJ+phNKld\ne50GjZsH45PvCfrikMgpITRUHz0ChP+EPU+PNBRpgHK3gX3OC8YXfgjfvBttPAIoITRMyWKY9lgw\n3m4faNUt2nikYdr3fIjnBeOT7442FgGUEBqmWeNh9ZJgvLRHK5Falt8S9jwlGP/yRT2oVgcoITRE\n65sNyGsK3U6INhZp2PpeARZev3r99mhjESWEBmfJZxtaNt1zaFCXKxKVFrtsOEv44nlY/Em08TRw\nSggNzZR7wxGD/S6KNBQRAPpfo7OEOkIJoSFZtThoLgCg6zHBrzORqDXvDHudGox/+QJ881608TRg\nSggNyXv3b3gy+YDLo41FpKyDrt9wx9HLv4NUKtp4GiglhIbipyXw3oPBePv9of2+0cYjUlaznTc8\nvbzwQ/j0qWjjaaCUEBqKt+6EkrDbwkOGRRuLSHkOvBq2bRmMTyyAojWRhtMQKSE0BD/OD9qeB+h8\nMHTqH2U0IuXL2w4O/UMwvmohvPbnaONpgJQQGoJXfr/h2sGhf4w2FpGK7HUatAurM9+9DxZ8EG08\nDYwSQrabPQE+fy4Y734S7LR3tPGIVCQWh+PugXgueArGXhp08yq1QgkhmxWuhhevCcZzt4MjdAou\n9UDLLtD/umB82Rcw/oZo42lAlBCy2fgbgmauAQ75PWzXOtJwRNLW76rgbjiAD0du6LtDMkoJIVt9\n+gxMezQY79Qf9r0g2nhEqiKegCEjoPH2wfTYy3Q9oRYoIWSjRR/Ds5cE442aweAHIKY/tdQzTdvB\nicPBYsEt0/8dCt/PjTqqrKZviWzz/VwYdUrwD2QxOGkENN0p6qhEts5uh8HRfw/G1y6Hh4+F5XOi\njSmLKSFkk+/nwsPHwU+Lg+nDbwv+oUTqs97nQv9rg/FVC+E/g4KzYKlxSgjZYt47MPxQWLUgmO5/\nLex/cbQxidSUAcPg4N8F42uWwkNHwMejoo0pCykh1HclRTDpFnj4GFj3YzCv/3XBP5BZtLGJ1BQz\nOPgGOPL28JrCz/DsRfC/04NWfKVGRJYQzOxIM/vSzOaYmW40rip3+Ow5eKBv0E6RpyCWA8ffF7RV\npGQg2Wj/i+GMZ2GbFsH05+Pg3t7Bj6K1P0QbWxYwd6/9nZrFgVnAQGAB8D5wqrt/Vsl2HkW8dcrK\nhfDp08G92T+UueOiVQ844QFo3b1GdnPqg+8y5avva+S9RDY17/ajq/cGq5cGz9l8+vSGefE82OP4\noCfADv0gp1H19pFFzAx3r/RXYqI2ginHvsAcd/8KwMxGA8cDFSaEBsU9qAL6cR4s+TToWnD+O7B0\nkyJq3BwO/G3wnEEiN5JQRWpdfksY8hD0PANevRUWfgDJQpjxRDAkGkGHA6Btr+BH0o5dg7vt8raL\nOvI6LaqEsBPwbZnpBcB+GdlT0Vr4YETwBUt4drF+vPRsY9NxNl+3wu2qsi4bLy8pDJr5LVodvq6B\ntd/DqkUbmqsuT4vdYO+zodcZ0KhpFQtFJEvsMiBowffrN+CjR4IqpGRRcI1h7qsb+g9fL68pNGkT\n/M/k5gcJIm87SORBLBEO8aD6df102erXjapia2p+mvJbwy9/VfXtqiCqhFB7itYErX3Wd4nG0LoH\n7Hoo7DoQduqV0esEnXbclp8Kizeb/+nCVRnbp8hWMQuSQueDYd2KIDnMmQTzJ8P3cyj9kQZQuBKW\nrYwkzGrbqXfGE0JU1xD6AAXufkQ4/TsAd//LJusVAH+q9QBFRLLbTe5esOnMqBJCguCi8qHAQoKL\nyr9295m1sG9P5+JKQ6Ny2ZzKpHwql81lS5lEUmXk7iVmdhnwMhAHHqqNZCAiIlsWyRlClLIlk9c0\nlcvmVCblU7lsLlvKpCE+qXxT1AHUUSqXzalMyqdy2VxWlEmDO0MQEZHyNcQzBBERKYcSgoiIAFma\nEMysuZlNMLPZ4ev2W1iv3Ab2zKzAzBaa2cfhcFTtRV+zKmtE0AJ3h8s/MbNe6W5bn1WzXOaZ2Yzw\ns5E1/TqmUSZdzGyKmRWa2TVV2bY+q2a51K/Pirtn3QDcAdwQjt8A/LWcdeLAXKAzkAtMB/YIlxUA\n10R9HDVQDls8xjLrHAW8RPBc/f7Ae+luW1+H6pRLuGwesEPUxxFBmbQE9gFuK/v/oc9K+eVSHz8r\nWXmGQNBQ3sPh+MPA4HLWKW1gz92LgPUN7GWTdI7xeOARD7wLNDOzNmluW19Vp1yyVaVl4u5L3f19\nYNM2TRr0Z6WCcql3sjUhtHL39b1mfAe0Kmed8hrYK9v58G/CqoKHtlTlVA9UdowVrZPOtvVVdcoF\ngsZxJprZh2Z2QcairF3V+Xs39M9KRerVZ6XeNm5nZhOB1uUsGlZ2wt3dzKp6b+39wC0Ef8xbgL8D\n525NnJKV+rn7QjNrCUwwsy/c/c2og5I6qV59VuptQnD3LfYeb2ZLzKyNuy8OT/OXlrPaQqB9mel2\n4TzcfUmZ9/o38HzNRF3rtniMaayTk8a29VV1ygV3X/+61MzGEFQr1Nl/8jSlUyaZ2Lauq9ax1bfP\nSrZWGT0HnBWOnwWMLWed94HdzKyTmeUCp4TbsUld8QnApxmMNZO2eIxlPAecGd5Vsz+wMqxuS2fb\n+mqry8XMtjWz7QDMbFvgcOrv56Os6vy9G/pnpVz18rMS9VXtTAxAC2ASMBuYCDQP57cFXiyz3lEE\nra7OBYaVmf8oMAP4hOCP3ybqY6pGWWx2jMBFwEXhuAH/CpfPAHpXVj7ZMGxtuRDcbTI9HGZmU7mk\nUSatCerQVwErwvEm+qyUXy718bOipitERATI3iojERGpIiUEEREBlBBERCSkhCAiIoASgoiIhJQQ\nREQEUEIQKZeZuZk9VmY6YWbLzKy+PrUuUiklBJHyrQG6m1njcHog2dMcg0i5lBBEtuxF4Ohw/FRg\n1PoFYbMED5nZVDObZmbHh/M7mtlbZvZROBwQzj/YzF43s6fM7Asze9zMrNaPSKQCSggiWzYaOMXM\nGgG/BN4rs2wY8Kq77wsMAP4WtlezFBjo7r2AocDdZbbpCVwJ7EHQrEHfzB+CSPrqbWunIpnm7p+Y\nWUeCs4MXN1l8OHBcmS4TGwE7A4uAe81sLyAJ/KLMNlPdfQGAmX0MdATezlT8IlWlhCBSseeAO4GD\nCRpNXM+Ak9z9y7Irm1kBsATYk+AM/OcyiwvLjCfR/5/UMaoyEqnYQ8BN7j5jk/kvE/SqZwBm1jOc\n3xRY7O4p4AyCPnlF6gUlBJEKuPsCd7+7nEW3EHQi9ImZzQynAe4DzjKz6UAXgruVROoFNX8tIiKA\nzhBERCSkhCAiIoASgoiIhJQQREQEUEIQEZGQEoKIiABKCCIiElJCEBERAP5/6ThHKkzIn9UAAAAA\nSUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEZCAYAAACNebLAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4VOXd//H3N2GRLWxKwpooAoJoBUVUXFtFKKJWFAHF\ntXXBrWJdqr9LwdpWrY+11gcei1bBEjdUUNwQsKIoIogsAmFHEAibEMBIgdy/P86BJmFIJsnM3JPk\n87quczFz5txnPjeT5Dtnu4855xARESkuxXcAERFJTioQIiISkQqEiIhEpAIhIiIRqUCIiEhEKhAi\nIhKRCoRICczs92b2D985RHxQgZCEM7PTzWy6mW0zs81m9qmZnVjBdV5tZp8Wm/eCmT1ckfU65/7s\nnLuhIus4FDMrMLMdZpZnZmvM7H/MzKJse5aZrYlHLpH9avgOINWLmTUA3gFuBF4HagFnALsrumog\npld9mlmqc25fLNdZjAOOd86tNLOjgGnAQuD5aOIR4/6KFKctCEm09oBzzr3mArudc5Odcwv2L2Bm\nvzGzheE36wVmdkI4/14zW1Zo/sXh/GOAkcCp4TfyrWb2G+AK4J5w+Qnhss3NbJyZbTSz5WZ2W6H3\nfcjMXjezl8xsG3B1OO+l8PXM8Fv/VWa2OlzH/YXaH2Zmo8P3/9bM7i7lW76FE865FcB04IRC67um\n0P/DMjO7IZxfF3gPaFFoCyTDAveFy24ys1fMrFHYpnbYr81m9oOZfWlmR5T3Q5TqQQVCEm0JsM/M\nXjSzXvv/gO1nZpcBDwJXOufSgAuBLeHLy4Ae4fzhwL/MLN05txi4CfjCOdfAOdfEOTcKGAs87pxL\nc85dFO6+eQeYAzQHfgHcYWbnFYpwIfCac64RkB3OK/5NvQfQDjgXeNDMOoTzhwFtgCzgPODKCG0j\nCovcGcDSQrNzgV+G/b0W+KuZneCc+xHoDawL+5vmnNsA3B7mPwNoAfwAjAjXdTWQBrQEmoT/X/nR\nZJPqSwVCEso5twM4HSgA/gFsNLMJhb7NXk/wR/3rcPkVzrk14eM3nHO54ePXCf6YnlyGt+8GHO6c\n+6Nzbp9zbhXwHDCg0DJfOOfeCd/jp0hdAIY55/7jnJsHzAV+Fr52GfBH51yec24d8HQUmb42s50E\nu5Y+JtgSInz/98OMOOc+BSYR/PE/lBuBB5xz651ze4CHgUvNLAXYAzQF2odbbnOcczujyCfVmAqE\nJJxzLsc5d51zrg3QmeDb7lPhy62B5ZHahbt25oS7SH4AjgUOL8NbZwItw11AW8N1/B5oVmiZaA78\n5hZ6/CNQP3zcAlhbxnV1cc7VB/oD3YF6+18ws95m9oWZbQmz9qbk/mYCb+3vH0HR2QOkAy8BHwKv\nmNlaM3vUzFKjyCfVmAqEeOWcWwK8SFAoIPij2rb4cmbWhmCLY4hzrrFzrjHwLeE+fCLvyik+bw2w\nItwF1SRcT0PnXN8S2pTFeqBVoedtomiz/xjEOGAG8BCAmdUCxgGPA0eE/X2fkvv7HdC7WP/qhVsU\ne51zf3DOHQucBvQFrip7F6U6UYGQhDKzDmY21Mxahs9bAwOBL8JFngN+Z2Zdw9fbhsvUI9gttdnM\nUszsWv5bVCD4Vt/KzGoWm3dUoeczgR1mdk94QDnVzI41s5PK0oUSXnsN+L2ZNQr7d0sZ1gvwKPAb\nM2tGcHZXLWCzc67AzHoDPQstmws0NbO0QvOeBf4UFlPM7AgzuzB8fLaZdQ53N+0k2LIoKGM+qWZU\nICTRdhDsSvnSzHYAnwPzgN/BgW/SfwSyzSwPeAto4pxbBPwPwbfsDQS7lz4rtN6pBFsUG8xsYzjv\neeDYcJfLm865AuACgjOFVgIbgVEEB2+jVfybe+HnDwPfh+ueRHAab0mn7xZZV3gm1yfA3eHxgTuA\n18PdRQOACYWWzQFeBlaE/csA/hYuM8nMthP83+4/RpNBsEWyneD/6WOC3U4ih2TxvGGQmbUCxhDs\nAy0ARjnnnjazxsCrBPtMVwH9nXPb4xZExAMzuwm43Dl3ju8sIuUR7y2IvcDQcL/nqcAt4el89wGT\nnXMdCL75/T7OOUTiLrwW4bTweoQOwF3Am75ziZRXXAuEc26Dc+6b8PFOYBHBQbyLgNHhYqOBi+OZ\nQyRBahEcB8gDJhPsHhtZYguRJBbXXUxF3sgsC/g3wYHFNeFZGftf2+qca5KQICIiEpWEHKQ2s/oE\nB8juCLckSjrQJyIiSSDug/WZWQ2C4vCSc27/WRi54RAJueHZFxsP0VaFQ0SkHJxzUY0MXJJEbEH8\nE1jonPtboXlvA9eEj6+m0Ol7xTnnqux0ySWXeM+g/qlv6l/Vm2IlrlsQZtaDYETN+WY2h2BX0v3A\nY8BrZnYdsJpgmAEREUkicS0QzrnpwKHGezk3nu8tIiIVoyupPerYsaPvCHFVlftXlfsG6p8EVCA8\n6tSpk+8IcVWV+1eV+wbqnwRUIETkIEOHDsXMqux0xRVXeM8QiykrKyuuPwe6J7WIHCQ3NzemZ8NI\nfJhV+EzWEmkLQkREIlKBEBGRiFQgREQkIhUISXoZGVlFDsxlZGT5jiRSLahASNLLzV1NcBF+MAXP\npbo68sgjmTp16oHnr7zyCk2bNmXatGmkpKSQlpZGWloazZs358ILL2Ty5MlF2mdlZVG3bl3S0tJo\n0KABaWlp3H777YnuRqWgAiEildbo0aO57bbbeO+998jMzMTM2L59O3l5ecydO5dzzz2XX/3qV4wZ\nM+ZAGzPj3XffJS8vjx07dpCXl8fTTz/tsRfJSwVCRCqlZ599lrvvvptJkybRvXv3A/P3n57brFkz\nbr/9doYNG8Y999xTpK1O4Y2OCoSIVDojRoxg2LBhTJ06lS5dupS47CWXXMLGjRvJyclJULqqQxfK\niUiZ2fDYXKDlHirfN/nJkydzzjnn0Llz51KXbdGiBQBbt249MO/iiy+mRo0aOOcwM/7yl79w/fXX\nlytLVaYCISJlVt4/7LEycuRIHnnkEa6//nqef/75Epf9/vvvAWjatOmBeRMmTOCcc86Ja8aqQLuY\nRKTSSU9PZ8qUKXz66acMGTKkxGXffPNN0tPTad++/YF5OgYRHRUIEamUMjIymDJlCh9++CF33XUX\nQJE7qm3cuJFnnnmGP/zhDzz66KM+o1Za2sUkIpVK4QHqWrduzZQpUzjrrLPYsGEDZkbjxo1xzlGv\nXj1OOukkxo0bx3nnnVdkHX379iU19b/3MjvvvPN44403EtaHykIFQkQqlRUrVhR5npWVxerVwcWT\nY8eOLbX9ypUr45KrKtIuJhERiUgFQkREIlKBEBGRiFQgREQkIhUIERGJSAVCREQiUoEQEZGIVCBE\nRCQiFQgRqVI6d+7MtGnTfMeoElQgRCQqxe8NHusp2nuNF7/lKAR3ljvjjDMAWLBgAWeeeWaJ61i9\nejUpKSkUFBSU6/+iutBQGyISlf/eGzxe66/YPSYKj9FUmv33gYjXqK779u0rMtZTZaUtCBGpUgpv\nYXz11Vd069aNhg0b0rx5c373u98BcNZZZwHQqFEj0tLS+PLLL3HO8cgjj5CVlUVGRgbXXHMNeXl5\nB9Y7ZswYsrKyOOKII3jkkUeKvM/w4cO57LLLGDx4MI0aNWL06NF89dVXnHbaaTRu3JiWLVty2223\nsXfv3gPrS0lJYeTIkbRv356GDRvy4IMPsmLFCnr06EGjRo0YMGBAkeV9UIEQkUrvUFsCd9xxB7/9\n7W/Zvn07y5cvp3///gAHjlHk5eWRl5dH9+7deeGFFxgzZgyffPIJK1asYMeOHdx6660ALFy4kFtu\nuYWXX36Z9evXs337dtatW1fkvd5++2369+/Ptm3buOKKK6hRowZPPfUUW7du5YsvvmDq1KmMGDGi\nSJtJkyYxZ84cZsyYweOPP86NN95IdnY2a9asYf78+bz88sux/q8qExUIEal0Lr74Ypo0aXJguuWW\nWyIuV6tWLZYtW8aWLVuoW7cuJ598cpHXCxeW7Oxshg4dSmZmJnXr1uXPf/4zr776KgUFBbzxxhtc\neOGFnHrqqdSoUYOHH374oPc69dRT6du3LwC1a9emS5cunHzyyZgZbdq04YYbbuCTTz4p0ubee++l\nXr16dOzYkc6dO9OzZ08yMzNp0KABvXv3Zs6cORX9r6oQFQgRqXQmTJjA1q1bD0zFv5nv9/zzz5OT\nk8MxxxxD9+7deffddw+5znXr1pGZmXngeWZmJnv37iU3N5d169bRunXrA6/VqVOnyC1MgSKvAyxd\nupS+ffvSvHlzGjVqxAMPPMDmzZuLLNOsWbMi60xPTy/yfOfOnSX8L8SfCoSIVDrRHlxu27Yt2dnZ\nbNq0iXvuuYdLL72U/Pz8iAe0W7RoceC+EhCc6VSjRg3S09Np3rw5a9euPfBafn4+W7ZsKdK++Dpv\nvvlmOnbsyPLly9m2bRt//OMfK92tTlUgRKTKGjt27IFv7Q0bNsTMSElJ4YgjjiAlJYXly5cfWHbg\nwIH89a9/ZdWqVezcuZMHHniAAQMGkJKSwqWXXso777zDjBkz2LNnD8OGDSv1vXfs2EFaWhp169Zl\n8eLFjBw5Ml7djBsVCBGJSnp6JmBxm4L1l66001kLv/7BBx9w7LHHkpaWxp133smrr75K7dq1qVOn\nDg888AA9evSgSZMmzJw5k+uuu47Bgwdz5pln0rZtW+rWrcvTTz8NQKdOnfj73//O5ZdfTosWLUhL\nS6NZs2bUrl37kDmeeOIJxo4dS1paGjfeeCMDBgwosR9lOU03USyZN3nMzCVzvorKzs5m0KBBvmPE\nTaz6F/ziFP45iN/569Gq6p9dPK8RqAp27dpFo0aNWLZsWZHjFol2qM8pnF/hiqMtCBGRKEycOJH8\n/Hx27drFXXfdxfHHH++1OCSCCoSISBQmTJhAixYtaNWqFcuXL+eVV17xHSnuNNSGiEgURo0axahR\no3zHSChtQUhSiTQgXHnbRTv4m4hEpi0ISSqRB4QrvUhEalfRwd9EqjttQYiISETaghCRg6Snpyfl\neflSVLzPotIWhIgc5Mknn8Q5V2WnsWPHes8Qi2nVqlVx/TlQgRARkYhUIEREJKK4Fggze97Mcs1s\nXqF5D5nZWjP7Opx6xTODiIiUT7y3IF4Azo8w/0nnXNdw+iDOGUREpBziWiCcc58BP0R4SadHiIgk\nOV/HIG41s2/M7Dkza+gpg4iIlMDHdRAjgIedc87MHgGeBK4/1ML9+vU78Lhjx4506tQp/gkTZPr0\n6b4jxFU8+5ednR2z5YYMGcr27bkHnjdsmM6IEU+W2EafXeVW1fq3cOFCFi1aFPsVx/s8XSATmFfW\n18LXXVU2duxY3xHiqjz9Axy4YlPxeQf/XByqXfnes/R2+uwqt6rev/BnuMJ/vxOxi2n/LaOCJ2YZ\nhV67BFiQgAwiIlJGcd3FZGbZwNlAUzP7DngIOMfMTgAKgFXAjfHMICIi5RPXAuGci3RPxhfi+Z4i\nIhIbupJaREQiUoEQEZGIVCBERCQiFQgREYlIBUJERCJSgRARkYhUIEREJCIVCKnCamNmRaaMjKxy\nrSkjI6vIeq644gpSU+vFbP3JYn8/r7jiiirTJyk/H4P1iSTIbsAVmZObW76R5nNzVx+0roICi9n6\nk0Wkflb2Pkn5aQtCREQiUoEQEZGIVCBERCQiFQgREYlIBUJERCJSgRARkYhUIEREJCIVCBERiUgF\nQkREIlKBEImp8g3vUXwoj7IMcVG8rYbGkFjRUBsiMVW+4T0qMsRF8bYaGkNiRVsQIiISkQqEiIhE\npAIhIiIRqUCIiEhEKhAiIhKRCoSIiESkAiEiIhGpQIiISEQqECIiEpEKhFRCBw9nISWryFAeUn1p\nqA2phA4ezgJUJEpSkaE8pPrSFoSIiESkAiEiIhGpQIiISEQqECIiElFUBcLM3jSzPmamgiIiUk1E\nexbTCOBa4Gkzex14wTmXE79YIlE66iPoNhJaALWaQF5LWH0mzLsS1voOJ1K5RVUgnHOTgclm1hAY\nGD5eA4wC/uWc2xPHjCIHq5EPfW+A1l/Ap/fDh2/Bf5ZAo5Vw1BT41VXB2bBTP4Bl56PTYEXKLurr\nIMysKXAlMBiYA4wFTgeuBs6ORziRiFKAARfDT41gxHzYWwe4Hjgcfjwc1nWD6ffAManQ6w7IawWT\nnoANXTwHF6lcoioQZvYW0AF4CejrnFsfvvSqmc2KVziRiHoDBTXhzbFQcIgfYZcCi4Ccb6Hrc3Bl\nb1jSB6YmMqhI5RbtQedRzrlOzrk/7y8OZlYbwDl3UtzSiRR39AfQDhj38qGLQ2EFNWDWTfD3HMhv\nCkPAzjSsZiKH6Sg6NEhqar0ohwo5eEgRDY8hiRRtgXgkwrwvYhlEpFQ1foILboK3gf80KFvb3Q3h\no8eDo2bN+8GtmdD5ZaAgDkEPenOCYS6CqaDgxyLPDx42JHI7cOGQGSKJUeJXMDPLAFoCdcysC/89\n0pcG1I1zNpGiuo2A9V1gRQX+SP4AvDYOMj+B84dC96dhCrDKoQPZIkWVto1+PnAN0Ap4stD8HcD9\nccokcrBaO6HHYzBmCjC+4utbfRaM+gqOfwku+AL2doEZd8CCAbC34qsXqQpKLBDOudHAaDPr55x7\nI0GZRA52wovw3RmwsXPs1ulSYO7VMO8aaPtosDVx/lBYDFNWTOHsrLNJTUmN3fuJVDKl7WK60jn3\nLyDLzIYWf90592SEZiKxZcDJf4e3n4vP+h2wrFcwNVgHnVtyz+R7WL9jPQM6D2Bg54HxeV+RJFfa\nQep64b/1gQYRJpH4OwrYUxe+Oz3+77WjBXwBs2+YzdSrp9KgVgMGvTkIbgPOfggOXxz/DCJJorRd\nTM+G/w4vz8rN7HngAiDXOXd8OK8x8CqQCawC+jvntpdn/VJNnAB8/WsSfRD5mMOPYfg5wxl29jBS\nWqXAcTvg6p/DjuYw8zaYD+xLaCSRhIp2sL7HzSzNzGqa2RQz22RmV0bR9AWCA92F3QdMds51ILhs\n6fdliyzVSq0dwXUP317uLYKZwTrgwyfhyTUw9Y9wXDb8Fjj9Uai5y1s2kXiK9jqIns65PIKtgVXA\n0cDdpTVyzn1GcGJhYRcBo8PHo4GLo8wg1VHHt2A1wRAaycClBscqXpoE/wIyvoHb28GJz0KKhiST\nqiXaArF/V1Qf4PUK7hJq5pzLBXDObQCaVWBdUtUdNxbm+Q5xCLnAuFfg5bfh2Nfg5p8FO05Fqoho\nB+ubaGaLgXzgZjM7AvgpRhkOdRkpAP369TvwuGPHjnTq1ClGb+vf9OnTfUeIq9L6N2TIULZvzz30\nArW3B6O1vhrjYKWqXbYhONadBGMmB1s7/frBsl8HV23nN4lLuuzs7JgsE4/lKouq9ru3cOFCFi1a\nFPsVO+eimoAmQGr4uC6QEWW7TGBeoeeLgPTwcQawqIS2riobO3as7whxVVr/AAeu2FRo3rGvOAb9\nMsJypbSr8LwKrKs2jt63Ou5q7mg3Mfbrj/A7EWn90f5fl3e5yq6q/+6Fn1nUf98PNUU93DdwDMH1\nEIXbjIminVH09JO3Ca7OfoxgqPAJZcgg1UmHd2BJX+A930mitxt4/++w8LLgnhRLJ8IkQIcnpBKK\n9iyml4AnCO7/0C2cSh3F1cyygc+B9mb2nZldCzwKnGdmOcAvwuciRaXshaPfhyUX+E5SPqvPhJFz\nodYuuAloOdN3IpEyi3YL4iSgU7jpEjXn3KBDvHRuWdYj1VDr6bAtK7jZT2W1uyG8NQY6vQQD+8KX\nt8Nn95Vy1E0keUR7FtMCguMFIonR7n1Y2sd3ithYCPxjNhw1ObjQLs13IJHoRFsgDgcWmtmHZvb2\n/imewaSaO3IqrKhCG5p5rYIznZb1ghuATuN8JxIpVbS7mIbFM4RIEYdtC8Y8WnuK7ySx5VLhs9/D\nyvuh333B3fHe/xvsqVd6WxEPotqCcM59QnAFdc3w8VfA13HMJdVZ5jRYcyrsq+U7SXx8D/zfnOBA\n/I1dofls34lEIor2LKbfAOOAZ8NZLYnJXVtEIjhyCqz8ue8U8fWfBjD+Rfj3cLiyN5wGWCJufyoS\nvWiPQdwC9ADyAJxzS9EQGRIvR06t+gVivwUDYNTM4CqjwT2D+1GIJIloC8Ru59x/9j8JL5bTyXoS\ne/WAtLWwoYvvJImzLQteBFafEexy6qBrRyU5RHuQ+hMzux+oY2bnAUOAd+IXS6qtLIJbixaU5SL/\nKqAA+OSh4MytS66Eoz/UFdjiXbRbEPcBmwhukXIjwdgH/y9eoaQaa0NwFXJ1taYH/N83wZlcvwHS\nk3UoW6kOoj2LqYDgoPQQ59ylzrlRZb2qWiQqrYE1p/lO4dfuhvDGWPgMuOoXcMafIHW371RSDZVY\nICwwzMw2AzlATng3uQcTE0+qlZq7gksy13f1nSQJWHAfjFFfQcsvYchx0HaS71BSzZS2BXEnwdlL\n3ZxzTZxzTYDuQA8zuzPu6aR6aflVcBOevYf5TpI8tmXBKxOC251ecBMMhLkb5vpOJdVEaQViMDDQ\nObdy/wzn3ArgSuCqeAaTaqj157DGd4gkteQC+N+FsAJ6je3F5eMuZ16ujk9IfJVWIGo65zYXn+mc\n2wTUjE8kqbZUIEq29zD4EpbetpSuGV3pPbY354w+J7iGImWv73RSBZVWIP5TztdEysYKVCCiVL9W\nfe49/V5W3rGSG0+8MdgJPLQVnH8nNNcIOBI7pRWIn5lZXoRpB3BcIgJKNdE0B35qBDt9B6k8aqXW\nYkDnAfA88MK0YPiO/pfCLfDYZ4+xfsd63xGlkivxaiTnXGqigkg11/rz8PTWlaUuKhFsaQ8fPwwf\nD4c2KSztuZROIzpxepvTuaHrDb7TSSUV7YVyIvHVakbVG97bC4Pv4LkLn2PNnWvo17EfD/77weC2\np+3e9R1OKhkVCEkOLWbB9918p6gEamNmRaZDqV+rPteccA1f3/A1fAz0uhMu6w91N5VxXUWXy8jI\ninGfJFmpQIh/NfLh8BzIPd53kkpgN8E4mYWnkplZcJnryLmwLRNu6BYezI52XUWXy81dXeFeSOVQ\nzUZEk6SUPg82d4C9dXwnqdr21oGP/gLfd4cre8Er6KwxKZG2IMS/FrNh3Um+U1QfCy+FN/8FA9Dd\n7KREKhDiX4tZKhCJtrwnTAQG/Arqb/CdRpKUCoT412IWrD/Rd4rqZxEw51roN0i3O5WIVCDEr5o/\nQpNlkKvrLr345EGo8RN0+1/fSSQJqUCIXxnfwKZOsK+27yTVk0uF8S/C2cOh0SrfaSTJqECIXzr+\n4N+W9vDlbXDufb6TSJJRgRC/musMpqTw+d3QenpwRz+RkAqE+KUtiOSwpy5MfQR+4TuIJBMVCPGn\nFsF+743H+k5SxUQ/HEcR86+ANCBzWlzTSeWhAiH+ZAAbj4MC3Xsqtso+HAcABTXgU+Csh+OWTCoX\nFQjxpwXavZRs5gGHL4Z03fdaVCDEJxWI5LMPmHUTnPyM7ySSBFQgxB8ViOQ0+wboNA7qbPWdRDxT\ngRAv8nbnQQNg8zG+o0hxu5rBkr7Q5XnfScQzFQjx4uv1X0MuwYFRST5f3QxdnyPqA9xSJalAiBez\n1s2Cdb5TyCGtPQXMQasvfScRj1QgxAsViGRn8M3V8LPRvoOIRyoQ4oUKRCUwbzAc+5ruO1mNqUBI\nwv2Q/wMbd22ELb6TSIm2t4Hcn0F730HEFxUISbjZ62fTpXkXHf+sDOZeBcf7DiG+qEBIws1eN5sT\nm+sOcpXC4ovgSKDWDt9JxAMVCEm4Wetn0a1FN98xJBo/NYbvgPYTfScRD1QgJOFmrZvFSS10BXWl\n8S3BldVS7ahASEJt/nEzP+T/QNsmbX1HkWjlAEdNhlo7fSeRBFOBkISavW42J7Y4kRTTj16lkQ+s\nPRXaves7iSSYfksloWatm8VJzbV7qdL59jLtZqqGvBUIM1tlZnPNbI6ZzfSVQxJr1nodf6iUci6E\ntpMgdbfvJJJAPrcgCoCznXNdnHMne8whCaQD1JXUj0fAxs6Q9W/fSSSBfBYI8/z+kmAbdm7gxz0/\nktUoy3cUKY8lfaHD275TSAL5HGXFAR+Z2T7gH865UR6zSBzl5+fz1FNPMX/3fBrRiOHDh/uOJOWR\ncyFc2Qve8x1EEsVngejhnFtvZkcQFIpFzrnPii/Ur1+/A487duxIp06dEpkxrqZPn+47Qlzt79+C\nBQt44ol/see0o6BGC4ZPAajafa+SNnWEfTUhA7Kzs32nqZCq9ru3cOFCFi1aFPP1eisQzrn14b+b\nzOwt4GTgoALxxhtvJDpaQg0aNMh3hLgaNGgQU6ZMYcSIL9neoi58cy1wCfA4MNlzOikbC3Yztf9b\nlfi5rQp9OBQzi8l6vBwDMLO6ZlY/fFwP6Aks8JFFEsPhoMUs3YO6ssu5EDr4DiGJ4usgcTrwmZnN\nAWYA7zjnJnnKIgng6v0HUvbB9ta+o0hFrD4DmsC6HbqZR3XgpUA451Y6504IT3E9zjn3qI8ckjj7\n0vPCrYfYbPqKJwU1YTm8u0RXVVcHOs1UEmJfRp52L1UVOfD2Ep3uWh2oQEhC7G2eB2tP8R1DYmEZ\nfLLqE/L35PtOInGmAiFxt8/tC3Yxre3uO4rEQj50ad6FqSun+k4icaYCIXH33Y/fkbKrNuQ39R1F\nYuSCdhfwzpJ3fMeQOFOBkLhbuGMhqRvSfMeQGOrboS8Tl0zEOd1YvCpTgZC4W7RjEanrVSCqkg5N\nO1CnZh2+2fCN7ygSRyoQEneLdiyixvqGvmNIzNQmJSWFZe8uo+uArpgZGRlZvkNJHKhASFxt+2kb\nG3dvJGVzPd9RJGZ2Aw6WTIEO3QBHbu5q36EkDlQgJK5mfj+TdvXaYU4/alXOd6dDk6VQf4PvJBIn\n+q2VuJqxdgYd0zr6jiHxsK8WLO+pe1VXYSoQElefr/mcTg2qzhDtUsySC6D9RN8pJE5UICRu9rl9\nfLH2CzqndfYdReJlWW84cqrfO8tI3KhASNys2r2KzIaZNKypM5iqrB8Ph43HQZbvIBIPKhASN4vz\nF3Nm5pk+RG9GAAALWElEQVS+Y0i85fSF9r5DSDyoQEjcqEBUE0sugPboquoqSAVC4qLAFZCTn6MC\nUR1s6gQO5m+c7zuJxJgKhMTF/Nz5pKWmkVE/w3cUiTuDJTBxic5mqmpUICQupq2eRoc6unlxtZGD\nRnetglQgJC6mrppKpzq6/qHaWA2LNi1i466NvpNIDKlASMzt2beHj1d+TOe6uv6h2tgH5x51ru5V\nXcWoQEjMzfx+Jkc1PoqGNXT9Q3VyaadLeX3h675jSAypQEjMfbj8Q3q27ek7hiTYBe0vYPqa6WzN\n3+o7isSICoTE3KTlk1QgqqH6tepz3lHnMX7xeN9RJEZUICSmtuZvZeGmhfRo3cN3FPGg/7H9ee3b\n13zHkBhRgZCYmrR8EmdknkHtGrV9RxEP+rTrwxdrv2DLj1t8R5EYUIGQmBq/eDwXd7jYdwzxpF6t\nepzf9nzeXPSm7ygSAyoQEjO79+7mg2UfcGGHC31HEY8Gdh7I2PljfceQGFCBkJiZunIqnZt1Jr1+\nuu8o4lGf9n34dtO3rPhhhe8oUkEqEBIz4xeP51fH/Mp3DPGsVmotBnUexOhvRvuOIhWkAiExsbdg\nLxNyJnDxMTr+IHBtl2sZPXc0Ba7AdxSpABUIiYkpK6bQpmEb2jZp6zuKJIETMk6g0WGN+Peqf/uO\nIhWgAiEx8dK8lxh8/GDfMSSJ/Lrrr3l29rO+Y0gFqEBIhe38z04mLpnIgM4DfEeRJHLVz67io+Uf\nsWb7Gt9RpJxUIKTCxi0cxxmZZ3BEvSN8R5EkklY7jcHHD2bkrJG+o0g5qUBIhTjneGbmM9x04k2+\no0gSuvXkW3nu6+fI35PvO4qUgwqEVMjM72fyw08/0OvoXr6jSBJq17Qdp7U+jVFfj/IdRcpBBUIq\n5JmvnmHISUNITUn1HUWS1INnPchj0x/TVkQlpAIh5bbihxW8v/R9rutyne8oksS6Nu/KSS1O0lZE\nJaQCIeX2p0//xC3dbqFxnca+o0iSe+ish3j0s0fJ253nO4qUgQqElMvyrcsZv3g8vz3lt76jSCXQ\ntXlXeh3di4c/edh3FCkDFQgplzs/vJPfnfY7bT1I1B4991FGzx3Nwk0LfUeRKKlASJm9k/MOS7Ys\nYeipQ31HkUqkWb1mDD97ONdNuI49+/b4jiNRUIGQMtny4xaGvDeEZ375DLVSa/mOI5XMzSfdTOM6\njbWrqZJQgZCoOee4dsK1XH7s5Zx71Lm+40glZGa8cNEL/PObfzJh8QTfcaQUNXwHkMrj/in3s+nH\nTYzrP853FKnEMupnMP7y8fwy+5dk1M+ge6vuviPJIWgLQkrlnOPPn/6Z8TnjmThwonYtSYV1a9mN\nFy96kb4v92Xa6mm+48gheCsQZtbLzBab2RIzu9dXDinZ7r27ufW9W3l5wct8NPgjmtZt6juSVBF9\n2vchu182/V7rx//N+j+cc74jSTFeCoSZpQDPAOcDxwIDzewYH1l8WrgwuU/3m7F2Bic/dzLf7/ie\nT6/9lFZprcrUPtn7J/6de9S5TL9uOiNnjaT32N7kbM5JyPvqZzM6vrYgTgaWOudWO+f2AK8AF3nK\n4s2iRYt8RzjInn17eHfJu/TJ7kP/1/tz92l389blb9HwsIZlXlcy9k+ST/um7Zn1m1n0bNuTHv/s\nQf/X+zN15VT2FuyN23vqZzM6vg5StwQK30VkLUHRkARxzvHjnh9Zk7eGZVuXsXjzYj777jM+/e5T\nOjTtwDUnXMOb/d+kdo3avqNKNVAztSZDTx3Kr7v+mhe/eZG7P7qbVdtW8fMjf86JzU/k+PTjadOw\nDW0atiGtdprvuNWGzmLyYPa62Tz47weZnTWb3mN7A8EfbIcr879lbbtrzy62/bSNbT9to0ZKDVqn\nteboJkfTrkk7BnYeyIg+I2jRoEVM+1uzZk1++mkuaWl9D8zbvXsZu3fH9G2kCkirncbt3W/n9u63\nszZvLdNWT2PWulk8NeMp1uStYc32Nexz+2hQqwENajegfq36HFbjMFItldSU1IP+TbHIO0lmZ82m\nT3afg+YbFlXOdk3a8ddef61QXysD83FgyMxOAYY553qFz+8DnHPusWLL6aiViEg5OOeiq3Yl8FUg\nUoEc4BfAemAmMNA5px2DIiJJwssuJufcPjO7FZhEcKD8eRUHEZHk4mULQkREkp/3K6nNrLGZTTKz\nHDP70Mwink9pZs+bWa6ZzStPex/K0LeIFw2a2UNmttbMvg6npLjxczQXOZrZ02a21My+MbMTytLW\nt3L0r0uh+avMbK6ZzTGzmYlLHb3S+mdmHczsczP7ycyGlqWtbxXsW1X47AaFfZhrZp+Z2fHRto3I\nOed1Ah4D7gkf3ws8eojlTgdOAOaVp32y9o2gSC8DMoGawDfAMeFrDwFDffcj2ryFlukNvBs+7g7M\niLat76ki/QufrwAa++5HBft3OHAi8IfCP3/J/vlVpG9V6LM7BWgYPu5V0d8971sQBBfIjQ4fjwYu\njrSQc+4z4IfytvckmmylXTRY4TMRYiyaixwvAsYAOOe+BBqaWXqUbX2rSP8g+LyS4ffqUErtn3Nu\ns3NuNlD8SrVk//wq0jeoGp/dDOfc9vDpDIJrzqJqG0ky/Gc0c87lAjjnNgDNEtw+nqLJFumiwZaF\nnt8a7sZ4Lkl2n5WWt6RlomnrW3n6932hZRzwkZl9ZWa/iVvK8qvIZ5Dsn19F81W1z+7XwPvlbAsk\n6CwmM/sISC88i+DD+H8RFq/oUfOEHnWPc99GAA8755yZPQI8CVxfrqB+JdtWUDz1cM6tN7MjCP7Y\nLAq3fiX5VZnPzszOAa4l2DVfbgkpEM658w71WnjgOd05l2tmGcDGMq6+ou0rJAZ9+x5oU+h5q3Ae\nzrlNheaPAt6JQeSKOmTeYsu0jrBMrSja+laR/uGcWx/+u8nM3iLYtE+mPzLR9C8ebROhQvmqymcX\nHpj+B9DLOfdDWdoWlwy7mN4GrgkfXw2UdJsp4+Bvo2Vpn2jRZPsKONrMMs2sFjAgbEdYVPa7BFgQ\nv6hRO2TeQt4GroIDV81vC3e1RdPWt3L3z8zqmln9cH49oCfJ8ZkVVtbPoPDvW7J/fuXuW1X57Mys\nDfAGMNg5t7wsbSNKgiPzTYDJBFdWTwIahfObAxMLLZcNrAN2A98B15bUPhmmMvStV7jMUuC+QvPH\nAPMIzjgYD6T77tOh8gI3AjcUWuYZgrMm5gJdS+trMk3l7R9wZPhZzQHmV9b+EewyXQNsA7aGv2/1\nK8PnV96+VaHPbhSwBfg67MvMktqWNulCORERiSgZdjGJiEgSUoEQEZGIVCBERCQiFQgREYlIBUJE\nRCJSgRARkYhUIEQAMyswszGFnqea2SYzS6YLwUQSSgVCJLAL6GxmtcPn51F0cDORakcFQuS/3gP6\nhI8HAi/vfyEciuF5M5thZrPNrG84P9PMppnZrHA6JZx/lpl9bGavm9kiM3sp4b0RqSAVCJGAIxgj\nf2C4FXE88GWh1x8ApjjnTgF+DjxhZnWAXOBc59xJBOPb/L1QmxOA24FOQFszOy3+3RCJnYSM5ipS\nGTjnFphZFsHWw7sUHaiuJ9DXzO4On+8fmXY98IwFt1XdB7Qr1GamC0cINbNvgCzg8zh2QSSmVCBE\ninob+AtwNsHtKfczoJ9zbmnhhc3sIWCDc+54M0sF8gu9vLvQ433o900qGe1iEgns31r4JzDcOfdt\nsdc/JNhdFCwcbDEANCTYioBgCPDUeIYUSSQVCJGAA3DOfe+ceybC638AaprZPDObDzwczh8BXGNm\nc4D2BGdDHXL9IpWJhvsWEZGItAUhIiIRqUCIiEhEKhAiIhKRCoSIiESkAiEiIhGpQIiISEQqECIi\nEpEKhIiIRPT/Abz6PSTJ+oGTAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2207,7 +2206,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.5.2" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index de92c2bcb..19182aa7a 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -46,12 +46,12 @@ "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')" + "h1 = openmc.Nuclide('H1')\n", + "b10 = openmc.Nuclide('B10')\n", + "o16 = openmc.Nuclide('O16')\n", + "u235 = openmc.Nuclide('U235')\n", + "u238 = openmc.Nuclide('U238')\n", + "zr90 = openmc.Nuclide('Zr90')" ] }, { @@ -339,7 +339,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AFBRQpN8J6/ygAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDUtMDVUMTQ6NDE6\nNTUtMDY6MDCnHFu9AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA1LTA1VDE0OjQxOjU1LTA2OjAw\n1kHjAQAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AHFwIoGZ/M0BAAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDctMjJUMjE6NDA6\nMjUtMDU6MDBskW7/AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA3LTIyVDIxOjQwOjI1LTA1OjAw\nHczWQwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -446,28 +446,28 @@ " 888\n", "\n", " Copyright: 2011-2016 Massachusetts Institute of Technology\n", - " License: http://openmc.readthedocs.org/en/latest/license.html\n", + " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.7.1\n", - " Git SHA1: df280b60eb1c6d7b7f842e05ede734a4883a0fc8\n", - " Date/Time: 2016-05-05 14:41:55\n", + " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", + " Date/Time: 2016-07-22 21:40:25\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", " ===========================================================================\n", "\n", " Reading settings XML file...\n", - " Reading cross sections XML file...\n", " Reading geometry XML file...\n", + " Reading cross sections XML file...\n", " Reading materials XML file...\n", + " Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n", + " Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n", + " Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n", + " Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n", + " Reading B10.71c from /home/romano/openmc/data/nndc_hdf5/B10_71c.h5\n", + " Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", - " Loading ACE cross section table: 92235.71c\n", - " Loading ACE cross section table: 92238.71c\n", - " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 1001.71c\n", - " Loading ACE cross section table: 5010.71c\n", - " Loading ACE cross section table: 40090.71c\n", - " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", " Initializing source particles...\n", "\n", " ===========================================================================\n", @@ -585,20 +585,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.4900E-01 seconds\n", - " Reading cross sections = 1.2100E-01 seconds\n", - " Total time in simulation = 3.4132E+02 seconds\n", - " Time in transport only = 3.4128E+02 seconds\n", - " Time in inactive batches = 1.0748E+01 seconds\n", - " Time in active batches = 3.3057E+02 seconds\n", - " Time synchronizing fission bank = 1.1000E-02 seconds\n", - " Sampling source sites = 1.1000E-02 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 1.9000E-02 seconds\n", - " Total time for finalization = 1.5600E-01 seconds\n", - " Total time elapsed = 3.4196E+02 seconds\n", - " Calculation Rate (inactive) = 4652.03 neutrons/second\n", - " Calculation Rate (active) = 1361.27 neutrons/second\n", + " Total time for initialization = 3.5100E-01 seconds\n", + " Reading cross sections = 1.8600E-01 seconds\n", + " Total time in simulation = 3.1672E+02 seconds\n", + " Time in transport only = 3.1667E+02 seconds\n", + " Time in inactive batches = 1.0782E+01 seconds\n", + " Time in active batches = 3.0594E+02 seconds\n", + " Time synchronizing fission bank = 2.1000E-02 seconds\n", + " Sampling source sites = 1.2000E-02 seconds\n", + " SEND/RECV source sites = 9.0000E-03 seconds\n", + " Time accumulating tallies = 1.7000E-02 seconds\n", + " Total time for finalization = 1.8100E-01 seconds\n", + " Total time elapsed = 3.1729E+02 seconds\n", + " Calculation Rate (inactive) = 4637.36 neutrons/second\n", + " Calculation Rate (active) = 1470.89 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -855,7 +855,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 24, @@ -866,7 +866,7 @@ "data": { "image/png": "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\nAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -898,7 +898,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1012,7 +1012,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 28, @@ -1023,7 +1023,7 @@ "data": { "image/png": "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\nrkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1074,7 +1074,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1107,7 +1107,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.5.2" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 56b3cb45c..dfd493f16 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -45,12 +45,12 @@ "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')" + "h1 = openmc.Nuclide('H1')\n", + "b10 = openmc.Nuclide('B10')\n", + "o16 = openmc.Nuclide('O16')\n", + "u235 = openmc.Nuclide('U235')\n", + "u238 = openmc.Nuclide('U238')\n", + "zr90 = openmc.Nuclide('Zr90')" ] }, { @@ -339,7 +339,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AFBRQzLY81/IkAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDUtMDVUMTQ6NTE6\nNDUtMDY6MDCqOITjAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA1LTA1VDE0OjUxOjQ1LTA2OjAw\n22U8XwAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AHFwInLqDpadAAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDctMjJUMjE6Mzk6\nNDYtMDU6MDBOOEOsAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA3LTIyVDIxOjM5OjQ2LTA1OjAw\nP2X7EAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -540,28 +540,28 @@ " 888\n", "\n", " Copyright: 2011-2016 Massachusetts Institute of Technology\n", - " License: http://openmc.readthedocs.org/en/latest/license.html\n", + " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.7.1\n", - " Git SHA1: df280b60eb1c6d7b7f842e05ede734a4883a0fc8\n", - " Date/Time: 2016-05-05 14:51:45\n", + " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", + " Date/Time: 2016-07-22 21:39:46\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", " ===========================================================================\n", "\n", " Reading settings XML file...\n", - " Reading cross sections XML file...\n", " Reading geometry XML file...\n", + " Reading cross sections XML file...\n", " Reading materials XML file...\n", + " Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n", + " Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n", + " Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n", + " Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n", + " Reading B10.71c from /home/romano/openmc/data/nndc_hdf5/B10_71c.h5\n", + " Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", - " Loading ACE cross section table: 92235.71c\n", - " Loading ACE cross section table: 92238.71c\n", - " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 1001.71c\n", - " Loading ACE cross section table: 5010.71c\n", - " Loading ACE cross section table: 40090.71c\n", - " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", " Initializing source particles...\n", "\n", " ===========================================================================\n", @@ -599,20 +599,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 7.2500E-01 seconds\n", - " Reading cross sections = 4.4400E-01 seconds\n", - " Total time in simulation = 1.5547E+01 seconds\n", - " Time in transport only = 1.5527E+01 seconds\n", - " Time in inactive batches = 2.2880E+00 seconds\n", - " Time in active batches = 1.3259E+01 seconds\n", + " Total time for initialization = 3.5600E-01 seconds\n", + " Reading cross sections = 2.3400E-01 seconds\n", + " Total time in simulation = 1.8333E+01 seconds\n", + " Time in transport only = 1.8325E+01 seconds\n", + " Time in inactive batches = 2.6950E+00 seconds\n", + " Time in active batches = 1.5638E+01 seconds\n", " Time synchronizing fission bank = 1.0000E-03 seconds\n", " Sampling source sites = 0.0000E+00 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", - " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.6291E+01 seconds\n", - " Calculation Rate (inactive) = 5463.29 neutrons/second\n", - " Calculation Rate (active) = 2828.27 neutrons/second\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 1.0000E-03 seconds\n", + " Total time elapsed = 1.8711E+01 seconds\n", + " Calculation Rate (inactive) = 4638.22 neutrons/second\n", + " Calculation Rate (active) = 2398.00 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1107,7 +1107,7 @@ " 10000\n", " 0.000000e+00\n", " 6.250000e-07\n", - " (U-238 / total)\n", + " (U238 / total)\n", " (nu-fission / flux)\n", " 6.636968e-07\n", " 4.132875e-09\n", @@ -1117,7 +1117,7 @@ " 10000\n", " 0.000000e+00\n", " 6.250000e-07\n", - " (U-238 / total)\n", + " (U238 / total)\n", " (scatter / flux)\n", " 2.099856e-01\n", " 1.232455e-03\n", @@ -1127,7 +1127,7 @@ " 10000\n", " 0.000000e+00\n", " 6.250000e-07\n", - " (U-235 / total)\n", + " (U235 / total)\n", " (nu-fission / flux)\n", " 3.552458e-01\n", " 2.252681e-03\n", @@ -1137,7 +1137,7 @@ " 10000\n", " 0.000000e+00\n", " 6.250000e-07\n", - " (U-235 / total)\n", + " (U235 / total)\n", " (scatter / flux)\n", " 5.554345e-03\n", " 3.265385e-05\n", @@ -1147,7 +1147,7 @@ " 10000\n", " 6.250000e-07\n", " 2.000000e+01\n", - " (U-238 / total)\n", + " (U238 / total)\n", " (nu-fission / flux)\n", " 7.126668e-03\n", " 5.296883e-05\n", @@ -1157,7 +1157,7 @@ " 10000\n", " 6.250000e-07\n", " 2.000000e+01\n", - " (U-238 / total)\n", + " (U238 / total)\n", " (scatter / flux)\n", " 2.277460e-01\n", " 1.003558e-03\n", @@ -1167,7 +1167,7 @@ " 10000\n", " 6.250000e-07\n", " 2.000000e+01\n", - " (U-235 / total)\n", + " (U235 / total)\n", " (nu-fission / flux)\n", " 8.010911e-03\n", " 6.802256e-05\n", @@ -1177,7 +1177,7 @@ " 10000\n", " 6.250000e-07\n", " 2.000000e+01\n", - " (U-235 / total)\n", + " (U235 / total)\n", " (scatter / flux)\n", " 3.367794e-03\n", " 1.443644e-05\n", @@ -1187,15 +1187,15 @@ "" ], "text/plain": [ - " cell energy low [MeV] energy high [MeV] nuclide \\\n", - "0 10000 0.00e+00 6.25e-07 (U-238 / total) \n", - "1 10000 0.00e+00 6.25e-07 (U-238 / total) \n", - "2 10000 0.00e+00 6.25e-07 (U-235 / total) \n", - "3 10000 0.00e+00 6.25e-07 (U-235 / total) \n", - "4 10000 6.25e-07 2.00e+01 (U-238 / total) \n", - "5 10000 6.25e-07 2.00e+01 (U-238 / total) \n", - "6 10000 6.25e-07 2.00e+01 (U-235 / total) \n", - "7 10000 6.25e-07 2.00e+01 (U-235 / total) \n", + " cell energy low [MeV] energy high [MeV] nuclide \\\n", + "0 10000 0.00e+00 6.25e-07 (U238 / total) \n", + "1 10000 0.00e+00 6.25e-07 (U238 / total) \n", + "2 10000 0.00e+00 6.25e-07 (U235 / total) \n", + "3 10000 0.00e+00 6.25e-07 (U235 / total) \n", + "4 10000 6.25e-07 2.00e+01 (U238 / total) \n", + "5 10000 6.25e-07 2.00e+01 (U238 / total) \n", + "6 10000 6.25e-07 2.00e+01 (U235 / total) \n", + "7 10000 6.25e-07 2.00e+01 (U235 / total) \n", "\n", " score mean std. dev. \n", "0 (nu-fission / flux) 6.64e-07 4.13e-09 \n", @@ -1276,7 +1276,7 @@ ], "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", + "u235_scatter_xs = fuel_xs.get_values(nuclides=['(U235 / total)'], \n", " scores=['(scatter / flux)'])\n", "print(u235_scatter_xs)" ] @@ -1342,7 +1342,7 @@ " 10000\n", " 0.000000e+00\n", " 6.250000e-07\n", - " U-238\n", + " U238\n", " nu-fission\n", " 0.000002\n", " 7.473789e-09\n", @@ -1352,7 +1352,7 @@ " 10000\n", " 0.000000e+00\n", " 6.250000e-07\n", - " U-235\n", + " U235\n", " nu-fission\n", " 0.861547\n", " 4.131310e-03\n", @@ -1362,7 +1362,7 @@ " 10000\n", " 6.250000e-07\n", " 2.000000e+01\n", - " U-238\n", + " U238\n", " nu-fission\n", " 0.082356\n", " 5.560461e-04\n", @@ -1372,7 +1372,7 @@ " 10000\n", " 6.250000e-07\n", " 2.000000e+01\n", - " U-235\n", + " U235\n", " nu-fission\n", " 0.092574\n", " 7.315442e-04\n", @@ -1383,10 +1383,10 @@ ], "text/plain": [ " cell energy low [MeV] energy high [MeV] nuclide score mean \\\n", - "0 10000 0.00e+00 6.25e-07 U-238 nu-fission 1.61e-06 \n", - "1 10000 0.00e+00 6.25e-07 U-235 nu-fission 8.62e-01 \n", - "2 10000 6.25e-07 2.00e+01 U-238 nu-fission 8.24e-02 \n", - "3 10000 6.25e-07 2.00e+01 U-235 nu-fission 9.26e-02 \n", + "0 10000 0.00e+00 6.25e-07 U238 nu-fission 1.61e-06 \n", + "1 10000 0.00e+00 6.25e-07 U235 nu-fission 8.62e-01 \n", + "2 10000 6.25e-07 2.00e+01 U238 nu-fission 8.24e-02 \n", + "3 10000 6.25e-07 2.00e+01 U235 nu-fission 9.26e-02 \n", "\n", " std. dev. \n", "0 7.47e-09 \n", @@ -1436,7 +1436,7 @@ " 10002\n", " 1.000000e-08\n", " 1.080060e-07\n", - " H-1\n", + " H1\n", " scatter\n", " 4.599225\n", " 0.015973\n", @@ -1446,7 +1446,7 @@ " 10002\n", " 1.080060e-07\n", " 1.166529e-06\n", - " H-1\n", + " H1\n", " scatter\n", " 2.037260\n", " 0.011236\n", @@ -1456,7 +1456,7 @@ " 10002\n", " 1.166529e-06\n", " 1.259921e-05\n", - " H-1\n", + " H1\n", " scatter\n", " 1.662552\n", " 0.010280\n", @@ -1466,7 +1466,7 @@ " 10002\n", " 1.259921e-05\n", " 1.360790e-04\n", - " H-1\n", + " H1\n", " scatter\n", " 1.872201\n", " 0.012136\n", @@ -1476,7 +1476,7 @@ " 10002\n", " 1.360790e-04\n", " 1.469734e-03\n", - " H-1\n", + " H1\n", " scatter\n", " 2.080459\n", " 0.013155\n", @@ -1486,7 +1486,7 @@ " 10002\n", " 1.469734e-03\n", " 1.587401e-02\n", - " H-1\n", + " H1\n", " scatter\n", " 2.154996\n", " 0.011975\n", @@ -1496,7 +1496,7 @@ " 10002\n", " 1.587401e-02\n", " 1.714488e-01\n", - " H-1\n", + " H1\n", " scatter\n", " 2.218740\n", " 0.008528\n", @@ -1506,7 +1506,7 @@ " 10002\n", " 1.714488e-01\n", " 1.851749e+00\n", - " H-1\n", + " H1\n", " scatter\n", " 2.010517\n", " 0.009187\n", @@ -1516,7 +1516,7 @@ " 10002\n", " 1.851749e+00\n", " 2.000000e+01\n", - " H-1\n", + " H1\n", " scatter\n", " 0.372022\n", " 0.003196\n", @@ -1527,15 +1527,15 @@ ], "text/plain": [ " cell energy low [MeV] energy high [MeV] nuclide score mean \\\n", - "0 10002 1.00e-08 1.08e-07 H-1 scatter 4.60e+00 \n", - "1 10002 1.08e-07 1.17e-06 H-1 scatter 2.04e+00 \n", - "2 10002 1.17e-06 1.26e-05 H-1 scatter 1.66e+00 \n", - "3 10002 1.26e-05 1.36e-04 H-1 scatter 1.87e+00 \n", - "4 10002 1.36e-04 1.47e-03 H-1 scatter 2.08e+00 \n", - "5 10002 1.47e-03 1.59e-02 H-1 scatter 2.15e+00 \n", - "6 10002 1.59e-02 1.71e-01 H-1 scatter 2.22e+00 \n", - "7 10002 1.71e-01 1.85e+00 H-1 scatter 2.01e+00 \n", - "8 10002 1.85e+00 2.00e+01 H-1 scatter 3.72e-01 \n", + "0 10002 1.00e-08 1.08e-07 H1 scatter 4.60e+00 \n", + "1 10002 1.08e-07 1.17e-06 H1 scatter 2.04e+00 \n", + "2 10002 1.17e-06 1.26e-05 H1 scatter 1.66e+00 \n", + "3 10002 1.26e-05 1.36e-04 H1 scatter 1.87e+00 \n", + "4 10002 1.36e-04 1.47e-03 H1 scatter 2.08e+00 \n", + "5 10002 1.47e-03 1.59e-02 H1 scatter 2.15e+00 \n", + "6 10002 1.59e-02 1.71e-01 H1 scatter 2.22e+00 \n", + "7 10002 1.71e-01 1.85e+00 H1 scatter 2.01e+00 \n", + "8 10002 1.85e+00 2.00e+01 H1 scatter 3.72e-01 \n", "\n", " std. dev. \n", "0 1.60e-02 \n", @@ -1557,7 +1557,7 @@ "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", + "slice_test = need_to_slice.get_slice(scores=['scatter'], nuclides=['H1'],\n", " filters=['cell'], filter_bins=[(moderator_cell.id,)])\n", "slice_test.get_pandas_dataframe()" ] @@ -1579,7 +1579,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.5.2" } }, "nbformat": 4, diff --git a/openmc/data/angle_energy.py b/openmc/data/angle_energy.py index c20c5f0ff..00e049ebc 100644 --- a/openmc/data/angle_energy.py +++ b/openmc/data/angle_energy.py @@ -102,7 +102,7 @@ class AngleEnergy(object): distribution = openmc.data.NBodyPhaseSpace.from_ace( ace, idx, rx.q_value) else: - raise IOError("Unsupported ACE secondary energy " - "distribution law {0}".format(law)) + raise ValueError("Unsupported ACE secondary energy " + "distribution law {}".format(law)) return distribution diff --git a/openmc/data/data.py b/openmc/data/data.py index 5f83d31c0..21fffc8cb 100644 --- a/openmc/data/data.py +++ b/openmc/data/data.py @@ -2,102 +2,102 @@ # of the elements 2009 (IUPAC Technical Report)", Pure. Appl. Chem. 83 (2), # pp. 397--410 (2011). NATURAL_ABUNDANCE = { - 'H-1': 0.999885, 'H-2': 0.000115, 'He-3': 1.34e-06, - 'He-4': 0.99999866, 'Li-6': 0.0759, 'Li-7': 0.9241, - 'Be-9': 1.0, 'B-10': 0.199, 'B-11': 0.801, - 'C-12': 0.9893, 'C-13': 0.0107, 'N-14': 0.99636, - 'N-15': 0.00364, 'O-16': 0.99757, 'O-17': 0.00038, - 'O-18': 0.00205, 'F-19': 1.0, 'Ne-20': 0.9048, - 'Ne-21': 0.0027, 'Ne-22': 0.0925, 'Na-23': 1.0, - 'Mg-24': 0.7899, 'Mg-25': 0.1, 'Mg-26': 0.1101, - 'Al-27': 1.0, 'Si-28': 0.92223, 'Si-29': 0.04685, - 'Si-30': 0.03092, 'P-31': 1.0, 'S-32': 0.9499, - 'S-33': 0.0075, 'S-34': 0.0425, 'S-36': 0.0001, - 'Cl-35': 0.7576, 'Cl-37': 0.2424, 'Ar-36': 0.003336, - 'Ar-38': 0.000629, 'Ar-40': 0.996035, 'K-39': 0.932581, - 'K-40': 0.000117, 'K-41': 0.067302, 'Ca-40': 0.96941, - 'Ca-42': 0.00647, 'Ca-43': 0.00135, 'Ca-44': 0.02086, - 'Ca-46': 4e-05, 'Ca-48': 0.00187, 'Sc-45': 1.0, - 'Ti-46': 0.0825, 'Ti-47': 0.0744, 'Ti-48': 0.7372, - 'Ti-49': 0.0541, 'Ti-50': 0.0518, 'V-50': 0.0025, - 'V-51': 0.9975, 'Cr-50': 0.04345, 'Cr-52': 0.83789, - 'Cr-53': 0.09501, 'Cr-54': 0.02365, 'Mn-55': 1.0, - 'Fe-54': 0.05845, 'Fe-56': 0.91754, 'Fe-57': 0.02119, - 'Fe-58': 0.00282, 'Co-59': 1.0, 'Ni-58': 0.68077, - 'Ni-60': 0.26223, 'Ni-61': 0.011399, 'Ni-62': 0.036346, - 'Ni-64': 0.009255, 'Cu-63': 0.6915, 'Cu-65': 0.3085, - 'Zn-64': 0.4917, 'Zn-66': 0.2773, 'Zn-67': 0.0404, - 'Zn-68': 0.1845, 'Zn-70': 0.0061, 'Ga-69': 0.60108, - 'Ga-71': 0.39892, 'Ge-70': 0.2057, 'Ge-72': 0.2745, - 'Ge-73': 0.0775, 'Ge-74': 0.365, 'Ge-76': 0.0773, - 'As-75': 1.0, 'Se-74': 0.0089, 'Se-76': 0.0937, - 'Se-77': 0.0763, 'Se-78': 0.2377, 'Se-80': 0.4961, - 'Se-82': 0.0873, 'Br-79': 0.5069, 'Br-81': 0.4931, - 'Kr-78': 0.00355, 'Kr-80': 0.02286, 'Kr-82': 0.11593, - 'Kr-83': 0.115, 'Kr-84': 0.56987, 'Kr-86': 0.17279, - 'Rb-85': 0.7217, 'Rb-87': 0.2783, 'Sr-84': 0.0056, - 'Sr-86': 0.0986, 'Sr-87': 0.07, 'Sr-88': 0.8258, - 'Y-89': 1.0, 'Zr-90': 0.5145, 'Zr-91': 0.1122, - 'Zr-92': 0.1715, 'Zr-94': 0.1738, 'Zr-96': 0.028, - 'Nb-93': 1.0, 'Mo-92': 0.1453, 'Mo-94': 0.0915, - 'Mo-95': 0.1584, 'Mo-96': 0.1667, 'Mo-97': 0.096, - 'Mo-98': 0.2439, 'Mo-100': 0.0982, 'Ru-96': 0.0554, - 'Ru-98': 0.0187, 'Ru-99': 0.1276, 'Ru-100': 0.126, - 'Ru-101': 0.1706, 'Ru-102': 0.3155, 'Ru-104': 0.1862, - 'Rh-103': 1.0, 'Pd-102': 0.0102, 'Pd-104': 0.1114, - 'Pd-105': 0.2233, 'Pd-106': 0.2733, 'Pd-108': 0.2646, - 'Pd-110': 0.1172, 'Ag-107': 0.51839, 'Ag-109': 0.48161, - 'Cd-106': 0.0125, 'Cd-108': 0.0089, 'Cd-110': 0.1249, - 'Cd-111': 0.128, 'Cd-112': 0.2413, 'Cd-113': 0.1222, - 'Cd-114': 0.2873, 'Cd-116': 0.0749, 'In-113': 0.0429, - 'In-115': 0.9571, 'Sn-112': 0.0097, 'Sn-114': 0.0066, - 'Sn-115': 0.0034, 'Sn-116': 0.1454, 'Sn-117': 0.0768, - 'Sn-118': 0.2422, 'Sn-119': 0.0859, 'Sn-120': 0.3258, - 'Sn-122': 0.0463, 'Sn-124': 0.0579, 'Sb-121': 0.5721, - 'Sb-123': 0.4279, 'Te-120': 0.0009, 'Te-122': 0.0255, - 'Te-123': 0.0089, 'Te-124': 0.0474, 'Te-125': 0.0707, - 'Te-126': 0.1884, 'Te-128': 0.3174, 'Te-130': 0.3408, - 'I-127': 1.0, 'Xe-124': 0.000952, 'Xe-126': 0.00089, - 'Xe-128': 0.019102, 'Xe-129': 0.264006, 'Xe-130': 0.04071, - 'Xe-131': 0.212324, 'Xe-132': 0.269086, 'Xe-134': 0.104357, - 'Xe-136': 0.088573, 'Cs-133': 1.0, 'Ba-130': 0.00106, - 'Ba-132': 0.00101, 'Ba-134': 0.02417, 'Ba-135': 0.06592, - 'Ba-136': 0.07854, 'Ba-137': 0.11232, 'Ba-138': 0.71698, - 'La-138': 0.0008881, 'La-139': 0.9991119, 'Ce-136': 0.00185, - 'Ce-138': 0.00251, 'Ce-140': 0.8845, 'Ce-142': 0.11114, - 'Pr-141': 1.0, 'Nd-142': 0.27152, 'Nd-143': 0.12174, - 'Nd-144': 0.23798, 'Nd-145': 0.08293, 'Nd-146': 0.17189, - 'Nd-148': 0.05756, 'Nd-150': 0.05638, 'Sm-144': 0.0307, - 'Sm-147': 0.1499, 'Sm-148': 0.1124, 'Sm-149': 0.1382, - 'Sm-150': 0.0738, 'Sm-152': 0.2675, 'Sm-154': 0.2275, - 'Eu-151': 0.4781, 'Eu-153': 0.5219, 'Gd-152': 0.002, - 'Gd-154': 0.0218, 'Gd-155': 0.148, 'Gd-156': 0.2047, - 'Gd-157': 0.1565, 'Gd-158': 0.2484, 'Gd-160': 0.2186, - 'Tb-159': 1.0, 'Dy-156': 0.00056, 'Dy-158': 0.00095, - 'Dy-160': 0.02329, 'Dy-161': 0.18889, 'Dy-162': 0.25475, - 'Dy-163': 0.24896, 'Dy-164': 0.2826, 'Ho-165': 1.0, - 'Er-162': 0.00139, 'Er-164': 0.01601, 'Er-166': 0.33503, - 'Er-167': 0.22869, 'Er-168': 0.26978, 'Er-170': 0.1491, - 'Tm-169': 1.0, 'Yb-168': 0.00123, 'Yb-170': 0.02982, - 'Yb-171': 0.1409, 'Yb-172': 0.2168, 'Yb-173': 0.16103, - 'Yb-174': 0.32026, 'Yb-176': 0.12996, 'Lu-175': 0.97401, - 'Lu-176': 0.02599, 'Hf-174': 0.0016, 'Hf-176': 0.0526, - 'Hf-177': 0.186, 'Hf-178': 0.2728, 'Hf-179': 0.1362, - 'Hf-180': 0.3508, 'Ta-180': 0.0001201, 'Ta-181': 0.9998799, - 'W-180': 0.0012, 'W-182': 0.265, 'W-183': 0.1431, - 'W-184': 0.3064, 'W-186': 0.2843, 'Re-185': 0.374, - 'Re-187': 0.626, 'Os-184': 0.0002, 'Os-186': 0.0159, - 'Os-187': 0.0196, 'Os-188': 0.1324, 'Os-189': 0.1615, - 'Os-190': 0.2626, 'Os-192': 0.4078, 'Ir-191': 0.373, - 'Ir-193': 0.627, 'Pt-190': 0.00012, 'Pt-192': 0.00782, - 'Pt-194': 0.3286, 'Pt-195': 0.3378, 'Pt-196': 0.2521, - 'Pt-198': 0.07356, 'Au-197': 1.0, 'Hg-196': 0.0015, - 'Hg-198': 0.0997, 'Hg-199': 0.1687, 'Hg-200': 0.231, - 'Hg-201': 0.1318, 'Hg-202': 0.2986, 'Hg-204': 0.0687, - 'Tl-203': 0.2952, 'Tl-205': 0.7048, 'Pb-204': 0.014, - 'Pb-206': 0.241, 'Pb-207': 0.221, 'Pb-208': 0.524, - 'Bi-209': 1.0, 'Th-232': 1.0, 'Pa-231': 1.0, - 'U-234': 5.4e-05, 'U-235': 0.007204, 'U-238': 0.992742 + 'H1': 0.999885, 'H2': 0.000115, 'He3': 1.34e-06, + 'He4': 0.99999866, 'Li6': 0.0759, 'Li7': 0.9241, + 'Be9': 1.0, 'B10': 0.199, 'B11': 0.801, + 'C12': 0.9893, 'C13': 0.0107, 'N14': 0.99636, + 'N15': 0.00364, 'O16': 0.99757, 'O17': 0.00038, + 'O18': 0.00205, 'F19': 1.0, 'Ne20': 0.9048, + 'Ne21': 0.0027, 'Ne22': 0.0925, 'Na23': 1.0, + 'Mg24': 0.7899, 'Mg25': 0.1, 'Mg26': 0.1101, + 'Al27': 1.0, 'Si28': 0.92223, 'Si29': 0.04685, + 'Si30': 0.03092, 'P31': 1.0, 'S32': 0.9499, + 'S33': 0.0075, 'S34': 0.0425, 'S36': 0.0001, + 'Cl35': 0.7576, 'Cl37': 0.2424, 'Ar36': 0.003336, + 'Ar38': 0.000629, 'Ar40': 0.996035, 'K39': 0.932581, + 'K40': 0.000117, 'K41': 0.067302, 'Ca40': 0.96941, + 'Ca42': 0.00647, 'Ca43': 0.00135, 'Ca44': 0.02086, + 'Ca46': 4e-05, 'Ca48': 0.00187, 'Sc45': 1.0, + 'Ti46': 0.0825, 'Ti47': 0.0744, 'Ti48': 0.7372, + 'Ti49': 0.0541, 'Ti50': 0.0518, 'V50': 0.0025, + 'V51': 0.9975, 'Cr50': 0.04345, 'Cr52': 0.83789, + 'Cr53': 0.09501, 'Cr54': 0.02365, 'Mn55': 1.0, + 'Fe54': 0.05845, 'Fe56': 0.91754, 'Fe57': 0.02119, + 'Fe58': 0.00282, 'Co59': 1.0, 'Ni58': 0.68077, + 'Ni60': 0.26223, 'Ni61': 0.011399, 'Ni62': 0.036346, + 'Ni64': 0.009255, 'Cu63': 0.6915, 'Cu65': 0.3085, + 'Zn64': 0.4917, 'Zn66': 0.2773, 'Zn67': 0.0404, + 'Zn68': 0.1845, 'Zn70': 0.0061, 'Ga69': 0.60108, + 'Ga71': 0.39892, 'Ge70': 0.2057, 'Ge72': 0.2745, + 'Ge73': 0.0775, 'Ge74': 0.365, 'Ge76': 0.0773, + 'As75': 1.0, 'Se74': 0.0089, 'Se76': 0.0937, + 'Se77': 0.0763, 'Se78': 0.2377, 'Se80': 0.4961, + 'Se82': 0.0873, 'Br79': 0.5069, 'Br81': 0.4931, + 'Kr78': 0.00355, 'Kr80': 0.02286, 'Kr82': 0.11593, + 'Kr83': 0.115, 'Kr84': 0.56987, 'Kr86': 0.17279, + 'Rb85': 0.7217, 'Rb87': 0.2783, 'Sr84': 0.0056, + 'Sr86': 0.0986, 'Sr87': 0.07, 'Sr88': 0.8258, + 'Y89': 1.0, 'Zr90': 0.5145, 'Zr91': 0.1122, + 'Zr92': 0.1715, 'Zr94': 0.1738, 'Zr96': 0.028, + 'Nb93': 1.0, 'Mo92': 0.1453, 'Mo94': 0.0915, + 'Mo95': 0.1584, 'Mo96': 0.1667, 'Mo97': 0.096, + 'Mo98': 0.2439, 'Mo100': 0.0982, 'Ru96': 0.0554, + 'Ru98': 0.0187, 'Ru99': 0.1276, 'Ru100': 0.126, + 'Ru101': 0.1706, 'Ru102': 0.3155, 'Ru104': 0.1862, + 'Rh103': 1.0, 'Pd102': 0.0102, 'Pd104': 0.1114, + 'Pd105': 0.2233, 'Pd106': 0.2733, 'Pd108': 0.2646, + 'Pd110': 0.1172, 'Ag107': 0.51839, 'Ag109': 0.48161, + 'Cd106': 0.0125, 'Cd108': 0.0089, 'Cd110': 0.1249, + 'Cd111': 0.128, 'Cd112': 0.2413, 'Cd113': 0.1222, + 'Cd114': 0.2873, 'Cd116': 0.0749, 'In113': 0.0429, + 'In115': 0.9571, 'Sn112': 0.0097, 'Sn114': 0.0066, + 'Sn115': 0.0034, 'Sn116': 0.1454, 'Sn117': 0.0768, + 'Sn118': 0.2422, 'Sn119': 0.0859, 'Sn120': 0.3258, + 'Sn122': 0.0463, 'Sn124': 0.0579, 'Sb121': 0.5721, + 'Sb123': 0.4279, 'Te120': 0.0009, 'Te122': 0.0255, + 'Te123': 0.0089, 'Te124': 0.0474, 'Te125': 0.0707, + 'Te126': 0.1884, 'Te128': 0.3174, 'Te130': 0.3408, + 'I127': 1.0, 'Xe124': 0.000952, 'Xe126': 0.00089, + 'Xe128': 0.019102, 'Xe129': 0.264006, 'Xe130': 0.04071, + 'Xe131': 0.212324, 'Xe132': 0.269086, 'Xe134': 0.104357, + 'Xe136': 0.088573, 'Cs133': 1.0, 'Ba130': 0.00106, + 'Ba132': 0.00101, 'Ba134': 0.02417, 'Ba135': 0.06592, + 'Ba136': 0.07854, 'Ba137': 0.11232, 'Ba138': 0.71698, + 'La138': 0.0008881, 'La139': 0.9991119, 'Ce136': 0.00185, + 'Ce138': 0.00251, 'Ce140': 0.8845, 'Ce142': 0.11114, + 'Pr141': 1.0, 'Nd142': 0.27152, 'Nd143': 0.12174, + 'Nd144': 0.23798, 'Nd145': 0.08293, 'Nd146': 0.17189, + 'Nd148': 0.05756, 'Nd150': 0.05638, 'Sm144': 0.0307, + 'Sm147': 0.1499, 'Sm148': 0.1124, 'Sm149': 0.1382, + 'Sm150': 0.0738, 'Sm152': 0.2675, 'Sm154': 0.2275, + 'Eu151': 0.4781, 'Eu153': 0.5219, 'Gd152': 0.002, + 'Gd154': 0.0218, 'Gd155': 0.148, 'Gd156': 0.2047, + 'Gd157': 0.1565, 'Gd158': 0.2484, 'Gd160': 0.2186, + 'Tb159': 1.0, 'Dy156': 0.00056, 'Dy158': 0.00095, + 'Dy160': 0.02329, 'Dy161': 0.18889, 'Dy162': 0.25475, + 'Dy163': 0.24896, 'Dy164': 0.2826, 'Ho165': 1.0, + 'Er162': 0.00139, 'Er164': 0.01601, 'Er166': 0.33503, + 'Er167': 0.22869, 'Er168': 0.26978, 'Er170': 0.1491, + 'Tm169': 1.0, 'Yb168': 0.00123, 'Yb170': 0.02982, + 'Yb171': 0.1409, 'Yb172': 0.2168, 'Yb173': 0.16103, + 'Yb174': 0.32026, 'Yb176': 0.12996, 'Lu175': 0.97401, + 'Lu176': 0.02599, 'Hf174': 0.0016, 'Hf176': 0.0526, + 'Hf177': 0.186, 'Hf178': 0.2728, 'Hf179': 0.1362, + 'Hf180': 0.3508, 'Ta180': 0.0001201, 'Ta181': 0.9998799, + 'W180': 0.0012, 'W182': 0.265, 'W183': 0.1431, + 'W184': 0.3064, 'W186': 0.2843, 'Re185': 0.374, + 'Re187': 0.626, 'Os184': 0.0002, 'Os186': 0.0159, + 'Os187': 0.0196, 'Os188': 0.1324, 'Os189': 0.1615, + 'Os190': 0.2626, 'Os192': 0.4078, 'Ir191': 0.373, + 'Ir193': 0.627, 'Pt190': 0.00012, 'Pt192': 0.00782, + 'Pt194': 0.3286, 'Pt195': 0.3378, 'Pt196': 0.2521, + 'Pt198': 0.07356, 'Au197': 1.0, 'Hg196': 0.0015, + 'Hg198': 0.0997, 'Hg199': 0.1687, 'Hg200': 0.231, + 'Hg201': 0.1318, 'Hg202': 0.2986, 'Hg204': 0.0687, + 'Tl203': 0.2952, 'Tl205': 0.7048, 'Pb204': 0.014, + 'Pb206': 0.241, 'Pb207': 0.221, 'Pb208': 0.524, + 'Bi209': 1.0, 'Th232': 1.0, 'Pa231': 1.0, + 'U234': 5.4e-05, 'U235': 0.007204, 'U238': 0.992742 } ATOMIC_SYMBOL = {1: 'H', 2: 'He', 3: 'Li', 4: 'Be', 5: 'B', 6: 'C', 7: 'N', diff --git a/openmc/data/energy_distribution.py b/openmc/data/energy_distribution.py index 677d31af2..2300081c1 100644 --- a/openmc/data/energy_distribution.py +++ b/openmc/data/energy_distribution.py @@ -52,6 +52,9 @@ class EnergyDistribution(object): return LevelInelastic.from_hdf5(group) elif energy_type == 'continuous': return ContinuousTabular.from_hdf5(group) + else: + raise ValueError("Unknown energy distribution type: {}" + .format(energy_type)) class ArbitraryTabulated(EnergyDistribution): diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index b6a4f03b5..5b587745d 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -39,7 +39,7 @@ class IncidentNeutron(object): atomic_weight_ratio : float Atomic mass ratio of the target nuclide. temperature : float - Temperature of the target nuclide in eV. + Temperature of the target nuclide in MeV. Attributes ---------- diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index cadab0bf7..c2e1b2410 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -303,9 +303,9 @@ class Reaction(object): def __repr__(self): if self.mt in REACTION_NAME: - return "".format(self.mt, REACTION_NAME[self.mt]) + return "".format(self.mt, REACTION_NAME[self.mt]) else: - return "".format(self.mt) + return "".format(self.mt) @property def center_of_mass(self): diff --git a/openmc/element.py b/openmc/element.py index f116c43eb..ada5726b4 100644 --- a/openmc/element.py +++ b/openmc/element.py @@ -1,3 +1,4 @@ +import re import sys import openmc @@ -8,6 +9,7 @@ if sys.version_info[0] >= 3: basestring = str + class Element(object): """A natural element used in a material via . Internally, OpenMC will expand the natural element into isotopes based on the known natural @@ -124,7 +126,7 @@ class Element(object): isotopes = [] for isotope, abundance in sorted(NATURAL_ABUNDANCE.items()): - if isotope.startswith(self.name + '-'): + if re.match(r'{}\d+'.format(self.name), isotope): nuc = openmc.Nuclide(isotope, self.xs) isotopes.append((nuc, abundance)) return isotopes diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 967e11f48..93a257f46 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -820,7 +820,7 @@ def get_opencg_lattice(openmc_lattice): # Create an OpenCG Lattice to represent this OpenMC Lattice name = openmc_lattice.name - dimension = openmc_lattice.dimension + dimension = openmc_lattice.shape pitch = openmc_lattice.pitch lower_left = openmc_lattice.lower_left universes = openmc_lattice.universes From b1fa2c176f98df9b4909496efeab59817a663642 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 25 Jul 2016 09:10:14 -0500 Subject: [PATCH 27/33] Fix bug in OpenCG compatibility module --- LICENSE | 2 +- openmc/opencg_compatible.py | 2 +- readme.rst | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/LICENSE b/LICENSE index f00937632..fe18b53f9 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2011-2015 Massachusetts Institute of Technology +Copyright (c) 2011-2016 Massachusetts Institute of Technology Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 967e11f48..93a257f46 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -820,7 +820,7 @@ def get_opencg_lattice(openmc_lattice): # Create an OpenCG Lattice to represent this OpenMC Lattice name = openmc_lattice.name - dimension = openmc_lattice.dimension + dimension = openmc_lattice.shape pitch = openmc_lattice.pitch lower_left = openmc_lattice.lower_left universes = openmc_lattice.universes diff --git a/readme.rst b/readme.rst index ab13e36f5..03964d943 100644 --- a/readme.rst +++ b/readme.rst @@ -10,9 +10,9 @@ transport code based on modern methods. It is a constructive solid geometry, continuous-energy transport code that uses ACE format cross sections. The project started under the Computational Reactor Physics Group at MIT. -Complete documentation on the usage of OpenMC is hosted on GitHub at -http://mit-crpg.github.io/openmc/. If you are interested in the project or would -like to help and contribute, please send a message to the OpenMC User's Group +Complete documentation on the usage of OpenMC is hosted on Read the Docs at +http://openmc.readthedocs.io. If you are interested in the project or would like +to help and contribute, please send a message to the OpenMC User's Group `mailing list`_. ------------ @@ -49,7 +49,7 @@ License OpenMC is distributed under the MIT/X license_. .. _mailing list: https://groups.google.com/forum/?fromgroups=#!forum/openmc-users -.. _installation instructions: http://mit-crpg.github.io/openmc/usersguide/install.html -.. _Troubleshooting section: http://mit-crpg.github.io/openmc/usersguide/troubleshoot.html +.. _installation instructions: http://openmc.readthedocs.io/en/latest/usersguide/install.html +.. _Troubleshooting section: http://openmc.readthedocs.io/en/latest/usersguide/troubleshoot.html .. _Issues: https://github.com/mit-crpg/openmc/issues -.. _license: http://mit-crpg.github.io/openmc/license.html +.. _license: http://openmc.readthedocs.io/en/latest/license.html From 8a4d1fba4f20d5b4b651dc3177b13e0a0fd285b9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 25 Jul 2016 10:41:58 -0500 Subject: [PATCH 28/33] Update URL for HDF5 data --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 86a2fbb4c..30708de36 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,7 +42,7 @@ install: true before_script: - if [[ ! -e $HOME/nndc_hdf5/cross_sections.xml ]]; then - wget https://anl.box.com/shared/static/b3373ozjaiarcndy1ikotm4yuawxomwa.xz -O - | tar -C $HOME -xvJ; + wget https://anl.box.com/shared/static/6pwyfjnufam0sb96kqwwrve6vdn8m7u4.xz -O - | tar -C $HOME -xvJ; fi - export OPENMC_CROSS_SECTIONS=$HOME/nndc_hdf5/cross_sections.xml From 462926ad44aad9de653155db6e82b460aafef555 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 25 Jul 2016 20:39:33 -0500 Subject: [PATCH 29/33] Address two @smharper comments in PyAPI. Restore ONLY option on 'use hdf5' --- openmc/data/ace.py | 13 ++++++------- openmc/data/reaction.py | 2 +- src/nuclide_header.F90 | 5 +++-- src/reaction_header.F90 | 3 ++- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/openmc/data/ace.py b/openmc/data/ace.py index 1a56c165e..03052bcab 100644 --- a/openmc/data/ace.py +++ b/openmc/data/ace.py @@ -16,7 +16,6 @@ generates ACE-format cross sections. """ from __future__ import division, unicode_literals -import io from os import SEEK_CUR import struct import sys @@ -164,7 +163,7 @@ class Library(object): # Determine whether file is ASCII or binary try: - fh = io.open(filename, 'rb') + fh = open(filename, 'rb') # Grab 10 lines of the library sb = b''.join([fh.readline() for i in range(10)]) @@ -173,13 +172,13 @@ class Library(object): # No exception so proceed with ASCII - reopen in non-binary fh.close() - fh = io.open(filename, 'r') - fh.seek(0) - self._read_ascii(fh, table_names, verbose) + with open(filename, 'r') as fh: + fh.seek(0) + self._read_ascii(fh, table_names, verbose) except UnicodeDecodeError: fh.close() - fh = open(filename, 'rb') - self._read_binary(fh, table_names, verbose) + with open(filename, 'rb') as fh: + self._read_binary(fh, table_names, verbose) def _read_binary(self, ace_file, table_names, verbose=False, recl_length=4096, entries=512): diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index c2e1b2410..62b02048b 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -456,7 +456,7 @@ class Reaction(object): # YIELD AND ANGLE-ENERGY DISTRIBUTION # Determine multiplicity - ty = ace.xss[ace.jxs[5] + i_reaction - 1] + ty = int(ace.xss[ace.jxs[5] + i_reaction - 1]) rx.center_of_mass = (ty < 0) if i_reaction < ace.nxs[5] + 1: if ty != 19: diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index 9f5594138..8ff83482e 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -3,8 +3,9 @@ module nuclide_header use, intrinsic :: ISO_FORTRAN_ENV use, intrinsic :: ISO_C_BINDING - use hdf5 - use h5lt, only: h5ltpath_valid_f + use hdf5, only: HID_T, HSIZE_T, SIZE_T, h5iget_name_f, h5gget_info_f, & + h5lget_name_by_idx_f, H5_INDEX_NAME_F, H5_ITER_INC_F + use h5lt, only: h5ltpath_valid_f use constants use dict_header, only: DictIntInt diff --git a/src/reaction_header.F90 b/src/reaction_header.F90 index 185945563..055dcb392 100644 --- a/src/reaction_header.F90 +++ b/src/reaction_header.F90 @@ -1,6 +1,7 @@ module reaction_header - use hdf5 + use hdf5, only: HID_T, HSIZE_T, SIZE_T, h5gget_info_f, h5lget_name_by_idx_f, & + H5_INDEX_NAME_F, H5_ITER_INC_F use constants, only: MAX_WORD_LEN use hdf5_interface, only: read_attribute, open_group, close_group, & From b8681600638f8d1181edd9f0e2d06cb2a1f1ccc9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 26 Jul 2016 22:35:28 -0500 Subject: [PATCH 30/33] Pesky little eV -> MeV --- openmc/data/neutron.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 5b587745d..63b2bab01 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -65,7 +65,7 @@ class IncidentNeutron(object): Contains summed cross sections, e.g., the total cross section. The keys are the MT values and the values are Reaction objects. temperature : float - Temperature of the target nuclide in eV. + Temperature of the target nuclide in MeV. urr : None or openmc.data.ProbabilityTables Unresolved resonance region probability tables From be7ca28dee279031d4be1bc33ada563f95733209 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 27 Jul 2016 18:02:38 -0500 Subject: [PATCH 31/33] Improve loading of cross sections from hdf5 Fix bug where reaction thresholds were not used. Automatically build summed reactions. Allow Tab1 evaluations of un-ordered datasets. --- openmc/data/function.py | 48 +++++++++++++++++++---------------------- openmc/data/neutron.py | 11 ++++++++++ openmc/data/reaction.py | 2 +- 3 files changed, 34 insertions(+), 27 deletions(-) diff --git a/openmc/data/function.py b/openmc/data/function.py index e2efb4c10..bea6f5e9a 100644 --- a/openmc/data/function.py +++ b/openmc/data/function.py @@ -80,50 +80,46 @@ class Tabulated1D(object): # Get indices for interpolation idx = np.searchsorted(self.x, x, side='right') - 1 - # Find lowest valid index - i_low = np.searchsorted(idx, 0) - + # Loop over interpolation regions for k in range(len(self.breakpoints)): - # Determine which x values are within this interpolation range - i_high = np.searchsorted(idx, self.breakpoints[k] - 1) + # Get indices for the begining and ending of this region + i_begin = self.breakpoints[k-1] - 1 if k > 0 else 0 + i_end = self.breakpoints[k] - 1 - # Get x values and bounding (x,y) pairs - xk = x[i_low:i_high] - xi = self.x[idx[i_low:i_high]] - xi1 = self.x[idx[i_low:i_high] + 1] - yi = self.y[idx[i_low:i_high]] - yi1 = self.y[idx[i_low:i_high] + 1] + # Figure out which idx values lie within this region + contained = (idx >= i_begin) & (idx < i_end) + + xk = x[contained] # x values in this region + xi = self.x[idx[contained]] # low edge of corresponding bins + xi1 = self.x[idx[contained] + 1] # high edge of corresponding bins + yi = self.y[idx[contained]] + yi1 = self.y[idx[contained] + 1] if self.interpolation[k] == 1: # Histogram - y[i_low:i_high] = yi + y[contined] = yi elif self.interpolation[k] == 2: # Linear-linear - y[i_low:i_high] = yi + (xk - xi)/(xi1 - xi)*(yi1 - yi) + y[contained] = yi + (xk - xi)/(xi1 - xi)*(yi1 - yi) elif self.interpolation[k] == 3: # Linear-log - y[i_low:i_high] = yi + np.log(xk/xi)/np.log(xi1/xi)*(yi1 - yi) + y[contained] = yi + np.log(xk/xi)/np.log(xi1/xi)*(yi1 - yi) elif self.interpolation[k] == 4: # Log-linear - y[i_low:i_high] = yi*np.exp((xk - xi)/(xi1 - xi)*np.log(yi1/yi)) + y[contained] = yi*np.exp((xk - xi)/(xi1 - xi)*np.log(yi1/yi)) elif self.interpolation[k] == 5: # Log-log - y[i_low:i_high] = yi*np.exp(np.log(xk/xi)/np.log(xi1/xi)*np.log(yi1/yi)) + y[contained] = (yi*np.exp(np.log(xk/xi)/np.log(xi1/xi) + *np.log(yi1/yi))) - i_low = i_high - - # In some cases, the first/last point of x may be less than the first - # value of self.x due only to precision, so we check if they're close - # and set them equal if so. Otherwise, the interpolated value might be - # out of range (and thus zero) - if np.isclose(x[0], self.x[0], 1e-8): - y[0] = self.y[0] - if np.isclose(x[-1], self.x[-1], 1e-8): - y[-1] = self.y[-1] + # In some cases, x values might be outside the tabulated region due only + # to precision, so we check if they're close and set them equal if so. + y[np.isclose(x, self.x[0], atol=1e-14)] = self.y[0] + y[np.isclose(x, self.x[-1], atol=1e-14)] = self.y[-1] return y if iterable else y[0] diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 63b2bab01..7cbcca8c7 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -326,6 +326,17 @@ class IncidentNeutron(object): tgroup = group['total_nu'] rx.derived_products.append(Product.from_hdf5(tgroup)) + # Build summed reactions. Start from the highest MT number because high + # MTs never depend on lower MTs. + for mt_sum in sorted(SUM_RULES.keys())[::-1]: + if mt_sum not in data: + xs_components = [data[mt].xs for mt in SUM_RULES[mt_sum] + if mt in data] + if len(xs_components) > 0: + rxn = Reaction(mt_sum) + rxn.xs = Sum(xs_components) + data.summed_reactions[mt_sum] = rxn + # Read unresolved resonance probability tables if 'urr' in group: urr_group = group['urr'] diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index 62b02048b..ad707d276 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -400,7 +400,7 @@ class Reaction(object): # Read cross section if 'xs' in group: xs = group['xs'].value - rx.xs = Tabulated1D(energy, xs) + rx.xs = Tabulated1D(energy[rx.threshold_idx:], xs) # Determine number of products n_product = 0 From 3e2e4743d80b2715c9001f0f97b2e3277a84ec03 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Thu, 28 Jul 2016 09:06:38 -0500 Subject: [PATCH 32/33] Address #686 comments --- openmc/data/neutron.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 7cbcca8c7..75c38e823 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -328,7 +328,7 @@ class IncidentNeutron(object): # Build summed reactions. Start from the highest MT number because high # MTs never depend on lower MTs. - for mt_sum in sorted(SUM_RULES.keys())[::-1]: + for mt_sum in sorted(SUM_RULES, reverse=True): if mt_sum not in data: xs_components = [data[mt].xs for mt in SUM_RULES[mt_sum] if mt in data] From 31771d8e2e6a88222355880623664d93639e5197 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Thu, 28 Jul 2016 16:27:11 -0500 Subject: [PATCH 33/33] Expand on IncidentNeutron.from_hdf5 in notebook --- .../pythonapi/examples/nuclear-data.ipynb | 506 +++++++++++++----- openmc/data/data.py | 9 +- 2 files changed, 376 insertions(+), 139 deletions(-) diff --git a/docs/source/pythonapi/examples/nuclear-data.ipynb b/docs/source/pythonapi/examples/nuclear-data.ipynb index 0c24079cf..82be4a113 100644 --- a/docs/source/pythonapi/examples/nuclear-data.ipynb +++ b/docs/source/pythonapi/examples/nuclear-data.ipynb @@ -32,7 +32,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The first thing we want to do is to read an ACE file into memory and instantiate a `IncidentNeutron` object. The easiest way to do this is with the `openmc.data.IncidentNeutron.from_ace(...)` factory method." + "## Importing from HDF5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `openmc.data` module can read OpenMC's HDF5-formatted data into Python objects. The easiest way to do this is with the `openmc.data.IncidentNeutron.from_hdf5(...)` factory method. Replace the `filename` variable below with a valid path to an HDF5 data file on your computer." ] }, { @@ -55,10 +62,10 @@ ], "source": [ "# Get filename for Gd-157\n", - "filename ='/opt/data/ace/nndc/293.6K/Gd_157_293.6K.ace'\n", + "filename ='/home/smharper/nuclear-data/nndc-hdf5/Gd157_71c.h5'\n", "\n", - "# Load ACE table into object\n", - "gd157 = openmc.data.IncidentNeutron.from_ace(filename)\n", + "# Load HDF5 data into object\n", + "gd157 = openmc.data.IncidentNeutron.from_hdf5(filename)\n", "gd157" ] }, @@ -66,7 +73,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now that we have our ACE table, we can look at its contents. Let's start off by plotting the total cross section. Reactions are indexed using their \"MT\" number -- a unique identifier for each reaction defined by the ENDF-6 format. The MT number for the total cross section is 1." + "## Cross sections" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From Python, it's easy to explore (and modify) the nuclear data. Let's start off by reading the total cross section. Reactions are indexed using their \"MT\" number -- a unique identifier for each reaction defined by the ENDF-6 format. The MT number for the total cross section is 1." ] }, { @@ -79,18 +93,129 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" + } + ], + "source": [ + "total = gd157[1]\n", + "total" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To find the cross section at a particular energy, 1 eV for example, simply call the reaction's `xs` attribute at that energy. Note that our nuclear data uses MeV as the unit of energy." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "142.6474702147809" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "total.xs(1e-6)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `xs` attribute can also be called on an array of energies." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 142.64747021, 38.65417611, 175.40019668])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "total.xs([1e-6, 2e-6, 3e-6])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A quick way to plot cross sections is to use the `energy` attribute of `IncidentNeutron`. This gives an array of all the energy values used in cross section interpolation." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1.00000000e-11, 1.03250000e-11, 1.06500000e-11, ...,\n", + " 1.95000000e+01, 1.99000000e+01, 2.00000000e+01])" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gd157.energy" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEWCAYAAAB1xKBvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmYFNXV+PHvGXaIirixI8o2qKCoCAFlNBhEwiJgBAwa\n3NBETN68KuQnGlzeqNEYoyhoopAYRhSBoCKIRoGAAREXlGFzY1EDLqCyyHp+f9xup6eZpbq7qquX\n83mefqa7qqvOrVn6zK27iapijDHGVKUg7AIYY4zJDpYwjDHGeGIJwxhjjCeWMIwxxnhiCcMYY4wn\nljCMMcZ4YgnDGGOMJ5YwjDHGeFI97ALEE5HuwMW4shWqaveQi2SMMQaQTB3pLSL9gaNV9S9hl8UY\nY0wabkmJyGMisllEVsRtP09EVovIWhEZXc6hw4DioMtnjDHGm3S0YUwCesVuEJECYHxk+wnAUBFp\nF7O/GbBNVXekoXzGGGM8CDxhqOoiYGvc5s7AOlVdr6p7galA/5j9l+MSjTHGmAwRVqN3E2BjzOtN\nuCQCgKqOq+xgEcnMhhdjjMlwqirJHpu13WrbtFH691fWr1dUg3m0a9cusHNbnMyPYXEyN4bFSe6R\nqrASxidA85jXTSPbPFuxAk49FTp1gnvugb17fS0fAEcddZT/J7U4WRPD4mRuDIsTjnQlDIk8opYB\nrUSkhYjUBIYAzyZywjvvHMeZZ85nyRJ4+WWXOBYv9rHE5N4vSi7FyaVrybU4uXQtuRJn/vz5jBs3\nLuXzpKNbbTHwGtBGRDaIyAhV3Q+MAuYBK4GpqroqkfOOGzeOoqIiWrWCuXNh7Fj46U/hyivhyy/9\nKXthYaE/J7I4WRnD4mRuDIuTmKKiouxIGKo6TFUbq2otVW2uqpMi2+eoaltVba2qd6USQwQuughK\nSqBOHTjhBJg8GVK9Zde+ffvUTmBxsjqGxcncGBYnHFnb6F2eww6DBx6A2bPhoYegqMglEWOMManL\n2oQxbtw45s+fX+6+U0+FJUvcLaoePeC3v4WdO9NbPmOMyRRZ04YRlGgbRkWqVYNf/tL1pvr4Y3eb\navbstBXPGGMyRta0YYStUSN48kl49FH49a9h4EDYuLHq44wxxpSV8wkj6txz4d13oUMHOOUUuO8+\n2Lcv7FIZY0z2yJuEAVC7NowbB6+9BnPmwGmnwX/+E3apjDEmO+RVwohq0wbmzYPRo2HQIBg5Er76\nKuxSGWNMZsvahFFZLykvRGDoUNfttkYN1yj+97+nPnbDGGMyjfWSqqKXlFf168P48fDss/DnP8M5\n58CqhMacG2NMZrNeUj47/XR4/XXXi+qss9xUI3v2VAu7WMYYkzEsYcSoVg1GjYJ33oF16+DGG/vw\nwgthl8oYYzKDJYxyNG4MTz0Fl122jOuugwsvhE8SmnzdGGNyjyWMSnTo8BnvvguFhdCxI9x/v43d\nMMbkL0sYVahTB267za218dxzrq1j6dKwS2WMMelnCcOjtm3dQk3XXw8DBsA118DWrWGXyhhj0scS\nRgJE4OKLS6dMb98epkyxsRvGmPxgCSMJhx8OEybAP/8J994LPXvCmjVhl8oYY4KVtQkj1ZHefjjj\nDFi2DPr2hW7d4JZbYNeuUItkjDEHsZHePo30TlX16m7a9HfecSPETzoJXnwx7FIZY0wpG+mdYZo0\ngWnT3BKx11zj1hj/9NOwS2WMMf7JuIQhzh0i8oCIDA+7PIk6/3x47z1o3dqN3XjgAdi/P+xSGWNM\n6jIuYQD9gabAHmBTyGVJSt26cMcdsHAhzJgBnTu7tg5jjMlmgScMEXlMRDaLyIq47eeJyGoRWSsi\no2N2tQUWq+r1wC+CLl+QCgvh1VddG0ffvm6N8W3bwi6VMcYkJx01jElAr9gNIlIAjI9sPwEYKiLt\nIrs3AdEhcVl/M0cEhg93Yzf27XNJZPJkOHAg7JIZY0xiAk8YqrqI0gQQ1RlYp6rrVXUvMBV3Kwpg\nBnCeiPwZWBB0+dKlQQN45BG37saECdC9O7z5ZtilMsYY76qHFLcJsDHm9SZcEkFVdwFXhFGodDj9\ndLeO+OOPQ+/ebonYk0+uGXaxjDGmSmEljJQNGjTo++eFhYW0b9/e9xiLFy/2/ZxRdevC7bfXZNq0\nDkye/GNef30pRUUfUBBgnS/I60l3nFy6llyLk0vXku1xSkpKWOXjEqJhJYxPgOYxr5tGtnk2ffp0\nXwtUkWHDhgV6/quugt//fg7PP9+bFSvO4KGHXC0kKEFfTzrj5NK15FqcXLqWXIojIikdn65utRJ5\nRC0DWolICxGpCQwBnk1TWTLOscduZdEi14uqXz+XRL74IuxSGWNMWenoVlsMvAa0EZENIjJCVfcD\no4B5wEpgqqomVG/KhLmk/FRQAJde6qYXqVvXzYQ7YYIN+jPGpC5r5pJS1WGq2lhVa6lqc1WdFNk+\nR1XbqmprVb0r0fNmylxSfqtf363s9/LL8OST7vbUwoVhl8oYk81sLqkc16EDLFgAN94Il1zielN9\n8EHYpTLG5DNLGBlMBIYMcbepTjvNTad+ww3w9ddhl8wYk4+yNmHkWhtGZerUgd/+1k1quG2bWy52\nwgQ3ctwYY6qSNW0YQcnVNozKNGwIf/mLW2/jmWfcbLhz59oSscaYylkbRh7r2NE1it91l5vY8Jxz\n3OhxY4wJkiWMLCXiZsB97z3XKD5kiBvDsWJF1ccaY0wyLGFkuerVYcQIWLsWevaEXr1g2DBYty7s\nkhljco0ljBxRqxZcd51LFCecAF27lg4ENMYYP2RtwsinXlKJ+MEP4Kab4P33oU0bKCpyYziWLw+7\nZMaYsFgvqTzsJZWI+vVd4vjwQzjrLBgwAO6+u4j5861XlTH5xnpJGU/q1YNf/crVODp33sjIkdCl\nC0yfbvNUGWMSYwkjT9SqBWef/QElJTBmDNxzj1su9tFH4bvvwi6dMSYbWMLIM9WqwQUXuHEbf/2r\nWzK2ZUv4/e9ha/xCusYYE8MSRp4ScW0bzz8PL73kuuUefzz87//Cxo1VH2+MyT+WMAwnngiTJ8M7\n77jXHTu6Lrk2lsMYE8sShvles2bwxz+6adTbtHFjOf70J2scN8Y4ljDMQQ4/3HXJXboUZs6EPn1s\nSnVjTBYnDBu4F7zjj4dXXoHWraFbN9iyJewSGWOSYQP3bOBeWlSvDg8+6EaL9+xpPamMyUY2cM+k\n1bhx0KOHm9jQ2jSMyU+WMIwnInDffbBrF9x+e9ilMcaEIeMShoj0EJGFIjJBRM4KuzymVI0aUFwM\nDz8Mb78ddmmMMemWcQkDUOBboBawKeSymDiNG7uV/i6/3G5NGZNvAk8YIvKYiGwWkRVx288TkdUi\nslZERke3q+pCVe0DjAFuC7p8JnEjRkCdOvDEE2GXxBiTTumoYUwCesVuEJECYHxk+wnAUBFpF3fc\nNqBmGspnEiTiJi+8+WbXpmGMyQ+BJwxVXQTEd8bsDKxT1fWquheYCvQHEJELRGQi8DdcUjEZqGtX\n6NwZJkwIuyTGmHSpHlLcJkDsFHebcEkEVZ0JzAyjUCYxN90E/fvDtddCTasLGpPzwkoYKRs0aND3\nzwsLC2nfvr3vMRYvXuz7OXMtTv36ZzNq1Mf06PFRoHHiZfP3LNfj5NK1ZHuckpISVq1a5dv5wkoY\nnwDNY143jWzzbPr06b4WqCLDhg2zOJU45hi47rpGTJzYFZHg4pQnW79n+RAnl64ll+JI7B9pEtLV\nrVYij6hlQCsRaSEiNYEhwLNpKovx0TnnuEbwBQvCLokxJmjp6FZbDLwGtBGRDSIyQlX3A6OAecBK\nYKqqJlRvsskHM4MIXH01TJwYdkmMMRXxa/LBwG9JqWq5dSxVnQPMSfa8fly88cfPfua62G7ZAkcf\nHXZpjDHxioqKKCoq4tZbb03pPJk40ttkmfr1YeBAmDQp7JIYY4JkCcP44vLL3TKvqmGXxBgTlKxN\nGNaGkVm6doU9e+Ctt8IuiTEmXtoWUBKRriLykIisEJHPIw3XL4jIL0XksJRLkCRbQCmziLi2jH/8\nI+ySGGPipWUBJRGZA1wBvAicBzQC2gNjgdrALBHpl3IpTE64+GJ48knYvz+1vt7GmMxUVS+p4ar6\nRdy27cCbkccfReTIQEpmsk6bNtC8OaxceUzYRTHGBKDShBGbLESkIW6+JwWWqep/499jzMUXw7Rp\nLcMuhjEmAJ4avUXkCuB1YCAwGFgiIpcFWTCTnQYPhjffbMLu3WGXxBjjN6+9pG4ATlHVn6vqpcCp\nwOgqjgmU9ZLKTI0bQ7Nm23j55bBLYoyJSlsvqYgvccumRn0b2RYa6yWVuTp33sAzz4RdCmNMlF+9\npCptwxCR30Sevg8sFZFZuDaM/sCKCg80ee300zcybtxp7Nlj62QYk0uqqmEcEnl8APwTlywAZgEf\nVXSQyW9HHLGLtm3hlVfCLokxxk9V9ZJKbaYqk7cGD4ZnnoHzzgu7JMYYv1Q1cO8vInJiBfvqichl\nInJxMEUz2WzQIPjnP2Hv3rBLYozxS1UD9x4CbhGRk4D3gM9xI7xbA4cCjwNTAi2hyUotWsBxx8H8\n+XDuuWGXxhjjh6puSb0N/FREfgCchpsaZBewSlXXpKF8JosNHOhqGZYwjMkNnhZQUtXtwPxgi2Jy\nzYAB0LMnjB8PKS4lbIzJADa9uQlMu3ZQrx4sXx52SYzJb+keuJdxbOBedujfH2bNCrsUxuS3tExv\nbkyqLGEYkzs8tWGISBvcfFItYo9R1XMCKpfJEV26wObN8OGHrteUMSZ7ea1hTMOtfzEWlziij0CI\nSF0RWSYi5wcVw6RHtWrQt6/VMozJBV4Txj5VnaCqr6vq8ugjwHKNBp4K8Pwmjey2lDG5wWvCeE5E\nfiEijUSkQfTh5UAReUxENovIirjt54nIahFZKyKjY7b3BEpwgwStM2YO6NkT3noLvrCltozJal4T\nxqW4W1CvAcsjjzc8HjsJ6BW7QUQKgPGR7ScAQ0WkXWR3EXAGMAy3nrjJcnXqwI9+BLNnh10SY0wq\nvA7cS3rNTVVdJCIt4jZ3Btap6noAEZmKmzJ9taqOjWy7BLD/SXNE9LbUpZeGXRJjTLK89pKqAVwD\nnBXZNB94RFWTnVquCbAx5vUmXBL5nqr+PclzmwzUpw9cdx3s2uVqHMaY7OMpYQATgBrAw5HXwyPb\nQrtlNGjQoO+fFxYW0r59e99jLF682Pdz5nOcJk1+xM03r6ZTp08Ci+E3i5OZMSyONyUlJaxatcq3\n83lNGKeraseY16+IyDspxP0EaB7zumlkm2fTp09PIbx3w4YNszg+xdm8GVauPAa/ipAP37NsjZNL\n15JLcSTFSd28NnrvF5HjY4IeB+xPII5QtsfTMqCViLQQkZrAEODZBM5nslD//vDcc7A/kd8cY0zG\n8JowbgBeFZH5IrIAeAX4Xy8HikgxrndVGxHZICIjVHU/MAqYB6wEpqpqQvUmm3ww+xx3HBx9NCxZ\nEnZJjMkvfk0+6LWX1L9EpDXQNrJpjaru9nhsuXUsVZ0DzPFUynL4cfEm/QYMcL2lunULuyTJe+cd\nOP54+MEPwi6JMd4UFRVRVFTErbemtup2VUu0nhP5OhDoA7SKPPpEthmTkFwY9X3yyTB2bNilMCb9\nqqph9MDdfupbzj4FZvheIpPTTj0VduyA1avdehnZateusEtgTPpVtUTr7yJPb1PVj2L3iUjSg/n8\nEF0Pw9bEyC4i0K+fq2Vkc8KwhnuTTebPn+9Lm6/XRu/y+rA+k3L0FNgCStmrf3+31nc2O3Ag7BIY\n451fCyhVWsOIzO90AnBYXJvFoUDtlKObvHT22TBkCPz3v9CwYdilSY5q2CUwJv2qqmG0BX4C1Me1\nY0QfnYArgy2ayVU1a0KvXm5MRrZShenT4Z57wi6JMelTVRvGLGCWiHRV1f+kqUwmD/TvD1OmwJVZ\n/G/HmDHw/vtwQ2BLiRmTWby2YVwtIvWjL0TkcBF5PKAymTzQuzcsXAjbt4ddkuSlOMvCQTZvdj3I\njMlUXhNGB1XdFn2hqluBU4Ipkjc20ju71a/v1vt+8cWwS5IcVf8TRsOGMHy4v+c0Bvwb6e01YRSI\nyOHRF5HV9rxOXBgI6yWV/bJ9EJ/fCQPgs8/8P6cxaeklFeOPwH9EZFrk9YXA/6Uc3eS1fv3gd7+D\nffugeqj/fiQuiBqGMZnOUw0jspjRQGBz5DFQVZ8IsmAm9zVrBi1awKJFYZckOV4TxksvwbffBlsW\nY9LB6y0pgAbADlUdD3we9khvkxuy+baU14Tx4x/D/fcHWxZj0sFTwhCR3wGjgd9GNtUA/hFUoUz+\nGDDAjfrOtoFwyZR38GB4+23/y2JMunitYVwA9AN2AKjqp8AhQRXK5I+TTnJf33033HIkI5E2jOhA\nv2ytTRkD3hPGHlVV3Ay1iEi94Ipk8olI9t6WskZvk2+8JoynReQRoL6IXAm8DPwluGKZfJKNCSPb\nbqEZ4wevK+7dKyLnAt/g5pe6RVVfCrRkVbDpzXPHmWfCRx/Bxo2u51S2sBqGyRZpnd48cgvqFVW9\nAVezqCMiNVKOngIbuJc7qleHPn3g2WfDLol3VsMw2cSvgXteb0ktBGqJSBNgLjAcmJxydGMigrwt\nNWUKvP66v+f0e+De2rVH+ncyYwLiNWGIqu7EDd6boKoX4tbJMMYXvXrBkiXw9df+n/tnP4Nrr/X/\nvIn2kqrMrbf++PvnZ54JM2eW7nv/ffjwQ7d9374EC2mMjzwnDBHpClwMzI5sqxZEgUSknYhMEJGn\nReTqIGKYzPODH7gPxDlzgjl/Ji+p+t13pc9V3cj32NtzrVvDySe77baWuAmT14TxK9ygvZmqulJE\njgNeDaJAqrpaVa8BLgJ+GEQMk5kGDAjutpTfCSPRNoxobaS842Jn7I2OR4l/3+7dicUzJghe55Ja\nqKr9VPXuyOsPVfU6L8eKyGMisllEVsRtP09EVovIWhEZHbevL/A88IK3yzC5oG9fmDsX9uzx/9xh\nrcFdWaKI2rix9PnOncGWx5hUJDKXVLImAb1iN4hIATA+sv0EYGhk/XAAVPU5Ve0D/CwN5TMZomFD\naNcOgljmJIheTck0epd3zKhR/pzbmKAFnjBUdRGwNW5zZ2Cdqq5X1b3AVKA/gIj0EJE/i8hESttL\nTJ7IlkF8yfaS8pq4Knqfdec1YQprFYImQExFnE24JIKqLgAWhFEoE74BA+Dcc2H8eH//y7YPWmNS\n5ylhiMgfgDuAXbhxGB2A/1HV0GasHTRo0PfPCwsLad++ve8xFi9e7Ps5LU7V9u//Cb///WJatoyv\nmCYbYxhff72N4uLEm8TKjzOMDRs+ZuvWQ4EGFBcXVxobYMWKFUAH3n13BcXF75X7nlgffvghxcVL\nvt9/4MB+oBrTpj1NnTrJ961Nx+9Atvye5UOckpISVq1a5d8JVbXKB/B25OsFwGPAYcA7Xo6NHNcC\nWBHzugswN+b1GGB0AufTdJgyZYrFCSHODTeojh3rXwxQbd8+ubKUFwdUhwxR7dTJPa8qNqiOG1f6\ntaL3xD4uvbTs/lq13Nevv07uOiq7Hr9ly+9ZPsaJfHZ6+pwt7+G1DSNaE+kDTFPVRIdXSeQRtQxo\nJSItRKQmMATIookhTJCia2RkskRvlyV7S2z79uSOMyYIXhPG8yKyGjgV+JeIHAV8V8UxAIhIMfAa\n0EZENojICFXdD4wC5gErgamqmlC9ady4cb5MpmUyT5cu8MUXsG5d2CWpWLLtKy+/7AbheTV2bHJx\njIk1f/58X+aS8jpb7ZhIO8bXqrpfRHYQ6dXk4diDb9C67XOApMf1+nHxJjMVFMAFF7gFh8aM8eec\nfjd6iySWNKLvja5fvmcP1KpVdblsZLfxQ3Rm71tvvTWl83idrfZCYG8kWYzFLc/aOKXIxlRi0CCX\nMPwSdsKwkdsmF3i9JXWzqn4rIt2BnriG7wnBFcvkux494OOPYf16f84XRMKIPffcuf6e35hM5DVh\nRGfi6QM8qqqzgZrBFMkba8PIbdWrQ79+ZWdtzSSxNYyNG6F378rfH5+wosd++WXF77/jDoj2iLSR\n3yYVfrVheE0Yn0SWaL0IeEFEaiVwbCBsAaXcN3Cgv7elwhSfMKKvj6xkGYybb4Z//zu4Mpn8ke4F\nlH4KvAj0UtVtQAPghpSjG1OJnj3hvffgv/9N/hzRWWr9nq020TaMRP3978Gd25hkeZ2tdifwAdBL\nRK4FjlbVeYGWzOS9WrXg/PNTuy21d6/7GsQMuFFeEofXNpRatVIrizFB8tpL6lfAFODoyOMfIlLO\nHJvG+GvQIJgxI/njo4nC715JQdUwrK3CZDKvt6QuB85Q1VtU9Rbc1B5XBlcsY5xevdx63BU1Dlcl\nmjD8rmGE9cG+erWLbeMzTBg8L9FKaU8pIs9D/V/Ieknlh3r1XFvGs0lOHLN3r1v+NciEkcwtqYpu\nUVV1rjfecF9vsBZEk4B095KaBCwVkXEiMg5YghuLERrrJZU/UhnEt3u3Sxhh35LyK2FEPfSQ99jG\npLWXlKreB4wAvoo8Rqjq/SlHN8aDn/wEFi6Eb75J/Nhowti3z59lWqPniP3AT8ftKVvPw2SCKueS\nEpFqwEpVbQe8GXyRjCnr0EPhzDNh9mwYOjSxY6NzNtWs6Z7Xrp1aWWITRhA1DGMyWZU1jMjMsmtE\npHkaymNMuZK9LbV7d9mEkaroeI4DB0o/9K1nk8kXXpdoPRxYKSKvAzuiG1W1XyClMiZO//7wP/8D\nO3dC3brej4smjFq1/EkY0RpG7O2taOJIpNaR7JrdVjMxYfKaMG4OtBTGVOGII+D002HOHFfb8Cq2\nhuFHw3d5NYzo1wMHoFq18o/z+kFvCcFkskoThoi0Ao5R1QVx27sDnwVZMGPiXXQRPPVU8gkjHTUM\nryp6b0UN85ZITCaoqg3jfqC8vilfR/YZkzYDB8KLLya2bGm00duvW1LRGkZ09e3o89iv5fH6gV9V\nTy5LHCZMVSWMY1T13fiNkW3HBlIij2zgXv454gjo1g2ee877MUHekoqKvSVVEa+9pCwhmCCka+Be\n/Ur21Uk5egps4F5+uugimDrV+/vT3eidKksYJgjpGrj3hogcNGeUiFwBLE85ujEJGjAA5s+HHTtq\neHp/Ohq9W7Ys3eZVom0YUaNsyk8Toqp6Sf0amCkiF1OaIE7DrbZ3QZAFM6Y8hx0G55wDb7zRlCs9\nTH+5e7dLFkE2ekf50YYR1PHG+KHShKGqm4EfisjZwImRzbNV9ZUgCyUi/XHLwR4CPK6qLwUZz2SX\niy6CO+9s4em9ft+SKq/RO8qPGoZf7zcmCJ7GYajqq8CrAZclNt4sYJaI1AfuASxhmO/17QuXXXYk\nn38ORx1V+Xt37nQz3vp1SyqRGsbixanHi7LR5CYTpGVdbhF5TEQ2i8iKuO3nichqEVkrIqPLOXQs\nYPNymjLq1YOOHT/ztLDS9u1u8kG/axjlJYz4bd27lz5PdS4pq2GYTJCWhIGbHr1X7AYRKQDGR7af\nAAwVkXYx++8CXlDVt9NURpNFunRZz5NPVv2+aMIIooaRyC2pVGfKtYRhMkFaEoaqLgK2xm3uDKxT\n1fWquheYCvQHiCz/+iNgsIhclY4ymuzSseOnvPsubNhQ+ftiE4bfbRjxKvtQj7+llGgC2L+/6vcY\nE7R01TDK0wTYGPN6U2Qbqvqgqp6uqr9Q1UdDKZ3JaDVrHuDCC+GJJyp/344dwd2SSqSGYW0QJhd4\nnXww4wyKmVCosLCQ9u3b+x5jsZ+tlhbH9xiNGh3B+PFdOfbY5yv8QF67tohly9bw8ceN2bXrWw45\nZG3CcWJt2HAY0IdPP/2M7dtrAQ2+3/fMM9M57LDY+17Dvn+2alUJUPo7OmPGDGBgQmWJV1xcnPAx\n6frZpIPFqVpJSQmrVq3y74SqmpYH0AJYEfO6CzA35vUYYLTHc2k6TJkyxeJkaJwpU6bogQOqbdqo\nvvZaxe/r3l114ULV3/xG9Z57kosT6623XIfac85RPeWUaOda9/jss7LHxu67/vqD3xv7OplHMtL1\ns0kHi5O4yGdn0p/j6bwlJZFH1DKglYi0EJGawBDg2TSWx2Q5Ebj0Uvjb3yp+z7ZtbrBfrVrp71Yb\ny25JmVyQrm61xcBrQBsR2SAiI9St5DcKmAesBKaqque6k00+aACGD4dp0+C778rf/8UXbqxGECvu\nxQty4J4xqfBr8sG0tGGo6rAKts8B5iRzTj8u3mS/Zs3glFNg1iw3AjyWKnz5pZvltlYt+Ka8ifoT\nFE0Ke/ZA9bi/HksCJlMVFRVRVFTErbfemtJ5wuwlZYwvrrgCHnnk4O3ffAO1a5fOJeXX5IPR21u1\napXdZzUMk+ssYZisN3AgrFoFJSVlt3/5JRx5pHtep46bJiRVBw64c+3efXCCSHcbxtrEOnwZk7Ks\nTRjWhmGiatZ0tYyHHy67fdMmaNTIPa9fH77+OvVY+/eXJoy9e8vuS3cNo1s3GDkSPvkk9XOZ3Jau\nBZQyli2gZGKNHAnFxWXbKT76CI47zj0//HDYGj/XQBL27IFDDnFf9+51ySoq3beZ1qxxifCkk+A3\nv4EtW9Ib32SPdC2gZExWaNoUeveG8eNLt334YeniRvXr+5Mw9u51I8ejNYzYhJHISG8/kkuDBnD3\n3bByJezbB4WFMGaMuxVnTBAsYZiccfPNcP/9pbWMt95y/32Dq2Fs25Z6jGgNI5owasQs/BdWQ3aj\nRvDAA/D22+4a27SBW27x53qNiWUJw+SMdu2gTx/3Ybl3L7z2GnTt6vb5fUsqmjBie0qF3UuqWTOY\nOBHeeMO137RuDXfcAd9+638sk5+yNmFYo7cpzx//CNOnu7W/TzrJ3aqC0hpGqh/Uld2Sij13mN1m\nW7aExx93CXP1ajj+ePi//7MaRz6zRm9r9DblaNAAFi6ETp3KThkSHYuR6n/be/a4sR3VqsGuXRW3\nYcQnjCDaMKrSujX84x+wYAGsW+cSx9SpHdm8OfjYJrNYo7cxFWjZEm6/HZo3L7u9cWP49NPUzr1n\nj0sStWp0PSKxAAASnElEQVS5tTYysYYRr7AQJk+G5cvhu+9qUFgI114L69eHXTKTbSxhmLzRpEnq\nCSN6Gyo62ju20buyGkYig/yCcuyx8POfv0FJibut1qkT/PznbtCjMV5YwjB5o3Hj1Ae57dnjkkTt\n2u517HxSlSWBTFoxr2FDuOsu+OADd9uqqAjOPx9efDGzakYm81jCMHnDjxpG9JbUoYe61xX1kor/\n4N23r+zrTPhgrl8fbroJPv4YBg+GG2+E9u1hwgS3UqEx8SxhmLzRpEnVa4BXJXpLKlrDqFatdF9l\nbRjxCSOT1KkDl13mxnFMmADz5kGLFi6BWDuHiWUJw+SNtm1Tn7Dvu+9crSJ6K6og5i+oshpG/LxT\nmVDDiCfibk/NnAnLlrnbaJ06uS7K8+YlNs7E5CZLGCZvtGvnxiWkYscOqFevtLH7kENK92VrDaM8\nLVu6MS0bNrjBkDfeCK1awW23Wa0jn1nCMHmjeXP46qvUxmJEE0Z0XEVswsi2Ngwv6tWDK69006w8\n/TRs3uxqHT17wpQpbiyKyR9ZmzBspLdJVEGBq2W8917y54gmjOgcVSefXLqvsiQQf0sq24jAaafB\nQw+5nmZXXglPPOHahUaOhFdfzb5aVD6xkd420tsk4Yc/hMWLkz9+xw6oWxf+/Gf47DM3rXhUZTWM\n+PXEs6WGUZ7atd1yuHPnwooV7vbV9de7bstXXQUrVjTM+gSZa2yktzFJ6NYt9YRRr55r+G7YsOw4\njNixFlUljFzRtKmbUn35cliyxI3reOaZDjRs6HpezZ7tz9K4JjNYwjB55cwz4d//Tv72STRhlOe7\n70qfxyeM2H3l7c8Fxx0HN9wAt902j7fegg4d4M47XWIdPhxmzPBn1UMTnoxLGCLSUkT+KiJPh10W\nk3uaNHEfbMk2f23f7qbVKE/sYLf4hBD/X3YuJoxYzZvDr38Nixa5BZ66dHFTrzdtCt27u7m+Xn89\ns0bAm6plXMJQ1Y9U9Yqwy2Fy109/Ck89ldyxX37pZsSNFW0AryxhbN9e9nU+fVA2bgy//KUby7Fl\ni1voautWGDECjjkGhgyBxx5zKyTmeiLNdoEnDBF5TEQ2i8iKuO3nichqEVkrIqODLocxUUOGuDUz\nEl0fQtUljCOOKLv9mWfg3HNh586y740VHytfB8HVqQO9esF997max1tvue/dyy+79qUWLeCSS2DS\nJLcmuyWQzJKOGsYkoFfsBhEpAMZHtp8ADBWRdnHHxa0gYIw/out/P/JIYsft2OGmAqlTp+z2Nm1c\nd93K5l/64ouyr/M1YcRr1gwuvxyefNLN8xVNHPPmuR5t/fqFXUITK/CEoaqLgPjFMTsD61R1varu\nBaYC/QFEpIGITABOtpqHCcrYsXDvvfD5596P+eqrg2sXUYccUrqWOBz8n/E335SdqDDVW1IPPpja\n8ZlIxCXfkSNdAnnxRRtVnmnCasNoAmyMeb0psg1V/UpVr1HV1qp6dyilMzmvsBCGDoXRCfxLsmUL\nHHVU+fuaNoWNMb/R5d1KOfzw0uext6/Ks25d2Xmq4v3855Ufb0wQqlf9lsw0aNCg758XFhbSvn17\n32MsTqXDvsXJ+BgdOlRn7NjejBq1gq5dy/9XNjbO0qXNqFbtWIqL/33Q+z76qDFLlrSluPhVAL79\ntiYwuMx7tm/fDbhqxqxZrwJnl9k/ceIzXH21O+b114t57LFqjBhxUZn3nHHGepYubcHUqdOoWzfx\n0XHZ8rMB2LTpUNau7UX37pto1mwbzZtvo1GjbzjyyJ0UFGhO/T4HFaekpIRVfq6QpaqBP4AWwIqY\n112AuTGvxwCjEzifpsOUKVMsTobG8SvG8uWqRx6punhx1XHuvlv1N78p/32bNqkecYTq/v3u9X//\nq+rqGaozZpQ+jz6efvrgbapln8e+jj5+8Qv3de/e5K43m342Bw6oLlmiOmmS6q9/rdqzp2rz5qq1\na6uecILqGWd8rHfeqTp3ruqWLb6ELFcu/d1EPjuT/ixPVw1DKNuIvQxoJSItgM+AIcDQNJXFmO91\n6uTmRLrgAvjnP6Fr14rfu3o1nH56+fuaNHG3nN5+250zdmqMCy5wbR9ffunWm7jmmoMbwWMdffTB\n2yZNct15TzzRTdNePWvvDXgnAmec4R6xdu50t+weffQTPv+8BXffDW++6b7/J5/sxtkcd5ybsqRl\nS7c0bXxHBZOcwH/tRKQYKAKOEJENwO9UdZKIjALm4dpRHlPVhOpN0bmkbD4pk6rzzoPJk6F/f/jD\nH+DSS0tno421ZAlce23F5xk+3A1Oe/TRgycbbNDAJYyrr3aNuevWVXye2MbzNWvgyCPLjv247jpP\nl5Wz6taFjh2hW7ePGTbsh4DrdbZunZvb6qOP3ASTzz3nnq9f775/TZu6QZd165Z91Kzper/FPgoK\nSp+vWtWOvXtd+9Uxx7jpT6IrLmaL+fPn+zJZa+AJQ1WHVbB9DjAn2fP6MZGWMVG9e8Mrr7iG8Bkz\nYPx4N1o5as0a10uqQ4eKz3HNNW6J01/9yn0Ixbr3XojeSm7Vyn2gtWzpPtBi1axZdhqRNm1Su658\nUVDgal5t2x6878AB12V30yZXO4l/7N7teq1FHwcOlD7fswe2bq3Dv/7letR99plLTIcf7mbvLSpy\njw4dKu+kELboP9e33nprSufJg4qtMd6ceCK88Yab/+iUU9ytpKOPPoY1a1wSGDmy8ltBRx3lFhi6\n9NLSMR7R9TL69SsdU9C1K9x/P/To4RLGEUfAmDHPAz+hWTP44INALzPvFBS42kXTpskdX1z8FsOG\nFX7/+sABV2tZutRNMTNxoutBd9ZZ8KMfufXRGzXyp+yZJoNzojHpV6sWjBvn2itatXIzr/bu7W5D\n/L//V/XxV1/tag5DhrjXs2cf/J4ePdzkh9H1wOvUgcaN3X2oBQvg/ff9uRYTjIKC0p/xxInud2Xl\nSvf6jTdcLXPwYPjPf8Iuqf+ytoZhbRgmSEcd5abtbt78JYYNK/euarlE4PHH4ZxzXK3kzDMPfk90\n8F90ffEtW0r3NWmSQqFNaBo1cgljyBDXBvXEEzBsmEssN93kfh/KaxdLl6xpwwiKtWGYTHXIIbBs\nWeXvWbrUdZQdPPjgiQlNdjv0UDfZ4lVXQXGx6yhRUODm0Dr1VNeLrkkTV7Pcu9f1mNuyxY3z+eQT\nd5vyww/dba86ddyttLPOcotUJcvaMIzJYp07u6/PP+8aua3dIvfUqOHasy65xC3atXgxzJoFv/ud\nWxv9u+9cm9iRR7pH9erHcuaZbhaCPn1cd+Bdu9wMApmydrolDGNC1LGj+2oJI3eJuDVAunev/H3F\nxf8u9/bnaacFVLAkWKO3McYYT7I2YYwbN86XRhxjjMl18+fP96XdN2tvSVmjtzHGeONXo3fW1jCM\nMcaklyUMY4wxnljCMMYY44klDGOMMZ5YwjDGGOOJJQxjjDGeWMIwxhjjiSUMY4wxnmRtwrCR3sYY\n442N9LaR3sYY44mN9DbGGJNWljCMMcZ4knG3pESkLvAwsBtYoKrFIRfJGGMMmVnDGAhMU9WRQL8w\nC1JSUmJxMjROLl1LrsXJpWvJxTipCDxhiMhjIrJZRFbEbT9PRFaLyFoRGR2zqymwMfJ8f9Dlq8yq\nVassTobGyaVrybU4uXQtuRgnFemoYUwCesVuEJECYHxk+wnAUBFpF9m9EZc0ACQN5avQ559/bnEy\nNE4uXUuuxcmla8nFOKkIPGGo6iJga9zmzsA6VV2vqnuBqUD/yL6ZwGAReQh4LujyVSbXflFyKU4u\nXUuuxcmla8nFOKkIq9G7CaW3nQA24ZIIqroTuKyqE4ikp/JhcTI3Ti5dS67FyaVrycU4ycq4XlJe\nqGpmf1eNMSYHhdVL6hOgeczrppFtxhhjMlS6EoZQtgF7GdBKRFqISE1gCPBsmspijDEmCenoVlsM\nvAa0EZENIjJCVfcDo4B5wEpgqqpmfp8yY4zJY6KqYZfBGGNMFsjEkd4JEZGWIvJXEXm6sm0Bxakr\nIpNF5BERGeZXrMi5C0XkKRF5SEQG+XnuuDjNRGRm5NpGV31E0nG6i8gEEfmLiCwKKIaIyB0i8oCI\nDA8iRiRODxFZGLmes4KKE4lVV0SWicj5AcZoF7mWp0Xk6gDj9BeRR0XkSRE5N6AYvv/tlxMjsL/7\nuDiBX0skjuefS9YnDFX9SFWvqGpbEHEIdhqT3sADqvpL4BKfzx3rJNw1XAGcHFQQVV2kqtcAzwN/\nCyhMf1wHij24rtpBUeBboFbAcQBGA08FGUBVV0d+NhcBPwwwzixVvQq4BvhpQDF8/9svR1qmL0rT\ntST0c8mYhJHEFCKZEKfKaUxSiPcEMERE/gA0qKogKcRZAlwhIi8DcwOMEzUMqHRCyRRitAUWq+r1\nwC+CuhZVXaiqfYAxwG1BxRGRnkAJ8DkeZj1I5WcjIn1xyfyFIONEjAUeCjiGZ0nESmr6oiz4jKvy\n54KqZsQD6I77D3dFzLYC4H2gBVADeBtoF9k3HLgPaBR5Pa2cc5a3zbc4wMXA+ZHnxQFdVwEwM6Dv\n35+Am4HuFX2//LweoBnwSIAxhgODI9umpuF3ribwdIA/m8ci8V4M8Hfg++uJbHs+wDiNgbuAc8L4\nPPAxVpV/937EiXmP52tJNo7nn0siBQn6EbmY2IvsAsyJeT0GGB13TANgArAuuq+8bQHFqQs8jsvK\nQ32+rhbAI7iaxg8D/P6dAEyLXNsfgooT2T4O6BLgtdQB/gr8GbgmwDgXABOBJ4GzgvyeRfZdQuQD\nKqDr6RH5nk0M+Ps2Ctel/mHgqoBiVPq370csPP7d+xAnqWtJIo7nn0umj/SucAqRKFX9CnfvrdJt\nAcXxNI1JkvHWAyOTOHeicVYCFwYdJxJrXJAxVHUXkOo9Xy9xZuLmPAs0Tky8vwcZR1UXAAtSiOE1\nzoPAgwHHSPRvP+FYKfzdJxrHr2upKo7nn0vGtGEYY4zJbJmeMNI1hUi6pyrJtetKR5xcuhaLk7kx\n0h0rq+JkWsJI1xQi6Z6qJNeuKx1xculaLE7mxkh3rOyOk0hDSpAPXFfLT3FreW8ARkS29wbW4Bp+\nxmRLnFy9rnTEyaVrsTiZGyMXv29Bx7GpQYwxxniSabekjDHGZChLGMYYYzyxhGGMMcYTSxjGGGM8\nsYRhjDHGE0sYxhhjPLGEYYwxxhNLGCaniMh+EXlTRN6KfL0x7DJFicg0ETk28vxjEVkQt//t+DUM\nyjnHByLSOm7bn0TkBhE5UUQm+V1uY6IyfbZaYxK1Q1U7+XlCEammqp4XyqngHO2BAlX9OLJJgUNE\npImqfiIi7SLbqvIkblqH2yPnFWAw0FVVN4lIExFpqqpBrwRo8pDVMEyuKXdlOhH5SETGichyEXlH\nRNpEtteNrFC2JLKvb2T7pSIyS0T+BbwszsMiUiIi80RktogMFJGzRWRmTJyeIjKjnCJcDMyK2/Y0\n7sMfYCgxKxGKSIGI/EFElkZqHldGdk2NOQbgLODjmATxfNx+Y3xjCcPkmjpxt6Ri1/rYoqqn4hYK\nuj6y7SbgX6raBTgHuFdE6kT2nQIMVNWzces4N1fV9rjV3boCqOqrQFsROSJyzAjcSnnxugHLY14r\nMB23GBNAX+C5mP2XA9tU9QzcugVXiUgLVX0P2C8iJ0XeNwRX64h6Azizsm+QMcmyW1Im1+ys5JZU\ntCawnNIP6h8DfUXkhsjrmpROA/2Sqn4ded4dtzIhqrpZRF6NOe8TwM9EZDJuZbPh5cRuhFubO9aX\nwFYRuQi3dveumH0/Bk6KSXiHAq2B9URqGSJSAgwAbok5bgtuKVRjfGcJw+ST3ZGv+yn93RdgkKqu\ni32jiHQBdng872Rc7WA3bv3lA+W8ZydQu5ztT+OW+rwkbrsAo1T1pXKOmQrMAxYC76hqbCKqTdnE\nY4xv7JaUyTXltmFU4kXguu8PFjm5gvctBgZF2jKOAYqiO1T1M9x00jcBFfVSWgW0KqecM4G7cQkg\nvly/EJHqkXK1jt4qU9UPgS+Auyh7OwqgDfBeBWUwJiWWMEyuqR3XhvH7yPaKeiDdDtQQkRUi8h5w\nWwXvm45bB3kl8Hfcba2vY/ZPATaq6poKjn8BODvmtQKo6nZVvUdV98W9/6+421Rvisi7uHaX2DsC\nTwJtgfgG9rOB2RWUwZiU2HoYxngkIvVUdYeINACWAt1UdUtk34PAm6pabg1DRGoDr0SOCeSPLrKS\n2nygewW3xYxJiSUMYzyKNHTXB2oAd6vqE5HtbwDbgXNVdW8lx58LrApqjISItAIaq+rCIM5vjCUM\nY4wxnlgbhjHGGE8sYRhjjPHEEoYxxhhPLGEYY4zxxBKGMcYYTyxhGGOM8eT/A1MGbSxcd/bBAAAA\nAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -98,8 +223,7 @@ } ], "source": [ - "total = gd157[1]\n", - "plt.loglog(total.xs.x, total.xs.y)\n", + "plt.loglog(gd157.energy, total.xs(gd157.energy))\n", "plt.xlabel('Energy (MeV)')\n", "plt.ylabel('Cross section (b)')" ] @@ -115,7 +239,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 8, "metadata": { "collapsed": false }, @@ -145,12 +269,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Let's suppose we want to look more closely at the (n,2n) reaction." + "Let's suppose we want to look more closely at the (n,2n) reaction. This reaction has an energy threshold" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 9, "metadata": { "collapsed": false }, @@ -161,12 +285,64 @@ "text": [ "Threshold = 6.400881 MeV\n" ] + } + ], + "source": [ + "n2n = gd157[16]\n", + "print('Threshold = {} MeV'.format(n2n.threshold))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The (n,2n) cross section, like all basic cross sections, is represented by the `Tabulated1D` class. The energy and cross section values in the table can be directly accessed with the `x` and `y` attributes. Using the `x` and `y` has the nice benefit of automatically acounting for reaction thresholds." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n2n.xs" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(6.400881, 20.0)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" }, { "data": { - "image/png": "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\n9zC0aV7vrgAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -174,12 +350,10 @@ } ], "source": [ - "n2n = gd157[16]\n", "plt.plot(n2n.xs.x, n2n.xs.y)\n", "plt.xlabel('Energy (MeV)')\n", "plt.ylabel('Cross section (b)')\n", - "plt.xlim((n2n.xs.x[0], n2n.xs.x[-1]))\n", - "print('Threshold = {} MeV'.format(n2n.threshold))" + "plt.xlim((n2n.xs.x[0], n2n.xs.x[-1]))" ] }, { @@ -191,7 +365,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 12, "metadata": { "collapsed": false }, @@ -203,7 +377,7 @@ " ]" ] }, - "execution_count": 6, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -214,7 +388,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 13, "metadata": { "collapsed": false }, @@ -222,10 +396,10 @@ { "data": { "text/plain": [ - "[]" + "[]" ] }, - "execution_count": 7, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -244,7 +418,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -252,39 +426,39 @@ { "data": { "text/plain": [ - "[,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ]" + "[,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ]" ] }, - "execution_count": 8, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -303,16 +477,16 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\nMAzDMAyv/B9ZBCMoWOfF0wAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -333,14 +507,42 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Unresolved resonance probability tables\n", - "\n", - "We can also look at unresolved resonance probability tables which are stored in a `ProbabilityTables` object. In the following example, we'll create a plot showing what the total cross section probability tables look like as a function of incoming energy." + "There is also `summed_reactions` attribute for cross sections (like total) which are built from summing up other cross sections." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[,\n", + " ,\n", + " ,\n", + " ,\n", + " ]\n" + ] + } + ], + "source": [ + "pprint(list(gd157.summed_reactions.values()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that the cross sections for these reactions are represented by the `Sum` class rather than `Tabulated1D`. They do not support the `x` and `y` attributes." + ] + }, + { + "cell_type": "code", + "execution_count": 17, "metadata": { "collapsed": false }, @@ -348,18 +550,49 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 10, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gd157[27].xs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Unresolved resonance probability tables\n", + "\n", + "We can also look at unresolved resonance probability tables which are stored in a `ProbabilityTables` object. In the following example, we'll create a plot showing what the total cross section probability tables look like as a function of incoming energy." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -411,7 +644,7 @@ " color=cm(value)))\n", "\n", "# Overlay total cross section\n", - "ax.plot(total.xs.x, total.xs.y, 'k')\n", + "ax.plot(gd157.energy, total.xs(gd157.energy), 'k')\n", "\n", "# Make plot pretty and labeled\n", "ax.set_xlim(1e-6, 1e-1)\n", @@ -426,32 +659,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Exporting to HDF5\n", + "## Converting ACE to HDF5\n", "\n", - "To create an HDF5 nuclear data file for a nuclide, we can use the `export_to_hdf5()` method." + "The `openmc.data` package can also read ACE files and output HDF5 files. ACE files can be read with the `openmc.data.IncidentNeutron.from_ace(...)` factory method." ] }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "gd157.export_to_hdf5('gd157.h5', 'w')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's see what's in the HDF5 file." - ] - }, - { - "cell_type": "code", - "execution_count": 12, + "execution_count": 19, "metadata": { "collapsed": false }, @@ -459,29 +674,80 @@ { "data": { "text/plain": [ - "['Gd157.71c']" + "" ] }, - "execution_count": 12, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "h5file = h5py.File('gd157.h5', 'r')\n", - "list(h5file)" + "filename = '/home/smharper/nuclear-data/nndc/293.6K/Gd_157_293.6K.ace'\n", + "gd157_ace = openmc.data.IncidentNeutron.from_ace(filename)\n", + "gd157_ace" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "All reaction data is contained in the `reactions` group under a nuclide. While the group for each reaction is only labeled by its MT value, we can look at the group attributes to get a label for the reaction." + "We can store this formerly ACE data as HDF5 with the `export_to_hdf5()` method." ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "gd157_ace.export_to_hdf5('gd157.h5', 'w')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With few exceptions, the HDF5 file encodes the same data as the ACE file." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gd157_reconstructed = openmc.data.IncidentNeutron.from_hdf5('gd157.h5')\n", + "gd157_ace[16].xs.y - gd157_reconstructed[16].xs.y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And one of the best parts of using HDF5 is that it is a widely used format with lots of third-party support. You can use `h5py`, for example, to inspect the data." + ] + }, + { + "cell_type": "code", + "execution_count": 22, "metadata": { "collapsed": false }, @@ -504,6 +770,7 @@ } ], "source": [ + "h5file = h5py.File('gd157.h5', 'r')\n", "main_group = h5file['Gd157.71c/reactions']\n", "for name, obj in sorted(list(main_group.items()))[:10]:\n", " if 'reaction_' in name:\n", @@ -512,7 +779,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 23, "metadata": { "collapsed": false }, @@ -541,9 +808,10 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 24, "metadata": { - "collapsed": false + "collapsed": false, + "scrolled": true }, "outputs": [ { @@ -564,7 +832,7 @@ " 7.77740000e-01])" ] }, - "execution_count": 15, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -572,57 +840,25 @@ "source": [ "n2n_group['xs'].value" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that we can go the other direction, converting data from an HDF5 file into a `NeutronTable` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "gd157_reconstructed = openmc.data.IncidentNeutron.from_hdf5('gd157.h5')\n", - "gd157[16].xs.y - gd157_reconstructed[16].xs.y" - ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 2", "language": "python", - "name": "python3" + "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 3 + "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2" + "pygments_lexer": "ipython2", + "version": "2.7.12" } }, "nbformat": 4, diff --git a/openmc/data/data.py b/openmc/data/data.py index 21fffc8cb..0365b3794 100644 --- a/openmc/data/data.py +++ b/openmc/data/data.py @@ -122,10 +122,11 @@ ATOMIC_SYMBOL = {1: 'H', 2: 'He', 3: 'Li', 4: 'Be', 5: 'B', 6: 'C', 7: 'N', 114: 'Fl', 116: 'Lv'} ATOMIC_NUMBER = {value: key for key, value in ATOMIC_SYMBOL.items()} -REACTION_NAME = {1: '(n,total)', 2: '(n,elastic)', 4: '(n,level)', 5: '(n,misc)', 11: '(n,2nd)', - 16: '(n,2n)', 17: '(n,3n)', 18: '(n,fission)', 19: '(n,f)', - 20: '(n,nf)', 21: '(n,2nf)', 22: '(n,na)', 23: '(n,n3a)', - 24: '(n,2na)', 25: '(n,3na)', 28: '(n,np)', 29: '(n,n2a)', +REACTION_NAME = {1: '(n,total)', 2: '(n,elastic)', 4: '(n,level)', + 5: '(n,misc)', 11: '(n,2nd)', 16: '(n,2n)', 17: '(n,3n)', + 18: '(n,fission)', 19: '(n,f)', 20: '(n,nf)', 21: '(n,2nf)', + 22: '(n,na)', 23: '(n,n3a)', 24: '(n,2na)', 25: '(n,3na)', + 27: '(n,absorption)', 28: '(n,np)', 29: '(n,n2a)', 30: '(n,2n2a)', 32: '(n,nd)', 33: '(n,nt)', 34: '(n,nHe-3)', 35: '(n,nd2a)', 36: '(n,nt2a)', 37: '(n,4n)', 38: '(n,3nf)', 41: '(n,2np)', 42: '(n,3np)', 44: '(n,n2p)', 45: '(n,npa)',