From dbd24035a348a2c1d4898e3a9373f9893c4452bc Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Tue, 20 Aug 2019 18:51:52 -0500 Subject: [PATCH] Refactor depletion unit tests with parametrization Removed unit test files for test_deplete_*py that pertained to a single integrator type only. Similarly removed tests where the integrators are used to perform simple restart analysis. These tests are still present, but done with two parametrized tests. Each of the integrators has the exact same solution in the unit tests with and without restarting,by nature of their design. This and the near-fixture like way the tests are structured allowed these tests to be easily parametrized provided 1) integrator, 2) reference solutions for atoms 1 and 2. Exact results for each integrator in the unit test are contained inside a collections.namedtuple, along with the Integrator class. These named tuples are placed in a dictionary in tests/dummy_operator.py that can be easily iterated over to provide access to a name of the scheme, e.g. "predictor", and the tuple of integrator, results for atom 1, and results for atom 2. Exact results for atoms 1 and 2 should be provided using the depletion matrix produced by the tests.dummy_operator.DummyOperator for two time steps of 0.75 seconds. --- tests/dummy_operator.py | 75 ++++- tests/unit_tests/test_deplete_cecm.py | 44 --- tests/unit_tests/test_deplete_celi.py | 43 --- tests/unit_tests/test_deplete_cf4.py | 43 --- tests/unit_tests/test_deplete_epc_rk4.py | 43 --- tests/unit_tests/test_deplete_integrator.py | 35 +- tests/unit_tests/test_deplete_leqi.py | 43 --- tests/unit_tests/test_deplete_predictor.py | 44 --- tests/unit_tests/test_deplete_restart.py | 347 ++------------------ tests/unit_tests/test_deplete_si_celi.py | 43 --- tests/unit_tests/test_deplete_si_leqi.py | 43 --- 11 files changed, 136 insertions(+), 667 deletions(-) delete mode 100644 tests/unit_tests/test_deplete_cecm.py delete mode 100644 tests/unit_tests/test_deplete_celi.py delete mode 100644 tests/unit_tests/test_deplete_cf4.py delete mode 100644 tests/unit_tests/test_deplete_epc_rk4.py delete mode 100644 tests/unit_tests/test_deplete_leqi.py delete mode 100644 tests/unit_tests/test_deplete_predictor.py delete mode 100644 tests/unit_tests/test_deplete_si_celi.py delete mode 100644 tests/unit_tests/test_deplete_si_leqi.py diff --git a/tests/dummy_operator.py b/tests/dummy_operator.py index c23abef631..37269b7bd6 100644 --- a/tests/dummy_operator.py +++ b/tests/dummy_operator.py @@ -1,9 +1,76 @@ +from collections import namedtuple + import numpy as np import scipy.sparse as sp from uncertainties import ufloat from openmc.deplete.reaction_rates import ReactionRates from openmc.deplete.abc import TransportOperator, OperatorResult +from openmc.deplete import ( + CECMIntegrator, PredictorIntegrator, CELIIntegrator, LEQIIntegrator, + EPCRK4Integrator, CF4Integrator, SICELIIntegrator, SILEQIIntegrator +) + +# Bundle for nicely passing test data to depletion unit tests +# solver should be a concrete subclass of openmc.deplete.abc.Integrator +# atoms_1 should be the number of atoms of type 1 through the simulation +# similar for atoms_2, but for type 2. This includes the first step +# Solutions should be the exact solution that can be obtained using +# the DummyOperator depletion matrix with two 0.75 second time steps +DepletionSolutionTuple = namedtuple( + "DepletionSolutionTuple", "solver atoms_1 atoms_2") + + +predictor_solution = DepletionSolutionTuple( + PredictorIntegrator, np.array([1.0, 2.46847546272295, 4.11525874568034]), + np.array([1.0, 0.986431226850467, -0.0581692232513460])) + + +cecm_solution = DepletionSolutionTuple( + CECMIntegrator, np.array([1.0, 1.86872629872102, 2.18097439443550]), + np.array([1.0, 1.395525772416039, 2.69429754646747])) + + +cf4_solution = DepletionSolutionTuple( + CF4Integrator, np.array([1.0, 2.06101629, 2.57241318]), + np.array([1.0, 1.37783588, 2.63731630])) + + +epc_rk4_solution = DepletionSolutionTuple( + EPCRK4Integrator, np.array([1.0, 2.01978516, 2.05246421]), + np.array([1.0, 1.42038037, 3.06177191])) + + +celi_solution = DepletionSolutionTuple( + CELIIntegrator, np.array([1.0, 1.82078767, 2.68441779]), + np.array([1.0, 0.97122898, 0.05125966])) + + +si_celi_solution = DepletionSolutionTuple( + SICELIIntegrator, np.array([1.0, 2.03325094, 2.69291933]), + np.array([1.0, 1.16826254, 0.37907772])) + + +leqi_solution = DepletionSolutionTuple( + LEQIIntegrator, np.array([1.0, 1.82078767, 2.74526197]), + np.array([1.0, 0.97122898, 0.23339915])) + + +si_leqi_solution = DepletionSolutionTuple( + SILEQIIntegrator, np.array([1.0, 2.03325094, 2.92711288]), + np.array([1.0, 1.16826254, 0.53753236])) + + +SCHEMES = { + "predictor": predictor_solution, + "cecm": cecm_solution, + "celi": celi_solution, + "cf4": cf4_solution, + "epc_rk4": epc_rk4_solution, + "leqi": leqi_solution, + "si_leqi": si_leqi_solution, + "si_celi": si_celi_solution, +} class DummyOperator(TransportOperator): @@ -21,6 +88,7 @@ class DummyOperator(TransportOperator): """ def __init__(self, previous_results=None): self.prev_res = previous_results + self.output_dir = "." def __call__(self, vec, power, print_out=False): """Evaluates F(y) @@ -76,7 +144,6 @@ class DummyOperator(TransportOperator): y_1 = rates[0, 0] y_2 = rates[1, 0] - mat = np.zeros((2, 2)) a11 = np.sin(y_2) a12 = np.cos(y_1) a21 = -np.cos(y_2) @@ -106,7 +173,8 @@ class DummyOperator(TransportOperator): def local_mats(self): """ local_mats : list of str - A list of all material IDs to be burned. Used for sorting the simulation. + A list of all material IDs to be burned. Used for sorting the + simulation. """ return ["1"] @@ -153,7 +221,8 @@ class DummyOperator(TransportOperator): nuc_list : list of str A list of all nuclide names. Used for sorting the simulation. burn_list : list of int - A list of all cell IDs to be burned. Used for sorting the simulation. + A list of all cell IDs to be burned. Used for sorting the + simulation. full_burn_list : OrderedDict of str to int Maps cell name to index in global geometry. diff --git a/tests/unit_tests/test_deplete_cecm.py b/tests/unit_tests/test_deplete_cecm.py deleted file mode 100644 index 65dd61643b..0000000000 --- a/tests/unit_tests/test_deplete_cecm.py +++ /dev/null @@ -1,44 +0,0 @@ -"""Regression tests for openmc.deplete.integrator.cecm algorithm. - -These tests integrate a simple test problem described in dummy_geometry.py. -""" - -from pytest import approx -from openmc.deplete import CECMIntegrator, ResultsList - -from tests import dummy_operator - - -def test_cecm(run_in_tmpdir): - """Integral regression test of integrator algorithm using CE/CM.""" - - op = dummy_operator.DummyOperator() - op.output_dir = "test_integrator_regression" - - # Perform simulation using the MCNPX/MCNP6 algorithm - dt = [0.75, 0.75] - power = 1.0 - integrator = CECMIntegrator(op, dt, power) - integrator.integrate() - - # Load the files - res = ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") - - # Mathematica solution - s1 = [1.86872629872102, 1.395525772416039] - s2 = [2.18097439443550, 2.69429754646747] - - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) - - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) - - # Test structure of depletion time dataset - - dep_time = res.get_depletion_time() - assert dep_time.shape == (len(dt), ) - assert all(dep_time > 0) diff --git a/tests/unit_tests/test_deplete_celi.py b/tests/unit_tests/test_deplete_celi.py deleted file mode 100644 index 01ec60d372..0000000000 --- a/tests/unit_tests/test_deplete_celi.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Regression tests for openmc.deplete.integrator.celi algorithm. - -These tests integrate a simple test problem described in dummy_geometry.py. -""" - -from pytest import approx -from openmc.deplete import ResultsList, CELIIntegrator - -from tests import dummy_operator - - -def test_celi(run_in_tmpdir): - """Integral regression test of integrator algorithm using celi""" - - op = dummy_operator.DummyOperator() - op.output_dir = "test_integrator_regression" - - # Perform simulation using the celi algorithm - dt = [0.75, 0.75] - power = 1.0 - CELIIntegrator(op, dt, power).integrate() - - # Load the files - res = ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") - - # Reference solution - s1 = [1.82078767, 0.97122898] - s2 = [2.68441779, 0.05125966] - - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) - - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) - - # Test structure of depletion time dataset - - dep_time = res.get_depletion_time() - assert dep_time.shape == (len(dt), ) - assert all(dep_time > 0) diff --git a/tests/unit_tests/test_deplete_cf4.py b/tests/unit_tests/test_deplete_cf4.py deleted file mode 100644 index 817dfb5e17..0000000000 --- a/tests/unit_tests/test_deplete_cf4.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Regression tests for openmc.deplete.integrator.cf4 algorithm. - -These tests integrate a simple test problem described in dummy_geometry.py. -""" - -from pytest import approx -from openmc.deplete import CF4Integrator, ResultsList - -from tests import dummy_operator - - -def test_cf4(run_in_tmpdir): - """Integral regression test of integrator algorithm using CF4""" - - op = dummy_operator.DummyOperator() - op.output_dir = "test_integrator_regression" - - # Perform simulation using the cf4 algorithm - dt = [0.75, 0.75] - power = 1.0 - CF4Integrator(op, dt, power).integrate() - - # Load the files - res = ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") - - # Reference solution - s1 = [2.06101629, 1.37783588] - s2 = [2.57241318, 2.63731630] - - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) - - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) - - # Test structure of depletion time dataset - - dep_time = res.get_depletion_time() - assert dep_time.shape == (len(dt), ) - assert all(dep_time > 0) diff --git a/tests/unit_tests/test_deplete_epc_rk4.py b/tests/unit_tests/test_deplete_epc_rk4.py deleted file mode 100644 index 0c656d7dbe..0000000000 --- a/tests/unit_tests/test_deplete_epc_rk4.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Regression tests for openmc.deplete.integrator.epc_rk4 algorithm. - -These tests integrate a simple test problem described in dummy_geometry.py. -""" - -from pytest import approx -from openmc.deplete import EPCRK4Integrator, ResultsList - -from tests import dummy_operator - - -def test_epc_rk4(run_in_tmpdir): - """Integral regression test of integrator algorithm using epc_rk4""" - - op = dummy_operator.DummyOperator() - op.output_dir = "test_integrator_regression" - - # Perform simulation using the epc_rk4 algorithm - dt = [0.75, 0.75] - power = 1.0 - EPCRK4Integrator(op, dt, power).integrate() - - # Load the files - res = ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") - - # Reference solution - s1 = [2.01978516, 1.42038037] - s2 = [2.05246421, 3.06177191] - - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) - - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) - - # Test structure of depletion time dataset - - dep_time = res.get_depletion_time() - assert dep_time.shape == (len(dt), ) - assert all(dep_time > 0) diff --git a/tests/unit_tests/test_deplete_integrator.py b/tests/unit_tests/test_deplete_integrator.py index fd4e2ba3ff..47c9690ae9 100644 --- a/tests/unit_tests/test_deplete_integrator.py +++ b/tests/unit_tests/test_deplete_integrator.py @@ -7,7 +7,6 @@ will be left unimplemented and testing will be done via regression. """ import copy -import os from unittest.mock import MagicMock import numpy as np @@ -18,6 +17,8 @@ from openmc.deplete import ( ReactionRates, Results, ResultsList, comm, OperatorResult, PredictorIntegrator, SICELIIntegrator) +from tests import dummy_operator + def test_results_save(run_in_tmpdir): """Test data save module""" @@ -41,10 +42,11 @@ def test_results_save(run_in_tmpdir): full_burn_list.append(str(2*i)) full_burn_list.append(str(2*i + 1)) - burn_list = full_burn_list[2*comm.rank : 2*comm.rank + 2] + burn_list = full_burn_list[2*comm.rank: 2*comm.rank + 2] nuc_list = ["na", "nb"] - op.get_results_info.return_value = vol_dict, nuc_list, burn_list, full_burn_list + op.get_results_info.return_value = ( + vol_dict, nuc_list, burn_list, full_burn_list) # Construct x x1 = [] @@ -130,3 +132,30 @@ def test_bad_integrator_inputs(timesteps): with pytest.raises(ValueError, match="n_steps"): SICELIIntegrator(op, timesteps, [1], n_steps=0) + + +@pytest.mark.parametrize("scheme", dummy_operator.SCHEMES) +def test_integrator(run_in_tmpdir, scheme): + """Test the integrators against their expected values""" + + bundle = dummy_operator.SCHEMES[scheme] + operator = dummy_operator.DummyOperator() + bundle.solver(operator, [0.75, 0.75], 1.0).integrate() + + # get expected results + + res = ResultsList.from_hdf5( + operator.output_dir / "depletion_results.h5") + + t1, y1 = res.get_atoms("1", "1") + t2, y2 = res.get_atoms("1", "2") + + assert (t1 == [0.0, 0.75, 1.5]).all() + assert y1 == pytest.approx(bundle.atoms_1) + assert (t2 == [0.0, 0.75, 1.5]).all() + assert y2 == pytest.approx(bundle.atoms_2) + + # test structure of depletion time dataset + dep_time = res.get_depletion_time() + assert dep_time.shape == (2, ) + assert all(dep_time > 0) diff --git a/tests/unit_tests/test_deplete_leqi.py b/tests/unit_tests/test_deplete_leqi.py deleted file mode 100644 index 113cb6e306..0000000000 --- a/tests/unit_tests/test_deplete_leqi.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Regression tests for openmc.deplete.integrator.leqi algorithm. - -These tests integrate a simple test problem described in dummy_geometry.py. -""" - -from pytest import approx -from openmc.deplete import LEQIIntegrator, ResultsList - -from tests import dummy_operator - - -def test_leqi(run_in_tmpdir): - """Integral regression test of integrator algorithm using leqi""" - - op = dummy_operator.DummyOperator() - op.output_dir = "test_integrator_regression" - - # Perform simulation using the leqi algorithm - dt = [0.75, 0.75] - power = 1.0 - LEQIIntegrator(op, dt, power).integrate() - - # Load the files - res = ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") - - # Reference solution - s1 = [1.82078767, 0.97122898] - s2 = [2.74526197, 0.23339915] - - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) - - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) - - # Test structure of depletion time dataset - - dep_time = res.get_depletion_time() - assert dep_time.shape == (len(dt), ) - assert all(dep_time > 0) diff --git a/tests/unit_tests/test_deplete_predictor.py b/tests/unit_tests/test_deplete_predictor.py deleted file mode 100644 index 38bee86c39..0000000000 --- a/tests/unit_tests/test_deplete_predictor.py +++ /dev/null @@ -1,44 +0,0 @@ -"""Regression tests for openmc.deplete.integrator.predictor algorithm. - -These tests integrate a simple test problem described in dummy_geometry.py. -""" - -from pytest import approx -from openmc.deplete import PredictorIntegrator, ResultsList - -from tests import dummy_operator - - -def test_predictor(run_in_tmpdir): - """Integral regression test of integrator algorithm using predictor""" - - op = dummy_operator.DummyOperator() - op.output_dir = "test_integrator_regression" - - # Perform simulation using the predictor algorithm - dt = [0.75, 0.75] - power = 1.0 - PredictorIntegrator(op, dt, power).integrate() - - - # Load the files - res = ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") - - # Mathematica solution - s1 = [2.46847546272295, 0.986431226850467] - s2 = [4.11525874568034, -0.0581692232513460] - - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) - - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) - - # Test structure of depletion time dataset - - dep_time = res.get_depletion_time() - assert dep_time.shape == (len(dt), ) - assert all(dep_time > 0) diff --git a/tests/unit_tests/test_deplete_restart.py b/tests/unit_tests/test_deplete_restart.py index c55f7fd0f4..82ef05ac7b 100644 --- a/tests/unit_tests/test_deplete_restart.py +++ b/tests/unit_tests/test_deplete_restart.py @@ -4,96 +4,13 @@ These tests run in two steps, a first run then a restart run, a simple test problem described in dummy_geometry.py. """ -from pytest import approx, raises +import pytest + import openmc.deplete -from openmc.deplete import ( - CECMIntegrator, PredictorIntegrator, CELIIntegrator, LEQIIntegrator, - EPCRK4Integrator, CF4Integrator, SICELIIntegrator, SILEQIIntegrator -) from tests import dummy_operator -def test_restart_predictor(run_in_tmpdir): - """Integral regression test of integrator algorithm using predictor.""" - - op = dummy_operator.DummyOperator() - output_dir = "test_restart_predictor" - op.output_dir = output_dir - - # Perform simulation using the predictor algorithm - dt = [0.75] - power = 1.0 - PredictorIntegrator(op, dt, power).integrate() - - # Load the files - prev_res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - # Re-create depletion operator and load previous results - op = dummy_operator.DummyOperator(prev_res) - op.output_dir = output_dir - - # Perform restarts simulation using the predictor algorithm - PredictorIntegrator(op, dt, power).integrate() - - # Load the files - res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") - - # Mathematica solution - s1 = [2.46847546272295, 0.986431226850467] - s2 = [4.11525874568034, -0.0581692232513460] - - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) - - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) - - -def test_restart_cecm(run_in_tmpdir): - """Integral regression test of integrator algorithm using CE/CM.""" - - op = dummy_operator.DummyOperator() - output_dir = "test_restart_cecm" - op.output_dir = output_dir - - # Perform simulation using the MCNPX/MCNP6 algorithm - dt = [0.75] - power = 1.0 - cecm = CECMIntegrator(op, dt, power) - cecm.integrate() - - # Load the files - prev_res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - # Re-create depletion operator and load previous results - op = dummy_operator.DummyOperator(prev_res) - op.output_dir = output_dir - - # Perform restarts simulation using the MCNPX/MCNP6 algorithm - cecm_restart = CECMIntegrator(op, dt, power) - cecm_restart.integrate() - - # Load the files - res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") - - # Mathematica solution - s1 = [1.86872629872102, 1.395525772416039] - s2 = [2.18097439443550, 2.69429754646747] - - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) - - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) - - def test_restart_predictor_cecm(run_in_tmpdir): """Test to ensure that schemes with different stages are not compatible""" @@ -104,18 +21,19 @@ def test_restart_predictor_cecm(run_in_tmpdir): # Perform simulation using the predictor algorithm dt = [0.75] power = 1.0 - PredictorIntegrator(op, dt, power).integrate() + 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.from_hdf5( + op.output_dir / "depletion_results.h5") # Re-create depletion operator and load previous results op = dummy_operator.DummyOperator(prev_res) op.output_dir = output_dir # check ValueError is raised, indicating previous and current stages - with raises(ValueError, match="incompatible.* 1.*2"): - CECMIntegrator(op, dt, power) + with pytest.raises(ValueError, match="incompatible.* 1.*2"): + openmc.deplete.CECMIntegrator(op, dt, power) def test_restart_cecm_predictor(run_in_tmpdir): @@ -129,249 +47,48 @@ def test_restart_cecm_predictor(run_in_tmpdir): # Perform simulation using the MCNPX/MCNP6 algorithm dt = [0.75] power = 1.0 - cecm = CECMIntegrator(op, dt, power) + cecm = openmc.deplete.CECMIntegrator(op, dt, power) cecm.integrate() # Load the files - prev_res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") + prev_res = openmc.deplete.ResultsList.from_hdf5( + op.output_dir / "depletion_results.h5") # Re-create depletion operator and load previous results op = dummy_operator.DummyOperator(prev_res) op.output_dir = output_dir # check ValueError is raised, indicating previous and current stages - with raises(ValueError, match="incompatible.* 2.*1"): - PredictorIntegrator(op, dt, power) + with pytest.raises(ValueError, match="incompatible.* 2.*1"): + openmc.deplete.PredictorIntegrator(op, dt, power) -def test_restart_cf4(run_in_tmpdir): - """Integral regression test of integrator algorithm using CF4.""" - op = dummy_operator.DummyOperator() - output_dir = "test_restart_cf4" - op.output_dir = output_dir +@pytest.mark.parametrize("scheme", dummy_operator.SCHEMES) +def test_restart(run_in_tmpdir, scheme): + # set up the problem - # Perform simulation - dt = [0.75] - power = 1.0 - CF4Integrator(op, dt, power).integrate() + bundle = dummy_operator.SCHEMES[scheme] - # Load the files - prev_res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") + operator = dummy_operator.DummyOperator() - # Re-create depletion operator and load previous results - op = dummy_operator.DummyOperator(prev_res) - op.output_dir = output_dir + # take first step + bundle.solver(operator, [0.75], 1.0).integrate() - # Perform restarts simulation - CF4Integrator(op, dt, power).integrate() + # restart + prev_res = openmc.deplete.ResultsList.from_hdf5( + operator.output_dir / "depletion_results.h5") + operator = dummy_operator.DummyOperator(prev_res) - # Load the files - res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") + # take second step + bundle.solver(operator, [0.75], 1.0).integrate() - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") + # compare results - # Reference solution - s1 = [2.06101629, 1.37783588] - s2 = [2.57241318, 2.63731630] + results = openmc.deplete.ResultsList.from_hdf5( + operator.output_dir / "depletion_results.h5") - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) + _t, y1 = results.get_atoms("1", "1") + _t, y2 = results.get_atoms("1", "2") - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) - - -def test_restart_epc_rk4(run_in_tmpdir): - """Integral regression test of integrator algorithm using EPC-RK4.""" - - op = dummy_operator.DummyOperator() - output_dir = "test_restart_epc_rk4" - op.output_dir = output_dir - - # Perform simulation - dt = [0.75] - power = 1.0 - EPCRK4Integrator(op, dt, power).integrate() - - # Load the files - prev_res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - # Re-create depletion operator and load previous results - op = dummy_operator.DummyOperator(prev_res) - op.output_dir = output_dir - - # Perform restarts simulation - EPCRK4Integrator(op, dt, power).integrate() - - # Load the files - res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") - - # Reference solution - s1 = [2.01978516, 1.42038037] - s2 = [2.05246421, 3.06177191] - - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) - - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) - - -def test_restart_celi(run_in_tmpdir): - """Integral regression test of integrator algorithm using CELI.""" - - op = dummy_operator.DummyOperator() - output_dir = "test_restart_celi" - op.output_dir = output_dir - - # Perform simulation - dt = [0.75] - power = 1.0 - CELIIntegrator(op, dt, power).integrate() - - # Load the files - prev_res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - # Re-create depletion operator and load previous results - op = dummy_operator.DummyOperator(prev_res) - op.output_dir = output_dir - - # Perform restarts simulation - CELIIntegrator(op, dt, power).integrate() - - # Load the files - res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") - - # Reference solution - s1 = [1.82078767, 0.97122898] - s2 = [2.68441779, 0.05125966] - - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) - - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) - - -def test_restart_leqi(run_in_tmpdir): - """Integral regression test of integrator algorithm using LEQI.""" - - op = dummy_operator.DummyOperator() - output_dir = "test_restart_leqi" - op.output_dir = output_dir - - # Perform simulation - dt = [0.75] - power = 1.0 - LEQIIntegrator(op, dt, power).integrate() - - # Load the files - prev_res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - # Re-create depletion operator and load previous results - op = dummy_operator.DummyOperator(prev_res) - op.output_dir = output_dir - - # Perform restarts simulation - LEQIIntegrator(op, dt, power).integrate() - - # Load the files - res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") - - # Reference solution - s1 = [1.82078767, 0.97122898] - s2 = [2.74526197, 0.23339915] - - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) - - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) - -def test_restart_si_celi(run_in_tmpdir): - """Integral regression test of integrator algorithm using SI-CELI.""" - - op = dummy_operator.DummyOperator() - output_dir = "test_restart_si_celi" - op.output_dir = output_dir - - # Perform simulation - dt = [0.75] - power = 1.0 - SICELIIntegrator(op, dt, power).integrate() - - # Load the files - prev_res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - # Re-create depletion operator and load previous results - op = dummy_operator.DummyOperator(prev_res) - op.output_dir = output_dir - - # Perform restarts simulation - SICELIIntegrator(op, dt, power).integrate() - - # Load the files - res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") - - # Reference solution - s1 = [2.03325094, 1.16826254] - s2 = [2.69291933, 0.37907772] - - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) - - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) - - -def test_restart_si_leqi(run_in_tmpdir): - """Integral regression test of integrator algorithm using SI-LEQI.""" - - op = dummy_operator.DummyOperator() - output_dir = "test_restart_si_leqi" - op.output_dir = output_dir - - # Perform simulation - dt = [0.75] - power = 1.0 - nstages = 10 - SILEQIIntegrator(op, dt, power, nstages).integrate() - - # Load the files - prev_res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - # Re-create depletion operator and load previous results - op = dummy_operator.DummyOperator(prev_res) - op.output_dir = output_dir - - # Perform restarts simulation - SILEQIIntegrator(op, dt, power, nstages).integrate() - - # Load the files - res = openmc.deplete.ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") - - # Reference solution - s1 = [2.03325094, 1.16826254] - s2 = [2.92711288, 0.53753236] - - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) - - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) + assert y1 == pytest.approx(bundle.atoms_1) + assert y2 == pytest.approx(bundle.atoms_2) diff --git a/tests/unit_tests/test_deplete_si_celi.py b/tests/unit_tests/test_deplete_si_celi.py deleted file mode 100644 index 5cc0d4e6c4..0000000000 --- a/tests/unit_tests/test_deplete_si_celi.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Regression tests for openmc.deplete.integrator.si_celi algorithm. - -These tests integrate a simple test problem described in dummy_geometry.py. -""" - -from pytest import approx -from openmc.deplete import SICELIIntegrator, ResultsList - -from tests import dummy_operator - - -def test_si_celi(run_in_tmpdir): - """Integral regression test of integrator algorithm using si_celi""" - - op = dummy_operator.DummyOperator() - op.output_dir = "test_integrator_regression" - - # Perform simulation using the si_celi algorithm - dt = [0.75, 0.75] - power = 1.0 - SICELIIntegrator(op, dt, power).integrate() - - # Load the files - res = ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") - - # Reference solution - s1 = [2.03325094, 1.16826254] - s2 = [2.69291933, 0.37907772] - - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) - - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) - - # Test structure of depletion time dataset - - dep_time = res.get_depletion_time() - assert dep_time.shape == (len(dt), ) - assert all(dep_time > 0) diff --git a/tests/unit_tests/test_deplete_si_leqi.py b/tests/unit_tests/test_deplete_si_leqi.py deleted file mode 100644 index 8e3c3a4648..0000000000 --- a/tests/unit_tests/test_deplete_si_leqi.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Regression tests for openmc.deplete.integrator.si_leqi algorithm. - -These tests integrate a simple test problem described in dummy_geometry.py. -""" - -from pytest import approx -from openmc.deplete import SILEQIIntegrator, ResultsList - -from tests import dummy_operator - - -def test_si_leqi(run_in_tmpdir): - """Integral regression test of integrator algorithm using si_leqi""" - - op = dummy_operator.DummyOperator() - op.output_dir = "test_integrator_regression" - - # Perform simulation using the si_leqi algorithm - dt = [0.75, 0.75] - power = 1.0 - SILEQIIntegrator(op, dt, power, 10).integrate() - - # Load the files - res = ResultsList.from_hdf5(op.output_dir / "depletion_results.h5") - - _, y1 = res.get_atoms("1", "1") - _, y2 = res.get_atoms("1", "2") - - # Reference solution - s1 = [2.03325094, 1.16826254] - s2 = [2.92711288, 0.53753236] - - assert y1[1] == approx(s1[0]) - assert y2[1] == approx(s1[1]) - - assert y1[2] == approx(s2[0]) - assert y2[2] == approx(s2[1]) - - # Test structure of depletion time dataset - - dep_time = res.get_depletion_time() - assert dep_time.shape == (len(dt), ) - assert all(dep_time > 0)