From 5a7de406c43ef253c86569d50aa7af4ea53a4eae Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 11 May 2020 14:18:04 -0500 Subject: [PATCH 01/12] Implmementing the templated filter creation method. --- include/openmc/tallies/filter.h | 9 ++++ src/tallies/filter.cpp | 73 ++++++++++++++++++++------------- 2 files changed, 53 insertions(+), 29 deletions(-) diff --git a/include/openmc/tallies/filter.h b/include/openmc/tallies/filter.h index fbafd7e072..cde55fa7b3 100644 --- a/include/openmc/tallies/filter.h +++ b/include/openmc/tallies/filter.h @@ -31,6 +31,15 @@ public: Filter(); virtual ~Filter(); + //! Create a new tally filter + // + //! \tparam T Type of the filter + //! \param[in] id Unique ID for the filter. If none is passed, an ID is + //! automatically assigned + //! \return Pointer to the new filter object + template + static T* create(int32_t id = -1); + //! Create a new tally filter // //! \param[in] type Type of the filter diff --git a/src/tallies/filter.cpp b/src/tallies/filter.cpp index afe47fbd09..0c8239ff24 100644 --- a/src/tallies/filter.cpp +++ b/src/tallies/filter.cpp @@ -4,6 +4,8 @@ #include // for strcpy #include +#include + #include "openmc/capi.h" #include "openmc/constants.h" // for MAX_LINE_LEN; #include "openmc/error.h" @@ -67,6 +69,23 @@ Filter::~Filter() model::filter_map.erase(id_); } +template +T* Filter::create(int32_t id) { + static_assert(std::is_base_of::value, + "Type specified is not derived from openmc::Filter."); + + auto filter = std::make_unique(); + + auto ptr_out = filter.get(); + + model::tally_filters.emplace_back(std::move(filter)); + + // Assign ID + model::tally_filters.back()->set_id(id); + + return ptr_out; +} + Filter* Filter::create(pugi::xml_node node) { // Copy filter id @@ -92,59 +111,55 @@ Filter* Filter::create(pugi::xml_node node) Filter* Filter::create(const std::string& type, int32_t id) { if (type == "azimuthal") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "cell") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "cellborn") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "cellfrom") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "cellinstance") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "distribcell") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "delayedgroup") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "energyfunction") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "energy") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "energyout") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "legendre") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "material") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "mesh") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "meshsurface") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "mu") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "particle") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "polar") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "surface") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "spatiallegendre") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "sphericalharmonics") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "universe") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "zernike") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "zernikeradial") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else { - throw std::runtime_error{"Unknown filter type: " + type}; + throw std::runtime_error{fmt::format("Unknown filter type: {}", type)}; } - - // Assign ID - model::tally_filters.back()->set_id(id); - - return model::tally_filters.back().get(); + return nullptr; } void Filter::set_id(int32_t id) From bd6048bc2806143aede516d934e7e9f5a04cd7b8 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 11 May 2020 17:52:28 -0500 Subject: [PATCH 02/12] Adding test files for the cpp driver test. --- tests/regression_tests/cpp_driver/__init__.py | 0 tests/regression_tests/cpp_driver/driver.cpp | 35 +++++++++ .../cpp_driver/inputs_true.dat | 60 +++++++++++++++ .../cpp_driver/inputs_true1.dat | 50 +++++++++++++ .../cpp_driver/inputs_true2.dat | 60 +++++++++++++++ .../cpp_driver/results_true.dat | 9 +++ tests/regression_tests/cpp_driver/test.py | 75 +++++++++++++++++++ 7 files changed, 289 insertions(+) create mode 100644 tests/regression_tests/cpp_driver/__init__.py create mode 100644 tests/regression_tests/cpp_driver/driver.cpp create mode 100644 tests/regression_tests/cpp_driver/inputs_true.dat create mode 100644 tests/regression_tests/cpp_driver/inputs_true1.dat create mode 100644 tests/regression_tests/cpp_driver/inputs_true2.dat create mode 100644 tests/regression_tests/cpp_driver/results_true.dat create mode 100644 tests/regression_tests/cpp_driver/test.py diff --git a/tests/regression_tests/cpp_driver/__init__.py b/tests/regression_tests/cpp_driver/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/regression_tests/cpp_driver/driver.cpp b/tests/regression_tests/cpp_driver/driver.cpp new file mode 100644 index 0000000000..2bc771b247 --- /dev/null +++ b/tests/regression_tests/cpp_driver/driver.cpp @@ -0,0 +1,35 @@ + +#include "openmc/capi.h" +#include "openmc/cell.h" +#include "openmc/tallies/filter.h" +#include "openmc/tallies/filter_cell.h" +#include "openmc/tallies/tally.h" + +using namespace openmc; + +int main(int argc, char** argv) { + openmc_init(argc, argv, nullptr); + + // create a new cell filter + auto cell_filter = Filter::create(); + + // add all cells to the cell filter + std::vector cell_indices; + for (auto& entry : openmc::model::cell_map) { + cell_indices.push_back(entry.second); + } + // sort to make sure the cell bins appear in the same + // order as the test relying on the openmc exe + std::sort(cell_indices.begin(), cell_indices.end()); + cell_filter->set_cells(cell_indices); + + // create a new tally + auto tally = Tally::create(); + std::vector filters = {cell_filter}; + tally->set_filters(filters); + tally->set_scores({"flux"}); + + openmc_run(); + openmc_finalize(); + return 0; +} diff --git a/tests/regression_tests/cpp_driver/inputs_true.dat b/tests/regression_tests/cpp_driver/inputs_true.dat new file mode 100644 index 0000000000..bcaac5af68 --- /dev/null +++ b/tests/regression_tests/cpp_driver/inputs_true.dat @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + eigenvalue + 100 + 10 + 1 + + + -0.63 -0.63 -1 0.63 0.63 1 + + + + + + + 1 2 3 + + + 2 + flux + + diff --git a/tests/regression_tests/cpp_driver/inputs_true1.dat b/tests/regression_tests/cpp_driver/inputs_true1.dat new file mode 100644 index 0000000000..fae59e202e --- /dev/null +++ b/tests/regression_tests/cpp_driver/inputs_true1.dat @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + eigenvalue + 100 + 10 + 1 + + + -0.63 -0.63 -1 0.63 0.63 1 + + + diff --git a/tests/regression_tests/cpp_driver/inputs_true2.dat b/tests/regression_tests/cpp_driver/inputs_true2.dat new file mode 100644 index 0000000000..728491d778 --- /dev/null +++ b/tests/regression_tests/cpp_driver/inputs_true2.dat @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + eigenvalue + 100 + 10 + 1 + + + -0.63 -0.63 -1 0.63 0.63 1 + + + + + + + 4 5 6 + + + 2 + flux + + diff --git a/tests/regression_tests/cpp_driver/results_true.dat b/tests/regression_tests/cpp_driver/results_true.dat new file mode 100644 index 0000000000..32a636636a --- /dev/null +++ b/tests/regression_tests/cpp_driver/results_true.dat @@ -0,0 +1,9 @@ +k-combined: +1.141180E+00 4.513757E-02 +tally 1: +1.220313E+02 +1.659250E+03 +4.421703E+01 +2.178300E+02 +2.356492E+02 +6.182509E+03 diff --git a/tests/regression_tests/cpp_driver/test.py b/tests/regression_tests/cpp_driver/test.py new file mode 100644 index 0000000000..02ddc621bd --- /dev/null +++ b/tests/regression_tests/cpp_driver/test.py @@ -0,0 +1,75 @@ +from pathlib import Path +import os +import shutil +import subprocess +import textwrap + +import openmc +import pytest + +from tests.testing_harness import PyAPITestHarness + + +@pytest.fixture +def driver(request): + """Compile the external source""" + + # Get build directory and write CMakeLists.txt file + openmc_dir = Path(str(request.config.rootdir)) / 'build' + with open('CMakeLists.txt', 'w') as f: + f.write(textwrap.dedent(""" + cmake_minimum_required(VERSION 3.3 FATAL_ERROR) + project(openmc_cpp_driver CXX) + add_executable(cpp_driver driver.cpp) + find_package(OpenMC REQUIRED HINTS {}) + target_link_libraries(cpp_driver OpenMC::libopenmc) + """.format(openmc_dir))) + + # Create temporary build directory and change to there + local_builddir = Path('build') + local_builddir.mkdir(exist_ok=True) + os.chdir(str(local_builddir)) + + # Run cmake/make to build the shared libary + subprocess.run(['cmake', os.path.pardir], check=True) + subprocess.run(['make'], check=True) + os.chdir(os.path.pardir) + + yield "./build/cpp_driver" + + # Remove local build directory when test is complete + shutil.rmtree('build') + + +@pytest.fixture +def model(): + model = openmc.examples.pwr_pin_cell() + model.settings.particles = 100 + model.settings.batches = 10 + model.settings.inactive = 1 + return model + +class ExternalDriverTestHarness(PyAPITestHarness): + + def __init__(self, executable, statepoint_name, model=None, inputs_true=None): + super().__init__(statepoint_name, model, inputs_true) + self.executable = executable + + def _run_openmc(self): + print("Running openmc") + openmc.run(openmc_exec=self.executable) + + +def test_cpp_driver(driver, model): + harness = ExternalDriverTestHarness(driver, 'statepoint.10.h5', model, 'inputs_true1.dat') + harness.main() + +def test_openmc_run(driver, model): + # modify model and test again using the openmc exe + cell_filter = openmc.CellFilter(list(model.geometry.get_all_cells().values())) + tally = openmc.Tally() + tally.filters = [cell_filter] + tally.scores = ['flux'] + model.tallies = [tally] + harness = PyAPITestHarness('statepoint.10.h5', model, 'inputs_true2.dat') + harness.main() From e2774f1f5d734b6b3ba8f2c1a496ca0156fc007d Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 11 May 2020 23:07:30 -0500 Subject: [PATCH 03/12] No longer running parallel test, seems unecesssary. --- .../cpp_driver/inputs_true.dat | 10 ---------- tests/regression_tests/cpp_driver/test.py | 18 ++++-------------- 2 files changed, 4 insertions(+), 24 deletions(-) diff --git a/tests/regression_tests/cpp_driver/inputs_true.dat b/tests/regression_tests/cpp_driver/inputs_true.dat index bcaac5af68..fae59e202e 100644 --- a/tests/regression_tests/cpp_driver/inputs_true.dat +++ b/tests/regression_tests/cpp_driver/inputs_true.dat @@ -48,13 +48,3 @@ - - - - 1 2 3 - - - 2 - flux - - diff --git a/tests/regression_tests/cpp_driver/test.py b/tests/regression_tests/cpp_driver/test.py index 02ddc621bd..3ccb126fa5 100644 --- a/tests/regression_tests/cpp_driver/test.py +++ b/tests/regression_tests/cpp_driver/test.py @@ -51,8 +51,8 @@ def model(): class ExternalDriverTestHarness(PyAPITestHarness): - def __init__(self, executable, statepoint_name, model=None, inputs_true=None): - super().__init__(statepoint_name, model, inputs_true) + def __init__(self, executable, statepoint_name, model=None): + super().__init__(statepoint_name, model) self.executable = executable def _run_openmc(self): @@ -61,15 +61,5 @@ class ExternalDriverTestHarness(PyAPITestHarness): def test_cpp_driver(driver, model): - harness = ExternalDriverTestHarness(driver, 'statepoint.10.h5', model, 'inputs_true1.dat') - harness.main() - -def test_openmc_run(driver, model): - # modify model and test again using the openmc exe - cell_filter = openmc.CellFilter(list(model.geometry.get_all_cells().values())) - tally = openmc.Tally() - tally.filters = [cell_filter] - tally.scores = ['flux'] - model.tallies = [tally] - harness = PyAPITestHarness('statepoint.10.h5', model, 'inputs_true2.dat') - harness.main() + harness = ExternalDriverTestHarness(driver, 'statepoint.10.h5', model) + harness.main() \ No newline at end of file From a50c4c15e985440429bbdb731d775bcc23cd646e Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 11 May 2020 23:14:08 -0500 Subject: [PATCH 04/12] PEP8 changes. --- tests/regression_tests/cpp_driver/test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/regression_tests/cpp_driver/test.py b/tests/regression_tests/cpp_driver/test.py index 3ccb126fa5..a562f895ea 100644 --- a/tests/regression_tests/cpp_driver/test.py +++ b/tests/regression_tests/cpp_driver/test.py @@ -49,6 +49,7 @@ def model(): model.settings.inactive = 1 return model + class ExternalDriverTestHarness(PyAPITestHarness): def __init__(self, executable, statepoint_name, model=None): @@ -62,4 +63,4 @@ class ExternalDriverTestHarness(PyAPITestHarness): def test_cpp_driver(driver, model): harness = ExternalDriverTestHarness(driver, 'statepoint.10.h5', model) - harness.main() \ No newline at end of file + harness.main() From 2007ba847e728a3bac7965446cd2360d292a4c5a Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 12 May 2020 08:40:23 -0500 Subject: [PATCH 05/12] Simplifying tests a bit. Updating results. --- .../cpp_driver/inputs_true1.dat | 50 ---------------- .../cpp_driver/inputs_true2.dat | 60 ------------------- .../cpp_driver/results_true.dat | 14 ++--- tests/regression_tests/cpp_driver/test.py | 32 +++++----- 4 files changed, 23 insertions(+), 133 deletions(-) delete mode 100644 tests/regression_tests/cpp_driver/inputs_true1.dat delete mode 100644 tests/regression_tests/cpp_driver/inputs_true2.dat diff --git a/tests/regression_tests/cpp_driver/inputs_true1.dat b/tests/regression_tests/cpp_driver/inputs_true1.dat deleted file mode 100644 index fae59e202e..0000000000 --- a/tests/regression_tests/cpp_driver/inputs_true1.dat +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - eigenvalue - 100 - 10 - 1 - - - -0.63 -0.63 -1 0.63 0.63 1 - - - diff --git a/tests/regression_tests/cpp_driver/inputs_true2.dat b/tests/regression_tests/cpp_driver/inputs_true2.dat deleted file mode 100644 index 728491d778..0000000000 --- a/tests/regression_tests/cpp_driver/inputs_true2.dat +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - eigenvalue - 100 - 10 - 1 - - - -0.63 -0.63 -1 0.63 0.63 1 - - - - - - - 4 5 6 - - - 2 - flux - - diff --git a/tests/regression_tests/cpp_driver/results_true.dat b/tests/regression_tests/cpp_driver/results_true.dat index 32a636636a..c7b247e59e 100644 --- a/tests/regression_tests/cpp_driver/results_true.dat +++ b/tests/regression_tests/cpp_driver/results_true.dat @@ -1,9 +1,9 @@ k-combined: -1.141180E+00 4.513757E-02 +1.108161E+00 3.345885E-02 tally 1: -1.220313E+02 -1.659250E+03 -4.421703E+01 -2.178300E+02 -2.356492E+02 -6.182509E+03 +1.178481E+02 +1.548363E+03 +4.198718E+01 +1.962188E+02 +2.252008E+02 +5.647830E+03 diff --git a/tests/regression_tests/cpp_driver/test.py b/tests/regression_tests/cpp_driver/test.py index a562f895ea..4225e5a735 100644 --- a/tests/regression_tests/cpp_driver/test.py +++ b/tests/regression_tests/cpp_driver/test.py @@ -7,11 +7,11 @@ import textwrap import openmc import pytest +from tests.regression_tests import config from tests.testing_harness import PyAPITestHarness - @pytest.fixture -def driver(request): +def cpp_driver(request): """Compile the external source""" # Get build directory and write CMakeLists.txt file @@ -40,16 +40,6 @@ def driver(request): # Remove local build directory when test is complete shutil.rmtree('build') - -@pytest.fixture -def model(): - model = openmc.examples.pwr_pin_cell() - model.settings.particles = 100 - model.settings.batches = 10 - model.settings.inactive = 1 - return model - - class ExternalDriverTestHarness(PyAPITestHarness): def __init__(self, executable, statepoint_name, model=None): @@ -57,10 +47,20 @@ class ExternalDriverTestHarness(PyAPITestHarness): self.executable = executable def _run_openmc(self): - print("Running openmc") - openmc.run(openmc_exec=self.executable) + if config['mpi']: + mpi_args = [config['mpiexec'], '-n', config['mpi_np']] + openmc.run(openmc_exec=self.executable, + mpi_args=mpi_args, + event_based=config['event']) + else: + openmc.run(openmc_exec=self.executable, + event_based=config['event']) +def test_cpp_driver(cpp_driver): + model = openmc.examples.pwr_pin_cell() + model.settings.particles = 100 + model.settings.batches = 10 + model.settings.inactive = 1 -def test_cpp_driver(driver, model): - harness = ExternalDriverTestHarness(driver, 'statepoint.10.h5', model) + harness = ExternalDriverTestHarness(cpp_driver, 'statepoint.10.h5', model) harness.main() From 2c0d54adb44879e227d184673c8b7fa4f0af7882 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 12 May 2020 10:26:13 -0500 Subject: [PATCH 06/12] Adding verbosity to travis make. --- tests/regression_tests/cpp_driver/test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/regression_tests/cpp_driver/test.py b/tests/regression_tests/cpp_driver/test.py index 4225e5a735..32d49f9b53 100644 --- a/tests/regression_tests/cpp_driver/test.py +++ b/tests/regression_tests/cpp_driver/test.py @@ -32,7 +32,7 @@ def cpp_driver(request): # Run cmake/make to build the shared libary subprocess.run(['cmake', os.path.pardir], check=True) - subprocess.run(['make'], check=True) + subprocess.run(['make', 'VERBOSE=1'], check=True) os.chdir(os.path.pardir) yield "./build/cpp_driver" From 4bb985ea331d5b699fe74c9eccf288caf97912b0 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 12 May 2020 13:39:24 -0500 Subject: [PATCH 07/12] Ensuring an mpi compiler when necessary. --- tests/regression_tests/cpp_driver/test.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/tests/regression_tests/cpp_driver/test.py b/tests/regression_tests/cpp_driver/test.py index 32d49f9b53..350b82b0d7 100644 --- a/tests/regression_tests/cpp_driver/test.py +++ b/tests/regression_tests/cpp_driver/test.py @@ -30,15 +30,19 @@ def cpp_driver(request): local_builddir.mkdir(exist_ok=True) os.chdir(str(local_builddir)) - # Run cmake/make to build the shared libary - subprocess.run(['cmake', os.path.pardir], check=True) - subprocess.run(['make', 'VERBOSE=1'], check=True) - os.chdir(os.path.pardir) + try: + # Run cmake/make to build the shared libary + if config['mpi']: + os.environ['CXX'] = 'mpicxx' + subprocess.run(['cmake', os.path.pardir], check=True) + subprocess.run(['make'], check=True) - yield "./build/cpp_driver" + yield "./build/cpp_driver" - # Remove local build directory when test is complete - shutil.rmtree('build') + finally: + # Remove local build directory when test is complete + os.chdir(os.path.pardir) + shutil.rmtree('build') class ExternalDriverTestHarness(PyAPITestHarness): @@ -63,4 +67,4 @@ def test_cpp_driver(cpp_driver): model.settings.inactive = 1 harness = ExternalDriverTestHarness(cpp_driver, 'statepoint.10.h5', model) - harness.main() + harness._build_inputs() From ac39214ce49f8405c436b281745c28fe83f75da0 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 12 May 2020 15:20:32 -0500 Subject: [PATCH 08/12] More PEP8 updates. --- tests/regression_tests/cpp_driver/test.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/tests/regression_tests/cpp_driver/test.py b/tests/regression_tests/cpp_driver/test.py index 350b82b0d7..656c55d126 100644 --- a/tests/regression_tests/cpp_driver/test.py +++ b/tests/regression_tests/cpp_driver/test.py @@ -10,6 +10,7 @@ import pytest from tests.regression_tests import config from tests.testing_harness import PyAPITestHarness + @pytest.fixture def cpp_driver(request): """Compile the external source""" @@ -30,10 +31,11 @@ def cpp_driver(request): local_builddir.mkdir(exist_ok=True) os.chdir(str(local_builddir)) + if config['mpi']: + os.environ['CXX'] = 'mpicxx' + try: # Run cmake/make to build the shared libary - if config['mpi']: - os.environ['CXX'] = 'mpicxx' subprocess.run(['cmake', os.path.pardir], check=True) subprocess.run(['make'], check=True) @@ -44,6 +46,7 @@ def cpp_driver(request): os.chdir(os.path.pardir) shutil.rmtree('build') + class ExternalDriverTestHarness(PyAPITestHarness): def __init__(self, executable, statepoint_name, model=None): @@ -54,11 +57,12 @@ class ExternalDriverTestHarness(PyAPITestHarness): if config['mpi']: mpi_args = [config['mpiexec'], '-n', config['mpi_np']] openmc.run(openmc_exec=self.executable, - mpi_args=mpi_args, - event_based=config['event']) + mpi_args=mpi_args, + event_based=config['event']) else: openmc.run(openmc_exec=self.executable, - event_based=config['event']) + event_based=config['event']) + def test_cpp_driver(cpp_driver): model = openmc.examples.pwr_pin_cell() From eec8792bac8975fcc229230154fb3f46eee17b35 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 12 May 2020 15:36:01 -0500 Subject: [PATCH 09/12] Tweaking static assert message a bit. --- src/tallies/filter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tallies/filter.cpp b/src/tallies/filter.cpp index 0c8239ff24..bff30c9e7e 100644 --- a/src/tallies/filter.cpp +++ b/src/tallies/filter.cpp @@ -72,7 +72,7 @@ Filter::~Filter() template T* Filter::create(int32_t id) { static_assert(std::is_base_of::value, - "Type specified is not derived from openmc::Filter."); + "Type specified is not derived from openmc::Filter"); auto filter = std::make_unique(); From 8265907c3f54fb65a6436a3d17a10ab1a0e32156 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 12 May 2020 17:14:18 -0500 Subject: [PATCH 10/12] Aesthetic changes to the new create method. --- src/tallies/filter.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/tallies/filter.cpp b/src/tallies/filter.cpp index bff30c9e7e..10f89cfa90 100644 --- a/src/tallies/filter.cpp +++ b/src/tallies/filter.cpp @@ -73,13 +73,10 @@ template T* Filter::create(int32_t id) { static_assert(std::is_base_of::value, "Type specified is not derived from openmc::Filter"); - + // Create filter and add to filters vector auto filter = std::make_unique(); - auto ptr_out = filter.get(); - model::tally_filters.emplace_back(std::move(filter)); - // Assign ID model::tally_filters.back()->set_id(id); From 64f6d5ce1fac641308b7b47049a90c39ca694d35 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Wed, 13 May 2020 17:05:31 -0500 Subject: [PATCH 11/12] Addressing comments from @paulromano. --- .../cpp_driver/inputs_true.dat | 46 +++++-------------- .../cpp_driver/results_true.dat | 12 ++--- tests/regression_tests/cpp_driver/test.py | 31 +++++++++++-- 3 files changed, 44 insertions(+), 45 deletions(-) diff --git a/tests/regression_tests/cpp_driver/inputs_true.dat b/tests/regression_tests/cpp_driver/inputs_true.dat index fae59e202e..4d0e90d8f1 100644 --- a/tests/regression_tests/cpp_driver/inputs_true.dat +++ b/tests/regression_tests/cpp_driver/inputs_true.dat @@ -1,39 +1,20 @@ - - - - - - - - - + + + + - - - - - - + + + - - - - - - - - - - - - - - - + + + + @@ -42,9 +23,4 @@ 100 10 1 - - - -0.63 -0.63 -1 0.63 0.63 1 - - diff --git a/tests/regression_tests/cpp_driver/results_true.dat b/tests/regression_tests/cpp_driver/results_true.dat index c7b247e59e..7748cf5c05 100644 --- a/tests/regression_tests/cpp_driver/results_true.dat +++ b/tests/regression_tests/cpp_driver/results_true.dat @@ -1,9 +1,7 @@ k-combined: -1.108161E+00 3.345885E-02 +1.857752E+00 2.922425E-02 tally 1: -1.178481E+02 -1.548363E+03 -4.198718E+01 -1.962188E+02 -2.252008E+02 -5.647830E+03 +5.337194E+01 +3.209877E+02 +1.621671E+02 +2.939588E+03 diff --git a/tests/regression_tests/cpp_driver/test.py b/tests/regression_tests/cpp_driver/test.py index 656c55d126..b7f95ebfb6 100644 --- a/tests/regression_tests/cpp_driver/test.py +++ b/tests/regression_tests/cpp_driver/test.py @@ -35,15 +35,16 @@ def cpp_driver(request): os.environ['CXX'] = 'mpicxx' try: + print("Building driver") # Run cmake/make to build the shared libary subprocess.run(['cmake', os.path.pardir], check=True) subprocess.run(['make'], check=True) + os.chdir(os.path.pardir) yield "./build/cpp_driver" finally: # Remove local build directory when test is complete - os.chdir(os.path.pardir) shutil.rmtree('build') @@ -65,10 +66,34 @@ class ExternalDriverTestHarness(PyAPITestHarness): def test_cpp_driver(cpp_driver): - model = openmc.examples.pwr_pin_cell() + + model = openmc.model.Model() + + # materials + u235 = openmc.Material(name="fuel") + u235.add_nuclide('U235', 1.0, 'ao') + u235.set_density('g/cc', 11) + + water = openmc.Material(name="water") + water.add_nuclide('H1', 2.0, 'ao') + water.add_nuclide('O16', 1.0, 'ao') + water.set_density('g/cc', 1.0) + + mats = openmc.Materials([u235, water]) + model.materials = mats + + # geometry + fuel_or = openmc.ZCylinder(r=1.5) + coolant_or = openmc.ZCylinder(r=3.0, boundary_type='reflective') + + fuel = openmc.Cell(fill=u235, region=-fuel_or) + coolant = openmc.Cell(fill=water, region=+fuel_or & -coolant_or) + + model.geometry = openmc.Geometry([fuel, coolant]) + model.settings.particles = 100 model.settings.batches = 10 model.settings.inactive = 1 harness = ExternalDriverTestHarness(cpp_driver, 'statepoint.10.h5', model) - harness._build_inputs() + harness.main() From 31b2f308b527d137426e14e0075e57c0f34a0a19 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Fri, 15 May 2020 11:49:55 -0500 Subject: [PATCH 12/12] Providing the model as a fixture. --- tests/regression_tests/cpp_driver/test.py | 42 +++++++++++++---------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/tests/regression_tests/cpp_driver/test.py b/tests/regression_tests/cpp_driver/test.py index b7f95ebfb6..a4dd8785b2 100644 --- a/tests/regression_tests/cpp_driver/test.py +++ b/tests/regression_tests/cpp_driver/test.py @@ -48,25 +48,8 @@ def cpp_driver(request): shutil.rmtree('build') -class ExternalDriverTestHarness(PyAPITestHarness): - - def __init__(self, executable, statepoint_name, model=None): - super().__init__(statepoint_name, model) - self.executable = executable - - def _run_openmc(self): - if config['mpi']: - mpi_args = [config['mpiexec'], '-n', config['mpi_np']] - openmc.run(openmc_exec=self.executable, - mpi_args=mpi_args, - event_based=config['event']) - else: - openmc.run(openmc_exec=self.executable, - event_based=config['event']) - - -def test_cpp_driver(cpp_driver): - +@pytest.fixture +def model(): model = openmc.model.Model() # materials @@ -95,5 +78,26 @@ def test_cpp_driver(cpp_driver): model.settings.batches = 10 model.settings.inactive = 1 + return model + + +class ExternalDriverTestHarness(PyAPITestHarness): + + def __init__(self, executable, statepoint_name, model=None): + super().__init__(statepoint_name, model) + self.executable = executable + + def _run_openmc(self): + if config['mpi']: + mpi_args = [config['mpiexec'], '-n', config['mpi_np']] + openmc.run(openmc_exec=self.executable, + mpi_args=mpi_args, + event_based=config['event']) + else: + openmc.run(openmc_exec=self.executable, + event_based=config['event']) + + +def test_cpp_driver(cpp_driver, model): harness = ExternalDriverTestHarness(cpp_driver, 'statepoint.10.h5', model) harness.main()