From 971c5f77a5ebc276c6aa5c24879f115d1a49a8ed Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 15 Jan 2024 14:33:56 -0600 Subject: [PATCH] Ensure that implicit complement cells appear last in DAGMC universes (#2838) --- src/cell.cpp | 30 ++++++++++++++++--- .../regression_tests/dagmc/external/main.cpp | 16 +++++++++- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/cell.cpp b/src/cell.cpp index c96abf39be..cba52f1b55 100644 --- a/src/cell.cpp +++ b/src/cell.cpp @@ -1020,19 +1020,41 @@ void read_cells(pugi::xml_node node) void populate_universes() { + // Used to map universe index to the index of an implicit complement cell for + // DAGMC universes + std::unordered_map implicit_comp_cells; + // Populate the Universe vector and map. - for (int i = 0; i < model::cells.size(); i++) { - int32_t uid = model::cells[i]->universe_; + for (int index_cell = 0; index_cell < model::cells.size(); index_cell++) { + int32_t uid = model::cells[index_cell]->universe_; auto it = model::universe_map.find(uid); if (it == model::universe_map.end()) { model::universes.push_back(make_unique()); model::universes.back()->id_ = uid; - model::universes.back()->cells_.push_back(i); + model::universes.back()->cells_.push_back(index_cell); model::universe_map[uid] = model::universes.size() - 1; } else { - model::universes[it->second]->cells_.push_back(i); +#ifdef DAGMC + // Skip implicit complement cells for now + Universe* univ = model::universes[it->second].get(); + DAGUniverse* dag_univ = dynamic_cast(univ); + if (dag_univ && (dag_univ->implicit_complement_idx() == index_cell)) { + implicit_comp_cells[it->second] = index_cell; + continue; + } +#endif + + model::universes[it->second]->cells_.push_back(index_cell); } } + + // Add DAGUniverse implicit complement cells last + for (const auto& it : implicit_comp_cells) { + int index_univ = it.first; + int index_cell = it.second; + model::universes[index_univ]->cells_.push_back(index_cell); + } + model::universes.shrink_to_fit(); } diff --git a/tests/regression_tests/dagmc/external/main.cpp b/tests/regression_tests/dagmc/external/main.cpp index 42f7d97c90..bebe088f60 100644 --- a/tests/regression_tests/dagmc/external/main.cpp +++ b/tests/regression_tests/dagmc/external/main.cpp @@ -33,7 +33,7 @@ int main(int argc, char* argv[]) // Initialize acceleration data structures rval = dag_ptr->init_OBBTree(); if (rval != moab::MB_SUCCESS) { - fatal_error("Failed to initialise OBB tree"); + fatal_error("Failed to initialize OBB tree"); } // Get rid of existing geometry @@ -62,6 +62,20 @@ int main(int argc, char* argv[]) // Add cells to universes openmc::populate_universes(); + // Make sure implicit complement appears last + auto dag_univ = dynamic_cast(model::universes.back().get()); + int n = dag_univ->cells_.size(); + for (int i = 0; i < n - 1; ++i) { + if (dag_univ->cells_[i] == dag_univ->implicit_complement_idx()) { + fatal_error("Implicit complement cell should appear last in vector of " + "cells for DAGMC universe."); + } + } + if (dag_univ->cells_.back() != dag_univ->implicit_complement_idx()) { + fatal_error( + "Last cell in DAGMC universe is not an implicit complement cell."); + } + // Set root universe openmc::model::root_universe = openmc::find_root_universe(); openmc::check_dagmc_root_univ();