From 7cb0b855f6ef54b3bc724c2c46ea3558f385c314 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sat, 17 Jul 2021 15:46:30 -0500 Subject: [PATCH 1/3] Adding a set of distribcells that can be manually set. --- include/openmc/settings.h | 1 + src/geometry_aux.cpp | 4 +++- src/settings.cpp | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/openmc/settings.h b/include/openmc/settings.h index cc3887f8f..2185a95c2 100644 --- a/include/openmc/settings.h +++ b/include/openmc/settings.h @@ -105,6 +105,7 @@ extern int trigger_batch_interval; //!< Batch interval for triggers extern "C" int verbosity; //!< How verbose to make output extern double weight_cutoff; //!< Weight cutoff for Russian roulette extern double weight_survive; //!< Survival weight after Russian roulette +extern std::unordered_set distribcells; //!< Manually set distribcells } // namespace settings //============================================================================== diff --git a/src/geometry_aux.cpp b/src/geometry_aux.cpp index 9d3062901..a4252b746 100644 --- a/src/geometry_aux.cpp +++ b/src/geometry_aux.cpp @@ -315,8 +315,10 @@ prepare_distribcell() { write_message("Preparing distributed cell instances...", 5); + // start with any cells manually specified via the C++ API + std::unordered_set distribcells = settings::distribcells; + // Find all cells listed in a DistribcellFilter or CellInstanceFilter - std::unordered_set distribcells; for (auto& filt : model::tally_filters) { auto* distrib_filt = dynamic_cast(filt.get()); auto* cell_inst_filt = dynamic_cast(filt.get()); diff --git a/src/settings.cpp b/src/settings.cpp index 2617da978..9aa3063c9 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -114,6 +114,7 @@ int trigger_batch_interval {1}; int verbosity {7}; double weight_cutoff {0.25}; double weight_survive {1.0}; +std::unordered_set distribcells; } // namespace settings From 88ec652760dffb92df71307da85d8e911ef5c48a Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Thu, 5 Aug 2021 17:03:37 -0500 Subject: [PATCH 2/3] Make the user-defined distribcells an argument to the function. --- include/openmc/geometry_aux.h | 6 +++++- include/openmc/settings.h | 1 - include/openmc/tallies/filter_cell_instance.h | 2 ++ src/geometry_aux.cpp | 10 ++++++---- src/settings.cpp | 1 - 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/include/openmc/geometry_aux.h b/include/openmc/geometry_aux.h index 28b19e315..9efdb303f 100644 --- a/include/openmc/geometry_aux.h +++ b/include/openmc/geometry_aux.h @@ -7,6 +7,7 @@ #include #include #include +#include #include "openmc/vector.h" @@ -63,9 +64,12 @@ int32_t find_root_universe(); //============================================================================== //! Populate all data structures needed for distribcells. +//! \param user_distribcells A set of cell indices to create distribcell data +//! structures for regardless of whether or not they are part of a tally +//! filter. //============================================================================== -void prepare_distribcell(); +void prepare_distribcell(const std::unordered_set* user_distribcells = nullptr); //============================================================================== //! Recursively search through the geometry and count cell instances. diff --git a/include/openmc/settings.h b/include/openmc/settings.h index 2185a95c2..cc3887f8f 100644 --- a/include/openmc/settings.h +++ b/include/openmc/settings.h @@ -105,7 +105,6 @@ extern int trigger_batch_interval; //!< Batch interval for triggers extern "C" int verbosity; //!< How verbose to make output extern double weight_cutoff; //!< Weight cutoff for Russian roulette extern double weight_survive; //!< Survival weight after Russian roulette -extern std::unordered_set distribcells; //!< Manually set distribcells } // namespace settings //============================================================================== diff --git a/include/openmc/tallies/filter_cell_instance.h b/include/openmc/tallies/filter_cell_instance.h index 789a4151e..387f7e591 100644 --- a/include/openmc/tallies/filter_cell_instance.h +++ b/include/openmc/tallies/filter_cell_instance.h @@ -44,6 +44,8 @@ public: const vector& cell_instances() const { return cell_instances_; } + const std::unordered_set& cells() const { return cells_; } + void set_cell_instances(gsl::span instances); private: diff --git a/src/geometry_aux.cpp b/src/geometry_aux.cpp index a4252b746..89769b370 100644 --- a/src/geometry_aux.cpp +++ b/src/geometry_aux.cpp @@ -2,7 +2,6 @@ #include // for std::max #include -#include #include #include @@ -311,12 +310,14 @@ find_root_universe() //============================================================================== void -prepare_distribcell() +prepare_distribcell(const std::unordered_set* user_distribcells) { write_message("Preparing distributed cell instances...", 5); + std::unordered_set distribcells; + // start with any cells manually specified via the C++ API - std::unordered_set distribcells = settings::distribcells; + if (user_distribcells) distribcells = *user_distribcells; // Find all cells listed in a DistribcellFilter or CellInstanceFilter for (auto& filt : model::tally_filters) { @@ -326,7 +327,8 @@ prepare_distribcell() distribcells.insert(distrib_filt->cell()); } if (cell_inst_filt) { - for (const auto& c_inst : cell_inst_filt->cell_instances()) distribcells.insert(c_inst.index_cell); + const auto& filter_cells = cell_inst_filt->cells(); + distribcells.insert(filter_cells.begin(), filter_cells.end()); } } diff --git a/src/settings.cpp b/src/settings.cpp index 9aa3063c9..2617da978 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -114,7 +114,6 @@ int trigger_batch_interval {1}; int verbosity {7}; double weight_cutoff {0.25}; double weight_survive {1.0}; -std::unordered_set distribcells; } // namespace settings From e8788cc1bb2234a8f8db270c31482a74c3b40b67 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 10 Aug 2021 08:06:54 -0500 Subject: [PATCH 3/3] Using vector instead of unordered_set for user-specified distribcells. --- include/openmc/geometry_aux.h | 4 ++-- src/geometry_aux.cpp | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/include/openmc/geometry_aux.h b/include/openmc/geometry_aux.h index 9efdb303f..899326a53 100644 --- a/include/openmc/geometry_aux.h +++ b/include/openmc/geometry_aux.h @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include "openmc/vector.h" @@ -69,7 +69,7 @@ int32_t find_root_universe(); //! filter. //============================================================================== -void prepare_distribcell(const std::unordered_set* user_distribcells = nullptr); +void prepare_distribcell(const std::vector* user_distribcells = nullptr); //============================================================================== //! Recursively search through the geometry and count cell instances. diff --git a/src/geometry_aux.cpp b/src/geometry_aux.cpp index 89769b370..857803421 100644 --- a/src/geometry_aux.cpp +++ b/src/geometry_aux.cpp @@ -2,6 +2,7 @@ #include // for std::max #include +#include #include #include @@ -310,14 +311,16 @@ find_root_universe() //============================================================================== void -prepare_distribcell(const std::unordered_set* user_distribcells) +prepare_distribcell(const std::vector* user_distribcells) { write_message("Preparing distributed cell instances...", 5); std::unordered_set distribcells; // start with any cells manually specified via the C++ API - if (user_distribcells) distribcells = *user_distribcells; + if (user_distribcells) { + distribcells.insert(user_distribcells->begin(), user_distribcells->end()); + } // Find all cells listed in a DistribcellFilter or CellInstanceFilter for (auto& filt : model::tally_filters) {