Merge pull request #1865 from pshriwise/manual_distribcells

Allow addition of distributed cell index generation in C++ API.
This commit is contained in:
Paul Romano 2021-08-10 12:51:25 -05:00 committed by GitHub
commit 4c17061a1d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 4 deletions

View file

@ -7,6 +7,7 @@
#include <cstdint>
#include <string>
#include <unordered_map>
#include <vector>
#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::vector<int32_t>* user_distribcells = nullptr);
//==============================================================================
//! Recursively search through the geometry and count cell instances.

View file

@ -44,6 +44,8 @@ public:
const vector<CellInstance>& cell_instances() const { return cell_instances_; }
const std::unordered_set<int32_t>& cells() const { return cells_; }
void set_cell_instances(gsl::span<CellInstance> instances);
private:

View file

@ -311,12 +311,18 @@ find_root_universe()
//==============================================================================
void
prepare_distribcell()
prepare_distribcell(const std::vector<int32_t>* user_distribcells)
{
write_message("Preparing distributed cell instances...", 5);
// Find all cells listed in a DistribcellFilter or CellInstanceFilter
std::unordered_set<int32_t> distribcells;
// start with any cells manually specified via the C++ API
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) {
auto* distrib_filt = dynamic_cast<DistribcellFilter*>(filt.get());
auto* cell_inst_filt = dynamic_cast<CellInstanceFilter*>(filt.get());
@ -324,7 +330,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());
}
}