From 0b77cc7edc6ec1d83a45e10a4beb2ebbf0aba34b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 28 Apr 2022 17:11:21 -0500 Subject: [PATCH] Allow normal instantiation of ResultsList (instead of from_hdf5) --- docs/source/usersguide/depletion.rst | 2 +- .../pincell_depletion/restart_depletion.py | 4 +-- examples/pincell_depletion/run_depletion.py | 2 +- openmc/deplete/abc.py | 2 +- openmc/deplete/results.py | 7 +++- openmc/deplete/results_list.py | 36 ++++++++++++------- tests/regression_tests/deplete/test.py | 6 ++-- tests/unit_tests/test_deplete_activation.py | 4 +-- tests/unit_tests/test_deplete_integrator.py | 5 ++- tests/unit_tests/test_deplete_restart.py | 10 +++--- tests/unit_tests/test_deplete_resultslist.py | 2 +- tests/unit_tests/test_transfer_volumes.py | 2 +- 12 files changed, 48 insertions(+), 34 deletions(-) diff --git a/docs/source/usersguide/depletion.rst b/docs/source/usersguide/depletion.rst index 78a12c4ca..e3f4017f2 100644 --- a/docs/source/usersguide/depletion.rst +++ b/docs/source/usersguide/depletion.rst @@ -53,7 +53,7 @@ The coupled transport-depletion problem is executed, and once it is done a easy retrieval of k-effective, nuclide concentrations, and reaction rates over time:: - results = openmc.deplete.ResultsList.from_hdf5("depletion_results.h5") + results = openmc.deplete.ResultsList("depletion_results.h5") time, keff = results.get_keff() Note that the coupling between the transport solver and the transmutation solver diff --git a/examples/pincell_depletion/restart_depletion.py b/examples/pincell_depletion/restart_depletion.py index 72209d2ab..45bb4343d 100644 --- a/examples/pincell_depletion/restart_depletion.py +++ b/examples/pincell_depletion/restart_depletion.py @@ -12,7 +12,7 @@ with openmc.StatePoint(statepoint) as sp: geometry = sp.summary.geometry # Load previous depletion results -previous_results = openmc.deplete.ResultsList.from_hdf5("depletion_results.h5") +previous_results = openmc.deplete.ResultsList("depletion_results.h5") ############################################################################### # Transport calculation settings @@ -56,7 +56,7 @@ integrator.integrate() ############################################################################### # Open results file -results = openmc.deplete.ResultsList.from_hdf5("depletion_results.h5") +results = openmc.deplete.ResultsList("depletion_results.h5") # Obtain K_eff as a function of time time, keff = results.get_keff(time_units='d') diff --git a/examples/pincell_depletion/run_depletion.py b/examples/pincell_depletion/run_depletion.py index 53b0614d1..727039a29 100644 --- a/examples/pincell_depletion/run_depletion.py +++ b/examples/pincell_depletion/run_depletion.py @@ -101,7 +101,7 @@ integrator.integrate() ############################################################################### # Open results file -results = openmc.deplete.ResultsList.from_hdf5("depletion_results.h5") +results = openmc.deplete.ResultsList("depletion_results.h5") # Obtain K_eff as a function of time time, keff = results.get_keff(time_units='d') diff --git a/openmc/deplete/abc.py b/openmc/deplete/abc.py index 0d1e8ad41..7c3fc42f7 100644 --- a/openmc/deplete/abc.py +++ b/openmc/deplete/abc.py @@ -842,7 +842,7 @@ class Integrator(ABC): k = ufloat(res.k[0, 0], res.k[0, 1]) # Scale reaction rates by ratio of source rates - rates *= source_rate / res.source_rate[0] + rates *= source_rate / res.source_rate return bos_conc, OperatorResult(k, rates) def _get_start_data(self): diff --git a/openmc/deplete/results.py b/openmc/deplete/results.py index 3916fb4d7..9ff07b049 100644 --- a/openmc/deplete/results.py +++ b/openmc/deplete/results.py @@ -69,6 +69,11 @@ class Results: self.data = None + def __repr__(self): + t = self.time[0] + dt = self.time[1] - self.time[0] + return f"" + def __getitem__(self, pos): """Retrieves an item from results. @@ -406,7 +411,7 @@ class Results: results.data = number_dset[step, :, :, :] results.k = eigenvalues_dset[step, :] results.time = time_dset[step, :] - results.source_rate = source_rate_dset[step, :] + results.source_rate = source_rate_dset[step, 0] if "depletion time" in handle: proc_time_dset = handle["/depletion time"] diff --git a/openmc/deplete/results_list.py b/openmc/deplete/results_list.py index f2f2be0ab..843e3aec6 100644 --- a/openmc/deplete/results_list.py +++ b/openmc/deplete/results_list.py @@ -29,9 +29,24 @@ def _get_time_as(seconds, units): class ResultsList(list): """A list of openmc.deplete.Results objects - It is recommended to use :meth:`from_hdf5` over - direct creation. + Parameters + ---------- + filename : str + Path to depletion result file + """ + def __init__(self, filename): + with h5py.File(str(filename), "r") as fh: + cv.check_filetype_version(fh, 'depletion results', VERSION_RESULTS[0]) + data = [] + + # Get number of results stored + n = fh["number"][...].shape[0] + + for i in range(n): + data.append(Results.from_hdf5(fh, i)) + super().__init__(data) + @classmethod def from_hdf5(cls, filename): @@ -46,17 +61,14 @@ class ResultsList(list): ------- new : ResultsList New instance of depletion results + """ - with h5py.File(str(filename), "r") as fh: - cv.check_filetype_version(fh, 'depletion results', VERSION_RESULTS[0]) - new = cls() - - # Get number of results stored - n = fh["number"][...].shape[0] - - for i in range(n): - new.append(Results.from_hdf5(fh, i)) - return new + warn( + "The from_hdf5(...) method is no longer necessary and will be removed " + "in a future version of OpenMC. Use ResultsList(...) instead.", + FutureWarning + ) + return cls(filename) def get_atoms(self, mat, nuc, nuc_units="atoms", time_units="s"): """Get number of nuclides over time from a single material diff --git a/tests/regression_tests/deplete/test.py b/tests/regression_tests/deplete/test.py index 4f0e738a3..91f18667e 100644 --- a/tests/regression_tests/deplete/test.py +++ b/tests/regression_tests/deplete/test.py @@ -77,8 +77,8 @@ def test_full(run_in_tmpdir, problem, multiproc): return # Load the reference/test results - res_test = openmc.deplete.ResultsList.from_hdf5(path_test) - res_ref = openmc.deplete.ResultsList.from_hdf5(path_reference) + res_test = openmc.deplete.ResultsList(path_test) + res_ref = openmc.deplete.ResultsList(path_reference) # Assert same mats for mat in res_ref[0].mat_to_ind: @@ -139,7 +139,7 @@ def test_depletion_results_to_material(run_in_tmpdir, problem): """Checks openmc.Materials objects can be created from depletion results""" # Load the reference/test results path_reference = Path(__file__).with_name('test_reference.h5') - res_ref = openmc.deplete.ResultsList.from_hdf5(path_reference) + res_ref = openmc.deplete.ResultsList(path_reference) # Firstly need to export materials.xml file for the initial simulation state geometry, lower_left, upper_right = problem diff --git a/tests/unit_tests/test_deplete_activation.py b/tests/unit_tests/test_deplete_activation.py index 2f02ec4b8..2c3e0c053 100644 --- a/tests/unit_tests/test_deplete_activation.py +++ b/tests/unit_tests/test_deplete_activation.py @@ -107,7 +107,7 @@ def test_activation(run_in_tmpdir, model, reaction_rate_mode, reaction_rate_opts integrator.integrate() # Get resulting number of atoms - results = openmc.deplete.ResultsList.from_hdf5('depletion_results.h5') + results = openmc.deplete.ResultsList('depletion_results.h5') _, atoms = results.get_atoms(w, "W186") assert atoms[0] == pytest.approx(n0) @@ -155,7 +155,7 @@ def test_decay(run_in_tmpdir): integrator.integrate() # Get resulting number of atoms - results = openmc.deplete.ResultsList.from_hdf5('depletion_results.h5') + results = openmc.deplete.ResultsList('depletion_results.h5') _, atoms = results.get_atoms(mat, "Sr89") # Ensure density goes down by a factor of 2 after each half-life diff --git a/tests/unit_tests/test_deplete_integrator.py b/tests/unit_tests/test_deplete_integrator.py index a08d8738c..9c53ad7e2 100644 --- a/tests/unit_tests/test_deplete_integrator.py +++ b/tests/unit_tests/test_deplete_integrator.py @@ -103,7 +103,7 @@ def test_results_save(run_in_tmpdir): Results.save(op, x2, op_result2, t2, 0, 1) # Load the files - res = ResultsList.from_hdf5("depletion_results.h5") + res = ResultsList("depletion_results.h5") for i in range(stages): for mat_i, mat in enumerate(burn_list): @@ -176,8 +176,7 @@ def test_integrator(run_in_tmpdir, scheme): # get expected results - res = ResultsList.from_hdf5( - operator.output_dir / "depletion_results.h5") + res = ResultsList(operator.output_dir / "depletion_results.h5") t1, y1 = res.get_atoms("1", "1") t2, y2 = res.get_atoms("1", "2") diff --git a/tests/unit_tests/test_deplete_restart.py b/tests/unit_tests/test_deplete_restart.py index 82ef05ac7..2bfcfea7d 100644 --- a/tests/unit_tests/test_deplete_restart.py +++ b/tests/unit_tests/test_deplete_restart.py @@ -24,8 +24,7 @@ def test_restart_predictor_cecm(run_in_tmpdir): openmc.deplete.PredictorIntegrator(op, dt, power).integrate() # Load the files - prev_res = openmc.deplete.ResultsList.from_hdf5( - op.output_dir / "depletion_results.h5") + prev_res = openmc.deplete.ResultsList(op.output_dir / "depletion_results.h5") # Re-create depletion operator and load previous results op = dummy_operator.DummyOperator(prev_res) @@ -51,8 +50,7 @@ def test_restart_cecm_predictor(run_in_tmpdir): cecm.integrate() # Load the files - prev_res = openmc.deplete.ResultsList.from_hdf5( - op.output_dir / "depletion_results.h5") + prev_res = openmc.deplete.ResultsList(op.output_dir / "depletion_results.h5") # Re-create depletion operator and load previous results op = dummy_operator.DummyOperator(prev_res) @@ -75,7 +73,7 @@ def test_restart(run_in_tmpdir, scheme): bundle.solver(operator, [0.75], 1.0).integrate() # restart - prev_res = openmc.deplete.ResultsList.from_hdf5( + prev_res = openmc.deplete.ResultsList( operator.output_dir / "depletion_results.h5") operator = dummy_operator.DummyOperator(prev_res) @@ -84,7 +82,7 @@ def test_restart(run_in_tmpdir, scheme): # compare results - results = openmc.deplete.ResultsList.from_hdf5( + results = openmc.deplete.ResultsList( operator.output_dir / "depletion_results.h5") _t, y1 = results.get_atoms("1", "1") diff --git a/tests/unit_tests/test_deplete_resultslist.py b/tests/unit_tests/test_deplete_resultslist.py index 03e7c3eb0..2554d2188 100644 --- a/tests/unit_tests/test_deplete_resultslist.py +++ b/tests/unit_tests/test_deplete_resultslist.py @@ -13,7 +13,7 @@ def res(): """Load the reference results""" filename = (Path(__file__).parents[1] / 'regression_tests' / 'deplete' / 'test_reference.h5') - return openmc.deplete.ResultsList.from_hdf5(filename) + return openmc.deplete.ResultsList(filename) def test_get_atoms(res): diff --git a/tests/unit_tests/test_transfer_volumes.py b/tests/unit_tests/test_transfer_volumes.py index e1f3c1053..50e222b95 100644 --- a/tests/unit_tests/test_transfer_volumes.py +++ b/tests/unit_tests/test_transfer_volumes.py @@ -19,7 +19,7 @@ def test_transfer_volumes(run_in_tmpdir): PredictorIntegrator(op, dt, power).integrate() # Load the files - res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") + res = openmc.deplete.ResultsList(op.output_dir / "depletion_results.h5") # Create a dictionary of volumes to transfer res[0].volume['1'] = 1.5