From 659e43af7de9030ef3fbfef32f0992c39a00820d Mon Sep 17 00:00:00 2001 From: Joffrey Dorville <54550047+JoffreyDorville@users.noreply.github.com> Date: Fri, 18 Jul 2025 03:47:08 -0500 Subject: [PATCH] Enabling MCPL source files to be read when using surf_source_read (#3472) Co-authored-by: Paul Romano --- include/openmc/source.h | 2 +- src/source.cpp | 55 ++++----- ..._true_read.dat => inputs_true_read_h5.dat} | 0 .../surface_source/inputs_true_read_mcpl.dat | 33 +++++ ...rue_write.dat => inputs_true_write_h5.dat} | 0 .../surface_source/inputs_true_write_mcpl.dat | 40 ++++++ .../surface_source/surface_source_true.h5 | Bin 106144 -> 106144 bytes .../surface_source/surface_source_true.mcpl | Bin 0 -> 36071 bytes tests/regression_tests/surface_source/test.py | 116 +++++++++++++----- 9 files changed, 187 insertions(+), 59 deletions(-) rename tests/regression_tests/surface_source/{inputs_true_read.dat => inputs_true_read_h5.dat} (100%) create mode 100644 tests/regression_tests/surface_source/inputs_true_read_mcpl.dat rename tests/regression_tests/surface_source/{inputs_true_write.dat => inputs_true_write_h5.dat} (100%) create mode 100644 tests/regression_tests/surface_source/inputs_true_write_mcpl.dat create mode 100644 tests/regression_tests/surface_source/surface_source_true.mcpl diff --git a/include/openmc/source.h b/include/openmc/source.h index d58195f10..1fbd31904 100644 --- a/include/openmc/source.h +++ b/include/openmc/source.h @@ -173,7 +173,7 @@ protected: SourceSite sample(uint64_t* seed) const override; private: - vector sites_; //!< Source sites from a file + vector sites_; //!< Source sites }; //============================================================================== diff --git a/src/source.cpp b/src/source.cpp index ae3daa404..12323f7bd 100644 --- a/src/source.cpp +++ b/src/source.cpp @@ -417,11 +417,7 @@ SourceSite IndependentSource::sample(uint64_t* seed) const FileSource::FileSource(pugi::xml_node node) : Source(node) { auto path = get_node_value(node, "file", false, true); - if (ends_with(path, ".mcpl") || ends_with(path, ".mcpl.gz")) { - sites_ = mcpl_source_sites(path); - } else { - this->load_sites_from_file(path); - } + load_sites_from_file(path); } FileSource::FileSource(const std::string& path) @@ -431,30 +427,33 @@ FileSource::FileSource(const std::string& path) void FileSource::load_sites_from_file(const std::string& path) { - // Check if source file exists - if (!file_exists(path)) { - fatal_error(fmt::format("Source file '{}' does not exist.", path)); + // If MCPL file, use the dedicated file reader + if (ends_with(path, ".mcpl") || ends_with(path, ".mcpl.gz")) { + sites_ = mcpl_source_sites(path); + } else { + // Check if source file exists + if (!file_exists(path)) { + fatal_error(fmt::format("Source file '{}' does not exist.", path)); + } + + write_message(6, "Reading source file from {}...", path); + + // Open the binary file + hid_t file_id = file_open(path, 'r', true); + + // Check to make sure this is a source file + std::string filetype; + read_attribute(file_id, "filetype", filetype); + if (filetype != "source" && filetype != "statepoint") { + fatal_error("Specified starting source file not a source file type."); + } + + // Read in the source particles + read_source_bank(file_id, sites_, false); + + // Close file + file_close(file_id); } - - // Read the source from a binary file instead of sampling from some - // assumed source distribution - write_message(6, "Reading source file from {}...", path); - - // Open the binary file - hid_t file_id = file_open(path, 'r', true); - - // Check to make sure this is a source file - std::string filetype; - read_attribute(file_id, "filetype", filetype); - if (filetype != "source" && filetype != "statepoint") { - fatal_error("Specified starting source file not a source file type."); - } - - // Read in the source particles - read_source_bank(file_id, sites_, false); - - // Close file - file_close(file_id); } SourceSite FileSource::sample(uint64_t* seed) const diff --git a/tests/regression_tests/surface_source/inputs_true_read.dat b/tests/regression_tests/surface_source/inputs_true_read_h5.dat similarity index 100% rename from tests/regression_tests/surface_source/inputs_true_read.dat rename to tests/regression_tests/surface_source/inputs_true_read_h5.dat diff --git a/tests/regression_tests/surface_source/inputs_true_read_mcpl.dat b/tests/regression_tests/surface_source/inputs_true_read_mcpl.dat new file mode 100644 index 000000000..b8d8c575a --- /dev/null +++ b/tests/regression_tests/surface_source/inputs_true_read_mcpl.dat @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + fixed source + 1000 + 10 + + surface_source_true.mcpl + + 1 + + + + 3 + + + 1 + flux + + + diff --git a/tests/regression_tests/surface_source/inputs_true_write.dat b/tests/regression_tests/surface_source/inputs_true_write_h5.dat similarity index 100% rename from tests/regression_tests/surface_source/inputs_true_write.dat rename to tests/regression_tests/surface_source/inputs_true_write_h5.dat diff --git a/tests/regression_tests/surface_source/inputs_true_write_mcpl.dat b/tests/regression_tests/surface_source/inputs_true_write_mcpl.dat new file mode 100644 index 000000000..c55223324 --- /dev/null +++ b/tests/regression_tests/surface_source/inputs_true_write_mcpl.dat @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + fixed source + 1000 + 10 + + + 0 0 0 + + + + 1 + true + 1000 + + 1 + + + + 3 + + + 1 + flux + + + diff --git a/tests/regression_tests/surface_source/surface_source_true.h5 b/tests/regression_tests/surface_source/surface_source_true.h5 index f2055d09dc3b668cc2fe85057cd999779788e9d7..d056d7328405bedf704f8690fd3b8056ec8aa101 100644 GIT binary patch delta 11203 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 NZmvQvPV5ll`9IHZo-P0Y literal 0 HcmV?d00001 diff --git a/tests/regression_tests/surface_source/test.py b/tests/regression_tests/surface_source/test.py index 83b78e61d..13966b26d 100644 --- a/tests/regression_tests/surface_source/test.py +++ b/tests/regression_tests/surface_source/test.py @@ -10,6 +10,25 @@ from tests.testing_harness import PyAPITestHarness from tests.regression_tests import config +def mcpl_to_array(filepath): + import mcpl + + source = [] + with mcpl.MCPLFile(filepath) as f: + for p in f.particles: + source.append( + [ + *tuple(p.position), + *tuple(p.direction), + 1.0e6 * p.ekin, + 1.0e-3 * p.time, + p.weight, + p.pdgcode, + ] + ) + return np.sort(np.array(source), axis=0) + + def assert_structured_arrays_close(arr1, arr2, rtol=1e-5, atol=1e-8): assert arr1.dtype == arr2.dtype @@ -24,8 +43,7 @@ def assert_structured_arrays_close(arr1, arr2, rtol=1e-5, atol=1e-8): @pytest.fixture def model(request): openmc.reset_auto_ids() - marker = request.node.get_closest_marker("surf_source_op") - surf_source_op = marker.args[0] + operation, file_format = request.node.get_closest_marker("params").args openmc_model = openmc.model.Model() @@ -54,15 +72,19 @@ def model(request): openmc_model.settings.batches = 10 openmc_model.settings.seed = 1 - if surf_source_op == 'write': + if operation == 'write': point = openmc.stats.Point((0, 0, 0)) pt_src = openmc.IndependentSource(space=point) openmc_model.settings.source = pt_src - openmc_model.settings.surf_source_write = {'surface_ids': [1], - 'max_particles': 1000} - elif surf_source_op == 'read': - openmc_model.settings.surf_source_read = {'path': 'surface_source_true.h5'} + surf_source_write_settings = {'surface_ids': [1], + 'max_particles': 1000} + if file_format == "mcpl": + surf_source_write_settings["mcpl"] = True + + openmc_model.settings.surf_source_write = surf_source_write_settings + elif operation == 'read': + openmc_model.settings.surf_source_read = {'path': f"surface_source_true.{file_format}"} # Tallies tal = openmc.Tally() @@ -75,22 +97,30 @@ def model(request): class SurfaceSourceTestHarness(PyAPITestHarness): + def __init__(self, statepoint_name, model=None, inputs_true=None, file_format="h5"): + super().__init__(statepoint_name, model, inputs_true) + self.file_format = file_format + def _test_output_created(self): - """Make sure surface_source.h5 has also been created.""" + """Make sure the surface_source file has also been created.""" super()._test_output_created() - # Check if 'surface_source.h5' has been created. if self._model.settings.surf_source_write: - assert os.path.exists('surface_source.h5'), \ + assert os.path.exists(f"surface_source.{self.file_format}"), \ 'Surface source file does not exist.' def _compare_output(self): """Make sure the current surface_source.h5 agree with the reference.""" if self._model.settings.surf_source_write: - with h5py.File("surface_source_true.h5", 'r') as f: - source_true = np.sort(f['source_bank'][()]) - with h5py.File("surface_source.h5", 'r') as f: - source_test = np.sort(f['source_bank'][()]) - assert_structured_arrays_close(source_true, source_test, atol=1e-07) + if self.file_format == "h5": + with h5py.File("surface_source_true.h5", 'r') as f: + source_true = np.sort(f['source_bank'][()]) + with h5py.File("surface_source.h5", 'r') as f: + source_test = np.sort(f['source_bank'][()]) + assert_structured_arrays_close(source_true, source_test, atol=1e-07) + elif self.file_format == "mcpl": + source_true = mcpl_to_array("surface_source_true.mcpl") + source_test = mcpl_to_array("surface_source.mcpl") + np.testing.assert_allclose(source_true, source_test, rtol=1e-5, atol=1e-7) def execute_test(self): """Build input XMLs, run OpenMC, check output and results.""" @@ -111,30 +141,56 @@ class SurfaceSourceTestHarness(PyAPITestHarness): def _overwrite_results(self): """Overwrite the results_true with the results_test.""" shutil.copyfile('results_test.dat', 'results_true.dat') - if os.path.exists('surface_source.h5'): - shutil.copyfile('surface_source.h5', 'surface_source_true.h5') + if os.path.exists(f"surface_source.{self.file_format}"): + shutil.copyfile(f"surface_source.{self.file_format}", f"surface_source_true.{self.file_format}") def _cleanup(self): """Delete statepoints, tally, and test files.""" super()._cleanup() - fs = 'surface_source.h5' + fs = f"surface_source.{self.file_format}" if os.path.exists(fs): os.remove(fs) -@pytest.mark.surf_source_op('write') -def test_surface_source_write(model, monkeypatch): - # Test result is based on 1 MPI process - monkeypatch.setitem(config, "mpi_np", "1") - harness = SurfaceSourceTestHarness('statepoint.10.h5', - model, - 'inputs_true_write.dat') +@pytest.mark.params('write', 'h5') +def test_surface_source_write(model, monkeypatch, request): + monkeypatch.setitem(config, "mpi_np", "1") # Results generated with 1 MPI process + operation, file_format = request.node.get_closest_marker("params").args + harness = SurfaceSourceTestHarness( + "statepoint.10.h5", model, f"inputs_true_{operation}_{file_format}.dat", + file_format=file_format + ) harness.main() -@pytest.mark.surf_source_op('read') -def test_surface_source_read(model): - harness = SurfaceSourceTestHarness('statepoint.10.h5', - model, - 'inputs_true_read.dat') +@pytest.mark.params('read', 'h5') +def test_surface_source_read(model, request): + operation, file_format = request.node.get_closest_marker("params").args + harness = SurfaceSourceTestHarness( + "statepoint.10.h5", model, f"inputs_true_{operation}_{file_format}.dat", + file_format=file_format + ) + harness.main() + + +@pytest.mark.skipif(shutil.which("mcpl-config") is None, reason="MCPL is not available.") +@pytest.mark.params('write', 'mcpl') +def test_surface_source_write_mcpl(model, monkeypatch, request): + monkeypatch.setitem(config, "mpi_np", "1") # Results generated with 1 MPI process + operation, file_format = request.node.get_closest_marker("params").args + harness = SurfaceSourceTestHarness( + "statepoint.10.h5", model, f"inputs_true_{operation}_{file_format}.dat", + file_format=file_format + ) + harness.main() + + +@pytest.mark.skipif(shutil.which("mcpl-config") is None, reason="MCPL is not available.") +@pytest.mark.params('read', 'mcpl') +def test_surface_source_read_mcpl(model, request): + operation, file_format = request.node.get_closest_marker("params").args + harness = SurfaceSourceTestHarness( + "statepoint.10.h5", model, f"inputs_true_{operation}_{file_format}.dat", + file_format=file_format + ) harness.main()