mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-28 14:15:42 -04:00
Speed up distribcell initialization
This commit is contained in:
parent
f62bdae0b6
commit
193c6a9d7c
4 changed files with 32 additions and 11 deletions
|
|
@ -385,8 +385,10 @@ prepare_distribcell()
|
|||
}
|
||||
|
||||
// Fill the cell and lattice offset tables.
|
||||
#pragma omp parallel for
|
||||
for (int map = 0; map < target_univ_ids.size(); map++) {
|
||||
auto target_univ_id = target_univ_ids[map];
|
||||
std::unordered_map<int32_t, int32_t> univ_count_memo;
|
||||
for (const auto& univ : model::universes) {
|
||||
int32_t offset = 0;
|
||||
for (int32_t cell_indx : univ->cells_) {
|
||||
|
|
@ -395,11 +397,13 @@ prepare_distribcell()
|
|||
if (c.type_ == Fill::UNIVERSE) {
|
||||
c.offset_[map] = offset;
|
||||
int32_t search_univ = c.fill_;
|
||||
offset += count_universe_instances(search_univ, target_univ_id);
|
||||
offset += count_universe_instances(search_univ, target_univ_id,
|
||||
univ_count_memo);
|
||||
|
||||
} else if (c.type_ == Fill::LATTICE) {
|
||||
Lattice& lat = *model::lattices[c.fill_];
|
||||
offset = lat.fill_offset_table(offset, target_univ_id, map);
|
||||
offset = lat.fill_offset_table(offset, target_univ_id, map,
|
||||
univ_count_memo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -411,7 +415,6 @@ prepare_distribcell()
|
|||
void
|
||||
count_cell_instances(int32_t univ_indx)
|
||||
{
|
||||
|
||||
const auto univ_counts = model::universe_cell_counts.find(univ_indx);
|
||||
if (univ_counts != model::universe_cell_counts.end()) {
|
||||
for (const auto& it : univ_counts->second) {
|
||||
|
|
@ -442,30 +445,42 @@ count_cell_instances(int32_t univ_indx)
|
|||
//==============================================================================
|
||||
|
||||
int
|
||||
count_universe_instances(int32_t search_univ, int32_t target_univ_id)
|
||||
count_universe_instances(int32_t search_univ, int32_t target_univ_id,
|
||||
std::unordered_map<int32_t, int32_t>& univ_count_memo)
|
||||
{
|
||||
// If this is the target, it can't contain itself.
|
||||
// If this is the target, it can't contain itself.
|
||||
if (model::universes[search_univ]->id_ == target_univ_id) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// If we have already counted the number of instances, reuse that value.
|
||||
auto search = univ_count_memo.find(search_univ);
|
||||
if (search != univ_count_memo.end()) {
|
||||
return search->second;
|
||||
}
|
||||
|
||||
int count {0};
|
||||
for (int32_t cell_indx : model::universes[search_univ]->cells_) {
|
||||
Cell& c = *model::cells[cell_indx];
|
||||
|
||||
if (c.type_ == Fill::UNIVERSE) {
|
||||
int32_t next_univ = c.fill_;
|
||||
count += count_universe_instances(next_univ, target_univ_id);
|
||||
count += count_universe_instances(next_univ, target_univ_id,
|
||||
univ_count_memo);
|
||||
|
||||
} else if (c.type_ == Fill::LATTICE) {
|
||||
Lattice& lat = *model::lattices[c.fill_];
|
||||
for (auto it = lat.begin(); it != lat.end(); ++it) {
|
||||
int32_t next_univ = *it;
|
||||
count += count_universe_instances(next_univ, target_univ_id);
|
||||
count += count_universe_instances(next_univ, target_univ_id,
|
||||
univ_count_memo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Remember the number of instances in this universe.
|
||||
univ_count_memo[search_univ] = count;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue