diff --git a/include/openmc/geometry_aux.h b/include/openmc/geometry_aux.h index 28b19e315d..9efdb303f1 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 2185a95c2a..cc3887f8f8 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 789a4151e3..387f7e5918 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 a4252b7463..89769b3704 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 9aa3063c90..2617da9788 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