Making an inner function for the recursion to clean up the exerior API.

This commit is contained in:
Patrick Shriwise 2020-05-15 20:55:01 -05:00
parent c3cb0fca2c
commit ad2aa90879
2 changed files with 24 additions and 11 deletions

View file

@ -76,7 +76,6 @@ public:
};
//==============================================================================
//! A geometry primitive that links surfaces, universes, and materials
//==============================================================================
class Cell {
@ -148,8 +147,13 @@ public:
void set_name(const std::string& name) { name_ = name; };
//! Get all cell instances contained by this cell
void get_contained_cells(std::unordered_map<int32_t, std::set<int32_t>>& contained_cells,
std::vector<CellInstance>& parent_cells);
//! \return Map with cell indexes as keys and instances as values
std::unordered_map<int32_t, std::set<int32_t>>
get_contained_cells();
void
get_contained_cells_inner(std::unordered_map<int32_t, std::set<int32_t>>& contained_cells,
std::vector<CellInstance>& parent_cells);
//----------------------------------------------------------------------------
// Data members

View file

@ -269,15 +269,13 @@ Cell::set_temperature(double T, int32_t instance, bool set_contained_cells)
throw std::runtime_error{fmt::format("Attempted to set the temperature of cell {} "
"which is not filled by a material.", id_)};
}
std::unordered_map<int32_t, std::set<int32_t>> contained_cells;
std::vector<CellInstance> parent_cells;
this->get_contained_cells(contained_cells, parent_cells);
auto contained_cells = this->get_contained_cells();
for (const auto& entry : contained_cells) {
auto& cell = model::cells[entry.first];
Expects(cell->type_ == Fill::MATERIAL);
auto& instances = entry.second;
for (auto instance = instances.begin(); instance != instances.end(); ++instance) {
Expects(cell->type_ == Fill::MATERIAL);
cell->set_temperature(T, *instance);
}
}
@ -1176,10 +1174,21 @@ openmc_cell_set_name(int32_t index, const char* name) {
return 0;
}
std::unordered_map<int32_t, std::set<int32_t>>
Cell::get_contained_cells() {
std::unordered_map<int32_t, std::set<int32_t>> contained_cells;
std::vector<CellInstance> parent_cells;
this->get_contained_cells_inner(contained_cells, parent_cells);
return contained_cells;
}
//! Get all cells within this cell
void
Cell::get_contained_cells(std::unordered_map<int32_t, std::set<int32_t>>& contained_cells,
std::vector<CellInstance>& parent_cells)
Cell::get_contained_cells_inner(std::unordered_map<int32_t, std::set<int32_t>>& contained_cells,
std::vector<CellInstance>& parent_cells)
{
// filled by material, determine instance based on parent cells
@ -1204,7 +1213,7 @@ Cell::get_contained_cells(std::unordered_map<int32_t, std::set<int32_t>>& contai
auto& univ = model::universes[fill_];
for(auto cell_index : univ->cells_) {
auto& cell = model::cells[cell_index];
cell->get_contained_cells(contained_cells, parent_cells);
cell->get_contained_cells_inner(contained_cells, parent_cells);
}
parent_cells.pop_back();
// filled with a lattice, visit each universe in the lattice
@ -1216,7 +1225,7 @@ Cell::get_contained_cells(std::unordered_map<int32_t, std::set<int32_t>>& contai
parent_cells.push_back({model::cell_map[this->id_], i.indx_});
for (auto cell_index : univ->cells_) {
auto& cell = model::cells[cell_index];
cell->get_contained_cells(contained_cells, parent_cells);
cell->get_contained_cells_inner(contained_cells, parent_cells);
}
parent_cells.pop_back();
}